%PDF- %PDF-
Direktori : /home/graphicd/public_html/vebto/public/client/ |
Current File : /home/graphicd/public_html/vebto/public/client/936-es2015.4c349652cd92731bb447.js.map |
{"version":3,"sources":["node_modules/@angular/material/__ivy_ngcc__/fesm2015/autocomplete.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/chips.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/form-field.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/slide-toggle.js","node_modules/fast-deep-equal/index.js","node_modules/lodash/_DataView.js","node_modules/lodash/_Hash.js","node_modules/lodash/_ListCache.js","node_modules/lodash/_Map.js","node_modules/lodash/_MapCache.js","node_modules/lodash/_Promise.js","node_modules/lodash/_Set.js","node_modules/lodash/_SetCache.js","node_modules/lodash/_Stack.js","node_modules/lodash/_Symbol.js","node_modules/lodash/_Uint8Array.js","node_modules/lodash/_WeakMap.js","node_modules/lodash/_arrayEach.js","node_modules/lodash/_arrayFilter.js","node_modules/lodash/_arrayIncludes.js","node_modules/lodash/_arrayIncludesWith.js","node_modules/lodash/_arrayLikeKeys.js","node_modules/lodash/_arrayMap.js","node_modules/lodash/_arrayPush.js","node_modules/lodash/_arraySome.js","node_modules/lodash/_assignValue.js","node_modules/lodash/_assocIndexOf.js","node_modules/lodash/_baseAssign.js","node_modules/lodash/_baseAssignIn.js","node_modules/lodash/_baseAssignValue.js","node_modules/lodash/_baseClone.js","node_modules/lodash/_baseCreate.js","node_modules/lodash/_baseFindIndex.js","node_modules/lodash/_baseGet.js","node_modules/lodash/_baseGetAllKeys.js","node_modules/lodash/_baseGetTag.js","node_modules/lodash/_baseHasIn.js","node_modules/lodash/_baseIndexOf.js","node_modules/lodash/_baseIsArguments.js","node_modules/lodash/_baseIsEqual.js","node_modules/lodash/_baseIsEqualDeep.js","node_modules/lodash/_baseIsMap.js","node_modules/lodash/_baseIsMatch.js","node_modules/lodash/_baseIsNaN.js","node_modules/lodash/_baseIsNative.js","node_modules/lodash/_baseIsSet.js","node_modules/lodash/_baseIsTypedArray.js","node_modules/lodash/_baseIteratee.js","node_modules/lodash/_baseKeys.js","node_modules/lodash/_baseKeysIn.js","node_modules/lodash/_baseMatches.js","node_modules/lodash/_baseMatchesProperty.js","node_modules/lodash/_baseProperty.js","node_modules/lodash/_basePropertyDeep.js","node_modules/lodash/_baseTimes.js","node_modules/lodash/_baseToString.js","node_modules/lodash/_baseUnary.js","node_modules/lodash/_baseUniq.js","node_modules/lodash/_cacheHas.js","node_modules/lodash/_castPath.js","node_modules/lodash/_cloneArrayBuffer.js","node_modules/lodash/_cloneBuffer.js","node_modules/lodash/_cloneDataView.js","node_modules/lodash/_cloneRegExp.js","node_modules/lodash/_cloneSymbol.js","node_modules/lodash/_cloneTypedArray.js","node_modules/lodash/_copyArray.js","node_modules/lodash/_copyObject.js","node_modules/lodash/_copySymbols.js","node_modules/lodash/_copySymbolsIn.js","node_modules/lodash/_coreJsData.js","node_modules/lodash/_createSet.js","node_modules/lodash/_defineProperty.js","node_modules/lodash/_equalArrays.js","node_modules/lodash/_equalByTag.js","node_modules/lodash/_equalObjects.js","node_modules/lodash/_freeGlobal.js","node_modules/lodash/_getAllKeys.js","node_modules/lodash/_getAllKeysIn.js","node_modules/lodash/_getMapData.js","node_modules/lodash/_getMatchData.js","node_modules/lodash/_getNative.js","node_modules/lodash/_getPrototype.js","node_modules/lodash/_getRawTag.js","node_modules/lodash/_getSymbols.js","node_modules/lodash/_getSymbolsIn.js","node_modules/lodash/_getTag.js","node_modules/lodash/_getValue.js","node_modules/lodash/_hasPath.js","node_modules/lodash/_hashClear.js","node_modules/lodash/_hashDelete.js","node_modules/lodash/_hashGet.js","node_modules/lodash/_hashHas.js","node_modules/lodash/_hashSet.js","node_modules/lodash/_initCloneArray.js","node_modules/lodash/_initCloneByTag.js","node_modules/lodash/_initCloneObject.js","node_modules/lodash/_isIndex.js","node_modules/lodash/_isKey.js","node_modules/lodash/_isKeyable.js","node_modules/lodash/_isMasked.js","node_modules/lodash/_isPrototype.js","node_modules/lodash/_isStrictComparable.js","node_modules/lodash/_listCacheClear.js","node_modules/lodash/_listCacheDelete.js","node_modules/lodash/_listCacheGet.js","node_modules/lodash/_listCacheHas.js","node_modules/lodash/_listCacheSet.js","node_modules/lodash/_mapCacheClear.js","node_modules/lodash/_mapCacheDelete.js","node_modules/lodash/_mapCacheGet.js","node_modules/lodash/_mapCacheHas.js","node_modules/lodash/_mapCacheSet.js","node_modules/lodash/_mapToArray.js","node_modules/lodash/_matchesStrictComparable.js","node_modules/lodash/_memoizeCapped.js","node_modules/lodash/_nativeCreate.js","node_modules/lodash/_nativeKeys.js","node_modules/lodash/_nativeKeysIn.js","node_modules/lodash/_nodeUtil.js","node_modules/lodash/_objectToString.js","node_modules/lodash/_overArg.js","node_modules/lodash/_root.js","node_modules/lodash/_setCacheAdd.js","node_modules/lodash/_setCacheHas.js","node_modules/lodash/_setToArray.js","node_modules/lodash/_stackClear.js","node_modules/lodash/_stackDelete.js","node_modules/lodash/_stackGet.js","node_modules/lodash/_stackHas.js","node_modules/lodash/_stackSet.js","node_modules/lodash/_strictIndexOf.js","node_modules/lodash/_stringToPath.js","node_modules/lodash/_toKey.js","node_modules/lodash/_toSource.js","node_modules/lodash/cloneDeep.js","node_modules/lodash/eq.js","node_modules/lodash/get.js","node_modules/lodash/hasIn.js","node_modules/lodash/identity.js","node_modules/lodash/isArguments.js","node_modules/lodash/isArray.js","node_modules/lodash/isArrayLike.js","node_modules/lodash/isBuffer.js","node_modules/lodash/isEqual.js","node_modules/lodash/isFunction.js","node_modules/lodash/isLength.js","node_modules/lodash/isMap.js","node_modules/lodash/isObject.js","node_modules/lodash/isObjectLike.js","node_modules/lodash/isSet.js","node_modules/lodash/isSymbol.js","node_modules/lodash/isTypedArray.js","node_modules/lodash/keys.js","node_modules/lodash/keysIn.js","node_modules/lodash/memoize.js","node_modules/lodash/noop.js","node_modules/lodash/property.js","node_modules/lodash/stubArray.js","node_modules/lodash/stubFalse.js","node_modules/lodash/toString.js","node_modules/lodash/uniqBy.js","node_modules/rxjs/_esm2015/internal/operators/throttle.js","node_modules/rxjs/_esm2015/internal/operators/throttleTime.js","src/app/drive/state/actions/commands.ts","src/app/drive/state/models/drive-page.ts","src/app/drive/state/actions/events.ts","src/app/drive/state/models/drive-state-model.ts","src/app/drive/state/models/drive-state-model-defaults.ts","src/app/drive/messages/loading-toast/loading-toast-messages.ts","src/app/drive/upload-input-config.ts","src/app/drive/folders/api/folders-api-routes.enum.ts","src/app/drive/folders/api/folders-api.service.ts","src/app/drive/drive-entry-api.service.ts","src/app/drive/drive-urls.service.ts","src/app/drive/uploads/drive-upload-validator.ts","src/app/drive/state/drive-state.ts","src/app/drive/sidebar/folders-tree/build-folder-tree.ts","src/app/drive/entries/supported-entry-types.ts","src/app/drive/files/components/file-icon/file-icon.component.ts","src/common/core/utils/kebab-case.ts","src/app/drive/files/components/file-icon/file-icon.component.html","src/app/drive/interactions/entry-drag-preview/entry-drag-preview.component.html","src/app/drive/interactions/entry-drag-preview/entry-drag-preview.component.ts","src/app/drive/permissions/drive-entry-permissions.ts","src/app/drive/sharing/shares-api.service.ts","src/app/drive/sharing/state/share-dialog.state.ts","src/app/drive/sharing/sharing-permissions-button/sharing-permissions-button.component.html","src/app/drive/sharing/sharing-permissions-button/sharing-permissions-button.component.ts","src/app/drive/sharing/entries-access-table/entries-access-table.component.html","src/app/drive/sharing/entries-access-table/entries-access-table.component.ts","src/app/drive/sharing/share-dialog/share-dialog.component.html","src/app/drive/sharing/share-dialog/share-dialog.component.ts","src/app/drive/sharing/links/shareable-links-api.service.ts","src/app/drive/sharing/links/share-link.state.ts","src/app/drive/sharing/links/link-options/link-options.component.html","src/app/drive/sharing/links/link-options/link-options.component.ts","src/app/drive/sharing/share-link-dialog/share-link-dialog.component.html","src/app/drive/sharing/share-link-dialog/share-link-dialog.component.ts","src/common/core/utils/share-link-socially.ts","src/app/drive/folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component.html","src/app/drive/folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component.ts","node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/tree.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/tree.js","src/app/drive/sidebar/folders-tree/folders-tree.service.ts","src/common/core/ui/context-menu/available-context-menus.ts","src/common/core/ui/context-menu/context-menu-ref.ts","src/common/core/ui/context-menu/context-menu-data.ts","src/common/core/ui/context-menu/context-menu.service.ts","src/common/core/ui/context-menu/context-menu.directive.ts","src/app/drive/interactions/drop-targets/base-drop-target.ts","src/app/drive/interactions/drop-targets/folder-drop-target.directive.ts","src/app/drive/sidebar/folders-tree/folders-tree.component.html","src/app/drive/sidebar/folders-tree/folders-tree.component.ts","src/app/drive/entries/move-entries-dialog/move-entries-dialog.component.ts","src/app/drive/entries/rename-entry-dialog/rename-entry-dialog.component.html","src/app/drive/entries/move-entries-dialog/move-entries-dialog.component.html","src/app/drive/entries/rename-entry-dialog/rename-entry-dialog.component.ts","src/app/drive/context-actions/drive-context-actions.ts","src/app/drive/context-actions/actions/entry-actions.ts","src/app/drive/context-actions/actions/folder-actions.ts","src/app/drive/context-actions/actions/shares-actions.ts","src/app/drive/context-actions/actions/trash-actions.ts","src/app/drive/context-actions/actions/trash-page-actions.ts","src/app/drive/interactions/drive-dom-cache.service.ts","src/app/drive/search/main-searchbar.component.ts","src/app/drive/search/drive-search-filters.ts","src/app/drive/search/main-searchbar.component.html","node_modules/rxjs/_esm2015/internal/operators/mapTo.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/sidenav.js","src/app/drive/sidebar/sidebar-action-buttons/sidebar-action-buttons.component.ts","src/app/drive/sidebar/sidebar-action-buttons/sidebar-action-buttons.component.html","src/app/drive/sidebar/available-space-indicator/available-space-indicator.component.html","src/app/drive/sidebar/available-space-indicator/available-space-indicator.component.ts","src/common/workspaces/workspace-selector/workspace-selector.component.html","src/common/workspaces/workspace-selector/workspace-selector.component.ts","src/app/drive/sidebar/sidebar.component.ts","src/app/drive/sidebar/sidebar.component.html","src/app/drive/details-sidebar/details-panel/entry-description-panel/entry-description-panel.component.html","src/app/drive/details-sidebar/details-panel/entry-description-panel/entry-description-panel.component.ts","src/app/drive/files/components/file-thumbnail/file-thumbnail.component.html","src/app/drive/files/components/file-thumbnail/file-thumbnail.component.ts","src/app/drive/details-sidebar/details-panel/details-panel.component.html","src/app/drive/details-sidebar/details-panel/details-panel.component.ts","src/app/drive/details-sidebar/details-sidebar.component.html","src/app/drive/details-sidebar/details-sidebar.component.ts","src/app/drive/files/components/files-grid/files-grid-item/files-grid-item.component.ts","src/app/drive/files/components/files-grid/files-grid-item/files-grid-item.component.html","src/app/drive/interactions/files-drag-select.service.ts","src/app/drive/interactions/drag-entry.service.ts","src/app/drive/interactions/drive-hammer-interactions.directive.ts","src/app/drive/interactions/toggle-selected-class.directive.ts","src/common/uploads/utils/read-uploaded-folders.ts","src/common/uploads/directives/upload-dropzone.directive.ts","src/common/core/ui/infinite-scroll/infinite.scroll.ts","src/app/drive/interactions/drive-infinite-scroll.directive.ts","src/app/drive/context-actions/components/drive-context-menu/drive-context-menu.component.ts","src/app/drive/context-actions/components/drive-context-menu/drive-context-menu.component.html","src/app/drive/drive-toolbar/entry-breadcrumbs/entry-breadcrumbs.component.html","src/app/drive/drive-toolbar/entry-breadcrumbs/entry-breadcrumbs.component.ts","src/app/drive/drive-toolbar/drive-toolbar.component.ts","src/app/drive/drive-toolbar/drive-toolbar.component.html","src/app/drive/entries/available-sorts.ts","src/app/drive/header/entries-sort-button/entries-sort-button.component.html","src/app/drive/header/entries-sort-button/entries-sort-button.component.ts","src/app/drive/context-actions/components/context-actions-container/context-actions-container.component.html","src/app/drive/context-actions/components/context-actions-container/context-actions-container.component.ts","src/app/drive/drive-toolbar/toolbar-actions/toolbar-actions.component.ts","src/app/drive/drive-toolbar/toolbar-actions/toolbar-actions.component.html","src/app/drive/header/file-list-header/file-list-header.component.ts","src/app/drive/header/file-list-header/file-list-header.component.html","src/app/drive/drive.component.html","src/app/drive/drive.component.ts","src/app/drive/files/components/files-grid/files-grid.component.html","src/app/drive/files/components/files-grid/files-grid.component.ts","src/app/drive/files/components/files-list/files-list.component.html","src/app/drive/files/components/files-list/files-list.component.ts","src/app/drive/messages/no-recent-entries/no-recent-entries.component.ts","src/app/drive/messages/no-recent-entries/no-recent-entries.component.html","src/app/drive/messages/no-trashed-entries/no-trashed-entries.component.ts","src/app/drive/messages/no-trashed-entries/no-trashed-entries.component.html","src/app/drive/messages/no-starred-entries/no-starred-entries.component.ts","src/app/drive/messages/no-starred-entries/no-starred-entries.component.html","src/app/drive/sharing/no-shared-entries/no-shared-entries.component.ts","src/app/drive/sharing/no-shared-entries/no-shared-entries.component.html","src/app/drive/messages/no-search-entries/no-search-entries.component.html","src/app/drive/messages/no-search-entries/no-search-entries.component.ts","src/app/drive/uploads/upload-dropzone/upload-dropzone.component.ts","src/app/drive/uploads/upload-dropzone/upload-dropzone.component.html","src/app/drive/messages/no-folder-entries/no-folder-entries.component.ts","src/app/drive/messages/no-folder-entries/no-folder-entries.component.html","src/app/drive/entries/entries-container/entries-container.component.html","src/app/drive/entries/entries-container/entries-container.component.ts","src/common/file-preview/current-preview-file.ts","src/common/file-preview/preview-url-transformer.ts","src/common/file-preview/base-file-preview.ts","src/common/file-preview/default-preview/default-preview.component.html","src/common/file-preview/default-preview/default-preview.component.ts","src/common/file-preview/text-preview/text-preview.component.html","src/common/file-preview/text-preview/text-preview.component.ts","src/common/file-preview/audio-preview/audio-preview.component.html","src/common/file-preview/audio-preview/audio-preview.component.ts","src/common/file-preview/video-preview/video-preview.component.html","src/common/file-preview/video-preview/video-preview.component.ts","src/common/file-preview/image-preview/image-preview.component.ts","src/common/file-preview/image-preview/image-preview.component.html","src/common/file-preview/pdf-preview/pdf-preview.component.ts","src/common/file-preview/pdf-preview/pdf-preview.component.html","src/common/file-preview/google-docs-viewer/google-docs-viewer.component.html","src/common/file-preview/google-docs-viewer/google-docs-viewer.component.ts","src/common/file-preview/available-previews.ts","src/common/file-preview/preview-files.service.ts","src/app/drive/preview/link-preview-container/link-preview-password-panel/link-preview-password-panel.component.html","src/app/drive/preview/link-preview-container/link-preview-password-panel/link-preview-password-panel.component.ts","src/app/drive/preview/file-preview-overlay/file-preview-toolbar/file-preview-toolbar.component.html","src/app/drive/preview/file-preview-overlay/file-preview-toolbar/file-preview-toolbar.component.ts","src/common/file-preview/preview-container/preview-container.component.html","src/common/file-preview/preview-container/preview-container.component.ts","src/app/drive/preview/file-preview-overlay/file-preview-overlay.component.html","src/app/drive/preview/file-preview-overlay/file-preview-overlay.component.ts","src/app/drive/preview/folder-preview/folder-preview.component.html","src/app/drive/preview/folder-preview/folder-preview.component.ts","src/app/drive/preview/link-preview-container/link-preview-container.component.html","src/app/drive/preview/link-preview-container/link-preview-container.component.ts","src/app/drive/drive-routing.module.ts","node_modules/@angular/material/__ivy_ngcc__/fesm2015/progress-spinner.js","src/app/drive/context-actions/drive-context-menus.ts","src/app/drive/state/handlers/overlay-handler.ts","src/app/drive/state/handlers/donwlod-handler.ts","src/app/drive/messages/loading-toast/loading-toast.component.ts","src/app/drive/messages/loading-toast/loading-toast.component.html","src/app/drive/state/handlers/toast-handler.ts","src/app/drive/uploads/uploads-panel/uploads-panel-item/uploads-panel-item.component.html","src/app/drive/uploads/uploads-panel/uploads-panel-item/uploads-panel-item.component.ts","src/app/drive/uploads/uploads-panel/uploads-panel.component.html","src/app/drive/uploads/uploads-panel/uploads-panel.component.ts","src/app/drive/state/handlers/upload-panel-handler.ts","src/app/drive/state/handlers/dialog-handler.ts","src/app/drive/sharing/sharing.module.ts","src/app/drive/state/handlers/reset-scroll-handler.ts","src/app/drive/state/handlers/page-change-handler.ts","src/app/drive/state/handlers/page-load-handler.ts","src/app/drive/state/handlers/remove-star-handler.ts","src/common/core/ui/context-menu/context-menu.module.ts","src/common/file-preview/file-preview.module.ts","src/common/workspaces/workspace-selector/workspace-selector.module.ts","src/app/drive/drive.module.ts","src/common/admin/file-entry-index/file-entry-index-filters.ts","src/common/auth/find-user-modal/find-user-modal.component.html","src/common/auth/find-user-modal/find-user-modal.component.ts","src/common/core/keybinds/keycodes.enum.ts","src/common/core/keybinds/keybinds.service.ts","src/common/core/ui/chips/chip-input/chip-input.component.html","src/common/core/ui/chips/chip-input/chip-input.component.ts","src/common/core/ui/chips/chips.module.ts","src/common/core/ui/skeleton/skeleton-animations.ts","src/common/core/ui/skeleton/skeleton.component.ts","src/common/core/ui/skeleton/skeleton.module.ts","src/common/core/utils/has-key.ts","src/common/core/utils/remove-null-from-object.ts","src/common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter.ts","src/common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter.ts","src/common/datatable/datatable-filters/search-input-with-filters/filter-suggestions/filter-suggestions.component.html","src/common/datatable/datatable-filters/search-input-with-filters/filter-suggestions/filter-suggestions.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/select-model-control/select-model-control.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/select-model-control/select-model-control.component.ts","src/common/datatable/datatable-filters/filter-operator-names.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/operator-select/operator-display-name.pipe.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/operator-select/operator-select.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/operator-select/operator-select.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filter/active-filter.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filter/active-filter.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filters.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filters.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.component.html","src/common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.module.ts","src/common/datatable/datatable.module.ts","src/common/shared/paginator.service.ts","src/common/datatable/utils/sort-datatable-data.ts","src/common/datatable/utils/filter-datatable-data.ts","src/common/datatable/datatable.service.ts","src/common/datatable/delete-resource-message.ts","src/common/datatable/table-sort-header/table-sort-header.component.ts","src/common/datatable/table-sort-header/table-sort-header.component.html","src/common/uploads/directives/upload-button.directive.ts","src/common/uploads/formatted-file-size.pipe.ts","src/common/uploads/upload-queue/upload-queue-item.ts","src/common/uploads/validation/default-upload-validator.ts","src/common/uploads/upload-queue/upload-queue.service.ts","src/common/uploads/uploads.module.ts","src/common/uploads/utils/download-file-from-url.ts","src/common/uploads/validation/validations/allowed-extensions-validation.ts","src/common/uploads/validation/validations/blocked-extensions-validation.ts","src/common/workspaces/workspace-config.ts","src/common/workspaces/workspaces.service.ts","src/common/workspaces/types/workspace-invite-notif.ts"],"names":["_c0","MatAutocomplete_ng_template_0_Template","rf","ctx","ɵngcc0","formFieldId_r1","id","ctx_r0","_classList","ariaLabel","_getPanelAriaLabelledby","_c1","_uniqueAutocompleteIdCounter","MatAutocompleteSelectedEvent","constructor","source","option","this","MatAutocompleteBase","_MatAutocompleteMixinBase","mixinDisableRipple","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS","InjectionToken","providedIn","factory","autoActiveFirstOption","_MatAutocompleteBase","_changeDetectorRef","_elementRef","defaults","platform","super","_activeOptionChanges","Subscription","showPanel","_isOpen","displayWith","optionSelected","EventEmitter","opened","closed","optionActivated","inertGroups","SAFARI","_autoActiveFirstOption","value","coerceBooleanProperty","length","coerceStringArray","reduce","classList","className","_setVisibilityClasses","nativeElement","ngAfterContentInit","_keyManager","ActiveDescendantKeyManager","options","withWrap","change","subscribe","index","emit","toArray","_setVisibility","ngOnDestroy","unsubscribe","_setScrollTop","scrollTop","panel","_getScrollTop","markForCheck","_emitSelectEvent","event","labelId","ariaLabelledby","_visibleClass","_hiddenClass","ɵfac","t","ɵngcc1","ɵdir","type","viewQuery","TemplateRef","_t","template","first","inputs","panelWidth","outputs","features","MatAutocomplete","arguments","ɵMatAutocomplete_BaseFactory","ɵcmp","selectors","contentQueries","dirIndex","MAT_OPTGROUP","MatOption","optionGroups","hostAttrs","disableRipple","exportAs","provide","MAT_OPTION_PARENT_COMPONENT","useExisting","ngContentSelectors","decls","vars","consts","directives","ɵngcc2","styles","encapsulation","changeDetection","MAT_AUTOCOMPLETE_SCROLL_STRATEGY","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER","deps","Overlay","useFactory","overlay","scrollStrategies","reposition","MAT_AUTOCOMPLETE_VALUE_ACCESSOR","NG_VALUE_ACCESSOR","forwardRef","MatAutocompleteTrigger","multi","_MatAutocompleteTriggerBase","_element","_overlay","_viewContainerRef","_zone","scrollStrategy","_dir","_formField","_document","_viewportRuler","_defaults","_componentDestroyed","_autocompleteDisabled","_manuallyFloatingLabel","_viewportSubscription","_canOpenOnNextFocus","_closeKeyEventStream","Subject","_windowBlurHandler","activeElement","panelOpen","_onChange","_onTouched","position","autocompleteAttribute","_overlayAttached","optionSelections","defer","autocomplete","merge","map","onSelectionChange","onStable","pipe","take","switchMap","_scrollStrategy","ngAfterViewInit","window","_getWindow","runOutsideAngular","addEventListener","ngOnChanges","changes","_positionStrategy","_setStrategyPositions","_overlayRef","updatePosition","removeEventListener","_destroyPanel","complete","openPanel","_attachOverlay","_floatLabel","closePanel","_resetLabel","hasAttached","detach","_closingActionsSubscription","detectChanges","tabOut","filter","_getOutsideClickStream","detachments","of","MatOptionSelectionChange","activeItem","fromEvent","clickTarget","_isInsideShadowRoot","composedPath","target","formField","customOrigin","connectedTo","elementRef","contains","overlayElement","writeValue","Promise","resolve","then","_setTriggerValue","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","disabled","_handleKeydown","keyCode","ESCAPE","hasModifierKey","preventDefault","activeOption","ENTER","_selectViaInteraction","_resetActiveItem","prevActiveItem","isArrowKey","UP_ARROW","DOWN_ARROW","TAB","onKeydown","_canOpen","_scrollToOption","activeItemIndex","_handleInput","parseFloat","_previousValue","_handleFocus","shouldAnimate","floatLabel","_animateAndLockLabel","_subscribeToClosingActions","firstStable","optionChanges","tap","reapplyLastPosition","delay","wasOpen","panelClosingActions","_setValueAndClose","dispose","toDisplay","inputValue","_control","_clearPreviousSelectedOption","focus","skip","forEach","selected","deselect","_a","_getShadowRoot","overlayRef","setOrigin","_getConnectedElement","updateSize","width","_getPanelWidth","_portal","TemplatePortal","getLabelId","create","_getOverlayConfig","keydownEvents","next","stopPropagation","attach","OverlayConfig","positionStrategy","_getOverlayPosition","direction","panelClass","overlayPanelClass","strategy","flexibleConnectedTo","withFlexibleDimensions","withPush","belowPositions","originX","originY","overlayX","overlayY","_aboveClass","abovePositions","positions","withPositions","getConnectedOverlayOrigin","_getHostWidth","getBoundingClientRect","setFirstItemActive","setActiveItem","element","readOnly","defaultView","labelCount","_countGroupLabelsBeforeOption","_getHostElement","newScrollPosition","_getOptionScrollPosition","offsetTop","offsetHeight","ɵngcc3","ɵngcc4","MAT_FORM_FIELD","DOCUMENT","ɵngcc5","autocompleteDisabled","ɵMatAutocompleteTrigger_BaseFactory","hostVars","hostBindings","$event","toString","MatAutocompleteModule","ɵmod","ɵinj","providers","imports","OverlayModule","MatOptionModule","MatCommonModule","CommonModule","CdkScrollableModule","MAT_CHIP_REMOVE","MAT_CHIP_AVATAR","MAT_CHIP_TRAILING_ICON","MatChipBase","_MatChipMixinBase","mixinTabIndex","mixinColor","MatChip","_ngZone","globalRippleOptions","animationMode","tabIndex","_hasFocus","chipListSelectable","_chipListMultiple","_chipListDisabled","_selected","_selectable","_disabled","_removable","_onFocus","_onBlur","selectionChange","destroyed","removed","_addHostClassName","_chipRippleTarget","createElement","add","appendChild","_chipRipple","RippleRenderer","setupTriggerEvents","rippleConfig","_animationsDisabled","parseInt","coercedValue","_dispatchSelectionChange","undefined","_value","textContent","selectable","hasAttribute","tagName","toLowerCase","chip","_removeTriggerEvents","select","selectViaInteraction","toggleSelected","isUserInput","remove","removable","_handleClick","DELETE","BACKSPACE","SPACE","_blur","run","MAT_RIPPLE_GLOBAL_OPTIONS","ANIMATION_MODULE_TYPE","avatar","trailingIcon","removeIcon","ariaSelected","color","MatChipRemove","_parentChip","nodeName","setAttribute","parentChip","MAT_CHIPS_DEFAULT_OPTIONS","MatChipListBase","_defaultErrorStateMatcher","_parentForm","_parentFormGroup","ngControl","_MatChipListMixinBase","mixinErrorState","nextUniqueId","MatChipListChange","MatChipList","controlType","_lastDestroyedChipIndex","_destroyed","_uid","_tabIndex","_userTabIndex","_multiple","_compareWith","o1","o2","_required","ariaOrientation","valueChange","valueAccessor","multiple","_selectionModel","empty","_syncChipsState","_initializeSelection","_chipInput","stateChanges","placeholder","_placeholder","focused","_hasFocusedChip","chips","FocusKeyManager","withVerticalOrientation","withHomeAndEnd","withHorizontalOrientation","takeUntil","dir","_allowFocusEscape","startWith","_resetChips","_updateTabIndex","_updateFocusForDestroyedChips","ngOnInit","SelectionModel","ngDoCheck","updateErrorState","_dropSubscriptions","registerInput","inputElement","setDescribedByIds","ids","_ariaDescribedby","join","_setSelectionByValue","onContainerClick","_originatesFromChip","_focusInput","_keydown","_isInputEmpty","setLastItemActive","newChipIndex","Math","min","_isValidIndex","_clearSelection","Array","isArray","currentValue","_selectValue","_sortValues","correspondingChip","find","clear","_propagateChanges","fallbackValue","valueToEmit","setTimeout","_markAsTouched","_listenToChipsFocus","_listenToChipsSelection","_listenToChipsRemoved","_chipFocusSubscription","_chipBlurSubscription","_chipSelectionSubscription","_chipRemoveSubscription","chipSelectionChanges","isSelected","chipFocusChanges","chipIndex","indexOf","updateActiveItem","chipBlurChanges","chipRemoveChanges","currentElement","parentElement","some","role","required","errorState","compareWith","errorStateMatcher","MatFormFieldControl","nextUniqueId$1","MatChipInput","_defaultOptions","_addOnBlur","separatorKeyCodes","chipEnd","_inputElement","_chipList","_emitChipEnd","addOnBlur","_focus","_isSeparatorKey","input","_onInput","Set","has","invalid","chipList","ɵ0","MatChipsModule","ErrorStateMatcher","useValue","MatFormFieldModule","ObserversModule","_c2","_c3","enterDuration","_c4","MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS","disableToggleValue","MAT_SLIDE_TOGGLE_VALUE_ACCESSOR","MatSlideToggle","MatSlideToggleChange","checked","MatSlideToggleBase","_MatSlideToggleMixinBase","mixinDisabled","_focusMonitor","_animationMode","_","_uniqueId","_checked","name","labelPosition","toggleChange","monitor","focusOrigin","stopMonitoring","_onChangeEvent","_emitChangeEvent","_onInputClick","origin","focusVia","toggle","_onLabelTextChange","_thumbEl","_thumbBarEl","_r0","_r4","inputId","trim","_MatSlideToggleRequiredValidatorModule","MatSlideToggleModule","MatRippleModule","module","exports","equal","a","b","i","keys","RegExp","flags","valueOf","Object","prototype","hasOwnProperty","call","key","DataView","require","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","entries","entry","set","get","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","setCacheAdd","setCacheHas","SetCache","values","__data__","push","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","data","size","root","Symbol","Uint8Array","WeakMap","array","iteratee","predicate","resIndex","result","baseIndexOf","comparator","baseTimes","isArguments","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","String","offset","baseAssignValue","eq","object","objValue","copyObject","keysIn","defineProperty","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isMap","isObject","isSet","cloneableTags","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","tag","isFunc","stacked","subValue","props","objectCreate","baseCreate","proto","fromIndex","fromRight","castPath","toKey","path","arrayPush","keysFunc","symbolsFunc","getRawTag","objectToString","symToStringTag","toStringTag","baseFindIndex","baseIsNaN","strictIndexOf","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","other","equalArrays","equalByTag","equalObjects","objectTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isFunction","isMasked","toSource","reIsHostCtor","reIsNative","Function","replace","test","isLength","typedArrayTags","baseMatches","baseMatchesProperty","identity","property","isPrototype","nativeKeys","nativeKeysIn","isProto","baseIsMatch","getMatchData","matchesStrictComparable","hasIn","isKey","isStrictComparable","baseGet","n","arrayMap","isSymbol","symbolProto","symbolToString","baseToString","func","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","includes","isCommon","seen","outer","computed","seenIndex","cache","stringToPath","arrayBuffer","byteLength","freeExports","nodeType","freeModule","Buffer","allocUnsafe","buffer","slice","copy","cloneArrayBuffer","dataView","byteOffset","reFlags","regexp","exec","lastIndex","symbolValueOf","symbol","typedArray","isNew","newValue","getSymbols","getSymbolsIn","noop","getNative","e","arraySome","isPartial","arrLength","othLength","arrStacked","othStacked","arrValue","othValue","compared","othIndex","mapToArray","message","convert","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","freeGlobal","global","baseGetAllKeys","isKeyable","baseIsNative","getValue","getPrototype","getPrototypeOf","objectProto","nativeObjectToString","isOwn","unmasked","arrayFilter","stubArray","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","Ctor","ctorString","hasFunc","nativeCreate","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","reIsUint","reIsDeepProp","reIsPlainProp","uid","coreJsData","maskSrcKey","IE_PROTO","assocIndexOf","splice","pop","getMapData","memoize","freeProcess","process","nodeUtil","types","binding","transform","arg","freeSelf","self","pairs","LARGE_ARRAY_SIZE","memoizeCapped","rePropName","reEscapeChar","string","charCodeAt","match","number","quote","subString","funcToString","CLONE_DEEP_FLAG","defaultValue","baseHasIn","hasPath","baseIsArguments","stubFalse","baseIsMap","baseUnary","nodeIsMap","baseIsSet","nodeIsSet","baseIsTypedArray","nodeIsTypedArray","arrayLikeKeys","baseKeys","isArrayLike","baseKeysIn","resolver","TypeError","memoized","args","apply","Cache","baseProperty","basePropertyDeep","baseIteratee","baseUniq","defaultThrottleConfig","leading","trailing","throttleTime","duration","scheduler","async","config","lift","ThrottleTimeOperator","subscriber","ThrottleTimeSubscriber","Subscriber","destination","_hasTrailingValue","_trailingValue","_next","throttled","schedule","dispatchNext","_complete","clearThrottle","LoadUserFolders","LoadUserSpaceUsage","BuildFolderTree","folders","OpenFolder","folder","OpenSearchPage","queryParams","SelectEntries","SelectAllEntries","DeselectAllEntries","DeleteSelectedEntries","OpenUploadsPanel","CloseUploadsPanel","AddEntries","MoveEntries","OpenDialog","dialog","OpenConfirmDialog","confirmAction","SetViewMode","mode","ToggleDetailsSidebar","ToggleSidebar","UploadFiles","files","RestoreTrashedEntries","DeleteTrashedEntriesForever","EmptyTrash","OpenFilePreview","DownloadEntries","link","password","AddStar","RemoveStar","RemoveEntries","LoadMoreEntries","loadMore","ReloadPageEntries","page","CopySelectedEntries","OpenUploadWindow","ShowLoadingToast","HideLoadingToast","ResetState","UpdateEntries","SetCurrentUser","user","SetWorkspace","workspace","UpdateEntryDescription","description","DrivePage","params","viewName","folderHash","hasActions","sortColumn","sortDirection","RECENT_PAGE","disableSort","recentOnly","SEARCH_PAGE","SHARES_PAGE","sharedOnly","TRASH_PAGE","deletedOnly","WORKSPACE_INDEX_PAGE","STARRED_PAGE","starredOnly","FolderPage","hash","RecentEntriesPageOpened","orderBy","FolderPageOpened","SharesFolderOpened","TrashPageOpened","WorkspacesIndexPageOpened","SearchPageOpened","StarredPageOpened","EntriesSelectedViaDrag","EntrySelectedViaContextMenu","EntryTapped","ctrlKey","EntryDoubleTapped","FileDeleteSuccess","deletedFiles","EntryContextMenuOpened","NewFolderCreated","EntryRenamed","newName","StartedDragging","StoppedDragging","MoveEntriesSuccess","oldLocation","MoveEntriesFailed","messages","TrashedEntriesDeleteSuccess","TrashedEntriesRestoreSuccess","NotEnoughSpaceError","UserSpaceUsageChanged","BreakpointChanged","status","DRIVE_STATE_MODEL_DEFAULTS","isMobile","activePage","folderTree","flatFolders","userFoldersLoaded","selectedEntries","dragging","loading","uploadsPanelOpen","viewMode","detailsVisible","sidebarOpen","currentUser","activeWorkspace","spaceUsage","available","used","meta","currentPage","lastPage","LoadingToastMessages","DRIVE_UPLOAD_INPUT_CONFIG","FOLDERS_API_ROUTES","FoldersApiService","http","GET_ALL","post","CREATE","DriveEntryApiService","userId","entryId","put","delete","emptyTrash","entryIds","DriveUrlsService","driveRoot","DriveUploadValidator","DEFAULT_MAX_FILE_SIZE_MB","validations","maxSize","getMaxFileSize","i18n","allowedExtensions","getAllowedExtensions","blockedExtensions","getBlockedExtensions","extensions","settings","convertToBytes","getJson","DriveState","foldersApi","entriesApi","router","driveUrls","uploads","store","localStore","validator","workspaces","toast","uploadInputConfig","state","parent_id","f","rootFolder","every","tags","spaceUsed","spaceAvail","permission","folderUser","users","u","owns_entry","entry_permissions","activeFolder","userHasPermission","edit","workspace_id","member","is_owner","permissions","findIndex","p","getAllForCurrentUser","response","patchState","dispatch","action","getState","tree","hashTable","len","children","treeHash","parent","oldState","newState","orderDir","query","filters","transformQueryParams","getEntriesForFolder","concat","last_page","current_page","currentFolder","deleted_at","title","body","ok","navigate","current","alreadySelected","curr","entryDoubleTapped","selectSnapshot","selectedEntryIds","actions","selectedEntryParent","canMoveEntriesTo","moveEntries","finalize","errResponse","errors","currentEntries","newEntries","newSize","sum","file_size","enoughSpaceLeftToUpload","destinationId","start","httpParams","parentId","fileEntry","all_parents","newEntry","deleteForever","restoredEntries","restore","addStar","removeStar","removeTag","open","replacements","count","copyEntries","location","activeWorkspace$","directory","getSpaceUsage","mainEntries","updatedEntry","mainIndex","selectedIndex","update","setState","folderId","file","movingEntries","startsWith","cancelUncompleted","selectedEntry","selectedEntryOrActiveFolder","userSpaceUsed","userSpaceAvailable","SUPPORTED_ENTRY_TYPES","FileIconComponent","mime","split","EntryDragPreviewComponent","DRIVE_ENTRY_FULL_PERMISSIONS","view","download","SharesApiService","SetInitialUsers","UpdateUserPermissions","RemoveUser","SetUsers","ShareEntries","payload","ShareEntriesFailed","ShareDialogState","sharesApi","usersWithAccess","original","loadingUsers","all","uniqueUsers","assign","varies","toggleUserLoading","changePermissions","updateUsers","detachUser","shareEntries","updateEntriesInDriveStore","errorResponse","isLoading","newUsers","updatedEntries","SharingPermissionsButtonComponent","api","compact","updateUserPermissions","newPermissions","selectPermission","EntriesAccessTableComponent","x","ShareDialogComponent","dialogRef","actions$","destroyed$","suggestUserEmails","getAll","perPage","email","resetModel","bindToShareError","bindToShareModel","emails","shareModel","setErrorMessages","valueChanges","ShareableLinksApiService","linkId","LoadShareableLink","UpdateShareableLink","CreateShareableLink","DeleteShareableLink","ToggleOptionsPanel","LinkCopySuccess","ResetShareLinkState","defaultState","optionsPanelVisible","backendErrors","linkOptions","allowDownload","allowEdit","expiresAt","ShareLinkState","linksApi","entry_id","cachedLink","findByEntryId","autoCreate","LinkOptionsComponent","form","date","time","passwordVisible","expirationVisible","bindToLinkChange","getPayload","link$","hydrateExpirationForm","setValue","expires_at","patchValue","allow_edit","allow_download","parts","substr","Date","toJSON","saveChanges","toggleOptionsPanel","ShareLinkDialogComponent","shareableLink$","subscriptions","bindToOptionsPanelToggle","s","close","focusInput","getBaseUrl","sub","optionsVisible","network","image","url","base","href","left","innerWidth","top","innerHeight","document","getElementById","height","padding","opacity","overflow","CrupdateFolderDialogComponent","folderName","setErrors","confirm","FlatTreeControl","expansionModel","dataNode","_trackByValue","expand","collapse","isExpanded","toggleDescendants","collapseDescendants","expandDescendants","collapseAll","toBeProcessed","getDescendants","trackBy","getLevel","isExpandable","results","dataNodes","expandAll","node","CDK_TREE_NODE_OUTLET_NODE","CdkTreeNodeOutlet","viewContainer","_node","CdkTreeNodeOutletContext","$implicit","CdkTreeNodeDef","when","CdkTree","_differs","_onDestroy","_levels","viewChange","BehaviorSubject","end","Number","MAX_VALUE","_dataSource","dataSource","_switchDataSource","_dataDiffer","_nodeOutlet","disconnect","_dataSubscription","ngAfterContentChecked","defaultNodeDefs","_nodeDefs","def","_defaultNodeDef","_observeRenderChanges","dataStream","isDataSource","connect","isObservable","renderNodeChanges","dataDiffer","parentData","diff","forEachOperation","item","adjustedPreviousIndex","currentIndex","previousIndex","insertNode","move","_getNodeDef","nodeData","context","level","treeControl","createEmbeddedView","CdkTreeNode","mostRecentTreeNode","_tree","_dataChanges","_role","_data","_setRoleFromData","_setExpanded","_expanded","_isAriaExpanded","_parentNodeAriaLevel","nodeElement","isNodeElement","coerceNumberProperty","getAttribute","cssUnitPattern","CdkTreeNodePadding","_treeNode","indentUnits","_indent","_setPadding","_level","_setLevelInput","indent","_setIndentInput","_paddingIndent","nodeLevel","forceChange","_currentPadding","paddingProp","resetProp","style","units","CdkTreeNodeToggle","_recursive","_toggle","recursive","CdkTreeModule","_MatTreeNodeMixinBase","MatTreeNode","MatTreeNodeDef","ɵMatTreeNodeDef_BaseFactory","MatTreeNodePadding","ɵMatTreeNodePadding_BaseFactory","MatTreeNodeOutlet","MatTree","ɵMatTree_BaseFactory","MatTreeNodeToggle","ɵMatTreeNodeToggle_BaseFactory","MatTreeModule","MatTreeFlattener","transformFunction","getChildren","_flattenNode","resultNodes","parentMap","flatNode","childrenNodes","_flattenChildren","child","childParentMap","flattenNodes","structuredData","expandFlattenedNodes","nodes","currentExpand","MatTreeFlatDataSource","DataSource","_treeControl","_treeFlattener","initialData","_flattenedData","_expandedData","collectionViewer","changed","FoldersTreeService","createTreeFlattener","createTreeControl","createTreeDataSource","items","flattener","transformer","control","expandable","AVAILABLE_CONTEXT_MENUS","ContextMenuRef","backdropClick","attachments","backdropElement","CONTEXT_MENU_DATA","ContextMenu","zone","injector","events","component","createOverlay","openContextMenu","portal","bindEventsToOverlay","removeLastOrigin","getMenuPositionStrategy","hasBackdrop","backdropClass","contextMenuElement","createOriginFromEvent","primary","lastOrigin","HTMLElement","EventTarget","clientY","offsetY","clientX","offsetX","ContextMenuDirective","el","contextMenu","_availableMenus","disableContextMenu","availableMenus","getMenuComponent","getMenuData","BaseDropTarget","subs","onDragStart","onDragEnd","enter","onDragEnter","leave","onDragLeave","classes","canDrop","active","removeDragOverClass","executeAction","FolderDropTargetDirective","FoldersTreeComponent","expanded","showRootNode","folderSelected","selectedFolderId$","sub1","userFolders","fs","sub2","MoveEntriesDialogComponent","destination$","loading$","canMove$","failure","success","RenameEntryDialogComponent","entryName","DriveContextActions","updateStatus","multipleEntriesSelected","allStarred","allSelectedEntriesStarred","onlyFoldersSelected","getSelectedFolder","getSelectedEntries","EntryActions","icon","showInCompact","execute","visible","hasPermission","autoFocus","separatorBefore","openUploadWindow","FolderActions","noopTrue","SharesActions","shares","TrashActions","bodyBold","TrashPageActions","DriveDomCacheService","MainSearchbarComponent","driveApi","currentUSer","label","operator","defaultOperator","searchControl","filterChange$","metaSub","searchEl","combineLatest","distinctUntilChanged","debounceTime","oldParams","inSearchPage","routerState","snapshot","openSearchPage","mapTo","MapToOperator","MapToSubscriber","MatDrawerContainer_div_0_Template","_r3","_onBackdropClicked","_isShowingBackdrop","MatDrawerContainer_mat_drawer_content_3_Template","MatSidenavContainer_div_0_Template","MatSidenavContainer_mat_sidenav_content_3_Template","_c5","matDrawerAnimations","transformDrawer","trigger","transition","animate","MAT_DRAWER_DEFAULT_AUTOSIZE","MAT_DRAWER_CONTAINER","MatDrawerContent","CdkScrollable","_container","scrollDispatcher","ngZone","_contentMarginChanges","MatDrawerContainer","_contentMargins","right","MatDrawer","_focusTrapFactory","_platform","_doc","_elementFocusedBeforeDrawerWasOpened","_enableAnimations","_position","_mode","_disableClose","_opened","_animationStarted","_animationEnd","_animationState","openedChange","_openedStream","o","openedStart","fromState","toState","_closedStream","closedStart","onPositionChanged","_modeChanged","_takeFocus","_isFocusWithinDrawer","_restoreFocus","disableClose","y","_updateFocusTrapState","_autoFocus","_focusTrap","focusInitialElementWhenReady","hasMovedFocus","_openedVia","blur","activeEl","isBrowser","destroy","openedVia","_closeViaBackdropClick","_setOpen","isOpen","restoreFocus","_getWidth","offsetWidth","enabled","_animationStartListener","_animationDoneListener","animation","viewportRuler","defaultAutosize","_drawers","QueryList","_doCheckSubject","_validateDrawers","updateContentMargins","_autosize","_start","_end","_backdropOverride","_userContent","_content","_allDrawers","drawer","reset","notifyOnChanges","_watchDrawerToggle","_watchDrawerPosition","_watchDrawerMode","_isDrawerOpen","_left","_right","_isPushed","_setContainerClass","onMicrotaskEmpty","isAdd","_closeModalDrawersViaBackdrop","_canHaveBackdrop","autosize","MatSidenavContent","changeDetectorRef","container","MatSidenavContainer","MatSidenav","_fixedInViewport","_fixedTopGap","_fixedBottomGap","ɵMatSidenav_BaseFactory","fixedInViewport","fixedTopGap","fixedBottomGap","ɵMatSidenavContainer_BaseFactory","MatSidenavModule","PlatformModule","SidebarActionButtonsComponent","openUploadsPanel","openNewFolderDialog","canUpload","AvailableSpaceIndicatorComponent","spaceUsedPercent","WorkspaceSelectorComponent","modal","vcr","cd","indexUserWorkspaces","m","WorkspaceModule","components","crupdateModal","viewContainerRef","manageMembers","menuTrigger","closeMenu","resource","afterClosed","confirmed","SidebarComponent","urls","openFolder","EntryDescriptionPanelComponent","editingDescription$","savingDescription$","textArea","queryList","FileThumbnailComponent","thumbnail","separator","DetailsPanelComponent","owner$","DetailsSidebarComponent","FilesGridItemComponent","driveEntry","FilesDragSelectService","initial","cacheClientRects","createSelectBox","bindScroll","gridElements","getGridElements","hammerToRelative","scrollCont","selectBox","lastPanEvent","resizeBox","removeSelectBox","dispatchSelectedAction","unbindScroll","newPos","getNewSelectorPosition","scrollAndRepositionSelector","selectIntersectingElements","tmp","x1","y1","x2","y2","bottom","area","rectToRelative","filesContRect","edge","reachedAreaEdge","scrollBy","scrollDiff","scrollValue","abs","scrollHeight","applyPosition","selectedBoxRect","gridItem","rect","center","dataset","filesCont","scrollContRect","from","querySelectorAll","scrollListener","DragEntryService","domCache","dragPreview","DriveHammerInteractionsDirective","dragSelect","dragEntry","bindToHammer","hammerManager","enable","createHammerManager","onPanStart","onPan","onPanEnd","onTap","onDoubleTap","Hammer","Manager","Tap","pan","Pan","doubleTap","taps","recognizeWith","on","gridElement","getEntryEl","panService","getEntryByEl","en","entryEl","srcEvent","metaKey","closest","ToggleSelectedClassDirective","els","readDirRecursive","readEntriesRecursive","createReader","childEntry","isDirectory","transformFileEntry","reader","allEntries","readEntries","fullPath","UploadDropzoneDirective","disableDropzoneClick","disableDropzone","uploadConfig","filesDropped","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","clickButton","handleClick","removeClassesFromDropzone","emitUploadEvent","dropzoneDisabled","dataTransfer","dropEffect","newEl","elementFromPoint","kind","webkitGetAsEntry","hasFiles","InfiniteScroll","threshold","scrollSub","getScrollContainer","capture","passive","onScroll","canLoadMore","targetCanScroll","scrollY","documentElement","loadMoreItems","DriveInfiniteScrollDirective","canLoadMoreEntries","DriveContextMenuComponent","EntryBreadcrumbsComponent","breadcrumb","foldersLoaded","bindToActivePage","activePageSub","breadcrumbs","getRootBreadcrumb","folderPath","getBreadcrumbForFolder","allFolders","pathFolder","workspaceId","activeId$","ROOT_FOLDER_PAGE","userOwnsActiveFolder","generateBreadCrumb","DriveToolbarComponent","AVAILABLE_SORTS","DEFAULT_VALUE","column","EntriesSortButtonComponent","btnDisabled","availableSorts","sort$","propagateChange","sort","ContextActionsContainerComponent","hasMoreActions$","subscription","combined","setActions","moreActionsButton","getActions","setActionsForEntry","isOwner","userOwnsSelectedEntries","ToolbarActionsComponent","toggleViewMode","ToggleDetails","anythingSelected","detailsOpen","FileListHeaderComponent","sortFormControl","emitEvent","DriveComponent","route","localStorage","breakpoints","setViewMode","cacheDemoElements","observeBreakpointChanges","bindToWorkspace","getModel","model$","filesContainer","scrollContainer","observe","matches","sub3","w","bindToNotificationClick","toggleSidebar","uploadFiles","FilesGridComponent","disableInteractions","FilesListComponent","datatable","init","v","NoRecentEntriesComponent","NoTrashedEntriesComponent","NoStarredEntriesComponent","NoSharedEntriesComponent","NoSearchEntriesComponent","noQueryOrFilters$","UploadDropzoneComponent","NoFolderEntriesComponent","EntriesContainerComponent","keybinds","tabindex","keybindSub","listenOn","addWithPreventDefault","activePageName","entriesEmpty","CURRENT_PREVIEW_FILE","PREVIEW_URL_TRANSFORMER","BaseFilePreview","sanitizer","filePreviewWrapper","bypassSecurityTrustResourceUrl","getSrc","responseType","DefaultPreviewComponent","TextPreviewComponent","content$","fileTooLarge$","loadFileContents","getContents","content","AudioPreviewComponent","invalidMedia","canPlayVideo","src","player","play","canPlayType","playerEl","VideoPreviewComponent","ImagePreviewComponent","PdfPreviewComponent","GoogleDocsViewerComponent","showDefaultPreview$","showDefaultPreview","iframe","onload","clearTimeout","timeoutRef","stopLoading","getIframeSrc","catch","reject","previewUrl","preview_token","getFullPreviewUrl","encodeURIComponent","AVAILABLE_PREVIEWS","DefaultPreviews","text","video","audio","pdf","spreadsheet","powerPoint","word","PreviewFilesService","availablePreviews","previewUriTransformer","asObservable","haveNext","updateMeta","updatePortal","havePrevious","newPointer","oldPointer","pointer","total","getCurrent","createInjector","activeFile","injectionTokens","LinkPreviewPasswordPanelComponent","links","passwordControl","passwordError$","passwordValid","checkPassword","handlePasswordCheck","submitPassword","previewFiles","FilePreviewToolbarComponent","showLogo","disableDownload","showCloseButton","PreviewContainerComponent","downloadSub","comp","instance","FilePreviewOverlayComponent","bindToDownload","previewContainer","optionsButton","shareableLink","closeOverlay","FolderPreviewComponent","linkApi","breadcrumb$","pagination$","loadChildren","generateBreadcrumb","setPagination","folderChildren","ent","activeEntry","hideMoreOptionsBtn","getEntry","openPreviewOverlay","makeLinkHash","subFolder","replaceChildren","order","findByHash","withEntries","pagination","onClick","LinkPreviewContainerComponent","data$","passwordPanelVisible$","linkChanged","setBackgroundClass","togglePasswordPanel","showPreview","importEntry","dashboardRoutes","canActivate","WorkspaceWrapperModule","DriveRoutingModule","MatProgressSpinner__svg_circle_1_Template","_spinnerAnimationLabel","_getStrokeDashOffset","_getStrokeCircumference","_getCircleStrokeWidth","_getCircleRadius","MatProgressSpinner__svg_circle_2_Template","ctx_r1","MatSpinner__svg_circle_1_Template","MatSpinner__svg_circle_2_Template","MatProgressSpinnerBase","_MatProgressSpinnerMixinBase","MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS","diameter","MatProgressSpinner","_diameter","_fallbackAnimation","trackedDiameters","_diameters","_getSpinnerAnimationLabel","head","EDGE","TRIDENT","_noopAnimations","_forceAnimations","strokeWidth","_styleRoot","_attachStyleNode","_strokeWidth","max","_getViewBox","viewBox","PI","styleRoot","currentDiameter","diameters","diametersForElement","styleTag","_getAnimationText","strokeCircumference","MatSpinner","MatProgressSpinnerModule","DRIVE_CONTEXT_MENUS","OverlayHandler","DownloadHandler","getDownloadUrl","hashes","getEntryHashes","LoadingToastComponent","ToastHandler","entriesDeleted","entriesStarred","entriesUnstarred","entriesMoveFailed","folderCreated","entriesMoved","entriesDeletedForever","entriesRestoredFromTrash","entryRenamed","linkCopiedToClipboard","notEnoughSpace","loadingToast","onAction","oldName","toastRef","openComponent","dismiss","UploadsPanelItemComponent","uploadQueue","progress","upload","progress$","animationFrame","isEmpty","UploadsPanelComponent","activeUploads","minimized$","toggleMinimized","overlayConfig","mobilePosition","UploadPanelHandler","overlayPanel","closeUploadsPanel","uploadPanelRef","DialogHandler","openConfirmDialog","beforeClosed","SharingModule","ResetScrollHandler","scrollTo","PageChangeHandler","PageLoadHandler","urlAfterRedirects","isLoggedIn","getPageLoadAction","getPageUriParams","pageName","search","firstChild","uri","RemoveStarHandler","ContextMenuModule","FilePreviewModule","useClass","WorkspaceSelectorModule","STATE_HANDLERS","DriveModule","handler","ext","FILE_ENTRY_TYPE_FILTER","FILE_ENTRY_INDEX_FILTERS","FindUserModalComponent","searchFormControl","users$","searchUsers","normalizeUser","display_name","model_type","Keycodes","Keybinds","bindings","callback","keybind","parseKeybindString","keybindString","fireIfInputFocused","executeBindings","bindingMatches","toUpperCase","ctrl","shiftKey","shift","parsed","part","ChipInputComponent","emailsInput","selectMode","formControl","items$","suggestedValues$","suggestFn","bindToSearchControl","parseEmailsOnPaste","propagate","matAutocomplete","duplicate","findValueIndex","inputEl","filtered","clipboardData","getData","selection","getSelection","rangeCount","deleteFromDocument","addFromAutocomplete","ChipsModule","SKELETON_ANIMATIONS","SkeletonComponent","theme","variant","dark","isDarkMode","SkeletonModule","hasKey","val","removeNullFromObject","obj","DatatableFilter","FilterOperator","FilterControlType","Select","inputType","operators","componentData","ALL_PRIMITIVE_OPERATORS","ne","gt","gte","lt","lte","TimestampFilter","toISOString","CreatedAtFilter","UpdatedAtFilter","filterSelected","FilterSuggestionsComponent","originalOrder","anyFocused","k","filterKey","SelectModelControlComponent","value$","openSelectModelDialog","model","FILTER_OPERATOR_NAMES","doesntHave","OperatorDisplayNamePipe","isMobile$","OperatorSelectComponent","resizeSelect","ActiveFilterComponent","compareFilterValueFn","val1","val2","resizeInput","valueInput","ActiveFiltersComponent","fb","opts","group","controls","addControl","last","focusValueInput","removeControl","removeByKey","controlKey","getFocusedIndex","previous","SearchInputWithFiltersComponent","filterChange","inputFocus","filterBarHeight","filterDropdownVisible$","keyedFilters","haveFiltersOrQuery$","watchForSizeChanges","setFiltersFromQuery","setupKeybinds","subscribeToCloseActions","bindToFormValueChange","activeFilters","searchInput","closeActionsStream$","searchInputIsFocused","selectionStart","formData","encodeFilterFormData","ResizeObserver","contentRect","box","qp","decodeFilterString","filterValue","cursorAtStartOfSearchInput","focusLast","removeCurrentlyFocused","focusPrevious","getByIndex","lastIsFocused","cursorAtEndOfSearchInput","suggestions","toggleFilterDropdown","newIndex","focusItemAt","getFocusedFilter","addFilterFromDropdownClick","btoa","JSON","stringify","filterString","filtersFromQuery","parse","atob","decodeURIComponent","SearchInputWithFiltersModule","DatatableModule","Paginator","params$","paginatedOnce$","response$","dontUpdateQueryParams","perPageCacheKey","noResults$","r","userParams","currentQueryParams","per_page","paginate","cursor","next_cursor","prev_cursor","newPerPage","firstPagination","updateQueryParams","replaceUrl","sortingDataAccessor","sortHeaderId","numberValue","filterDatatableData","dataStr","objectToStr","transformedFilter","currentTerm","DatatableService","filters$","searchTerm$","staticParams$","paginator","ignoreNextParamChange","originalData$","selectedRows$","tableData","staticParams","connectToPaginator","initialSearchTerm","searchControlSub","mainSub","applyLocalTransforms","paginatorSub","pairwise","prev","infiniteScroll","valueA","valueB","valueAType","valueBType","comparatorResult","cmp","modifiedResource","DELETE_RESOURCE_MESSAGE","TableSortHeaderComponent","datable","focusMonitor","arrowVisible","arrowDirection","columnName","sortSub","onMouseLeave","getDirection","changeSort","UploadButtonDirective","filesSelected","FormattedFileSizePipe","bytes","precision","isNaN","isFinite","UploadQueueItem","queueId","canceled$","processing$","uploadedResponse$","ReplaySubject","percentage","error$","customData","uploadedFile","completed","setProgress","eta","DefaultUploadValidator","showToast","UploadQueueService","defaultValidator","uploads$","totalProgress$","uploadsAdded$","count$","pending","queueItem","c","uploadQueueItems","transformUploads","transformed","updateCount","mergeMap","uploadQueueItem","catchError","handleUploadFailure","bubbleError","throwError","E","handleUploadEvent","willProcessFiles","queueItemId","speed","totalBytes","completedBytes","updateTotalProgress","addError","cancel","activeUpload","validate","failed","errorMessage","updateProgress","completeUpload","msg","showLearnMoreButton","isAdmin","errorUpload","inProgress","UploadsModule","downloadFileFromUrl","click","removeChild","AllowedExtensionsValidation","extension","BlockedExtensionsValidation","WORKSPACE_CONFIG","PERSONAL_WORKSPACE","default","WorkspacesService","cookie","notifications","available$","getIdFromCookie","cookieName","BASE_URI","pushAndSelect","inviteId","roleId","memberId","member_id","clickedOnNotification$","notification","err","handleWorkspaceInviteClickError","deleteInvite","notif"],"mappings":"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","sourceRoot":"webpack:///","sourcesContent":["import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty, coerceStringArray } from '@angular/cdk/coercion';\nimport { Platform, _getShadowRoot } from '@angular/cdk/platform';\nimport { InjectionToken, EventEmitter, Directive, ChangeDetectorRef, ElementRef, Inject, ViewChild, TemplateRef, Input, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, ContentChildren, forwardRef, ViewContainerRef, NgZone, Optional, Host, NgModule } from '@angular/core';\nimport { mixinDisableRipple, MAT_OPTION_PARENT_COMPONENT, MAT_OPTGROUP, MatOption, MatOptionSelectionChange, _countGroupLabelsBeforeOption, _getOptionScrollPosition, MatOptionModule, MatCommonModule } from '@angular/material/core';\nimport { Subscription, Subject, defer, merge, of, fromEvent } from 'rxjs';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';\nimport { ViewportRuler, CdkScrollableModule } from '@angular/cdk/scrolling';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { ESCAPE, hasModifierKey, ENTER, UP_ARROW, DOWN_ARROW, TAB } from '@angular/cdk/keycodes';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatFormField, MAT_FORM_FIELD } from '@angular/material/form-field';\nimport { take, switchMap, filter, map, tap, delay } from 'rxjs/operators';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Autocomplete IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/platform';\nimport * as ɵngcc2 from '@angular/common';\nimport * as ɵngcc3 from '@angular/cdk/overlay';\nimport * as ɵngcc4 from '@angular/cdk/bidi';\nimport * as ɵngcc5 from '@angular/cdk/scrolling';\nimport * as ɵngcc6 from '@angular/material/form-field';\n\nconst _c0 = [\"panel\"];\nfunction MatAutocomplete_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 0, 1);\n ɵngcc0.ɵɵprojection(2);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const formFieldId_r1 = ctx.id;\n const ctx_r0 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"id\", ctx_r0.id)(\"ngClass\", ctx_r0._classList);\n ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r0.ariaLabel || null)(\"aria-labelledby\", ctx_r0._getPanelAriaLabelledby(formFieldId_r1));\n} }\nconst _c1 = [\"*\"];\nlet _uniqueAutocompleteIdCounter = 0;\n/** Event object that is emitted when an autocomplete option is selected. */\nclass MatAutocompleteSelectedEvent {\n constructor(\n /** Reference to the autocomplete panel that emitted the event. */\n source, \n /** Option that was selected. */\n option) {\n this.source = source;\n this.option = option;\n }\n}\n// Boilerplate for applying mixins to MatAutocomplete.\n/** @docs-private */\nclass MatAutocompleteBase {\n}\nconst _MatAutocompleteMixinBase = mixinDisableRipple(MatAutocompleteBase);\n/** Injection token to be used to override the default options for `mat-autocomplete`. */\nconst MAT_AUTOCOMPLETE_DEFAULT_OPTIONS = new InjectionToken('mat-autocomplete-default-options', {\n providedIn: 'root',\n factory: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY,\n});\n/** @docs-private */\nfunction MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY() {\n return { autoActiveFirstOption: false };\n}\n/** Base class with all of the `MatAutocomplete` functionality. */\nclass _MatAutocompleteBase extends _MatAutocompleteMixinBase {\n constructor(_changeDetectorRef, _elementRef, defaults, platform) {\n super();\n this._changeDetectorRef = _changeDetectorRef;\n this._elementRef = _elementRef;\n this._activeOptionChanges = Subscription.EMPTY;\n /** Whether the autocomplete panel should be visible, depending on option length. */\n this.showPanel = false;\n this._isOpen = false;\n /** Function that maps an option's control value to its display value in the trigger. */\n this.displayWith = null;\n /** Event that is emitted whenever an option from the list is selected. */\n this.optionSelected = new EventEmitter();\n /** Event that is emitted when the autocomplete panel is opened. */\n this.opened = new EventEmitter();\n /** Event that is emitted when the autocomplete panel is closed. */\n this.closed = new EventEmitter();\n /** Emits whenever an option is activated using the keyboard. */\n this.optionActivated = new EventEmitter();\n this._classList = {};\n /** Unique ID to be used by autocomplete trigger's \"aria-owns\" property. */\n this.id = `mat-autocomplete-${_uniqueAutocompleteIdCounter++}`;\n // TODO(crisbeto): the problem that the `inertGroups` option resolves is only present on\n // Safari using VoiceOver. We should occasionally check back to see whether the bug\n // wasn't resolved in VoiceOver, and if it has, we can remove this and the `inertGroups`\n // option altogether.\n this.inertGroups = (platform === null || platform === void 0 ? void 0 : platform.SAFARI) || false;\n this._autoActiveFirstOption = !!defaults.autoActiveFirstOption;\n }\n /** Whether the autocomplete panel is open. */\n get isOpen() { return this._isOpen && this.showPanel; }\n /**\n * Whether the first option should be highlighted when the autocomplete panel is opened.\n * Can be configured globally through the `MAT_AUTOCOMPLETE_DEFAULT_OPTIONS` token.\n */\n get autoActiveFirstOption() { return this._autoActiveFirstOption; }\n set autoActiveFirstOption(value) {\n this._autoActiveFirstOption = coerceBooleanProperty(value);\n }\n /**\n * Takes classes set on the host mat-autocomplete element and applies them to the panel\n * inside the overlay container to allow for easy styling.\n */\n set classList(value) {\n if (value && value.length) {\n this._classList = coerceStringArray(value).reduce((classList, className) => {\n classList[className] = true;\n return classList;\n }, {});\n }\n else {\n this._classList = {};\n }\n this._setVisibilityClasses(this._classList);\n this._elementRef.nativeElement.className = '';\n }\n ngAfterContentInit() {\n this._keyManager = new ActiveDescendantKeyManager(this.options).withWrap();\n this._activeOptionChanges = this._keyManager.change.subscribe(index => {\n this.optionActivated.emit({ source: this, option: this.options.toArray()[index] || null });\n });\n // Set the initial visibility state.\n this._setVisibility();\n }\n ngOnDestroy() {\n this._activeOptionChanges.unsubscribe();\n }\n /**\n * Sets the panel scrollTop. This allows us to manually scroll to display options\n * above or below the fold, as they are not actually being focused when active.\n */\n _setScrollTop(scrollTop) {\n if (this.panel) {\n this.panel.nativeElement.scrollTop = scrollTop;\n }\n }\n /** Returns the panel's scrollTop. */\n _getScrollTop() {\n return this.panel ? this.panel.nativeElement.scrollTop : 0;\n }\n /** Panel should hide itself when the option list is empty. */\n _setVisibility() {\n this.showPanel = !!this.options.length;\n this._setVisibilityClasses(this._classList);\n this._changeDetectorRef.markForCheck();\n }\n /** Emits the `select` event. */\n _emitSelectEvent(option) {\n const event = new MatAutocompleteSelectedEvent(this, option);\n this.optionSelected.emit(event);\n }\n /** Gets the aria-labelledby for the autocomplete panel. */\n _getPanelAriaLabelledby(labelId) {\n if (this.ariaLabel) {\n return null;\n }\n const labelExpression = labelId ? labelId + ' ' : '';\n return this.ariaLabelledby ? labelExpression + this.ariaLabelledby : labelId;\n }\n /** Sets the autocomplete visibility classes on a classlist based on the panel is visible. */\n _setVisibilityClasses(classList) {\n classList[this._visibleClass] = this.showPanel;\n classList[this._hiddenClass] = !this.showPanel;\n }\n}\n_MatAutocompleteBase.ɵfac = function _MatAutocompleteBase_Factory(t) { return new (t || _MatAutocompleteBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform)); };\n_MatAutocompleteBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatAutocompleteBase, viewQuery: function _MatAutocompleteBase_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(TemplateRef, 7);\n ɵngcc0.ɵɵviewQuery(_c0, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.template = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.panel = _t.first);\n } }, inputs: { displayWith: \"displayWith\", autoActiveFirstOption: \"autoActiveFirstOption\", classList: [\"class\", \"classList\"], ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], panelWidth: \"panelWidth\" }, outputs: { optionSelected: \"optionSelected\", opened: \"opened\", closed: \"closed\", optionActivated: \"optionActivated\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n_MatAutocompleteBase.ctorParameters = () => [\n { type: ChangeDetectorRef },\n { type: ElementRef },\n { type: undefined, decorators: [{ type: Inject, args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,] }] },\n { type: Platform }\n];\n_MatAutocompleteBase.propDecorators = {\n template: [{ type: ViewChild, args: [TemplateRef, { static: true },] }],\n panel: [{ type: ViewChild, args: ['panel',] }],\n ariaLabel: [{ type: Input, args: ['aria-label',] }],\n ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],\n displayWith: [{ type: Input }],\n autoActiveFirstOption: [{ type: Input }],\n panelWidth: [{ type: Input }],\n optionSelected: [{ type: Output }],\n opened: [{ type: Output }],\n closed: [{ type: Output }],\n optionActivated: [{ type: Output }],\n classList: [{ type: Input, args: ['class',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatAutocompleteBase, [{\n type: Directive\n }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.ElementRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS]\n }] }, { type: ɵngcc1.Platform }]; }, { displayWith: [{\n type: Input\n }], optionSelected: [{\n type: Output\n }], opened: [{\n type: Output\n }], closed: [{\n type: Output\n }], optionActivated: [{\n type: Output\n }], autoActiveFirstOption: [{\n type: Input\n }], classList: [{\n type: Input,\n args: ['class']\n }], template: [{\n type: ViewChild,\n args: [TemplateRef, { static: true }]\n }], panel: [{\n type: ViewChild,\n args: ['panel']\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], ariaLabelledby: [{\n type: Input,\n args: ['aria-labelledby']\n }], panelWidth: [{\n type: Input\n }] }); })();\nclass MatAutocomplete extends _MatAutocompleteBase {\n constructor() {\n super(...arguments);\n this._visibleClass = 'mat-autocomplete-visible';\n this._hiddenClass = 'mat-autocomplete-hidden';\n }\n}\nMatAutocomplete.ɵfac = /*@__PURE__*/ function () { let ɵMatAutocomplete_BaseFactory; return function MatAutocomplete_Factory(t) { return (ɵMatAutocomplete_BaseFactory || (ɵMatAutocomplete_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatAutocomplete)))(t || MatAutocomplete); }; }();\nMatAutocomplete.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatAutocomplete, selectors: [[\"mat-autocomplete\"]], contentQueries: function MatAutocomplete_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_OPTGROUP, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatOption, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.optionGroups = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.options = _t);\n } }, hostAttrs: [1, \"mat-autocomplete\"], inputs: { disableRipple: \"disableRipple\" }, exportAs: [\"matAutocomplete\"], features: [ɵngcc0.ɵɵProvidersFeature([\n { provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatAutocomplete }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 1, vars: 0, consts: [[\"role\", \"listbox\", 1, \"mat-autocomplete-panel\", 3, \"id\", \"ngClass\"], [\"panel\", \"\"]], template: function MatAutocomplete_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵtemplate(0, MatAutocomplete_ng_template_0_Template, 3, 4, \"ng-template\");\n } }, directives: [ɵngcc2.NgClass], styles: [\".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}.mat-autocomplete-panel-above .mat-autocomplete-panel{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.mat-autocomplete-panel .mat-divider-horizontal{margin-top:-1px}.cdk-high-contrast-active .mat-autocomplete-panel{outline:solid 1px}mat-autocomplete{display:none}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatAutocomplete.propDecorators = {\n optionGroups: [{ type: ContentChildren, args: [MAT_OPTGROUP, { descendants: true },] }],\n options: [{ type: ContentChildren, args: [MatOption, { descendants: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocomplete, [{\n type: Component,\n args: [{\n selector: 'mat-autocomplete',\n template: \"<ng-template let-formFieldId=\\\"id\\\">\\n <div class=\\\"mat-autocomplete-panel\\\"\\n role=\\\"listbox\\\"\\n [id]=\\\"id\\\"\\n [attr.aria-label]=\\\"ariaLabel || null\\\"\\n [attr.aria-labelledby]=\\\"_getPanelAriaLabelledby(formFieldId)\\\"\\n [ngClass]=\\\"_classList\\\"\\n #panel>\\n <ng-content></ng-content>\\n </div>\\n</ng-template>\\n\",\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'matAutocomplete',\n inputs: ['disableRipple'],\n host: {\n 'class': 'mat-autocomplete'\n },\n providers: [\n { provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatAutocomplete }\n ],\n styles: [\".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}.mat-autocomplete-panel-above .mat-autocomplete-panel{border-radius:0;border-top-left-radius:4px;border-top-right-radius:4px}.mat-autocomplete-panel .mat-divider-horizontal{margin-top:-1px}.cdk-high-contrast-active .mat-autocomplete-panel{outline:solid 1px}mat-autocomplete{display:none}\\n\"]\n }]\n }], null, { optionGroups: [{\n type: ContentChildren,\n args: [MAT_OPTGROUP, { descendants: true }]\n }], options: [{\n type: ContentChildren,\n args: [MatOption, { descendants: true }]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Base class containing all of the functionality for `MatAutocompleteOrigin`. */\nclass _MatAutocompleteOriginBase {\n constructor(\n /** Reference to the element on which the directive is applied. */\n elementRef) {\n this.elementRef = elementRef;\n }\n}\n_MatAutocompleteOriginBase.ɵfac = function _MatAutocompleteOriginBase_Factory(t) { return new (t || _MatAutocompleteOriginBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\n_MatAutocompleteOriginBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatAutocompleteOriginBase });\n_MatAutocompleteOriginBase.ctorParameters = () => [\n { type: ElementRef }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatAutocompleteOriginBase, [{\n type: Directive\n }], function () { return [{ type: ɵngcc0.ElementRef }]; }, null); })();\n/**\n * Directive applied to an element to make it usable\n * as a connection point for an autocomplete panel.\n */\nclass MatAutocompleteOrigin extends _MatAutocompleteOriginBase {\n}\nMatAutocompleteOrigin.ɵfac = /*@__PURE__*/ function () { let ɵMatAutocompleteOrigin_BaseFactory; return function MatAutocompleteOrigin_Factory(t) { return (ɵMatAutocompleteOrigin_BaseFactory || (ɵMatAutocompleteOrigin_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatAutocompleteOrigin)))(t || MatAutocompleteOrigin); }; }();\nMatAutocompleteOrigin.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatAutocompleteOrigin, selectors: [[\"\", \"matAutocompleteOrigin\", \"\"]], exportAs: [\"matAutocompleteOrigin\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocompleteOrigin, [{\n type: Directive,\n args: [{\n selector: '[matAutocompleteOrigin]',\n exportAs: 'matAutocompleteOrigin'\n }]\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * The following style constants are necessary to save here in order\n * to properly calculate the scrollTop of the panel. Because we are not\n * actually focusing the active item, scroll must be handled manually.\n */\n/**\n * The height of each autocomplete option.\n * @deprecated No longer being used. To be removed.\n * @breaking-change 12.0.0\n */\nconst AUTOCOMPLETE_OPTION_HEIGHT = 48;\n/**\n * The total height of the autocomplete panel.\n * @deprecated No longer being used. To be removed.\n * @breaking-change 12.0.0\n */\nconst AUTOCOMPLETE_PANEL_HEIGHT = 256;\n/** Injection token that determines the scroll handling while the autocomplete panel is open. */\nconst MAT_AUTOCOMPLETE_SCROLL_STRATEGY = new InjectionToken('mat-autocomplete-scroll-strategy');\n/** @docs-private */\nfunction MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY(overlay) {\n return () => overlay.scrollStrategies.reposition();\n}\n/** @docs-private */\nconst MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: MAT_AUTOCOMPLETE_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY,\n};\n/**\n * Provider that allows the autocomplete to register as a ControlValueAccessor.\n * @docs-private\n */\nconst MAT_AUTOCOMPLETE_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatAutocompleteTrigger),\n multi: true\n};\n/**\n * Creates an error to be thrown when attempting to use an autocomplete trigger without a panel.\n * @docs-private\n */\nfunction getMatAutocompleteMissingPanelError() {\n return Error('Attempting to open an undefined instance of `mat-autocomplete`. ' +\n 'Make sure that the id passed to the `matAutocomplete` is correct and that ' +\n 'you\\'re attempting to open it after the ngAfterContentInit hook.');\n}\n/** Base class with all of the `MatAutocompleteTrigger` functionality. */\nclass _MatAutocompleteTriggerBase {\n constructor(_element, _overlay, _viewContainerRef, _zone, _changeDetectorRef, scrollStrategy, _dir, _formField, _document, _viewportRuler, _defaults) {\n this._element = _element;\n this._overlay = _overlay;\n this._viewContainerRef = _viewContainerRef;\n this._zone = _zone;\n this._changeDetectorRef = _changeDetectorRef;\n this._dir = _dir;\n this._formField = _formField;\n this._document = _document;\n this._viewportRuler = _viewportRuler;\n this._defaults = _defaults;\n this._componentDestroyed = false;\n this._autocompleteDisabled = false;\n /** Whether or not the label state is being overridden. */\n this._manuallyFloatingLabel = false;\n /** Subscription to viewport size changes. */\n this._viewportSubscription = Subscription.EMPTY;\n /**\n * Whether the autocomplete can open the next time it is focused. Used to prevent a focused,\n * closed autocomplete from being reopened if the user switches to another browser tab and then\n * comes back.\n */\n this._canOpenOnNextFocus = true;\n /** Stream of keyboard events that can close the panel. */\n this._closeKeyEventStream = new Subject();\n /**\n * Event handler for when the window is blurred. Needs to be an\n * arrow function in order to preserve the context.\n */\n this._windowBlurHandler = () => {\n // If the user blurred the window while the autocomplete is focused, it means that it'll be\n // refocused when they come back. In this case we want to skip the first focus event, if the\n // pane was closed, in order to avoid reopening it unintentionally.\n this._canOpenOnNextFocus =\n this._document.activeElement !== this._element.nativeElement || this.panelOpen;\n };\n /** `View -> model callback called when value changes` */\n this._onChange = () => { };\n /** `View -> model callback called when autocomplete has been touched` */\n this._onTouched = () => { };\n /**\n * Position of the autocomplete panel relative to the trigger element. A position of `auto`\n * will render the panel underneath the trigger if there is enough space for it to fit in\n * the viewport, otherwise the panel will be shown above it. If the position is set to\n * `above` or `below`, the panel will always be shown above or below the trigger. no matter\n * whether it fits completely in the viewport.\n */\n this.position = 'auto';\n /**\n * `autocomplete` attribute to be set on the input element.\n * @docs-private\n */\n this.autocompleteAttribute = 'off';\n this._overlayAttached = false;\n /** Stream of autocomplete option selections. */\n this.optionSelections = defer(() => {\n if (this.autocomplete && this.autocomplete.options) {\n return merge(...this.autocomplete.options.map(option => option.onSelectionChange));\n }\n // If there are any subscribers before `ngAfterViewInit`, the `autocomplete` will be undefined.\n // Return a stream that we'll replace with the real one once everything is in place.\n return this._zone.onStable\n .pipe(take(1), switchMap(() => this.optionSelections));\n });\n this._scrollStrategy = scrollStrategy;\n }\n /**\n * Whether the autocomplete is disabled. When disabled, the element will\n * act as a regular input and the user won't be able to open the panel.\n */\n get autocompleteDisabled() { return this._autocompleteDisabled; }\n set autocompleteDisabled(value) {\n this._autocompleteDisabled = coerceBooleanProperty(value);\n }\n ngAfterViewInit() {\n const window = this._getWindow();\n if (typeof window !== 'undefined') {\n this._zone.runOutsideAngular(() => window.addEventListener('blur', this._windowBlurHandler));\n }\n }\n ngOnChanges(changes) {\n if (changes['position'] && this._positionStrategy) {\n this._setStrategyPositions(this._positionStrategy);\n if (this.panelOpen) {\n this._overlayRef.updatePosition();\n }\n }\n }\n ngOnDestroy() {\n const window = this._getWindow();\n if (typeof window !== 'undefined') {\n window.removeEventListener('blur', this._windowBlurHandler);\n }\n this._viewportSubscription.unsubscribe();\n this._componentDestroyed = true;\n this._destroyPanel();\n this._closeKeyEventStream.complete();\n }\n /** Whether or not the autocomplete panel is open. */\n get panelOpen() {\n return this._overlayAttached && this.autocomplete.showPanel;\n }\n /** Opens the autocomplete suggestion panel. */\n openPanel() {\n this._attachOverlay();\n this._floatLabel();\n }\n /** Closes the autocomplete suggestion panel. */\n closePanel() {\n this._resetLabel();\n if (!this._overlayAttached) {\n return;\n }\n if (this.panelOpen) {\n // Only emit if the panel was visible.\n this.autocomplete.closed.emit();\n }\n this.autocomplete._isOpen = this._overlayAttached = false;\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n this._closingActionsSubscription.unsubscribe();\n }\n // Note that in some cases this can end up being called after the component is destroyed.\n // Add a check to ensure that we don't try to run change detection on a destroyed view.\n if (!this._componentDestroyed) {\n // We need to trigger change detection manually, because\n // `fromEvent` doesn't seem to do it at the proper time.\n // This ensures that the label is reset when the\n // user clicks outside.\n this._changeDetectorRef.detectChanges();\n }\n }\n /**\n * Updates the position of the autocomplete suggestion panel to ensure that it fits all options\n * within the viewport.\n */\n updatePosition() {\n if (this._overlayAttached) {\n this._overlayRef.updatePosition();\n }\n }\n /**\n * A stream of actions that should close the autocomplete panel, including\n * when an option is selected, on blur, and when TAB is pressed.\n */\n get panelClosingActions() {\n return merge(this.optionSelections, this.autocomplete._keyManager.tabOut.pipe(filter(() => this._overlayAttached)), this._closeKeyEventStream, this._getOutsideClickStream(), this._overlayRef ?\n this._overlayRef.detachments().pipe(filter(() => this._overlayAttached)) :\n of()).pipe(\n // Normalize the output so we return a consistent type.\n map(event => event instanceof MatOptionSelectionChange ? event : null));\n }\n /** The currently active option, coerced to MatOption type. */\n get activeOption() {\n if (this.autocomplete && this.autocomplete._keyManager) {\n return this.autocomplete._keyManager.activeItem;\n }\n return null;\n }\n /** Stream of clicks outside of the autocomplete panel. */\n _getOutsideClickStream() {\n return merge(fromEvent(this._document, 'click'), fromEvent(this._document, 'auxclick'), fromEvent(this._document, 'touchend'))\n .pipe(filter(event => {\n // If we're in the Shadow DOM, the event target will be the shadow root, so we have to\n // fall back to check the first element in the path of the click event.\n const clickTarget = (this._isInsideShadowRoot && event.composedPath ? event.composedPath()[0] :\n event.target);\n const formField = this._formField ? this._formField._elementRef.nativeElement : null;\n const customOrigin = this.connectedTo ? this.connectedTo.elementRef.nativeElement : null;\n return this._overlayAttached && clickTarget !== this._element.nativeElement &&\n (!formField || !formField.contains(clickTarget)) &&\n (!customOrigin || !customOrigin.contains(clickTarget)) &&\n (!!this._overlayRef && !this._overlayRef.overlayElement.contains(clickTarget));\n }));\n }\n // Implemented as part of ControlValueAccessor.\n writeValue(value) {\n Promise.resolve(null).then(() => this._setTriggerValue(value));\n }\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn) {\n this._onChange = fn;\n }\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn) {\n this._onTouched = fn;\n }\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled) {\n this._element.nativeElement.disabled = isDisabled;\n }\n _handleKeydown(event) {\n const keyCode = event.keyCode;\n // Prevent the default action on all escape key presses. This is here primarily to bring IE\n // in line with other browsers. By default, pressing escape on IE will cause it to revert\n // the input value to the one that it had on focus, however it won't dispatch any events\n // which means that the model value will be out of sync with the view.\n if (keyCode === ESCAPE && !hasModifierKey(event)) {\n event.preventDefault();\n }\n if (this.activeOption && keyCode === ENTER && this.panelOpen) {\n this.activeOption._selectViaInteraction();\n this._resetActiveItem();\n event.preventDefault();\n }\n else if (this.autocomplete) {\n const prevActiveItem = this.autocomplete._keyManager.activeItem;\n const isArrowKey = keyCode === UP_ARROW || keyCode === DOWN_ARROW;\n if (this.panelOpen || keyCode === TAB) {\n this.autocomplete._keyManager.onKeydown(event);\n }\n else if (isArrowKey && this._canOpen()) {\n this.openPanel();\n }\n if (isArrowKey || this.autocomplete._keyManager.activeItem !== prevActiveItem) {\n this._scrollToOption(this.autocomplete._keyManager.activeItemIndex || 0);\n }\n }\n }\n _handleInput(event) {\n let target = event.target;\n let value = target.value;\n // Based on `NumberValueAccessor` from forms.\n if (target.type === 'number') {\n value = value == '' ? null : parseFloat(value);\n }\n // If the input has a placeholder, IE will fire the `input` event on page load,\n // focus and blur, in addition to when the user actually changed the value. To\n // filter out all of the extra events, we save the value on focus and between\n // `input` events, and we check whether it changed.\n // See: https://connect.microsoft.com/IE/feedback/details/885747/\n if (this._previousValue !== value) {\n this._previousValue = value;\n this._onChange(value);\n if (this._canOpen() && this._document.activeElement === event.target) {\n this.openPanel();\n }\n }\n }\n _handleFocus() {\n if (!this._canOpenOnNextFocus) {\n this._canOpenOnNextFocus = true;\n }\n else if (this._canOpen()) {\n this._previousValue = this._element.nativeElement.value;\n this._attachOverlay();\n this._floatLabel(true);\n }\n }\n /**\n * In \"auto\" mode, the label will animate down as soon as focus is lost.\n * This causes the value to jump when selecting an option with the mouse.\n * This method manually floats the label until the panel can be closed.\n * @param shouldAnimate Whether the label should be animated when it is floated.\n */\n _floatLabel(shouldAnimate = false) {\n if (this._formField && this._formField.floatLabel === 'auto') {\n if (shouldAnimate) {\n this._formField._animateAndLockLabel();\n }\n else {\n this._formField.floatLabel = 'always';\n }\n this._manuallyFloatingLabel = true;\n }\n }\n /** If the label has been manually elevated, return it to its normal state. */\n _resetLabel() {\n if (this._manuallyFloatingLabel) {\n this._formField.floatLabel = 'auto';\n this._manuallyFloatingLabel = false;\n }\n }\n /**\n * This method listens to a stream of panel closing actions and resets the\n * stream every time the option list changes.\n */\n _subscribeToClosingActions() {\n const firstStable = this._zone.onStable.pipe(take(1));\n const optionChanges = this.autocomplete.options.changes.pipe(tap(() => this._positionStrategy.reapplyLastPosition()), \n // Defer emitting to the stream until the next tick, because changing\n // bindings in here will cause \"changed after checked\" errors.\n delay(0));\n // When the zone is stable initially, and when the option list changes...\n return merge(firstStable, optionChanges)\n .pipe(\n // create a new stream of panelClosingActions, replacing any previous streams\n // that were created, and flatten it so our stream only emits closing events...\n switchMap(() => {\n const wasOpen = this.panelOpen;\n this._resetActiveItem();\n this.autocomplete._setVisibility();\n if (this.panelOpen) {\n this._overlayRef.updatePosition();\n // If the `panelOpen` state changed, we need to make sure to emit the `opened`\n // event, because we may not have emitted it when the panel was attached. This\n // can happen if the users opens the panel and there are no options, but the\n // options come in slightly later or as a result of the value changing.\n if (wasOpen !== this.panelOpen) {\n this.autocomplete.opened.emit();\n }\n }\n return this.panelClosingActions;\n }), \n // when the first closing event occurs...\n take(1))\n // set the value, close the panel, and complete.\n .subscribe(event => this._setValueAndClose(event));\n }\n /** Destroys the autocomplete suggestion panel. */\n _destroyPanel() {\n if (this._overlayRef) {\n this.closePanel();\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n }\n _setTriggerValue(value) {\n const toDisplay = this.autocomplete && this.autocomplete.displayWith ?\n this.autocomplete.displayWith(value) :\n value;\n // Simply falling back to an empty string if the display value is falsy does not work properly.\n // The display value can also be the number zero and shouldn't fall back to an empty string.\n const inputValue = toDisplay != null ? toDisplay : '';\n // If it's used within a `MatFormField`, we should set it through the property so it can go\n // through change detection.\n if (this._formField) {\n this._formField._control.value = inputValue;\n }\n else {\n this._element.nativeElement.value = inputValue;\n }\n this._previousValue = inputValue;\n }\n /**\n * This method closes the panel, and if a value is specified, also sets the associated\n * control to that value. It will also mark the control as dirty if this interaction\n * stemmed from the user.\n */\n _setValueAndClose(event) {\n if (event && event.source) {\n this._clearPreviousSelectedOption(event.source);\n this._setTriggerValue(event.source.value);\n this._onChange(event.source.value);\n this._element.nativeElement.focus();\n this.autocomplete._emitSelectEvent(event.source);\n }\n this.closePanel();\n }\n /**\n * Clear any previous selected option and emit a selection change event for this option\n */\n _clearPreviousSelectedOption(skip) {\n this.autocomplete.options.forEach(option => {\n if (option !== skip && option.selected) {\n option.deselect();\n }\n });\n }\n _attachOverlay() {\n var _a;\n if (!this.autocomplete && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatAutocompleteMissingPanelError();\n }\n // We want to resolve this once, as late as possible so that we can be\n // sure that the element has been moved into its final place in the DOM.\n if (this._isInsideShadowRoot == null) {\n this._isInsideShadowRoot = !!_getShadowRoot(this._element.nativeElement);\n }\n let overlayRef = this._overlayRef;\n if (!overlayRef) {\n this._portal = new TemplatePortal(this.autocomplete.template, this._viewContainerRef, { id: (_a = this._formField) === null || _a === void 0 ? void 0 : _a.getLabelId() });\n overlayRef = this._overlay.create(this._getOverlayConfig());\n this._overlayRef = overlayRef;\n // Use the `keydownEvents` in order to take advantage of\n // the overlay event targeting provided by the CDK overlay.\n overlayRef.keydownEvents().subscribe(event => {\n // Close when pressing ESCAPE or ALT + UP_ARROW, based on the a11y guidelines.\n // See: https://www.w3.org/TR/wai-aria-practices-1.1/#textbox-keyboard-interaction\n if ((event.keyCode === ESCAPE && !hasModifierKey(event)) ||\n (event.keyCode === UP_ARROW && hasModifierKey(event, 'altKey'))) {\n this._resetActiveItem();\n this._closeKeyEventStream.next();\n // We need to stop propagation, otherwise the event will eventually\n // reach the input itself and cause the overlay to be reopened.\n event.stopPropagation();\n event.preventDefault();\n }\n });\n this._viewportSubscription = this._viewportRuler.change().subscribe(() => {\n if (this.panelOpen && overlayRef) {\n overlayRef.updateSize({ width: this._getPanelWidth() });\n }\n });\n }\n else {\n // Update the trigger, panel width and direction, in case anything has changed.\n this._positionStrategy.setOrigin(this._getConnectedElement());\n overlayRef.updateSize({ width: this._getPanelWidth() });\n }\n if (overlayRef && !overlayRef.hasAttached()) {\n overlayRef.attach(this._portal);\n this._closingActionsSubscription = this._subscribeToClosingActions();\n }\n const wasOpen = this.panelOpen;\n this.autocomplete._setVisibility();\n this.autocomplete._isOpen = this._overlayAttached = true;\n // We need to do an extra `panelOpen` check in here, because the\n // autocomplete won't be shown if there are no options.\n if (this.panelOpen && wasOpen !== this.panelOpen) {\n this.autocomplete.opened.emit();\n }\n }\n _getOverlayConfig() {\n var _a;\n return new OverlayConfig({\n positionStrategy: this._getOverlayPosition(),\n scrollStrategy: this._scrollStrategy(),\n width: this._getPanelWidth(),\n direction: this._dir,\n panelClass: (_a = this._defaults) === null || _a === void 0 ? void 0 : _a.overlayPanelClass,\n });\n }\n _getOverlayPosition() {\n const strategy = this._overlay.position()\n .flexibleConnectedTo(this._getConnectedElement())\n .withFlexibleDimensions(false)\n .withPush(false);\n this._setStrategyPositions(strategy);\n this._positionStrategy = strategy;\n return strategy;\n }\n /** Sets the positions on a position strategy based on the directive's input state. */\n _setStrategyPositions(positionStrategy) {\n // Note that we provide horizontal fallback positions, even though by default the dropdown\n // width matches the input, because consumers can override the width. See #18854.\n const belowPositions = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' }\n ];\n // The overlay edge connected to the trigger should have squared corners, while\n // the opposite end has rounded corners. We apply a CSS class to swap the\n // border-radius based on the overlay position.\n const panelClass = this._aboveClass;\n const abovePositions = [\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', panelClass },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', panelClass }\n ];\n let positions;\n if (this.position === 'above') {\n positions = abovePositions;\n }\n else if (this.position === 'below') {\n positions = belowPositions;\n }\n else {\n positions = [...belowPositions, ...abovePositions];\n }\n positionStrategy.withPositions(positions);\n }\n _getConnectedElement() {\n if (this.connectedTo) {\n return this.connectedTo.elementRef;\n }\n return this._formField ? this._formField.getConnectedOverlayOrigin() : this._element;\n }\n _getPanelWidth() {\n return this.autocomplete.panelWidth || this._getHostWidth();\n }\n /** Returns the width of the input element, so the panel width can match it. */\n _getHostWidth() {\n return this._getConnectedElement().nativeElement.getBoundingClientRect().width;\n }\n /**\n * Resets the active item to -1 so arrow events will activate the\n * correct options, or to 0 if the consumer opted into it.\n */\n _resetActiveItem() {\n const autocomplete = this.autocomplete;\n if (autocomplete.autoActiveFirstOption) {\n // Note that we go through `setFirstItemActive`, rather than `setActiveItem(0)`, because\n // the former will find the next enabled option, if the first one is disabled.\n autocomplete._keyManager.setFirstItemActive();\n }\n else {\n autocomplete._keyManager.setActiveItem(-1);\n }\n }\n /** Determines whether the panel can be opened. */\n _canOpen() {\n const element = this._element.nativeElement;\n return !element.readOnly && !element.disabled && !this._autocompleteDisabled;\n }\n /** Use defaultView of injected document if available or fallback to global window reference */\n _getWindow() {\n var _a;\n return ((_a = this._document) === null || _a === void 0 ? void 0 : _a.defaultView) || window;\n }\n /** Scrolls to a particular option in the list. */\n _scrollToOption(index) {\n // Given that we are not actually focusing active options, we must manually adjust scroll\n // to reveal options below the fold. First, we find the offset of the option from the top\n // of the panel. If that offset is below the fold, the new scrollTop will be the offset -\n // the panel height + the option height, so the active option will be just visible at the\n // bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\n // will become the offset. If that offset is visible within the panel already, the scrollTop is\n // not adjusted.\n const autocomplete = this.autocomplete;\n const labelCount = _countGroupLabelsBeforeOption(index, autocomplete.options, autocomplete.optionGroups);\n if (index === 0 && labelCount === 1) {\n // If we've got one group label before the option and we're at the top option,\n // scroll the list to the top. This is better UX than scrolling the list to the\n // top of the option, because it allows the user to read the top group's label.\n autocomplete._setScrollTop(0);\n }\n else if (autocomplete.panel) {\n const option = autocomplete.options.toArray()[index];\n if (option) {\n const element = option._getHostElement();\n const newScrollPosition = _getOptionScrollPosition(element.offsetTop, element.offsetHeight, autocomplete._getScrollTop(), autocomplete.panel.nativeElement.offsetHeight);\n autocomplete._setScrollTop(newScrollPosition);\n }\n }\n }\n}\n_MatAutocompleteTriggerBase.ɵfac = function _MatAutocompleteTriggerBase_Factory(t) { return new (t || _MatAutocompleteTriggerBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.Overlay), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_SCROLL_STRATEGY), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(MAT_FORM_FIELD, 9), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc5.ViewportRuler), ɵngcc0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, 8)); };\n_MatAutocompleteTriggerBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatAutocompleteTriggerBase, inputs: { position: [\"matAutocompletePosition\", \"position\"], autocompleteAttribute: [\"autocomplete\", \"autocompleteAttribute\"], autocompleteDisabled: [\"matAutocompleteDisabled\", \"autocompleteDisabled\"], autocomplete: [\"matAutocomplete\", \"autocomplete\"], connectedTo: [\"matAutocompleteConnectedTo\", \"connectedTo\"] }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n_MatAutocompleteTriggerBase.ctorParameters = () => [\n { type: ElementRef },\n { type: Overlay },\n { type: ViewContainerRef },\n { type: NgZone },\n { type: ChangeDetectorRef },\n { type: undefined, decorators: [{ type: Inject, args: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY,] }] },\n { type: Directionality, decorators: [{ type: Optional }] },\n { type: MatFormField, decorators: [{ type: Optional }, { type: Inject, args: [MAT_FORM_FIELD,] }, { type: Host }] },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n { type: ViewportRuler },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,] }] }\n];\n_MatAutocompleteTriggerBase.propDecorators = {\n autocomplete: [{ type: Input, args: ['matAutocomplete',] }],\n position: [{ type: Input, args: ['matAutocompletePosition',] }],\n connectedTo: [{ type: Input, args: ['matAutocompleteConnectedTo',] }],\n autocompleteAttribute: [{ type: Input, args: ['autocomplete',] }],\n autocompleteDisabled: [{ type: Input, args: ['matAutocompleteDisabled',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatAutocompleteTriggerBase, [{\n type: Directive\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc3.Overlay }, { type: ɵngcc0.ViewContainerRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY]\n }] }, { type: ɵngcc4.Directionality, decorators: [{\n type: Optional\n }] }, { type: ɵngcc6.MatFormField, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_FORM_FIELD]\n }, {\n type: Host\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: ɵngcc5.ViewportRuler }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS]\n }] }]; }, { position: [{\n type: Input,\n args: ['matAutocompletePosition']\n }], autocompleteAttribute: [{\n type: Input,\n args: ['autocomplete']\n }], autocompleteDisabled: [{\n type: Input,\n args: ['matAutocompleteDisabled']\n }], autocomplete: [{\n type: Input,\n args: ['matAutocomplete']\n }], connectedTo: [{\n type: Input,\n args: ['matAutocompleteConnectedTo']\n }] }); })();\nclass MatAutocompleteTrigger extends _MatAutocompleteTriggerBase {\n constructor() {\n super(...arguments);\n this._aboveClass = 'mat-autocomplete-panel-above';\n }\n}\nMatAutocompleteTrigger.ɵfac = /*@__PURE__*/ function () { let ɵMatAutocompleteTrigger_BaseFactory; return function MatAutocompleteTrigger_Factory(t) { return (ɵMatAutocompleteTrigger_BaseFactory || (ɵMatAutocompleteTrigger_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatAutocompleteTrigger)))(t || MatAutocompleteTrigger); }; }();\nMatAutocompleteTrigger.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatAutocompleteTrigger, selectors: [[\"input\", \"matAutocomplete\", \"\"], [\"textarea\", \"matAutocomplete\", \"\"]], hostAttrs: [1, \"mat-autocomplete-trigger\"], hostVars: 7, hostBindings: function MatAutocompleteTrigger_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"focusin\", function MatAutocompleteTrigger_focusin_HostBindingHandler() { return ctx._handleFocus(); })(\"blur\", function MatAutocompleteTrigger_blur_HostBindingHandler() { return ctx._onTouched(); })(\"input\", function MatAutocompleteTrigger_input_HostBindingHandler($event) { return ctx._handleInput($event); })(\"keydown\", function MatAutocompleteTrigger_keydown_HostBindingHandler($event) { return ctx._handleKeydown($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"autocomplete\", ctx.autocompleteAttribute)(\"role\", ctx.autocompleteDisabled ? null : \"combobox\")(\"aria-autocomplete\", ctx.autocompleteDisabled ? null : \"list\")(\"aria-activedescendant\", ctx.panelOpen && ctx.activeOption ? ctx.activeOption.id : null)(\"aria-expanded\", ctx.autocompleteDisabled ? null : ctx.panelOpen.toString())(\"aria-owns\", ctx.autocompleteDisabled || !ctx.panelOpen ? null : ctx.autocomplete == null ? null : ctx.autocomplete.id)(\"aria-haspopup\", !ctx.autocompleteDisabled);\n } }, exportAs: [\"matAutocompleteTrigger\"], features: [ɵngcc0.ɵɵProvidersFeature([MAT_AUTOCOMPLETE_VALUE_ACCESSOR]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocompleteTrigger, [{\n type: Directive,\n args: [{\n selector: `input[matAutocomplete], textarea[matAutocomplete]`,\n host: {\n 'class': 'mat-autocomplete-trigger',\n '[attr.autocomplete]': 'autocompleteAttribute',\n '[attr.role]': 'autocompleteDisabled ? null : \"combobox\"',\n '[attr.aria-autocomplete]': 'autocompleteDisabled ? null : \"list\"',\n '[attr.aria-activedescendant]': '(panelOpen && activeOption) ? activeOption.id : null',\n '[attr.aria-expanded]': 'autocompleteDisabled ? null : panelOpen.toString()',\n '[attr.aria-owns]': '(autocompleteDisabled || !panelOpen) ? null : autocomplete?.id',\n '[attr.aria-haspopup]': '!autocompleteDisabled',\n // Note: we use `focusin`, as opposed to `focus`, in order to open the panel\n // a little earlier. This avoids issues where IE delays the focusing of the input.\n '(focusin)': '_handleFocus()',\n '(blur)': '_onTouched()',\n '(input)': '_handleInput($event)',\n '(keydown)': '_handleKeydown($event)'\n },\n exportAs: 'matAutocompleteTrigger',\n providers: [MAT_AUTOCOMPLETE_VALUE_ACCESSOR]\n }]\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatAutocompleteModule {\n}\nMatAutocompleteModule.ɵfac = function MatAutocompleteModule_Factory(t) { return new (t || MatAutocompleteModule)(); };\nMatAutocompleteModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatAutocompleteModule });\nMatAutocompleteModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ providers: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER], imports: [[\n OverlayModule,\n MatOptionModule,\n MatCommonModule,\n CommonModule\n ], CdkScrollableModule,\n MatOptionModule,\n MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocompleteModule, [{\n type: NgModule,\n args: [{\n imports: [\n OverlayModule,\n MatOptionModule,\n MatCommonModule,\n CommonModule\n ],\n exports: [\n MatAutocomplete,\n MatAutocompleteTrigger,\n MatAutocompleteOrigin,\n CdkScrollableModule,\n MatOptionModule,\n MatCommonModule,\n ],\n declarations: [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin],\n providers: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatAutocompleteModule, { declarations: function () { return [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin]; }, imports: function () { return [OverlayModule,\n MatOptionModule,\n MatCommonModule,\n CommonModule]; }, exports: function () { return [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin, CdkScrollableModule,\n MatOptionModule,\n MatCommonModule]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { AUTOCOMPLETE_OPTION_HEIGHT, AUTOCOMPLETE_PANEL_HEIGHT, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY, MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY, MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER, MAT_AUTOCOMPLETE_VALUE_ACCESSOR, MatAutocomplete, MatAutocompleteModule, MatAutocompleteOrigin, MatAutocompleteSelectedEvent, MatAutocompleteTrigger, _MatAutocompleteBase, _MatAutocompleteOriginBase, _MatAutocompleteTriggerBase, getMatAutocompleteMissingPanelError };\n\n//# sourceMappingURL=autocomplete.js.map","import { SPACE, BACKSPACE, DELETE, TAB, hasModifierKey, ENTER } from '@angular/cdk/keycodes';\nimport { InjectionToken, Directive, EventEmitter, ElementRef, NgZone, Optional, Inject, ChangeDetectorRef, Attribute, ContentChild, Input, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, Self, ContentChildren, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinColor, mixinDisableRipple, RippleRenderer, MAT_RIPPLE_GLOBAL_OPTIONS, mixinErrorState, ErrorStateMatcher, MatCommonModule } from '@angular/material/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Platform } from '@angular/cdk/platform';\nimport { DOCUMENT } from '@angular/common';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { Subject, merge } from 'rxjs';\nimport { take, takeUntil, startWith } from 'rxjs/operators';\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { NgForm, FormGroupDirective, NgControl } from '@angular/forms';\nimport { MatFormFieldControl } from '@angular/material/form-field';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Event object emitted by MatChip when selected or deselected. */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/platform';\nimport * as ɵngcc2 from '@angular/cdk/bidi';\nimport * as ɵngcc3 from '@angular/forms';\nimport * as ɵngcc4 from '@angular/material/core';\n\nconst _c0 = [\"*\"];\nclass MatChipSelectionChange {\n constructor(\n /** Reference to the chip that emitted the event. */\n source, \n /** Whether the chip that emitted the event is selected. */\n selected, \n /** Whether the selection change was a result of a user interaction. */\n isUserInput = false) {\n this.source = source;\n this.selected = selected;\n this.isUserInput = isUserInput;\n }\n}\n/**\n * Injection token that can be used to reference instances of `MatChipRemove`. It serves as\n * alternative token to the actual `MatChipRemove` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_CHIP_REMOVE = new InjectionToken('MatChipRemove');\n/**\n * Injection token that can be used to reference instances of `MatChipAvatar`. It serves as\n * alternative token to the actual `MatChipAvatar` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_CHIP_AVATAR = new InjectionToken('MatChipAvatar');\n/**\n * Injection token that can be used to reference instances of `MatChipTrailingIcon`. It serves as\n * alternative token to the actual `MatChipTrailingIcon` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_CHIP_TRAILING_ICON = new InjectionToken('MatChipTrailingIcon');\n// Boilerplate for applying mixins to MatChip.\n/** @docs-private */\nclass MatChipBase {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}\nconst _MatChipMixinBase = mixinTabIndex(mixinColor(mixinDisableRipple(MatChipBase), 'primary'), -1);\n/**\n * Dummy directive to add CSS class to chip avatar.\n * @docs-private\n */\nclass MatChipAvatar {\n}\nMatChipAvatar.ɵfac = function MatChipAvatar_Factory(t) { return new (t || MatChipAvatar)(); };\nMatChipAvatar.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipAvatar, selectors: [[\"mat-chip-avatar\"], [\"\", \"matChipAvatar\", \"\"]], hostAttrs: [1, \"mat-chip-avatar\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_CHIP_AVATAR, useExisting: MatChipAvatar }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipAvatar, [{\n type: Directive,\n args: [{\n selector: 'mat-chip-avatar, [matChipAvatar]',\n host: { 'class': 'mat-chip-avatar' },\n providers: [{ provide: MAT_CHIP_AVATAR, useExisting: MatChipAvatar }]\n }]\n }], null, null); })();\n/**\n * Dummy directive to add CSS class to chip trailing icon.\n * @docs-private\n */\nclass MatChipTrailingIcon {\n}\nMatChipTrailingIcon.ɵfac = function MatChipTrailingIcon_Factory(t) { return new (t || MatChipTrailingIcon)(); };\nMatChipTrailingIcon.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipTrailingIcon, selectors: [[\"mat-chip-trailing-icon\"], [\"\", \"matChipTrailingIcon\", \"\"]], hostAttrs: [1, \"mat-chip-trailing-icon\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_CHIP_TRAILING_ICON, useExisting: MatChipTrailingIcon }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipTrailingIcon, [{\n type: Directive,\n args: [{\n selector: 'mat-chip-trailing-icon, [matChipTrailingIcon]',\n host: { 'class': 'mat-chip-trailing-icon' },\n providers: [{ provide: MAT_CHIP_TRAILING_ICON, useExisting: MatChipTrailingIcon }]\n }]\n }], null, null); })();\n/**\n * Material design styled Chip component. Used inside the MatChipList component.\n */\nclass MatChip extends _MatChipMixinBase {\n constructor(_elementRef, _ngZone, platform, globalRippleOptions, _changeDetectorRef, _document, animationMode, tabIndex) {\n super(_elementRef);\n this._elementRef = _elementRef;\n this._ngZone = _ngZone;\n this._changeDetectorRef = _changeDetectorRef;\n /** Whether the chip has focus. */\n this._hasFocus = false;\n /** Whether the chip list is selectable */\n this.chipListSelectable = true;\n /** Whether the chip list is in multi-selection mode. */\n this._chipListMultiple = false;\n /** Whether the chip list as a whole is disabled. */\n this._chipListDisabled = false;\n this._selected = false;\n this._selectable = true;\n this._disabled = false;\n this._removable = true;\n /** Emits when the chip is focused. */\n this._onFocus = new Subject();\n /** Emits when the chip is blured. */\n this._onBlur = new Subject();\n /** Emitted when the chip is selected or deselected. */\n this.selectionChange = new EventEmitter();\n /** Emitted when the chip is destroyed. */\n this.destroyed = new EventEmitter();\n /** Emitted when a chip is to be removed. */\n this.removed = new EventEmitter();\n this._addHostClassName();\n // Dynamically create the ripple target, append it within the chip, and use it as the\n // chip's ripple target. Adding the class '.mat-chip-ripple' ensures that it will have\n // the proper styles.\n this._chipRippleTarget = _document.createElement('div');\n this._chipRippleTarget.classList.add('mat-chip-ripple');\n this._elementRef.nativeElement.appendChild(this._chipRippleTarget);\n this._chipRipple = new RippleRenderer(this, _ngZone, this._chipRippleTarget, platform);\n this._chipRipple.setupTriggerEvents(_elementRef);\n this.rippleConfig = globalRippleOptions || {};\n this._animationsDisabled = animationMode === 'NoopAnimations';\n this.tabIndex = tabIndex != null ? (parseInt(tabIndex) || -1) : -1;\n }\n /**\n * Whether ripples are disabled on interaction\n * @docs-private\n */\n get rippleDisabled() {\n return this.disabled || this.disableRipple || this._animationsDisabled ||\n !!this.rippleConfig.disabled;\n }\n /** Whether the chip is selected. */\n get selected() { return this._selected; }\n set selected(value) {\n const coercedValue = coerceBooleanProperty(value);\n if (coercedValue !== this._selected) {\n this._selected = coercedValue;\n this._dispatchSelectionChange();\n }\n }\n /** The value of the chip. Defaults to the content inside `<mat-chip>` tags. */\n get value() {\n return this._value !== undefined\n ? this._value\n : this._elementRef.nativeElement.textContent;\n }\n set value(value) { this._value = value; }\n /**\n * Whether or not the chip is selectable. When a chip is not selectable,\n * changes to its selected state are always ignored. By default a chip is\n * selectable, and it becomes non-selectable if its parent chip list is\n * not selectable.\n */\n get selectable() { return this._selectable && this.chipListSelectable; }\n set selectable(value) {\n this._selectable = coerceBooleanProperty(value);\n }\n /** Whether the chip is disabled. */\n get disabled() { return this._chipListDisabled || this._disabled; }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n }\n /**\n * Determines whether or not the chip displays the remove styling and emits (removed) events.\n */\n get removable() { return this._removable; }\n set removable(value) {\n this._removable = coerceBooleanProperty(value);\n }\n /** The ARIA selected applied to the chip. */\n get ariaSelected() {\n // Remove the `aria-selected` when the chip is deselected in single-selection mode, because\n // it adds noise to NVDA users where \"not selected\" will be read out for each chip.\n return this.selectable && (this._chipListMultiple || this.selected) ?\n this.selected.toString() : null;\n }\n _addHostClassName() {\n const basicChipAttrName = 'mat-basic-chip';\n const element = this._elementRef.nativeElement;\n if (element.hasAttribute(basicChipAttrName) ||\n element.tagName.toLowerCase() === basicChipAttrName) {\n element.classList.add(basicChipAttrName);\n return;\n }\n else {\n element.classList.add('mat-standard-chip');\n }\n }\n ngOnDestroy() {\n this.destroyed.emit({ chip: this });\n this._chipRipple._removeTriggerEvents();\n }\n /** Selects the chip. */\n select() {\n if (!this._selected) {\n this._selected = true;\n this._dispatchSelectionChange();\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Deselects the chip. */\n deselect() {\n if (this._selected) {\n this._selected = false;\n this._dispatchSelectionChange();\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Select this chip and emit selected event */\n selectViaInteraction() {\n if (!this._selected) {\n this._selected = true;\n this._dispatchSelectionChange(true);\n this._changeDetectorRef.markForCheck();\n }\n }\n /** Toggles the current selected state of this chip. */\n toggleSelected(isUserInput = false) {\n this._selected = !this.selected;\n this._dispatchSelectionChange(isUserInput);\n this._changeDetectorRef.markForCheck();\n return this.selected;\n }\n /** Allows for programmatic focusing of the chip. */\n focus() {\n if (!this._hasFocus) {\n this._elementRef.nativeElement.focus();\n this._onFocus.next({ chip: this });\n }\n this._hasFocus = true;\n }\n /**\n * Allows for programmatic removal of the chip. Called by the MatChipList when the DELETE or\n * BACKSPACE keys are pressed.\n *\n * Informs any listeners of the removal request. Does not remove the chip from the DOM.\n */\n remove() {\n if (this.removable) {\n this.removed.emit({ chip: this });\n }\n }\n /** Handles click events on the chip. */\n _handleClick(event) {\n if (this.disabled) {\n event.preventDefault();\n }\n else {\n event.stopPropagation();\n }\n }\n /** Handle custom key presses. */\n _handleKeydown(event) {\n if (this.disabled) {\n return;\n }\n switch (event.keyCode) {\n case DELETE:\n case BACKSPACE:\n // If we are removable, remove the focused chip\n this.remove();\n // Always prevent so page navigation does not occur\n event.preventDefault();\n break;\n case SPACE:\n // If we are selectable, toggle the focused chip\n if (this.selectable) {\n this.toggleSelected(true);\n }\n // Always prevent space from scrolling the page since the list has focus\n event.preventDefault();\n break;\n }\n }\n _blur() {\n // When animations are enabled, Angular may end up removing the chip from the DOM a little\n // earlier than usual, causing it to be blurred and throwing off the logic in the chip list\n // that moves focus not the next item. To work around the issue, we defer marking the chip\n // as not focused until the next time the zone stabilizes.\n this._ngZone.onStable\n .pipe(take(1))\n .subscribe(() => {\n this._ngZone.run(() => {\n this._hasFocus = false;\n this._onBlur.next({ chip: this });\n });\n });\n }\n _dispatchSelectionChange(isUserInput = false) {\n this.selectionChange.emit({\n source: this,\n isUserInput,\n selected: this._selected\n });\n }\n}\nMatChip.ɵfac = function MatChip_Factory(t) { return new (t || MatChip)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform), ɵngcc0.ɵɵdirectiveInject(MAT_RIPPLE_GLOBAL_OPTIONS, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(DOCUMENT), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatChip.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChip, selectors: [[\"mat-basic-chip\"], [\"\", \"mat-basic-chip\", \"\"], [\"mat-chip\"], [\"\", \"mat-chip\", \"\"]], contentQueries: function MatChip_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_CHIP_AVATAR, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_CHIP_TRAILING_ICON, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_CHIP_REMOVE, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.avatar = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.trailingIcon = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.removeIcon = _t.first);\n } }, hostAttrs: [\"role\", \"option\", 1, \"mat-chip\", \"mat-focus-indicator\"], hostVars: 14, hostBindings: function MatChip_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function MatChip_click_HostBindingHandler($event) { return ctx._handleClick($event); })(\"keydown\", function MatChip_keydown_HostBindingHandler($event) { return ctx._handleKeydown($event); })(\"focus\", function MatChip_focus_HostBindingHandler() { return ctx.focus(); })(\"blur\", function MatChip_blur_HostBindingHandler() { return ctx._blur(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabindex\", ctx.disabled ? null : ctx.tabIndex)(\"disabled\", ctx.disabled || null)(\"aria-disabled\", ctx.disabled.toString())(\"aria-selected\", ctx.ariaSelected);\n ɵngcc0.ɵɵclassProp(\"mat-chip-selected\", ctx.selected)(\"mat-chip-with-avatar\", ctx.avatar)(\"mat-chip-with-trailing-icon\", ctx.trailingIcon || ctx.removeIcon)(\"mat-chip-disabled\", ctx.disabled)(\"_mat-animation-noopable\", ctx._animationsDisabled);\n } }, inputs: { color: \"color\", disableRipple: \"disableRipple\", tabIndex: \"tabIndex\", selected: \"selected\", value: \"value\", selectable: \"selectable\", disabled: \"disabled\", removable: \"removable\" }, outputs: { selectionChange: \"selectionChange\", destroyed: \"destroyed\", removed: \"removed\" }, exportAs: [\"matChip\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatChip.ctorParameters = () => [\n { type: ElementRef },\n { type: NgZone },\n { type: Platform },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RIPPLE_GLOBAL_OPTIONS,] }] },\n { type: ChangeDetectorRef },\n { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\nMatChip.propDecorators = {\n avatar: [{ type: ContentChild, args: [MAT_CHIP_AVATAR,] }],\n trailingIcon: [{ type: ContentChild, args: [MAT_CHIP_TRAILING_ICON,] }],\n removeIcon: [{ type: ContentChild, args: [MAT_CHIP_REMOVE,] }],\n selected: [{ type: Input }],\n value: [{ type: Input }],\n selectable: [{ type: Input }],\n disabled: [{ type: Input }],\n removable: [{ type: Input }],\n selectionChange: [{ type: Output }],\n destroyed: [{ type: Output }],\n removed: [{ type: Output }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChip, [{\n type: Directive,\n args: [{\n selector: `mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]`,\n inputs: ['color', 'disableRipple', 'tabIndex'],\n exportAs: 'matChip',\n host: {\n 'class': 'mat-chip mat-focus-indicator',\n '[attr.tabindex]': 'disabled ? null : tabIndex',\n 'role': 'option',\n '[class.mat-chip-selected]': 'selected',\n '[class.mat-chip-with-avatar]': 'avatar',\n '[class.mat-chip-with-trailing-icon]': 'trailingIcon || removeIcon',\n '[class.mat-chip-disabled]': 'disabled',\n '[class._mat-animation-noopable]': '_animationsDisabled',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-selected]': 'ariaSelected',\n '(click)': '_handleClick($event)',\n '(keydown)': '_handleKeydown($event)',\n '(focus)': 'focus()',\n '(blur)': '_blur()'\n }\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc1.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_RIPPLE_GLOBAL_OPTIONS]\n }] }, { type: ɵngcc0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }, { type: String, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }]; }, { selectionChange: [{\n type: Output\n }], destroyed: [{\n type: Output\n }], removed: [{\n type: Output\n }], selected: [{\n type: Input\n }], value: [{\n type: Input\n }], selectable: [{\n type: Input\n }], disabled: [{\n type: Input\n }], removable: [{\n type: Input\n }], avatar: [{\n type: ContentChild,\n args: [MAT_CHIP_AVATAR]\n }], trailingIcon: [{\n type: ContentChild,\n args: [MAT_CHIP_TRAILING_ICON]\n }], removeIcon: [{\n type: ContentChild,\n args: [MAT_CHIP_REMOVE]\n }] }); })();\n/**\n * Applies proper (click) support and adds styling for use with the Material Design \"cancel\" icon\n * available at https://material.io/icons/#ic_cancel.\n *\n * Example:\n *\n * `<mat-chip>\n * <mat-icon matChipRemove>cancel</mat-icon>\n * </mat-chip>`\n *\n * You *may* use a custom icon, but you may need to override the `mat-chip-remove` positioning\n * styles to properly center the icon within the chip.\n */\nclass MatChipRemove {\n constructor(_parentChip, elementRef) {\n this._parentChip = _parentChip;\n if (elementRef.nativeElement.nodeName === 'BUTTON') {\n elementRef.nativeElement.setAttribute('type', 'button');\n }\n }\n /** Calls the parent chip's public `remove()` method if applicable. */\n _handleClick(event) {\n const parentChip = this._parentChip;\n if (parentChip.removable && !parentChip.disabled) {\n parentChip.remove();\n }\n // We need to stop event propagation because otherwise the event will bubble up to the\n // form field and cause the `onContainerClick` method to be invoked. This method would then\n // reset the focused chip that has been focused after chip removal. Usually the parent\n // the parent click listener of the `MatChip` would prevent propagation, but it can happen\n // that the chip is being removed before the event bubbles up.\n event.stopPropagation();\n }\n}\nMatChipRemove.ɵfac = function MatChipRemove_Factory(t) { return new (t || MatChipRemove)(ɵngcc0.ɵɵdirectiveInject(MatChip), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nMatChipRemove.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipRemove, selectors: [[\"\", \"matChipRemove\", \"\"]], hostAttrs: [1, \"mat-chip-remove\", \"mat-chip-trailing-icon\"], hostBindings: function MatChipRemove_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function MatChipRemove_click_HostBindingHandler($event) { return ctx._handleClick($event); });\n } }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_CHIP_REMOVE, useExisting: MatChipRemove }])] });\nMatChipRemove.ctorParameters = () => [\n { type: MatChip },\n { type: ElementRef }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipRemove, [{\n type: Directive,\n args: [{\n selector: '[matChipRemove]',\n host: {\n 'class': 'mat-chip-remove mat-chip-trailing-icon',\n '(click)': '_handleClick($event)'\n },\n providers: [{ provide: MAT_CHIP_REMOVE, useExisting: MatChipRemove }]\n }]\n }], function () { return [{ type: MatChip }, { type: ɵngcc0.ElementRef }]; }, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injection token to be used to override the default options for the chips module. */\nconst MAT_CHIPS_DEFAULT_OPTIONS = new InjectionToken('mat-chips-default-options');\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Boilerplate for applying mixins to MatChipList.\n/** @docs-private */\nclass MatChipListBase {\n constructor(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, \n /** @docs-private */\n ngControl) {\n this._defaultErrorStateMatcher = _defaultErrorStateMatcher;\n this._parentForm = _parentForm;\n this._parentFormGroup = _parentFormGroup;\n this.ngControl = ngControl;\n }\n}\nconst _MatChipListMixinBase = mixinErrorState(MatChipListBase);\n// Increasing integer for generating unique ids for chip-list components.\nlet nextUniqueId = 0;\n/** Change event object that is emitted when the chip list value has changed. */\nclass MatChipListChange {\n constructor(\n /** Chip list that emitted the event. */\n source, \n /** Value of the chip list when the event was emitted. */\n value) {\n this.source = source;\n this.value = value;\n }\n}\n/**\n * A material design chips component (named ChipList for its similarity to the List component).\n */\nclass MatChipList extends _MatChipListMixinBase {\n constructor(_elementRef, _changeDetectorRef, _dir, _parentForm, _parentFormGroup, _defaultErrorStateMatcher, \n /** @docs-private */\n ngControl) {\n super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);\n this._elementRef = _elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._dir = _dir;\n this.ngControl = ngControl;\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n this.controlType = 'mat-chip-list';\n /**\n * When a chip is destroyed, we store the index of the destroyed chip until the chips\n * query list notifies about the update. This is necessary because we cannot determine an\n * appropriate chip that should receive focus until the array of chips updated completely.\n */\n this._lastDestroyedChipIndex = null;\n /** Subject that emits when the component has been destroyed. */\n this._destroyed = new Subject();\n /** Uid of the chip list */\n this._uid = `mat-chip-list-${nextUniqueId++}`;\n /** Tab index for the chip list. */\n this._tabIndex = 0;\n /**\n * User defined tab index.\n * When it is not null, use user defined tab index. Otherwise use _tabIndex\n */\n this._userTabIndex = null;\n /** Function when touched */\n this._onTouched = () => { };\n /** Function when changed */\n this._onChange = () => { };\n this._multiple = false;\n this._compareWith = (o1, o2) => o1 === o2;\n this._required = false;\n this._disabled = false;\n /** Orientation of the chip list. */\n this.ariaOrientation = 'horizontal';\n this._selectable = true;\n /** Event emitted when the selected chip list value has been changed by the user. */\n this.change = new EventEmitter();\n /**\n * Event that emits whenever the raw value of the chip-list changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n this.valueChange = new EventEmitter();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n /** The array of selected chips inside chip list. */\n get selected() {\n return this.multiple ? this._selectionModel.selected : this._selectionModel.selected[0];\n }\n /** The ARIA role applied to the chip list. */\n get role() { return this.empty ? null : 'listbox'; }\n /** Whether the user should be allowed to select multiple chips. */\n get multiple() { return this._multiple; }\n set multiple(value) {\n this._multiple = coerceBooleanProperty(value);\n this._syncChipsState();\n }\n /**\n * A function to compare the option values with the selected values. The first argument\n * is a value from an option. The second is a value from the selection. A boolean\n * should be returned.\n */\n get compareWith() { return this._compareWith; }\n set compareWith(fn) {\n this._compareWith = fn;\n if (this._selectionModel) {\n // A different comparator means the selection could change.\n this._initializeSelection();\n }\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get value() { return this._value; }\n set value(value) {\n this.writeValue(value);\n this._value = value;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get id() {\n return this._chipInput ? this._chipInput.id : this._uid;\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get required() { return this._required; }\n set required(value) {\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get placeholder() {\n return this._chipInput ? this._chipInput.placeholder : this._placeholder;\n }\n set placeholder(value) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n /** Whether any chips or the matChipInput inside of this chip-list has focus. */\n get focused() {\n return (this._chipInput && this._chipInput.focused) || this._hasFocusedChip();\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get empty() {\n return (!this._chipInput || this._chipInput.empty) && (!this.chips || this.chips.length === 0);\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat() { return !this.empty || this.focused; }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get disabled() { return this.ngControl ? !!this.ngControl.disabled : this._disabled; }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n this._syncChipsState();\n }\n /**\n * Whether or not this chip list is selectable. When a chip list is not selectable,\n * the selected states for all the chips inside the chip list are always ignored.\n */\n get selectable() { return this._selectable; }\n set selectable(value) {\n this._selectable = coerceBooleanProperty(value);\n if (this.chips) {\n this.chips.forEach(chip => chip.chipListSelectable = this._selectable);\n }\n }\n set tabIndex(value) {\n this._userTabIndex = value;\n this._tabIndex = value;\n }\n /** Combined stream of all of the child chips' selection change events. */\n get chipSelectionChanges() {\n return merge(...this.chips.map(chip => chip.selectionChange));\n }\n /** Combined stream of all of the child chips' focus change events. */\n get chipFocusChanges() {\n return merge(...this.chips.map(chip => chip._onFocus));\n }\n /** Combined stream of all of the child chips' blur change events. */\n get chipBlurChanges() {\n return merge(...this.chips.map(chip => chip._onBlur));\n }\n /** Combined stream of all of the child chips' remove change events. */\n get chipRemoveChanges() {\n return merge(...this.chips.map(chip => chip.destroyed));\n }\n ngAfterContentInit() {\n this._keyManager = new FocusKeyManager(this.chips)\n .withWrap()\n .withVerticalOrientation()\n .withHomeAndEnd()\n .withHorizontalOrientation(this._dir ? this._dir.value : 'ltr');\n if (this._dir) {\n this._dir.change\n .pipe(takeUntil(this._destroyed))\n .subscribe(dir => this._keyManager.withHorizontalOrientation(dir));\n }\n this._keyManager.tabOut.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._allowFocusEscape();\n });\n // When the list changes, re-subscribe\n this.chips.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {\n if (this.disabled) {\n // Since this happens after the content has been\n // checked, we need to defer it to the next tick.\n Promise.resolve().then(() => {\n this._syncChipsState();\n });\n }\n this._resetChips();\n // Reset chips selected/deselected status\n this._initializeSelection();\n // Check to see if we need to update our tab index\n this._updateTabIndex();\n // Check to see if we have a destroyed chip and need to refocus\n this._updateFocusForDestroyedChips();\n this.stateChanges.next();\n });\n }\n ngOnInit() {\n this._selectionModel = new SelectionModel(this.multiple, undefined, false);\n this.stateChanges.next();\n }\n ngDoCheck() {\n if (this.ngControl) {\n // We need to re-evaluate this on every change detection cycle, because there are some\n // error triggers that we can't subscribe to (e.g. parent form submissions). This means\n // that whatever logic is in here has to be super lean or we risk destroying the performance.\n this.updateErrorState();\n if (this.ngControl.disabled !== this._disabled) {\n this.disabled = !!this.ngControl.disabled;\n }\n }\n }\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this.stateChanges.complete();\n this._dropSubscriptions();\n }\n /** Associates an HTML input element with this chip list. */\n registerInput(inputElement) {\n this._chipInput = inputElement;\n // We use this attribute to match the chip list to its input in test harnesses.\n // Set the attribute directly here to avoid \"changed after checked\" errors.\n this._elementRef.nativeElement.setAttribute('data-mat-chip-input', inputElement.id);\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n setDescribedByIds(ids) { this._ariaDescribedby = ids.join(' '); }\n // Implemented as part of ControlValueAccessor.\n writeValue(value) {\n if (this.chips) {\n this._setSelectionByValue(value, false);\n }\n }\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn) {\n this._onChange = fn;\n }\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn) {\n this._onTouched = fn;\n }\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this.stateChanges.next();\n }\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n onContainerClick(event) {\n if (!this._originatesFromChip(event)) {\n this.focus();\n }\n }\n /**\n * Focuses the first non-disabled chip in this chip list, or the associated input when there\n * are no eligible chips.\n */\n focus(options) {\n if (this.disabled) {\n return;\n }\n // TODO: ARIA says this should focus the first `selected` chip if any are selected.\n // Focus on first element if there's no chipInput inside chip-list\n if (this._chipInput && this._chipInput.focused) {\n // do nothing\n }\n else if (this.chips.length > 0) {\n this._keyManager.setFirstItemActive();\n this.stateChanges.next();\n }\n else {\n this._focusInput(options);\n this.stateChanges.next();\n }\n }\n /** Attempt to focus an input if we have one. */\n _focusInput(options) {\n if (this._chipInput) {\n this._chipInput.focus(options);\n }\n }\n /**\n * Pass events to the keyboard manager. Available here for tests.\n */\n _keydown(event) {\n const target = event.target;\n // If they are on an empty input and hit backspace, focus the last chip\n if (event.keyCode === BACKSPACE && this._isInputEmpty(target)) {\n this._keyManager.setLastItemActive();\n event.preventDefault();\n }\n else if (target && target.classList.contains('mat-chip')) {\n this._keyManager.onKeydown(event);\n this.stateChanges.next();\n }\n }\n /**\n * Check the tab index as you should not be allowed to focus an empty list.\n */\n _updateTabIndex() {\n // If we have 0 chips, we should not allow keyboard focus\n this._tabIndex = this._userTabIndex || (this.chips.length === 0 ? -1 : 0);\n }\n /**\n * If the amount of chips changed, we need to update the\n * key manager state and focus the next closest chip.\n */\n _updateFocusForDestroyedChips() {\n // Move focus to the closest chip. If no other chips remain, focus the chip-list itself.\n if (this._lastDestroyedChipIndex != null) {\n if (this.chips.length) {\n const newChipIndex = Math.min(this._lastDestroyedChipIndex, this.chips.length - 1);\n this._keyManager.setActiveItem(newChipIndex);\n }\n else {\n this.focus();\n }\n }\n this._lastDestroyedChipIndex = null;\n }\n /**\n * Utility to ensure all indexes are valid.\n *\n * @param index The index to be checked.\n * @returns True if the index is valid for our list of chips.\n */\n _isValidIndex(index) {\n return index >= 0 && index < this.chips.length;\n }\n _isInputEmpty(element) {\n if (element && element.nodeName.toLowerCase() === 'input') {\n let input = element;\n return !input.value;\n }\n return false;\n }\n _setSelectionByValue(value, isUserInput = true) {\n this._clearSelection();\n this.chips.forEach(chip => chip.deselect());\n if (Array.isArray(value)) {\n value.forEach(currentValue => this._selectValue(currentValue, isUserInput));\n this._sortValues();\n }\n else {\n const correspondingChip = this._selectValue(value, isUserInput);\n // Shift focus to the active item. Note that we shouldn't do this in multiple\n // mode, because we don't know what chip the user interacted with last.\n if (correspondingChip) {\n if (isUserInput) {\n this._keyManager.setActiveItem(correspondingChip);\n }\n }\n }\n }\n /**\n * Finds and selects the chip based on its value.\n * @returns Chip that has the corresponding value.\n */\n _selectValue(value, isUserInput = true) {\n const correspondingChip = this.chips.find(chip => {\n return chip.value != null && this._compareWith(chip.value, value);\n });\n if (correspondingChip) {\n isUserInput ? correspondingChip.selectViaInteraction() : correspondingChip.select();\n this._selectionModel.select(correspondingChip);\n }\n return correspondingChip;\n }\n _initializeSelection() {\n // Defer setting the value in order to avoid the \"Expression\n // has changed after it was checked\" errors from Angular.\n Promise.resolve().then(() => {\n if (this.ngControl || this._value) {\n this._setSelectionByValue(this.ngControl ? this.ngControl.value : this._value, false);\n this.stateChanges.next();\n }\n });\n }\n /**\n * Deselects every chip in the list.\n * @param skip Chip that should not be deselected.\n */\n _clearSelection(skip) {\n this._selectionModel.clear();\n this.chips.forEach(chip => {\n if (chip !== skip) {\n chip.deselect();\n }\n });\n this.stateChanges.next();\n }\n /**\n * Sorts the model values, ensuring that they keep the same\n * order that they have in the panel.\n */\n _sortValues() {\n if (this._multiple) {\n this._selectionModel.clear();\n this.chips.forEach(chip => {\n if (chip.selected) {\n this._selectionModel.select(chip);\n }\n });\n this.stateChanges.next();\n }\n }\n /** Emits change event to set the model value. */\n _propagateChanges(fallbackValue) {\n let valueToEmit = null;\n if (Array.isArray(this.selected)) {\n valueToEmit = this.selected.map(chip => chip.value);\n }\n else {\n valueToEmit = this.selected ? this.selected.value : fallbackValue;\n }\n this._value = valueToEmit;\n this.change.emit(new MatChipListChange(this, valueToEmit));\n this.valueChange.emit(valueToEmit);\n this._onChange(valueToEmit);\n this._changeDetectorRef.markForCheck();\n }\n /** When blurred, mark the field as touched when focus moved outside the chip list. */\n _blur() {\n if (!this._hasFocusedChip()) {\n this._keyManager.setActiveItem(-1);\n }\n if (!this.disabled) {\n if (this._chipInput) {\n // If there's a chip input, we should check whether the focus moved to chip input.\n // If the focus is not moved to chip input, mark the field as touched. If the focus moved\n // to chip input, do nothing.\n // Timeout is needed to wait for the focus() event trigger on chip input.\n setTimeout(() => {\n if (!this.focused) {\n this._markAsTouched();\n }\n });\n }\n else {\n // If there's no chip input, then mark the field as touched.\n this._markAsTouched();\n }\n }\n }\n /** Mark the field as touched */\n _markAsTouched() {\n this._onTouched();\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n /**\n * Removes the `tabindex` from the chip list and resets it back afterwards, allowing the\n * user to tab out of it. This prevents the list from capturing focus and redirecting\n * it back to the first chip, creating a focus trap, if it user tries to tab away.\n */\n _allowFocusEscape() {\n if (this._tabIndex !== -1) {\n this._tabIndex = -1;\n setTimeout(() => {\n this._tabIndex = this._userTabIndex || 0;\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n _resetChips() {\n this._dropSubscriptions();\n this._listenToChipsFocus();\n this._listenToChipsSelection();\n this._listenToChipsRemoved();\n }\n _dropSubscriptions() {\n if (this._chipFocusSubscription) {\n this._chipFocusSubscription.unsubscribe();\n this._chipFocusSubscription = null;\n }\n if (this._chipBlurSubscription) {\n this._chipBlurSubscription.unsubscribe();\n this._chipBlurSubscription = null;\n }\n if (this._chipSelectionSubscription) {\n this._chipSelectionSubscription.unsubscribe();\n this._chipSelectionSubscription = null;\n }\n if (this._chipRemoveSubscription) {\n this._chipRemoveSubscription.unsubscribe();\n this._chipRemoveSubscription = null;\n }\n }\n /** Listens to user-generated selection events on each chip. */\n _listenToChipsSelection() {\n this._chipSelectionSubscription = this.chipSelectionChanges.subscribe(event => {\n event.source.selected\n ? this._selectionModel.select(event.source)\n : this._selectionModel.deselect(event.source);\n // For single selection chip list, make sure the deselected value is unselected.\n if (!this.multiple) {\n this.chips.forEach(chip => {\n if (!this._selectionModel.isSelected(chip) && chip.selected) {\n chip.deselect();\n }\n });\n }\n if (event.isUserInput) {\n this._propagateChanges();\n }\n });\n }\n /** Listens to user-generated selection events on each chip. */\n _listenToChipsFocus() {\n this._chipFocusSubscription = this.chipFocusChanges.subscribe(event => {\n let chipIndex = this.chips.toArray().indexOf(event.chip);\n if (this._isValidIndex(chipIndex)) {\n this._keyManager.updateActiveItem(chipIndex);\n }\n this.stateChanges.next();\n });\n this._chipBlurSubscription = this.chipBlurChanges.subscribe(() => {\n this._blur();\n this.stateChanges.next();\n });\n }\n _listenToChipsRemoved() {\n this._chipRemoveSubscription = this.chipRemoveChanges.subscribe(event => {\n const chip = event.chip;\n const chipIndex = this.chips.toArray().indexOf(event.chip);\n // In case the chip that will be removed is currently focused, we temporarily store\n // the index in order to be able to determine an appropriate sibling chip that will\n // receive focus.\n if (this._isValidIndex(chipIndex) && chip._hasFocus) {\n this._lastDestroyedChipIndex = chipIndex;\n }\n });\n }\n /** Checks whether an event comes from inside a chip element. */\n _originatesFromChip(event) {\n let currentElement = event.target;\n while (currentElement && currentElement !== this._elementRef.nativeElement) {\n if (currentElement.classList.contains('mat-chip')) {\n return true;\n }\n currentElement = currentElement.parentElement;\n }\n return false;\n }\n /** Checks whether any of the chips is focused. */\n _hasFocusedChip() {\n return this.chips && this.chips.some(chip => chip._hasFocus);\n }\n /** Syncs the list's state with the individual chips. */\n _syncChipsState() {\n if (this.chips) {\n this.chips.forEach(chip => {\n chip._chipListDisabled = this._disabled;\n chip._chipListMultiple = this.multiple;\n });\n }\n }\n}\nMatChipList.ɵfac = function MatChipList_Factory(t) { return new (t || MatChipList)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.NgForm, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.FormGroupDirective, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.ErrorStateMatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.NgControl, 10)); };\nMatChipList.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatChipList, selectors: [[\"mat-chip-list\"]], contentQueries: function MatChipList_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatChip, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.chips = _t);\n } }, hostAttrs: [1, \"mat-chip-list\"], hostVars: 15, hostBindings: function MatChipList_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"focus\", function MatChipList_focus_HostBindingHandler() { return ctx.focus(); })(\"blur\", function MatChipList_blur_HostBindingHandler() { return ctx._blur(); })(\"keydown\", function MatChipList_keydown_HostBindingHandler($event) { return ctx._keydown($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"id\", ctx._uid);\n ɵngcc0.ɵɵattribute(\"tabindex\", ctx.disabled ? null : ctx._tabIndex)(\"aria-describedby\", ctx._ariaDescribedby || null)(\"aria-required\", ctx.role ? ctx.required : null)(\"aria-disabled\", ctx.disabled.toString())(\"aria-invalid\", ctx.errorState)(\"aria-multiselectable\", ctx.multiple)(\"role\", ctx.role)(\"aria-orientation\", ctx.ariaOrientation);\n ɵngcc0.ɵɵclassProp(\"mat-chip-list-disabled\", ctx.disabled)(\"mat-chip-list-invalid\", ctx.errorState)(\"mat-chip-list-required\", ctx.required);\n } }, inputs: { ariaOrientation: [\"aria-orientation\", \"ariaOrientation\"], multiple: \"multiple\", compareWith: \"compareWith\", value: \"value\", required: \"required\", placeholder: \"placeholder\", disabled: \"disabled\", selectable: \"selectable\", tabIndex: \"tabIndex\", errorStateMatcher: \"errorStateMatcher\" }, outputs: { change: \"change\", valueChange: \"valueChange\" }, exportAs: [\"matChipList\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MatFormFieldControl, useExisting: MatChipList }]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[1, \"mat-chip-list-wrapper\"]], template: function MatChipList_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵelementEnd();\n } }, styles: [\".mat-chip{position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transform:translateZ(0);border:none;-webkit-appearance:none;-moz-appearance:none}.mat-standard-chip{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);display:inline-flex;padding:7px 12px;border-radius:16px;align-items:center;cursor:default;min-height:32px;height:1px}._mat-animation-noopable.mat-standard-chip{transition:none;animation:none}.mat-standard-chip .mat-chip-remove.mat-icon{width:18px;height:18px}.mat-standard-chip::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;opacity:0;content:\\\"\\\";pointer-events:none;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-standard-chip:hover::after{opacity:.12}.mat-standard-chip:focus{outline:none}.mat-standard-chip:focus::after{opacity:.16}.cdk-high-contrast-active .mat-standard-chip{outline:solid 1px}.cdk-high-contrast-active .mat-standard-chip:focus{outline:dotted 2px}.mat-standard-chip.mat-chip-disabled::after{opacity:0}.mat-standard-chip.mat-chip-disabled .mat-chip-remove,.mat-standard-chip.mat-chip-disabled .mat-chip-trailing-icon{cursor:default}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar,.mat-standard-chip.mat-chip-with-avatar{padding-top:0;padding-bottom:0}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-right:8px;padding-left:0}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-left:8px;padding-right:0}.mat-standard-chip.mat-chip-with-trailing-icon{padding-top:7px;padding-bottom:7px;padding-right:8px;padding-left:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon{padding-left:8px;padding-right:12px}.mat-standard-chip.mat-chip-with-avatar{padding-left:0;padding-right:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-avatar{padding-right:0;padding-left:12px}.mat-standard-chip .mat-chip-avatar{width:24px;height:24px;margin-right:8px;margin-left:4px}[dir=rtl] .mat-standard-chip .mat-chip-avatar{margin-left:8px;margin-right:4px}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{width:18px;height:18px;cursor:pointer}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{margin-left:8px;margin-right:0}[dir=rtl] .mat-standard-chip .mat-chip-remove,[dir=rtl] .mat-standard-chip .mat-chip-trailing-icon{margin-right:8px;margin-left:0}.mat-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit;overflow:hidden}.mat-chip-list-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;margin:-4px}.mat-chip-list-wrapper input.mat-input-element,.mat-chip-list-wrapper .mat-standard-chip{margin:4px}.mat-chip-list-stacked .mat-chip-list-wrapper{flex-direction:column;align-items:flex-start}.mat-chip-list-stacked .mat-chip-list-wrapper .mat-standard-chip{width:100%}.mat-chip-avatar{border-radius:50%;justify-content:center;align-items:center;display:flex;overflow:hidden;object-fit:cover}input.mat-chip-input{width:150px;margin:4px;flex:1 0 150px}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatChipList.ctorParameters = () => [\n { type: ElementRef },\n { type: ChangeDetectorRef },\n { type: Directionality, decorators: [{ type: Optional }] },\n { type: NgForm, decorators: [{ type: Optional }] },\n { type: FormGroupDirective, decorators: [{ type: Optional }] },\n { type: ErrorStateMatcher },\n { type: NgControl, decorators: [{ type: Optional }, { type: Self }] }\n];\nMatChipList.propDecorators = {\n errorStateMatcher: [{ type: Input }],\n multiple: [{ type: Input }],\n compareWith: [{ type: Input }],\n value: [{ type: Input }],\n required: [{ type: Input }],\n placeholder: [{ type: Input }],\n disabled: [{ type: Input }],\n ariaOrientation: [{ type: Input, args: ['aria-orientation',] }],\n selectable: [{ type: Input }],\n tabIndex: [{ type: Input }],\n change: [{ type: Output }],\n valueChange: [{ type: Output }],\n chips: [{ type: ContentChildren, args: [MatChip, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipList, [{\n type: Component,\n args: [{\n selector: 'mat-chip-list',\n template: `<div class=\"mat-chip-list-wrapper\"><ng-content></ng-content></div>`,\n exportAs: 'matChipList',\n host: {\n '[attr.tabindex]': 'disabled ? null : _tabIndex',\n '[attr.aria-describedby]': '_ariaDescribedby || null',\n '[attr.aria-required]': 'role ? required : null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-invalid]': 'errorState',\n '[attr.aria-multiselectable]': 'multiple',\n '[attr.role]': 'role',\n '[class.mat-chip-list-disabled]': 'disabled',\n '[class.mat-chip-list-invalid]': 'errorState',\n '[class.mat-chip-list-required]': 'required',\n '[attr.aria-orientation]': 'ariaOrientation',\n 'class': 'mat-chip-list',\n '(focus)': 'focus()',\n '(blur)': '_blur()',\n '(keydown)': '_keydown($event)',\n '[id]': '_uid'\n },\n providers: [{ provide: MatFormFieldControl, useExisting: MatChipList }],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\".mat-chip{position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transform:translateZ(0);border:none;-webkit-appearance:none;-moz-appearance:none}.mat-standard-chip{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);display:inline-flex;padding:7px 12px;border-radius:16px;align-items:center;cursor:default;min-height:32px;height:1px}._mat-animation-noopable.mat-standard-chip{transition:none;animation:none}.mat-standard-chip .mat-chip-remove.mat-icon{width:18px;height:18px}.mat-standard-chip::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;opacity:0;content:\\\"\\\";pointer-events:none;transition:opacity 200ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-standard-chip:hover::after{opacity:.12}.mat-standard-chip:focus{outline:none}.mat-standard-chip:focus::after{opacity:.16}.cdk-high-contrast-active .mat-standard-chip{outline:solid 1px}.cdk-high-contrast-active .mat-standard-chip:focus{outline:dotted 2px}.mat-standard-chip.mat-chip-disabled::after{opacity:0}.mat-standard-chip.mat-chip-disabled .mat-chip-remove,.mat-standard-chip.mat-chip-disabled .mat-chip-trailing-icon{cursor:default}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar,.mat-standard-chip.mat-chip-with-avatar{padding-top:0;padding-bottom:0}.mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-right:8px;padding-left:0}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon.mat-chip-with-avatar{padding-left:8px;padding-right:0}.mat-standard-chip.mat-chip-with-trailing-icon{padding-top:7px;padding-bottom:7px;padding-right:8px;padding-left:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-trailing-icon{padding-left:8px;padding-right:12px}.mat-standard-chip.mat-chip-with-avatar{padding-left:0;padding-right:12px}[dir=rtl] .mat-standard-chip.mat-chip-with-avatar{padding-right:0;padding-left:12px}.mat-standard-chip .mat-chip-avatar{width:24px;height:24px;margin-right:8px;margin-left:4px}[dir=rtl] .mat-standard-chip .mat-chip-avatar{margin-left:8px;margin-right:4px}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{width:18px;height:18px;cursor:pointer}.mat-standard-chip .mat-chip-remove,.mat-standard-chip .mat-chip-trailing-icon{margin-left:8px;margin-right:0}[dir=rtl] .mat-standard-chip .mat-chip-remove,[dir=rtl] .mat-standard-chip .mat-chip-trailing-icon{margin-right:8px;margin-left:0}.mat-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit;overflow:hidden}.mat-chip-list-wrapper{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;margin:-4px}.mat-chip-list-wrapper input.mat-input-element,.mat-chip-list-wrapper .mat-standard-chip{margin:4px}.mat-chip-list-stacked .mat-chip-list-wrapper{flex-direction:column;align-items:flex-start}.mat-chip-list-stacked .mat-chip-list-wrapper .mat-standard-chip{width:100%}.mat-chip-avatar{border-radius:50%;justify-content:center;align-items:center;display:flex;overflow:hidden;object-fit:cover}input.mat-chip-input{width:150px;margin:4px;flex:1 0 150px}\\n\"]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc2.Directionality, decorators: [{\n type: Optional\n }] }, { type: ɵngcc3.NgForm, decorators: [{\n type: Optional\n }] }, { type: ɵngcc3.FormGroupDirective, decorators: [{\n type: Optional\n }] }, { type: ɵngcc4.ErrorStateMatcher }, { type: ɵngcc3.NgControl, decorators: [{\n type: Optional\n }, {\n type: Self\n }] }]; }, { ariaOrientation: [{\n type: Input,\n args: ['aria-orientation']\n }], change: [{\n type: Output\n }], valueChange: [{\n type: Output\n }], multiple: [{\n type: Input\n }], compareWith: [{\n type: Input\n }], value: [{\n type: Input\n }], required: [{\n type: Input\n }], placeholder: [{\n type: Input\n }], disabled: [{\n type: Input\n }], selectable: [{\n type: Input\n }], tabIndex: [{\n type: Input\n }], errorStateMatcher: [{\n type: Input\n }], chips: [{\n type: ContentChildren,\n args: [MatChip, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n }]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Increasing integer for generating unique ids.\nlet nextUniqueId$1 = 0;\n/**\n * Directive that adds chip-specific behaviors to an input element inside `<mat-form-field>`.\n * May be placed inside or outside of an `<mat-chip-list>`.\n */\nclass MatChipInput {\n constructor(_elementRef, _defaultOptions) {\n this._elementRef = _elementRef;\n this._defaultOptions = _defaultOptions;\n /** Whether the control is focused. */\n this.focused = false;\n this._addOnBlur = false;\n /**\n * The list of key codes that will trigger a chipEnd event.\n *\n * Defaults to `[ENTER]`.\n */\n this.separatorKeyCodes = this._defaultOptions.separatorKeyCodes;\n /** Emitted when a chip is to be added. */\n this.chipEnd = new EventEmitter();\n /** The input's placeholder text. */\n this.placeholder = '';\n /** Unique id for the input. */\n this.id = `mat-chip-list-input-${nextUniqueId$1++}`;\n this._disabled = false;\n this._inputElement = this._elementRef.nativeElement;\n }\n /** Register input for chip list */\n set chipList(value) {\n if (value) {\n this._chipList = value;\n this._chipList.registerInput(this);\n }\n }\n /**\n * Whether or not the chipEnd event will be emitted when the input is blurred.\n */\n get addOnBlur() { return this._addOnBlur; }\n set addOnBlur(value) { this._addOnBlur = coerceBooleanProperty(value); }\n /** Whether the input is disabled. */\n get disabled() { return this._disabled || (this._chipList && this._chipList.disabled); }\n set disabled(value) { this._disabled = coerceBooleanProperty(value); }\n /** Whether the input is empty. */\n get empty() { return !this._inputElement.value; }\n ngOnChanges() {\n this._chipList.stateChanges.next();\n }\n /** Utility method to make host definition/tests more clear. */\n _keydown(event) {\n // Allow the user's focus to escape when they're tabbing forward. Note that we don't\n // want to do this when going backwards, because focus should go back to the first chip.\n if (event && event.keyCode === TAB && !hasModifierKey(event, 'shiftKey')) {\n this._chipList._allowFocusEscape();\n }\n this._emitChipEnd(event);\n }\n /** Checks to see if the blur should emit the (chipEnd) event. */\n _blur() {\n if (this.addOnBlur) {\n this._emitChipEnd();\n }\n this.focused = false;\n // Blur the chip list if it is not focused\n if (!this._chipList.focused) {\n this._chipList._blur();\n }\n this._chipList.stateChanges.next();\n }\n _focus() {\n this.focused = true;\n this._chipList.stateChanges.next();\n }\n /** Checks to see if the (chipEnd) event needs to be emitted. */\n _emitChipEnd(event) {\n if (!this._inputElement.value && !!event) {\n this._chipList._keydown(event);\n }\n if (!event || this._isSeparatorKey(event)) {\n this.chipEnd.emit({ input: this._inputElement, value: this._inputElement.value });\n if (event) {\n event.preventDefault();\n }\n }\n }\n _onInput() {\n // Let chip list know whenever the value changes.\n this._chipList.stateChanges.next();\n }\n /** Focuses the input. */\n focus(options) {\n this._inputElement.focus(options);\n }\n /** Checks whether a keycode is one of the configured separators. */\n _isSeparatorKey(event) {\n return !hasModifierKey(event) && new Set(this.separatorKeyCodes).has(event.keyCode);\n }\n}\nMatChipInput.ɵfac = function MatChipInput_Factory(t) { return new (t || MatChipInput)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(MAT_CHIPS_DEFAULT_OPTIONS)); };\nMatChipInput.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipInput, selectors: [[\"input\", \"matChipInputFor\", \"\"]], hostAttrs: [1, \"mat-chip-input\", \"mat-input-element\"], hostVars: 5, hostBindings: function MatChipInput_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"keydown\", function MatChipInput_keydown_HostBindingHandler($event) { return ctx._keydown($event); })(\"blur\", function MatChipInput_blur_HostBindingHandler() { return ctx._blur(); })(\"focus\", function MatChipInput_focus_HostBindingHandler() { return ctx._focus(); })(\"input\", function MatChipInput_input_HostBindingHandler() { return ctx._onInput(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"id\", ctx.id);\n ɵngcc0.ɵɵattribute(\"disabled\", ctx.disabled || null)(\"placeholder\", ctx.placeholder || null)(\"aria-invalid\", ctx._chipList && ctx._chipList.ngControl ? ctx._chipList.ngControl.invalid : null)(\"aria-required\", ctx._chipList && ctx._chipList.required || null);\n } }, inputs: { separatorKeyCodes: [\"matChipInputSeparatorKeyCodes\", \"separatorKeyCodes\"], placeholder: \"placeholder\", id: \"id\", chipList: [\"matChipInputFor\", \"chipList\"], addOnBlur: [\"matChipInputAddOnBlur\", \"addOnBlur\"], disabled: \"disabled\" }, outputs: { chipEnd: \"matChipInputTokenEnd\" }, exportAs: [\"matChipInput\", \"matChipInputFor\"], features: [ɵngcc0.ɵɵNgOnChangesFeature] });\nMatChipInput.ctorParameters = () => [\n { type: ElementRef },\n { type: undefined, decorators: [{ type: Inject, args: [MAT_CHIPS_DEFAULT_OPTIONS,] }] }\n];\nMatChipInput.propDecorators = {\n chipList: [{ type: Input, args: ['matChipInputFor',] }],\n addOnBlur: [{ type: Input, args: ['matChipInputAddOnBlur',] }],\n separatorKeyCodes: [{ type: Input, args: ['matChipInputSeparatorKeyCodes',] }],\n chipEnd: [{ type: Output, args: ['matChipInputTokenEnd',] }],\n placeholder: [{ type: Input }],\n id: [{ type: Input }],\n disabled: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipInput, [{\n type: Directive,\n args: [{\n selector: 'input[matChipInputFor]',\n exportAs: 'matChipInput, matChipInputFor',\n host: {\n 'class': 'mat-chip-input mat-input-element',\n '(keydown)': '_keydown($event)',\n '(blur)': '_blur()',\n '(focus)': '_focus()',\n '(input)': '_onInput()',\n '[id]': 'id',\n '[attr.disabled]': 'disabled || null',\n '[attr.placeholder]': 'placeholder || null',\n '[attr.aria-invalid]': '_chipList && _chipList.ngControl ? _chipList.ngControl.invalid : null',\n '[attr.aria-required]': '_chipList && _chipList.required || null'\n }\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_CHIPS_DEFAULT_OPTIONS]\n }] }]; }, { separatorKeyCodes: [{\n type: Input,\n args: ['matChipInputSeparatorKeyCodes']\n }], chipEnd: [{\n type: Output,\n args: ['matChipInputTokenEnd']\n }], placeholder: [{\n type: Input\n }], id: [{\n type: Input\n }], chipList: [{\n type: Input,\n args: ['matChipInputFor']\n }], addOnBlur: [{\n type: Input,\n args: ['matChipInputAddOnBlur']\n }], disabled: [{\n type: Input\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst CHIP_DECLARATIONS = [\n MatChipList,\n MatChip,\n MatChipInput,\n MatChipRemove,\n MatChipAvatar,\n MatChipTrailingIcon,\n];\nconst ɵ0 = {\n separatorKeyCodes: [ENTER]\n};\nclass MatChipsModule {\n}\nMatChipsModule.ɵfac = function MatChipsModule_Factory(t) { return new (t || MatChipsModule)(); };\nMatChipsModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatChipsModule });\nMatChipsModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ providers: [\n ErrorStateMatcher,\n {\n provide: MAT_CHIPS_DEFAULT_OPTIONS,\n useValue: ɵ0\n }\n ], imports: [[MatCommonModule]] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipsModule, [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule],\n exports: CHIP_DECLARATIONS,\n declarations: CHIP_DECLARATIONS,\n providers: [\n ErrorStateMatcher,\n {\n provide: MAT_CHIPS_DEFAULT_OPTIONS,\n useValue: ɵ0\n }\n ]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatChipsModule, { declarations: function () { return [MatChipList, MatChip, MatChipInput, MatChipRemove, MatChipAvatar, MatChipTrailingIcon]; }, imports: function () { return [MatCommonModule]; }, exports: function () { return [MatChipList, MatChip, MatChipInput, MatChipRemove, MatChipAvatar, MatChipTrailingIcon]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_CHIPS_DEFAULT_OPTIONS, MAT_CHIP_AVATAR, MAT_CHIP_REMOVE, MAT_CHIP_TRAILING_ICON, MatChip, MatChipAvatar, MatChipInput, MatChipList, MatChipListChange, MatChipRemove, MatChipSelectionChange, MatChipTrailingIcon, MatChipsModule, ɵ0 };\n\n//# sourceMappingURL=chips.js.map","import { ObserversModule } from '@angular/cdk/observers';\nimport { CommonModule } from '@angular/common';\nimport { InjectionToken, Directive, Input, Component, ViewEncapsulation, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef, Inject, Optional, NgZone, ViewChild, ContentChild, ContentChildren, NgModule } from '@angular/core';\nimport { mixinColor, MatCommonModule } from '@angular/material/core';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Subject, merge, fromEvent } from 'rxjs';\nimport { startWith, takeUntil, take } from 'rxjs/operators';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { Platform } from '@angular/cdk/platform';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/bidi';\nimport * as ɵngcc2 from '@angular/cdk/platform';\nimport * as ɵngcc3 from '@angular/common';\nimport * as ɵngcc4 from '@angular/cdk/observers';\n\nconst _c0 = [\"underline\"];\nconst _c1 = [\"connectionContainer\"];\nconst _c2 = [\"inputContainer\"];\nconst _c3 = [\"label\"];\nfunction MatFormField_ng_container_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵelementStart(1, \"div\", 14);\n ɵngcc0.ɵɵelement(2, \"div\", 15);\n ɵngcc0.ɵɵelement(3, \"div\", 16);\n ɵngcc0.ɵɵelement(4, \"div\", 17);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(5, \"div\", 18);\n ɵngcc0.ɵɵelement(6, \"div\", 15);\n ɵngcc0.ɵɵelement(7, \"div\", 16);\n ɵngcc0.ɵɵelement(8, \"div\", 17);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainerEnd();\n} }\nfunction MatFormField_div_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 19);\n ɵngcc0.ɵɵprojection(1, 1);\n ɵngcc0.ɵɵelementEnd();\n} }\nfunction MatFormField_label_9_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainerStart(0);\n ɵngcc0.ɵɵprojection(1, 2);\n ɵngcc0.ɵɵelementStart(2, \"span\");\n ɵngcc0.ɵɵtext(3);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n const ctx_r10 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵtextInterpolate(ctx_r10._control.placeholder);\n} }\nfunction MatFormField_label_9_ng_content_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojection(0, 3, [\"*ngSwitchCase\", \"true\"]);\n} }\nfunction MatFormField_label_9_span_4_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"span\", 23);\n ɵngcc0.ɵɵtext(1, \" *\");\n ɵngcc0.ɵɵelementEnd();\n} }\nfunction MatFormField_label_9_Template(rf, ctx) { if (rf & 1) {\n const _r14 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"label\", 20, 21);\n ɵngcc0.ɵɵlistener(\"cdkObserveContent\", function MatFormField_label_9_Template_label_cdkObserveContent_0_listener() { ɵngcc0.ɵɵrestoreView(_r14); const ctx_r13 = ɵngcc0.ɵɵnextContext(); return ctx_r13.updateOutlineGap(); });\n ɵngcc0.ɵɵtemplate(2, MatFormField_label_9_ng_container_2_Template, 4, 1, \"ng-container\", 12);\n ɵngcc0.ɵɵtemplate(3, MatFormField_label_9_ng_content_3_Template, 1, 0, \"ng-content\", 12);\n ɵngcc0.ɵɵtemplate(4, MatFormField_label_9_span_4_Template, 2, 0, \"span\", 22);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r4 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassProp(\"mat-empty\", ctx_r4._control.empty && !ctx_r4._shouldAlwaysFloat())(\"mat-form-field-empty\", ctx_r4._control.empty && !ctx_r4._shouldAlwaysFloat())(\"mat-accent\", ctx_r4.color == \"accent\")(\"mat-warn\", ctx_r4.color == \"warn\");\n ɵngcc0.ɵɵproperty(\"cdkObserveContentDisabled\", ctx_r4.appearance != \"outline\")(\"id\", ctx_r4._labelId)(\"ngSwitch\", ctx_r4._hasLabel());\n ɵngcc0.ɵɵattribute(\"for\", ctx_r4._control.id)(\"aria-owns\", ctx_r4._control.id);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r4.hideRequiredMarker && ctx_r4._control.required && !ctx_r4._control.disabled);\n} }\nfunction MatFormField_div_10_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 24);\n ɵngcc0.ɵɵprojection(1, 4);\n ɵngcc0.ɵɵelementEnd();\n} }\nfunction MatFormField_div_11_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 25, 26);\n ɵngcc0.ɵɵelement(2, \"span\", 27);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r6 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"mat-accent\", ctx_r6.color == \"accent\")(\"mat-warn\", ctx_r6.color == \"warn\");\n} }\nfunction MatFormField_div_13_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\");\n ɵngcc0.ɵɵprojection(1, 5);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r7 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"@transitionMessages\", ctx_r7._subscriptAnimationState);\n} }\nfunction MatFormField_div_14_div_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 31);\n ɵngcc0.ɵɵtext(1);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r16 = ɵngcc0.ɵɵnextContext(2);\n ɵngcc0.ɵɵproperty(\"id\", ctx_r16._hintLabelId);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵtextInterpolate(ctx_r16.hintLabel);\n} }\nfunction MatFormField_div_14_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"div\", 28);\n ɵngcc0.ɵɵtemplate(1, MatFormField_div_14_div_1_Template, 2, 2, \"div\", 29);\n ɵngcc0.ɵɵprojection(2, 6);\n ɵngcc0.ɵɵelement(3, \"div\", 30);\n ɵngcc0.ɵɵprojection(4, 7);\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r8 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵproperty(\"@transitionMessages\", ctx_r8._subscriptAnimationState);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r8.hintLabel);\n} }\nconst _c4 = [\"*\", [[\"\", \"matPrefix\", \"\"]], [[\"mat-placeholder\"]], [[\"mat-label\"]], [[\"\", \"matSuffix\", \"\"]], [[\"mat-error\"]], [[\"mat-hint\", 3, \"align\", \"end\"]], [[\"mat-hint\", \"align\", \"end\"]]];\nconst _c5 = [\"*\", \"[matPrefix]\", \"mat-placeholder\", \"mat-label\", \"[matSuffix]\", \"mat-error\", \"mat-hint:not([align='end'])\", \"mat-hint[align='end']\"];\nlet nextUniqueId = 0;\n/**\n * Injection token that can be used to reference instances of `MatError`. It serves as\n * alternative token to the actual `MatError` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_ERROR = new InjectionToken('MatError');\n/** Single error message to be shown underneath the form field. */\nclass MatError {\n constructor() {\n this.id = `mat-error-${nextUniqueId++}`;\n }\n}\nMatError.ɵfac = function MatError_Factory(t) { return new (t || MatError)(); };\nMatError.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatError, selectors: [[\"mat-error\"]], hostAttrs: [\"role\", \"alert\", 1, \"mat-error\"], hostVars: 1, hostBindings: function MatError_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"id\", ctx.id);\n } }, inputs: { id: \"id\" }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_ERROR, useExisting: MatError }])] });\nMatError.propDecorators = {\n id: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatError, [{\n type: Directive,\n args: [{\n selector: 'mat-error',\n host: {\n 'class': 'mat-error',\n 'role': 'alert',\n '[attr.id]': 'id'\n },\n providers: [{ provide: MAT_ERROR, useExisting: MatError }]\n }]\n }], function () { return []; }, { id: [{\n type: Input\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Animations used by the MatFormField.\n * @docs-private\n */\nconst matFormFieldAnimations = {\n /** Animation that transitions the form field's error and hint messages. */\n transitionMessages: trigger('transitionMessages', [\n // TODO(mmalerba): Use angular animations for label animation as well.\n state('enter', style({ opacity: 1, transform: 'translateY(0%)' })),\n transition('void => enter', [\n style({ opacity: 0, transform: 'translateY(-5px)' }),\n animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)'),\n ]),\n ])\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** An interface which allows a control to work inside of a `MatFormField`. */\nclass MatFormFieldControl {\n}\nMatFormFieldControl.ɵfac = function MatFormFieldControl_Factory(t) { return new (t || MatFormFieldControl)(); };\nMatFormFieldControl.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatFormFieldControl });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatFormFieldControl, [{\n type: Directive\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** @docs-private */\nfunction getMatFormFieldPlaceholderConflictError() {\n return Error('Placeholder attribute and child element were both specified.');\n}\n/** @docs-private */\nfunction getMatFormFieldDuplicatedHintError(align) {\n return Error(`A hint was already declared for 'align=\"${align}\"'.`);\n}\n/** @docs-private */\nfunction getMatFormFieldMissingControlError() {\n return Error('mat-form-field must contain a MatFormFieldControl.');\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet nextUniqueId$1 = 0;\n/**\n * Injection token that can be used to reference instances of `MatHint`. It serves as\n * alternative token to the actual `MatHint` class which could cause unnecessary\n * retention of the class and its directive metadata.\n *\n * *Note*: This is not part of the public API as the MDC-based form-field will not\n * need a lightweight token for `MatHint` and we want to reduce breaking changes.\n */\nconst _MAT_HINT = new InjectionToken('MatHint');\n/** Hint text to be shown underneath the form field control. */\nclass MatHint {\n constructor() {\n /** Whether to align the hint label at the start or end of the line. */\n this.align = 'start';\n /** Unique ID for the hint. Used for the aria-describedby on the form field control. */\n this.id = `mat-hint-${nextUniqueId$1++}`;\n }\n}\nMatHint.ɵfac = function MatHint_Factory(t) { return new (t || MatHint)(); };\nMatHint.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatHint, selectors: [[\"mat-hint\"]], hostAttrs: [1, \"mat-hint\"], hostVars: 4, hostBindings: function MatHint_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"id\", ctx.id)(\"align\", null);\n ɵngcc0.ɵɵclassProp(\"mat-form-field-hint-end\", ctx.align === \"end\");\n } }, inputs: { align: \"align\", id: \"id\" }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: _MAT_HINT, useExisting: MatHint }])] });\nMatHint.propDecorators = {\n align: [{ type: Input }],\n id: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatHint, [{\n type: Directive,\n args: [{\n selector: 'mat-hint',\n host: {\n 'class': 'mat-hint',\n '[class.mat-form-field-hint-end]': 'align === \"end\"',\n '[attr.id]': 'id',\n // Remove align attribute to prevent it from interfering with layout.\n '[attr.align]': 'null'\n },\n providers: [{ provide: _MAT_HINT, useExisting: MatHint }]\n }]\n }], function () { return []; }, { align: [{\n type: Input\n }], id: [{\n type: Input\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** The floating label for a `mat-form-field`. */\nclass MatLabel {\n}\nMatLabel.ɵfac = function MatLabel_Factory(t) { return new (t || MatLabel)(); };\nMatLabel.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatLabel, selectors: [[\"mat-label\"]] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatLabel, [{\n type: Directive,\n args: [{\n selector: 'mat-label'\n }]\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * The placeholder text for an `MatFormField`.\n * @deprecated Use `<mat-label>` to specify the label and the `placeholder` attribute to specify the\n * placeholder.\n * @breaking-change 8.0.0\n */\nclass MatPlaceholder {\n}\nMatPlaceholder.ɵfac = function MatPlaceholder_Factory(t) { return new (t || MatPlaceholder)(); };\nMatPlaceholder.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatPlaceholder, selectors: [[\"mat-placeholder\"]] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatPlaceholder, [{\n type: Directive,\n args: [{\n selector: 'mat-placeholder'\n }]\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injection token that can be used to reference instances of `MatPrefix`. It serves as\n * alternative token to the actual `MatPrefix` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_PREFIX = new InjectionToken('MatPrefix');\n/** Prefix to be placed in front of the form field. */\nclass MatPrefix {\n}\nMatPrefix.ɵfac = function MatPrefix_Factory(t) { return new (t || MatPrefix)(); };\nMatPrefix.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatPrefix, selectors: [[\"\", \"matPrefix\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_PREFIX, useExisting: MatPrefix }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatPrefix, [{\n type: Directive,\n args: [{\n selector: '[matPrefix]',\n providers: [{ provide: MAT_PREFIX, useExisting: MatPrefix }]\n }]\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injection token that can be used to reference instances of `MatSuffix`. It serves as\n * alternative token to the actual `MatSuffix` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_SUFFIX = new InjectionToken('MatSuffix');\n/** Suffix to be placed at the end of the form field. */\nclass MatSuffix {\n}\nMatSuffix.ɵfac = function MatSuffix_Factory(t) { return new (t || MatSuffix)(); };\nMatSuffix.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatSuffix, selectors: [[\"\", \"matSuffix\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_SUFFIX, useExisting: MatSuffix }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSuffix, [{\n type: Directive,\n args: [{\n selector: '[matSuffix]',\n providers: [{ provide: MAT_SUFFIX, useExisting: MatSuffix }]\n }]\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet nextUniqueId$2 = 0;\nconst floatingLabelScale = 0.75;\nconst outlineGapPadding = 5;\n/**\n * Boilerplate for applying mixins to MatFormField.\n * @docs-private\n */\nclass MatFormFieldBase {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}\n/**\n * Base class to which we're applying the form field mixins.\n * @docs-private\n */\nconst _MatFormFieldMixinBase = mixinColor(MatFormFieldBase, 'primary');\n/**\n * Injection token that can be used to configure the\n * default options for all form field within an app.\n */\nconst MAT_FORM_FIELD_DEFAULT_OPTIONS = new InjectionToken('MAT_FORM_FIELD_DEFAULT_OPTIONS');\n/**\n * Injection token that can be used to inject an instances of `MatFormField`. It serves\n * as alternative token to the actual `MatFormField` class which would cause unnecessary\n * retention of the `MatFormField` class and its component metadata.\n */\nconst MAT_FORM_FIELD = new InjectionToken('MatFormField');\n/** Container for form controls that applies Material Design styling and behavior. */\nclass MatFormField extends _MatFormFieldMixinBase {\n constructor(_elementRef, _changeDetectorRef, \n /**\n * @deprecated `_labelOptions` parameter no longer being used. To be removed.\n * @breaking-change 12.0.0\n */\n // Use `ElementRef` here so Angular has something to inject.\n _labelOptions, _dir, _defaults, _platform, _ngZone, _animationMode) {\n super(_elementRef);\n this._elementRef = _elementRef;\n this._changeDetectorRef = _changeDetectorRef;\n this._dir = _dir;\n this._defaults = _defaults;\n this._platform = _platform;\n this._ngZone = _ngZone;\n /**\n * Whether the outline gap needs to be calculated\n * immediately on the next change detection run.\n */\n this._outlineGapCalculationNeededImmediately = false;\n /** Whether the outline gap needs to be calculated next time the zone has stabilized. */\n this._outlineGapCalculationNeededOnStable = false;\n this._destroyed = new Subject();\n /** Override for the logic that disables the label animation in certain cases. */\n this._showAlwaysAnimate = false;\n /** State of the mat-hint and mat-error animations. */\n this._subscriptAnimationState = '';\n this._hintLabel = '';\n // Unique id for the hint label.\n this._hintLabelId = `mat-hint-${nextUniqueId$2++}`;\n // Unique id for the label element.\n this._labelId = `mat-form-field-label-${nextUniqueId$2++}`;\n this.floatLabel = this._getDefaultFloatLabelState();\n this._animationsEnabled = _animationMode !== 'NoopAnimations';\n // Set the default through here so we invoke the setter on the first run.\n this.appearance = (_defaults && _defaults.appearance) ? _defaults.appearance : 'legacy';\n this._hideRequiredMarker = (_defaults && _defaults.hideRequiredMarker != null) ?\n _defaults.hideRequiredMarker : false;\n }\n /** The form-field appearance style. */\n get appearance() { return this._appearance; }\n set appearance(value) {\n const oldValue = this._appearance;\n this._appearance = value || (this._defaults && this._defaults.appearance) || 'legacy';\n if (this._appearance === 'outline' && oldValue !== value) {\n this._outlineGapCalculationNeededOnStable = true;\n }\n }\n /** Whether the required marker should be hidden. */\n get hideRequiredMarker() { return this._hideRequiredMarker; }\n set hideRequiredMarker(value) {\n this._hideRequiredMarker = coerceBooleanProperty(value);\n }\n /** Whether the floating label should always float or not. */\n _shouldAlwaysFloat() {\n return this.floatLabel === 'always' && !this._showAlwaysAnimate;\n }\n /** Whether the label can float or not. */\n _canLabelFloat() { return this.floatLabel !== 'never'; }\n /** Text for the form field hint. */\n get hintLabel() { return this._hintLabel; }\n set hintLabel(value) {\n this._hintLabel = value;\n this._processHints();\n }\n /**\n * Whether the label should always float, never float or float as the user types.\n *\n * Note: only the legacy appearance supports the `never` option. `never` was originally added as a\n * way to make the floating label emulate the behavior of a standard input placeholder. However\n * the form field now supports both floating labels and placeholders. Therefore in the non-legacy\n * appearances the `never` option has been disabled in favor of just using the placeholder.\n */\n get floatLabel() {\n return this.appearance !== 'legacy' && this._floatLabel === 'never' ? 'auto' : this._floatLabel;\n }\n set floatLabel(value) {\n if (value !== this._floatLabel) {\n this._floatLabel = value || this._getDefaultFloatLabelState();\n this._changeDetectorRef.markForCheck();\n }\n }\n get _control() {\n // TODO(crisbeto): we need this workaround in order to support both Ivy and ViewEngine.\n // We should clean this up once Ivy is the default renderer.\n return this._explicitFormFieldControl || this._controlNonStatic || this._controlStatic;\n }\n set _control(value) {\n this._explicitFormFieldControl = value;\n }\n /**\n * Gets the id of the label element. If no label is present, returns `null`.\n */\n getLabelId() {\n return this._hasFloatingLabel() ? this._labelId : null;\n }\n /**\n * Gets an ElementRef for the element that a overlay attached to the form-field should be\n * positioned relative to.\n */\n getConnectedOverlayOrigin() {\n return this._connectionContainerRef || this._elementRef;\n }\n ngAfterContentInit() {\n this._validateControlChild();\n const control = this._control;\n if (control.controlType) {\n this._elementRef.nativeElement.classList.add(`mat-form-field-type-${control.controlType}`);\n }\n // Subscribe to changes in the child control state in order to update the form field UI.\n control.stateChanges.pipe(startWith(null)).subscribe(() => {\n this._validatePlaceholders();\n this._syncDescribedByIds();\n this._changeDetectorRef.markForCheck();\n });\n // Run change detection if the value changes.\n if (control.ngControl && control.ngControl.valueChanges) {\n control.ngControl.valueChanges\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._changeDetectorRef.markForCheck());\n }\n // Note that we have to run outside of the `NgZone` explicitly,\n // in order to avoid throwing users into an infinite loop\n // if `zone-patch-rxjs` is included.\n this._ngZone.runOutsideAngular(() => {\n this._ngZone.onStable.pipe(takeUntil(this._destroyed)).subscribe(() => {\n if (this._outlineGapCalculationNeededOnStable) {\n this.updateOutlineGap();\n }\n });\n });\n // Run change detection and update the outline if the suffix or prefix changes.\n merge(this._prefixChildren.changes, this._suffixChildren.changes).subscribe(() => {\n this._outlineGapCalculationNeededOnStable = true;\n this._changeDetectorRef.markForCheck();\n });\n // Re-validate when the number of hints changes.\n this._hintChildren.changes.pipe(startWith(null)).subscribe(() => {\n this._processHints();\n this._changeDetectorRef.markForCheck();\n });\n // Update the aria-described by when the number of errors changes.\n this._errorChildren.changes.pipe(startWith(null)).subscribe(() => {\n this._syncDescribedByIds();\n this._changeDetectorRef.markForCheck();\n });\n if (this._dir) {\n this._dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {\n if (typeof requestAnimationFrame === 'function') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => this.updateOutlineGap());\n });\n }\n else {\n this.updateOutlineGap();\n }\n });\n }\n }\n ngAfterContentChecked() {\n this._validateControlChild();\n if (this._outlineGapCalculationNeededImmediately) {\n this.updateOutlineGap();\n }\n }\n ngAfterViewInit() {\n // Avoid animations on load.\n this._subscriptAnimationState = 'enter';\n this._changeDetectorRef.detectChanges();\n }\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Determines whether a class from the NgControl should be forwarded to the host element. */\n _shouldForward(prop) {\n const ngControl = this._control ? this._control.ngControl : null;\n return ngControl && ngControl[prop];\n }\n _hasPlaceholder() {\n return !!(this._control && this._control.placeholder || this._placeholderChild);\n }\n _hasLabel() {\n return !!(this._labelChildNonStatic || this._labelChildStatic);\n }\n _shouldLabelFloat() {\n return this._canLabelFloat() &&\n ((this._control && this._control.shouldLabelFloat) || this._shouldAlwaysFloat());\n }\n _hideControlPlaceholder() {\n // In the legacy appearance the placeholder is promoted to a label if no label is given.\n return this.appearance === 'legacy' && !this._hasLabel() ||\n this._hasLabel() && !this._shouldLabelFloat();\n }\n _hasFloatingLabel() {\n // In the legacy appearance the placeholder is promoted to a label if no label is given.\n return this._hasLabel() || this.appearance === 'legacy' && this._hasPlaceholder();\n }\n /** Determines whether to display hints or errors. */\n _getDisplayedMessages() {\n return (this._errorChildren && this._errorChildren.length > 0 &&\n this._control.errorState) ? 'error' : 'hint';\n }\n /** Animates the placeholder up and locks it in position. */\n _animateAndLockLabel() {\n if (this._hasFloatingLabel() && this._canLabelFloat()) {\n // If animations are disabled, we shouldn't go in here,\n // because the `transitionend` will never fire.\n if (this._animationsEnabled && this._label) {\n this._showAlwaysAnimate = true;\n fromEvent(this._label.nativeElement, 'transitionend').pipe(take(1)).subscribe(() => {\n this._showAlwaysAnimate = false;\n });\n }\n this.floatLabel = 'always';\n this._changeDetectorRef.markForCheck();\n }\n }\n /**\n * Ensure that there is only one placeholder (either `placeholder` attribute on the child control\n * or child element with the `mat-placeholder` directive).\n */\n _validatePlaceholders() {\n if (this._control.placeholder && this._placeholderChild &&\n (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatFormFieldPlaceholderConflictError();\n }\n }\n /** Does any extra processing that is required when handling the hints. */\n _processHints() {\n this._validateHints();\n this._syncDescribedByIds();\n }\n /**\n * Ensure that there is a maximum of one of each `<mat-hint>` alignment specified, with the\n * attribute being considered as `align=\"start\"`.\n */\n _validateHints() {\n if (this._hintChildren && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n let startHint;\n let endHint;\n this._hintChildren.forEach((hint) => {\n if (hint.align === 'start') {\n if (startHint || this.hintLabel) {\n throw getMatFormFieldDuplicatedHintError('start');\n }\n startHint = hint;\n }\n else if (hint.align === 'end') {\n if (endHint) {\n throw getMatFormFieldDuplicatedHintError('end');\n }\n endHint = hint;\n }\n });\n }\n }\n /** Gets the default float label state. */\n _getDefaultFloatLabelState() {\n return (this._defaults && this._defaults.floatLabel) || 'auto';\n }\n /**\n * Sets the list of element IDs that describe the child control. This allows the control to update\n * its `aria-describedby` attribute accordingly.\n */\n _syncDescribedByIds() {\n if (this._control) {\n let ids = [];\n // TODO(wagnermaciel): Remove the type check when we find the root cause of this bug.\n if (this._control.userAriaDescribedBy &&\n typeof this._control.userAriaDescribedBy === 'string') {\n ids.push(...this._control.userAriaDescribedBy.split(' '));\n }\n if (this._getDisplayedMessages() === 'hint') {\n const startHint = this._hintChildren ?\n this._hintChildren.find(hint => hint.align === 'start') : null;\n const endHint = this._hintChildren ?\n this._hintChildren.find(hint => hint.align === 'end') : null;\n if (startHint) {\n ids.push(startHint.id);\n }\n else if (this._hintLabel) {\n ids.push(this._hintLabelId);\n }\n if (endHint) {\n ids.push(endHint.id);\n }\n }\n else if (this._errorChildren) {\n ids.push(...this._errorChildren.map(error => error.id));\n }\n this._control.setDescribedByIds(ids);\n }\n }\n /** Throws an error if the form field's control is missing. */\n _validateControlChild() {\n if (!this._control && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMatFormFieldMissingControlError();\n }\n }\n /**\n * Updates the width and position of the gap in the outline. Only relevant for the outline\n * appearance.\n */\n updateOutlineGap() {\n const labelEl = this._label ? this._label.nativeElement : null;\n if (this.appearance !== 'outline' || !labelEl || !labelEl.children.length ||\n !labelEl.textContent.trim()) {\n return;\n }\n if (!this._platform.isBrowser) {\n // getBoundingClientRect isn't available on the server.\n return;\n }\n // If the element is not present in the DOM, the outline gap will need to be calculated\n // the next time it is checked and in the DOM.\n if (!this._isAttachedToDOM()) {\n this._outlineGapCalculationNeededImmediately = true;\n return;\n }\n let startWidth = 0;\n let gapWidth = 0;\n const container = this._connectionContainerRef.nativeElement;\n const startEls = container.querySelectorAll('.mat-form-field-outline-start');\n const gapEls = container.querySelectorAll('.mat-form-field-outline-gap');\n if (this._label && this._label.nativeElement.children.length) {\n const containerRect = container.getBoundingClientRect();\n // If the container's width and height are zero, it means that the element is\n // invisible and we can't calculate the outline gap. Mark the element as needing\n // to be checked the next time the zone stabilizes. We can't do this immediately\n // on the next change detection, because even if the element becomes visible,\n // the `ClientRect` won't be reclaculated immediately. We reset the\n // `_outlineGapCalculationNeededImmediately` flag some we don't run the checks twice.\n if (containerRect.width === 0 && containerRect.height === 0) {\n this._outlineGapCalculationNeededOnStable = true;\n this._outlineGapCalculationNeededImmediately = false;\n return;\n }\n const containerStart = this._getStartEnd(containerRect);\n const labelChildren = labelEl.children;\n const labelStart = this._getStartEnd(labelChildren[0].getBoundingClientRect());\n let labelWidth = 0;\n for (let i = 0; i < labelChildren.length; i++) {\n labelWidth += labelChildren[i].offsetWidth;\n }\n startWidth = Math.abs(labelStart - containerStart) - outlineGapPadding;\n gapWidth = labelWidth > 0 ? labelWidth * floatingLabelScale + outlineGapPadding * 2 : 0;\n }\n for (let i = 0; i < startEls.length; i++) {\n startEls[i].style.width = `${startWidth}px`;\n }\n for (let i = 0; i < gapEls.length; i++) {\n gapEls[i].style.width = `${gapWidth}px`;\n }\n this._outlineGapCalculationNeededOnStable =\n this._outlineGapCalculationNeededImmediately = false;\n }\n /** Gets the start end of the rect considering the current directionality. */\n _getStartEnd(rect) {\n return (this._dir && this._dir.value === 'rtl') ? rect.right : rect.left;\n }\n /** Checks whether the form field is attached to the DOM. */\n _isAttachedToDOM() {\n const element = this._elementRef.nativeElement;\n if (element.getRootNode) {\n const rootNode = element.getRootNode();\n // If the element is inside the DOM the root node will be either the document\n // or the closest shadow root, otherwise it'll be the element itself.\n return rootNode && rootNode !== element;\n }\n // Otherwise fall back to checking if it's in the document. This doesn't account for\n // shadow DOM, however browser that support shadow DOM should support `getRootNode` as well.\n return document.documentElement.contains(element);\n }\n}\nMatFormField.ɵfac = function MatFormField_Factory(t) { return new (t || MatFormField)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(MAT_FORM_FIELD_DEFAULT_OPTIONS, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Platform), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatFormField.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatFormField, selectors: [[\"mat-form-field\"]], contentQueries: function MatFormField_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatFormFieldControl, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatFormFieldControl, 7);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatLabel, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatLabel, 7);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatPlaceholder, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_ERROR, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, _MAT_HINT, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_PREFIX, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_SUFFIX, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._controlNonStatic = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._controlStatic = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._labelChildNonStatic = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._labelChildStatic = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._placeholderChild = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._errorChildren = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._hintChildren = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._prefixChildren = _t);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._suffixChildren = _t);\n } }, viewQuery: function MatFormField_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c0, 5);\n ɵngcc0.ɵɵviewQuery(_c1, 7);\n ɵngcc0.ɵɵviewQuery(_c2, 5);\n ɵngcc0.ɵɵviewQuery(_c3, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.underlineRef = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._connectionContainerRef = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._inputContainerRef = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._label = _t.first);\n } }, hostAttrs: [1, \"mat-form-field\"], hostVars: 40, hostBindings: function MatFormField_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"mat-form-field-appearance-standard\", ctx.appearance == \"standard\")(\"mat-form-field-appearance-fill\", ctx.appearance == \"fill\")(\"mat-form-field-appearance-outline\", ctx.appearance == \"outline\")(\"mat-form-field-appearance-legacy\", ctx.appearance == \"legacy\")(\"mat-form-field-invalid\", ctx._control.errorState)(\"mat-form-field-can-float\", ctx._canLabelFloat())(\"mat-form-field-should-float\", ctx._shouldLabelFloat())(\"mat-form-field-has-label\", ctx._hasFloatingLabel())(\"mat-form-field-hide-placeholder\", ctx._hideControlPlaceholder())(\"mat-form-field-disabled\", ctx._control.disabled)(\"mat-form-field-autofilled\", ctx._control.autofilled)(\"mat-focused\", ctx._control.focused)(\"ng-untouched\", ctx._shouldForward(\"untouched\"))(\"ng-touched\", ctx._shouldForward(\"touched\"))(\"ng-pristine\", ctx._shouldForward(\"pristine\"))(\"ng-dirty\", ctx._shouldForward(\"dirty\"))(\"ng-valid\", ctx._shouldForward(\"valid\"))(\"ng-invalid\", ctx._shouldForward(\"invalid\"))(\"ng-pending\", ctx._shouldForward(\"pending\"))(\"_mat-animation-noopable\", !ctx._animationsEnabled);\n } }, inputs: { color: \"color\", floatLabel: \"floatLabel\", appearance: \"appearance\", hideRequiredMarker: \"hideRequiredMarker\", hintLabel: \"hintLabel\" }, exportAs: [\"matFormField\"], features: [ɵngcc0.ɵɵProvidersFeature([\n { provide: MAT_FORM_FIELD, useExisting: MatFormField },\n ]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c5, decls: 15, vars: 8, consts: [[1, \"mat-form-field-wrapper\"], [1, \"mat-form-field-flex\", 3, \"click\"], [\"connectionContainer\", \"\"], [4, \"ngIf\"], [\"class\", \"mat-form-field-prefix\", 4, \"ngIf\"], [1, \"mat-form-field-infix\"], [\"inputContainer\", \"\"], [1, \"mat-form-field-label-wrapper\"], [\"class\", \"mat-form-field-label\", 3, \"cdkObserveContentDisabled\", \"id\", \"mat-empty\", \"mat-form-field-empty\", \"mat-accent\", \"mat-warn\", \"ngSwitch\", \"cdkObserveContent\", 4, \"ngIf\"], [\"class\", \"mat-form-field-suffix\", 4, \"ngIf\"], [\"class\", \"mat-form-field-underline\", 4, \"ngIf\"], [1, \"mat-form-field-subscript-wrapper\", 3, \"ngSwitch\"], [4, \"ngSwitchCase\"], [\"class\", \"mat-form-field-hint-wrapper\", 4, \"ngSwitchCase\"], [1, \"mat-form-field-outline\"], [1, \"mat-form-field-outline-start\"], [1, \"mat-form-field-outline-gap\"], [1, \"mat-form-field-outline-end\"], [1, \"mat-form-field-outline\", \"mat-form-field-outline-thick\"], [1, \"mat-form-field-prefix\"], [1, \"mat-form-field-label\", 3, \"cdkObserveContentDisabled\", \"id\", \"ngSwitch\", \"cdkObserveContent\"], [\"label\", \"\"], [\"class\", \"mat-placeholder-required mat-form-field-required-marker\", \"aria-hidden\", \"true\", 4, \"ngIf\"], [\"aria-hidden\", \"true\", 1, \"mat-placeholder-required\", \"mat-form-field-required-marker\"], [1, \"mat-form-field-suffix\"], [1, \"mat-form-field-underline\"], [\"underline\", \"\"], [1, \"mat-form-field-ripple\"], [1, \"mat-form-field-hint-wrapper\"], [\"class\", \"mat-hint\", 3, \"id\", 4, \"ngIf\"], [1, \"mat-form-field-hint-spacer\"], [1, \"mat-hint\", 3, \"id\"]], template: function MatFormField_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c4);\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵelementStart(1, \"div\", 1, 2);\n ɵngcc0.ɵɵlistener(\"click\", function MatFormField_Template_div_click_1_listener($event) { return ctx._control.onContainerClick && ctx._control.onContainerClick($event); });\n ɵngcc0.ɵɵtemplate(3, MatFormField_ng_container_3_Template, 9, 0, \"ng-container\", 3);\n ɵngcc0.ɵɵtemplate(4, MatFormField_div_4_Template, 2, 0, \"div\", 4);\n ɵngcc0.ɵɵelementStart(5, \"div\", 5, 6);\n ɵngcc0.ɵɵprojection(7);\n ɵngcc0.ɵɵelementStart(8, \"span\", 7);\n ɵngcc0.ɵɵtemplate(9, MatFormField_label_9_Template, 5, 16, \"label\", 8);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(10, MatFormField_div_10_Template, 2, 0, \"div\", 9);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵtemplate(11, MatFormField_div_11_Template, 3, 4, \"div\", 10);\n ɵngcc0.ɵɵelementStart(12, \"div\", 11);\n ɵngcc0.ɵɵtemplate(13, MatFormField_div_13_Template, 2, 1, \"div\", 12);\n ɵngcc0.ɵɵtemplate(14, MatFormField_div_14_Template, 5, 2, \"div\", 13);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.appearance == \"outline\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx._prefixChildren.length);\n ɵngcc0.ɵɵadvance(5);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx._hasFloatingLabel());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx._suffixChildren.length);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.appearance != \"outline\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx._getDisplayedMessages());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", \"error\");\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", \"hint\");\n } }, directives: [ɵngcc3.NgIf, ɵngcc3.NgSwitch, ɵngcc3.NgSwitchCase, ɵngcc4.CdkObserveContent], styles: [\".mat-form-field{display:inline-block;position:relative;text-align:left}[dir=rtl] .mat-form-field{text-align:right}.mat-form-field-wrapper{position:relative}.mat-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-form-field-prefix,.mat-form-field-suffix{white-space:nowrap;flex:none;position:relative}.mat-form-field-infix{display:block;position:relative;flex:auto;min-width:0;width:180px}.cdk-high-contrast-active .mat-form-field-infix{border-image:linear-gradient(transparent, transparent)}.mat-form-field-label-wrapper{position:absolute;left:0;box-sizing:content-box;width:100%;height:100%;overflow:hidden;pointer-events:none}[dir=rtl] .mat-form-field-label-wrapper{left:auto;right:0}.mat-form-field-label{position:absolute;left:0;font:inherit;pointer-events:none;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),width 400ms cubic-bezier(0.25, 0.8, 0.25, 1);display:none}[dir=rtl] .mat-form-field-label{transform-origin:100% 0;left:auto;right:0}.mat-form-field-empty.mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{display:block}.mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:block;transition:none}.mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float .mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:block}.mat-form-field-label:not(.mat-form-field-empty){transition:none}.mat-form-field-underline{position:absolute;width:100%;pointer-events:none;transform:scale3d(1, 1.0001, 1)}.mat-form-field-ripple{position:absolute;left:0;width:100%;transform-origin:50%;transform:scaleX(0.5);opacity:0;transition:background-color 300ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-form-field.mat-focused .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple{opacity:1;transform:none;transition:transform 300ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 300ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-subscript-wrapper{position:absolute;box-sizing:border-box;width:100%;overflow:hidden}.mat-form-field-subscript-wrapper .mat-icon,.mat-form-field-label-wrapper .mat-icon{width:1em;height:1em;font-size:inherit;vertical-align:baseline}.mat-form-field-hint-wrapper{display:flex}.mat-form-field-hint-spacer{flex:1 0 1em}.mat-error{display:block}.mat-form-field-control-wrapper{position:relative}.mat-form-field-hint-end{order:1}.mat-form-field._mat-animation-noopable .mat-form-field-label,.mat-form-field._mat-animation-noopable .mat-form-field-ripple{transition:none}\\n\", \".mat-form-field-appearance-fill .mat-form-field-flex{border-radius:4px 4px 0 0;padding:.75em .75em 0 .75em}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-flex{outline:solid 1px}.mat-form-field-appearance-fill .mat-form-field-underline::before{content:\\\"\\\";display:block;position:absolute;bottom:0;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-fill:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-fill._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}.mat-form-field-appearance-fill .mat-form-field-subscript-wrapper{padding:0 1em}\\n\", \".mat-input-element{font:inherit;background:transparent;color:currentColor;border:none;outline:none;padding:0;margin:0;width:100%;max-width:100%;vertical-align:bottom;text-align:inherit;box-sizing:content-box}.mat-input-element:-moz-ui-invalid{box-shadow:none}.mat-input-element::-ms-clear,.mat-input-element::-ms-reveal{display:none}.mat-input-element,.mat-input-element::-webkit-search-cancel-button,.mat-input-element::-webkit-search-decoration,.mat-input-element::-webkit-search-results-button,.mat-input-element::-webkit-search-results-decoration{-webkit-appearance:none}.mat-input-element::-webkit-contacts-auto-fill-button,.mat-input-element::-webkit-caps-lock-indicator,.mat-input-element::-webkit-credentials-auto-fill-button{visibility:hidden}.mat-input-element[type=date],.mat-input-element[type=datetime],.mat-input-element[type=datetime-local],.mat-input-element[type=month],.mat-input-element[type=week],.mat-input-element[type=time]{line-height:1}.mat-input-element[type=date]::after,.mat-input-element[type=datetime]::after,.mat-input-element[type=datetime-local]::after,.mat-input-element[type=month]::after,.mat-input-element[type=week]::after,.mat-input-element[type=time]::after{content:\\\" \\\";white-space:pre;width:1px}.mat-input-element::-webkit-inner-spin-button,.mat-input-element::-webkit-calendar-picker-indicator,.mat-input-element::-webkit-clear-button{font-size:.75em}.mat-input-element::placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-moz-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-moz-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-webkit-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-webkit-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element:-ms-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element:-ms-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-form-field-hide-placeholder .mat-input-element::placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-moz-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-webkit-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element:-ms-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}textarea.mat-input-element{resize:vertical;overflow:auto}textarea.mat-input-element.cdk-textarea-autosize{resize:none}textarea.mat-input-element{padding:2px 0;margin:-2px 0}select.mat-input-element{-moz-appearance:none;-webkit-appearance:none;position:relative;background-color:transparent;display:inline-flex;box-sizing:border-box;padding-top:1em;top:-1em;margin-bottom:-1em}select.mat-input-element::-ms-expand{display:none}select.mat-input-element::-moz-focus-inner{border:0}select.mat-input-element:not(:disabled){cursor:pointer}select.mat-input-element::-ms-value{color:inherit;background:none}.mat-focused .cdk-high-contrast-active select.mat-input-element::-ms-value{color:inherit}.mat-form-field-type-mat-native-select .mat-form-field-infix::after{content:\\\"\\\";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;position:absolute;top:50%;right:0;margin-top:-2.5px;pointer-events:none}[dir=rtl] .mat-form-field-type-mat-native-select .mat-form-field-infix::after{right:auto;left:0}.mat-form-field-type-mat-native-select .mat-input-element{padding-right:15px}[dir=rtl] .mat-form-field-type-mat-native-select .mat-input-element{padding-right:0;padding-left:15px}.mat-form-field-type-mat-native-select .mat-form-field-label-wrapper{max-width:calc(100% - 10px)}.mat-form-field-type-mat-native-select.mat-form-field-appearance-outline .mat-form-field-infix::after{margin-top:-5px}.mat-form-field-type-mat-native-select.mat-form-field-appearance-fill .mat-form-field-infix::after{margin-top:-10px}\\n\", \".mat-form-field-appearance-legacy .mat-form-field-label{transform:perspective(100px);-ms-transform:none}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon{width:1em}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button{font:inherit;vertical-align:baseline}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button .mat-icon{font-size:inherit}.mat-form-field-appearance-legacy .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-legacy .mat-form-field-ripple{top:0;height:2px;overflow:hidden}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-legacy.mat-form-field-invalid:not(.mat-focused) .mat-form-field-ripple{height:1px}\\n\", \".mat-form-field-appearance-outline .mat-form-field-wrapper{margin:.25em 0}.mat-form-field-appearance-outline .mat-form-field-flex{padding:0 .75em 0 .75em;margin-top:-0.25em;position:relative}.mat-form-field-appearance-outline .mat-form-field-prefix,.mat-form-field-appearance-outline .mat-form-field-suffix{top:.25em}.mat-form-field-appearance-outline .mat-form-field-outline{display:flex;position:absolute;top:.25em;left:0;right:0;bottom:0;pointer-events:none}.mat-form-field-appearance-outline .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-end{border:1px solid currentColor;min-width:5px}.mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:5px 0 0 5px;border-right-style:none}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-start{border-right-style:solid;border-left-style:none;border-radius:0 5px 5px 0}.mat-form-field-appearance-outline .mat-form-field-outline-end{border-radius:0 5px 5px 0;border-left-style:none;flex-grow:1}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-end{border-left-style:solid;border-right-style:none;border-radius:5px 0 0 5px}.mat-form-field-appearance-outline .mat-form-field-outline-gap{border-radius:.000001px;border:1px solid currentColor;border-left-style:none;border-right-style:none}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-outline-gap{border-top-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline-thick{opacity:0}.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-end,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:2px}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline{opacity:0;transition:opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline{opacity:0;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline .mat-form-field-subscript-wrapper{padding:0 1em}.mat-form-field-appearance-outline._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-start,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-end,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-gap{transition:none}\\n\", \".mat-form-field-appearance-standard .mat-form-field-flex{padding-top:.75em}.mat-form-field-appearance-standard .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-standard .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-standard:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-standard._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}\\n\"], encapsulation: 2, data: { animation: [matFormFieldAnimations.transitionMessages] }, changeDetection: 0 });\nMatFormField.ctorParameters = () => [\n { type: ElementRef },\n { type: ChangeDetectorRef },\n { type: undefined, decorators: [{ type: Inject, args: [ElementRef,] }] },\n { type: Directionality, decorators: [{ type: Optional }] },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_FORM_FIELD_DEFAULT_OPTIONS,] }] },\n { type: Platform },\n { type: NgZone },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatFormField.propDecorators = {\n appearance: [{ type: Input }],\n hideRequiredMarker: [{ type: Input }],\n hintLabel: [{ type: Input }],\n floatLabel: [{ type: Input }],\n underlineRef: [{ type: ViewChild, args: ['underline',] }],\n _connectionContainerRef: [{ type: ViewChild, args: ['connectionContainer', { static: true },] }],\n _inputContainerRef: [{ type: ViewChild, args: ['inputContainer',] }],\n _label: [{ type: ViewChild, args: ['label',] }],\n _controlNonStatic: [{ type: ContentChild, args: [MatFormFieldControl,] }],\n _controlStatic: [{ type: ContentChild, args: [MatFormFieldControl, { static: true },] }],\n _labelChildNonStatic: [{ type: ContentChild, args: [MatLabel,] }],\n _labelChildStatic: [{ type: ContentChild, args: [MatLabel, { static: true },] }],\n _placeholderChild: [{ type: ContentChild, args: [MatPlaceholder,] }],\n _errorChildren: [{ type: ContentChildren, args: [MAT_ERROR, { descendants: true },] }],\n _hintChildren: [{ type: ContentChildren, args: [_MAT_HINT, { descendants: true },] }],\n _prefixChildren: [{ type: ContentChildren, args: [MAT_PREFIX, { descendants: true },] }],\n _suffixChildren: [{ type: ContentChildren, args: [MAT_SUFFIX, { descendants: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatFormField, [{\n type: Component,\n args: [{\n selector: 'mat-form-field',\n exportAs: 'matFormField',\n template: \"<div class=\\\"mat-form-field-wrapper\\\">\\n <div class=\\\"mat-form-field-flex\\\" #connectionContainer\\n (click)=\\\"_control.onContainerClick && _control.onContainerClick($event)\\\">\\n\\n <!-- Outline used for outline appearance. -->\\n <ng-container *ngIf=\\\"appearance == 'outline'\\\">\\n <div class=\\\"mat-form-field-outline\\\">\\n <div class=\\\"mat-form-field-outline-start\\\"></div>\\n <div class=\\\"mat-form-field-outline-gap\\\"></div>\\n <div class=\\\"mat-form-field-outline-end\\\"></div>\\n </div>\\n <div class=\\\"mat-form-field-outline mat-form-field-outline-thick\\\">\\n <div class=\\\"mat-form-field-outline-start\\\"></div>\\n <div class=\\\"mat-form-field-outline-gap\\\"></div>\\n <div class=\\\"mat-form-field-outline-end\\\"></div>\\n </div>\\n </ng-container>\\n\\n <div class=\\\"mat-form-field-prefix\\\" *ngIf=\\\"_prefixChildren.length\\\">\\n <ng-content select=\\\"[matPrefix]\\\"></ng-content>\\n </div>\\n\\n <div class=\\\"mat-form-field-infix\\\" #inputContainer>\\n <ng-content></ng-content>\\n\\n <span class=\\\"mat-form-field-label-wrapper\\\">\\n <!-- We add aria-owns as a workaround for an issue in JAWS & NVDA where the label isn't\\n read if it comes before the control in the DOM. -->\\n <label class=\\\"mat-form-field-label\\\"\\n (cdkObserveContent)=\\\"updateOutlineGap()\\\"\\n [cdkObserveContentDisabled]=\\\"appearance != 'outline'\\\"\\n [id]=\\\"_labelId\\\"\\n [attr.for]=\\\"_control.id\\\"\\n [attr.aria-owns]=\\\"_control.id\\\"\\n [class.mat-empty]=\\\"_control.empty && !_shouldAlwaysFloat()\\\"\\n [class.mat-form-field-empty]=\\\"_control.empty && !_shouldAlwaysFloat()\\\"\\n [class.mat-accent]=\\\"color == 'accent'\\\"\\n [class.mat-warn]=\\\"color == 'warn'\\\"\\n #label\\n *ngIf=\\\"_hasFloatingLabel()\\\"\\n [ngSwitch]=\\\"_hasLabel()\\\">\\n\\n <!-- @breaking-change 8.0.0 remove in favor of mat-label element an placeholder attr. -->\\n <ng-container *ngSwitchCase=\\\"false\\\">\\n <ng-content select=\\\"mat-placeholder\\\"></ng-content>\\n <span>{{_control.placeholder}}</span>\\n </ng-container>\\n\\n <ng-content select=\\\"mat-label\\\" *ngSwitchCase=\\\"true\\\"></ng-content>\\n\\n <!-- @breaking-change 8.0.0 remove `mat-placeholder-required` class -->\\n <span\\n class=\\\"mat-placeholder-required mat-form-field-required-marker\\\"\\n aria-hidden=\\\"true\\\"\\n *ngIf=\\\"!hideRequiredMarker && _control.required && !_control.disabled\\\"> *</span>\\n </label>\\n </span>\\n </div>\\n\\n <div class=\\\"mat-form-field-suffix\\\" *ngIf=\\\"_suffixChildren.length\\\">\\n <ng-content select=\\\"[matSuffix]\\\"></ng-content>\\n </div>\\n </div>\\n\\n <!-- Underline used for legacy, standard, and box appearances. -->\\n <div class=\\\"mat-form-field-underline\\\" #underline\\n *ngIf=\\\"appearance != 'outline'\\\">\\n <span class=\\\"mat-form-field-ripple\\\"\\n [class.mat-accent]=\\\"color == 'accent'\\\"\\n [class.mat-warn]=\\\"color == 'warn'\\\"></span>\\n </div>\\n\\n <div class=\\\"mat-form-field-subscript-wrapper\\\"\\n [ngSwitch]=\\\"_getDisplayedMessages()\\\">\\n <div *ngSwitchCase=\\\"'error'\\\" [@transitionMessages]=\\\"_subscriptAnimationState\\\">\\n <ng-content select=\\\"mat-error\\\"></ng-content>\\n </div>\\n\\n <div class=\\\"mat-form-field-hint-wrapper\\\" *ngSwitchCase=\\\"'hint'\\\"\\n [@transitionMessages]=\\\"_subscriptAnimationState\\\">\\n <!-- TODO(mmalerba): use an actual <mat-hint> once all selectors are switched to mat-* -->\\n <div *ngIf=\\\"hintLabel\\\" [id]=\\\"_hintLabelId\\\" class=\\\"mat-hint\\\">{{hintLabel}}</div>\\n <ng-content select=\\\"mat-hint:not([align='end'])\\\"></ng-content>\\n <div class=\\\"mat-form-field-hint-spacer\\\"></div>\\n <ng-content select=\\\"mat-hint[align='end']\\\"></ng-content>\\n </div>\\n </div>\\n</div>\\n\",\n animations: [matFormFieldAnimations.transitionMessages],\n host: {\n 'class': 'mat-form-field',\n '[class.mat-form-field-appearance-standard]': 'appearance == \"standard\"',\n '[class.mat-form-field-appearance-fill]': 'appearance == \"fill\"',\n '[class.mat-form-field-appearance-outline]': 'appearance == \"outline\"',\n '[class.mat-form-field-appearance-legacy]': 'appearance == \"legacy\"',\n '[class.mat-form-field-invalid]': '_control.errorState',\n '[class.mat-form-field-can-float]': '_canLabelFloat()',\n '[class.mat-form-field-should-float]': '_shouldLabelFloat()',\n '[class.mat-form-field-has-label]': '_hasFloatingLabel()',\n '[class.mat-form-field-hide-placeholder]': '_hideControlPlaceholder()',\n '[class.mat-form-field-disabled]': '_control.disabled',\n '[class.mat-form-field-autofilled]': '_control.autofilled',\n '[class.mat-focused]': '_control.focused',\n '[class.ng-untouched]': '_shouldForward(\"untouched\")',\n '[class.ng-touched]': '_shouldForward(\"touched\")',\n '[class.ng-pristine]': '_shouldForward(\"pristine\")',\n '[class.ng-dirty]': '_shouldForward(\"dirty\")',\n '[class.ng-valid]': '_shouldForward(\"valid\")',\n '[class.ng-invalid]': '_shouldForward(\"invalid\")',\n '[class.ng-pending]': '_shouldForward(\"pending\")',\n '[class._mat-animation-noopable]': '!_animationsEnabled'\n },\n inputs: ['color'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: MAT_FORM_FIELD, useExisting: MatFormField },\n ],\n styles: [\".mat-form-field{display:inline-block;position:relative;text-align:left}[dir=rtl] .mat-form-field{text-align:right}.mat-form-field-wrapper{position:relative}.mat-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-form-field-prefix,.mat-form-field-suffix{white-space:nowrap;flex:none;position:relative}.mat-form-field-infix{display:block;position:relative;flex:auto;min-width:0;width:180px}.cdk-high-contrast-active .mat-form-field-infix{border-image:linear-gradient(transparent, transparent)}.mat-form-field-label-wrapper{position:absolute;left:0;box-sizing:content-box;width:100%;height:100%;overflow:hidden;pointer-events:none}[dir=rtl] .mat-form-field-label-wrapper{left:auto;right:0}.mat-form-field-label{position:absolute;left:0;font:inherit;pointer-events:none;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),width 400ms cubic-bezier(0.25, 0.8, 0.25, 1);display:none}[dir=rtl] .mat-form-field-label{transform-origin:100% 0;left:auto;right:0}.mat-form-field-empty.mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{display:block}.mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:block;transition:none}.mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float .mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:block}.mat-form-field-label:not(.mat-form-field-empty){transition:none}.mat-form-field-underline{position:absolute;width:100%;pointer-events:none;transform:scale3d(1, 1.0001, 1)}.mat-form-field-ripple{position:absolute;left:0;width:100%;transform-origin:50%;transform:scaleX(0.5);opacity:0;transition:background-color 300ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-form-field.mat-focused .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple{opacity:1;transform:none;transition:transform 300ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 300ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-subscript-wrapper{position:absolute;box-sizing:border-box;width:100%;overflow:hidden}.mat-form-field-subscript-wrapper .mat-icon,.mat-form-field-label-wrapper .mat-icon{width:1em;height:1em;font-size:inherit;vertical-align:baseline}.mat-form-field-hint-wrapper{display:flex}.mat-form-field-hint-spacer{flex:1 0 1em}.mat-error{display:block}.mat-form-field-control-wrapper{position:relative}.mat-form-field-hint-end{order:1}.mat-form-field._mat-animation-noopable .mat-form-field-label,.mat-form-field._mat-animation-noopable .mat-form-field-ripple{transition:none}\\n\", \".mat-form-field-appearance-fill .mat-form-field-flex{border-radius:4px 4px 0 0;padding:.75em .75em 0 .75em}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-flex{outline:solid 1px}.mat-form-field-appearance-fill .mat-form-field-underline::before{content:\\\"\\\";display:block;position:absolute;bottom:0;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-fill:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-fill._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}.mat-form-field-appearance-fill .mat-form-field-subscript-wrapper{padding:0 1em}\\n\", \".mat-input-element{font:inherit;background:transparent;color:currentColor;border:none;outline:none;padding:0;margin:0;width:100%;max-width:100%;vertical-align:bottom;text-align:inherit;box-sizing:content-box}.mat-input-element:-moz-ui-invalid{box-shadow:none}.mat-input-element::-ms-clear,.mat-input-element::-ms-reveal{display:none}.mat-input-element,.mat-input-element::-webkit-search-cancel-button,.mat-input-element::-webkit-search-decoration,.mat-input-element::-webkit-search-results-button,.mat-input-element::-webkit-search-results-decoration{-webkit-appearance:none}.mat-input-element::-webkit-contacts-auto-fill-button,.mat-input-element::-webkit-caps-lock-indicator,.mat-input-element::-webkit-credentials-auto-fill-button{visibility:hidden}.mat-input-element[type=date],.mat-input-element[type=datetime],.mat-input-element[type=datetime-local],.mat-input-element[type=month],.mat-input-element[type=week],.mat-input-element[type=time]{line-height:1}.mat-input-element[type=date]::after,.mat-input-element[type=datetime]::after,.mat-input-element[type=datetime-local]::after,.mat-input-element[type=month]::after,.mat-input-element[type=week]::after,.mat-input-element[type=time]::after{content:\\\" \\\";white-space:pre;width:1px}.mat-input-element::-webkit-inner-spin-button,.mat-input-element::-webkit-calendar-picker-indicator,.mat-input-element::-webkit-clear-button{font-size:.75em}.mat-input-element::placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-moz-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-moz-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-webkit-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-webkit-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element:-ms-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element:-ms-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-form-field-hide-placeholder .mat-input-element::placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-moz-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-webkit-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element:-ms-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}textarea.mat-input-element{resize:vertical;overflow:auto}textarea.mat-input-element.cdk-textarea-autosize{resize:none}textarea.mat-input-element{padding:2px 0;margin:-2px 0}select.mat-input-element{-moz-appearance:none;-webkit-appearance:none;position:relative;background-color:transparent;display:inline-flex;box-sizing:border-box;padding-top:1em;top:-1em;margin-bottom:-1em}select.mat-input-element::-ms-expand{display:none}select.mat-input-element::-moz-focus-inner{border:0}select.mat-input-element:not(:disabled){cursor:pointer}select.mat-input-element::-ms-value{color:inherit;background:none}.mat-focused .cdk-high-contrast-active select.mat-input-element::-ms-value{color:inherit}.mat-form-field-type-mat-native-select .mat-form-field-infix::after{content:\\\"\\\";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;position:absolute;top:50%;right:0;margin-top:-2.5px;pointer-events:none}[dir=rtl] .mat-form-field-type-mat-native-select .mat-form-field-infix::after{right:auto;left:0}.mat-form-field-type-mat-native-select .mat-input-element{padding-right:15px}[dir=rtl] .mat-form-field-type-mat-native-select .mat-input-element{padding-right:0;padding-left:15px}.mat-form-field-type-mat-native-select .mat-form-field-label-wrapper{max-width:calc(100% - 10px)}.mat-form-field-type-mat-native-select.mat-form-field-appearance-outline .mat-form-field-infix::after{margin-top:-5px}.mat-form-field-type-mat-native-select.mat-form-field-appearance-fill .mat-form-field-infix::after{margin-top:-10px}\\n\", \".mat-form-field-appearance-legacy .mat-form-field-label{transform:perspective(100px);-ms-transform:none}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon{width:1em}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button{font:inherit;vertical-align:baseline}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button .mat-icon{font-size:inherit}.mat-form-field-appearance-legacy .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-legacy .mat-form-field-ripple{top:0;height:2px;overflow:hidden}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-legacy.mat-form-field-invalid:not(.mat-focused) .mat-form-field-ripple{height:1px}\\n\", \".mat-form-field-appearance-outline .mat-form-field-wrapper{margin:.25em 0}.mat-form-field-appearance-outline .mat-form-field-flex{padding:0 .75em 0 .75em;margin-top:-0.25em;position:relative}.mat-form-field-appearance-outline .mat-form-field-prefix,.mat-form-field-appearance-outline .mat-form-field-suffix{top:.25em}.mat-form-field-appearance-outline .mat-form-field-outline{display:flex;position:absolute;top:.25em;left:0;right:0;bottom:0;pointer-events:none}.mat-form-field-appearance-outline .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-end{border:1px solid currentColor;min-width:5px}.mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:5px 0 0 5px;border-right-style:none}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-start{border-right-style:solid;border-left-style:none;border-radius:0 5px 5px 0}.mat-form-field-appearance-outline .mat-form-field-outline-end{border-radius:0 5px 5px 0;border-left-style:none;flex-grow:1}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-end{border-left-style:solid;border-right-style:none;border-radius:5px 0 0 5px}.mat-form-field-appearance-outline .mat-form-field-outline-gap{border-radius:.000001px;border:1px solid currentColor;border-left-style:none;border-right-style:none}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-outline-gap{border-top-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline-thick{opacity:0}.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-end,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:2px}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline{opacity:0;transition:opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline{opacity:0;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline .mat-form-field-subscript-wrapper{padding:0 1em}.mat-form-field-appearance-outline._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-start,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-end,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-gap{transition:none}\\n\", \".mat-form-field-appearance-standard .mat-form-field-flex{padding-top:.75em}.mat-form-field-appearance-standard .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-standard .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-standard:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-standard._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}\\n\"]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [ElementRef]\n }] }, { type: ɵngcc1.Directionality, decorators: [{\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]\n }] }, { type: ɵngcc2.Platform }, { type: ɵngcc0.NgZone }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, { floatLabel: [{\n type: Input\n }], appearance: [{\n type: Input\n }], hideRequiredMarker: [{\n type: Input\n }], hintLabel: [{\n type: Input\n }], underlineRef: [{\n type: ViewChild,\n args: ['underline']\n }], _connectionContainerRef: [{\n type: ViewChild,\n args: ['connectionContainer', { static: true }]\n }], _inputContainerRef: [{\n type: ViewChild,\n args: ['inputContainer']\n }], _label: [{\n type: ViewChild,\n args: ['label']\n }], _controlNonStatic: [{\n type: ContentChild,\n args: [MatFormFieldControl]\n }], _controlStatic: [{\n type: ContentChild,\n args: [MatFormFieldControl, { static: true }]\n }], _labelChildNonStatic: [{\n type: ContentChild,\n args: [MatLabel]\n }], _labelChildStatic: [{\n type: ContentChild,\n args: [MatLabel, { static: true }]\n }], _placeholderChild: [{\n type: ContentChild,\n args: [MatPlaceholder]\n }], _errorChildren: [{\n type: ContentChildren,\n args: [MAT_ERROR, { descendants: true }]\n }], _hintChildren: [{\n type: ContentChildren,\n args: [_MAT_HINT, { descendants: true }]\n }], _prefixChildren: [{\n type: ContentChildren,\n args: [MAT_PREFIX, { descendants: true }]\n }], _suffixChildren: [{\n type: ContentChildren,\n args: [MAT_SUFFIX, { descendants: true }]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatFormFieldModule {\n}\nMatFormFieldModule.ɵfac = function MatFormFieldModule_Factory(t) { return new (t || MatFormFieldModule)(); };\nMatFormFieldModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatFormFieldModule });\nMatFormFieldModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[\n CommonModule,\n MatCommonModule,\n ObserversModule,\n ], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatFormFieldModule, [{\n type: NgModule,\n args: [{\n declarations: [\n MatError,\n MatFormField,\n MatHint,\n MatLabel,\n MatPlaceholder,\n MatPrefix,\n MatSuffix,\n ],\n imports: [\n CommonModule,\n MatCommonModule,\n ObserversModule,\n ],\n exports: [\n MatCommonModule,\n MatError,\n MatFormField,\n MatHint,\n MatLabel,\n MatPlaceholder,\n MatPrefix,\n MatSuffix,\n ]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatFormFieldModule, { declarations: function () { return [MatError, MatFormField, MatHint, MatLabel, MatPlaceholder, MatPrefix, MatSuffix]; }, imports: function () { return [CommonModule,\n MatCommonModule,\n ObserversModule]; }, exports: function () { return [MatCommonModule, MatError, MatFormField, MatHint, MatLabel, MatPlaceholder, MatPrefix, MatSuffix]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_ERROR, MAT_FORM_FIELD, MAT_FORM_FIELD_DEFAULT_OPTIONS, MAT_PREFIX, MAT_SUFFIX, MatError, MatFormField, MatFormFieldControl, MatFormFieldModule, MatHint, MatLabel, MatPlaceholder, MatPrefix, MatSuffix, _MAT_HINT, getMatFormFieldDuplicatedHintError, getMatFormFieldMissingControlError, getMatFormFieldPlaceholderConflictError, matFormFieldAnimations };\n\n//# sourceMappingURL=form-field.js.map","import { ObserversModule } from '@angular/cdk/observers';\nimport { InjectionToken, forwardRef, EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef, Attribute, Inject, Optional, ViewChild, Input, Output, Directive, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinColor, mixinDisableRipple, mixinDisabled, MatRippleModule, MatCommonModule } from '@angular/material/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { NG_VALUE_ACCESSOR, NG_VALIDATORS, CheckboxRequiredValidator } from '@angular/forms';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injection token to be used to override the default options for `mat-slide-toggle`. */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/a11y';\nimport * as ɵngcc2 from '@angular/material/core';\nimport * as ɵngcc3 from '@angular/cdk/observers';\n\nconst _c0 = [\"thumbContainer\"];\nconst _c1 = [\"toggleBar\"];\nconst _c2 = [\"input\"];\nconst _c3 = function () { return { enterDuration: 150 }; };\nconst _c4 = [\"*\"];\nconst MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS = new InjectionToken('mat-slide-toggle-default-options', {\n providedIn: 'root',\n factory: () => ({ disableToggleValue: false })\n});\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// Increasing integer for generating unique ids for slide-toggle components.\nlet nextUniqueId = 0;\n/** @docs-private */\nconst MAT_SLIDE_TOGGLE_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatSlideToggle),\n multi: true\n};\n/** Change event object emitted by a MatSlideToggle. */\nclass MatSlideToggleChange {\n constructor(\n /** The source MatSlideToggle of the event. */\n source, \n /** The new `checked` value of the MatSlideToggle. */\n checked) {\n this.source = source;\n this.checked = checked;\n }\n}\n// Boilerplate for applying mixins to MatSlideToggle.\n/** @docs-private */\nclass MatSlideToggleBase {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}\nconst _MatSlideToggleMixinBase = mixinTabIndex(mixinColor(mixinDisableRipple(mixinDisabled(MatSlideToggleBase)), 'accent'));\n/** Represents a slidable \"switch\" toggle that can be moved between on and off. */\nclass MatSlideToggle extends _MatSlideToggleMixinBase {\n constructor(elementRef, _focusMonitor, _changeDetectorRef, tabIndex, defaults, _animationMode) {\n super(elementRef);\n this._focusMonitor = _focusMonitor;\n this._changeDetectorRef = _changeDetectorRef;\n this.defaults = defaults;\n this._animationMode = _animationMode;\n this._onChange = (_) => { };\n this._onTouched = () => { };\n this._uniqueId = `mat-slide-toggle-${++nextUniqueId}`;\n this._required = false;\n this._checked = false;\n /** Name value will be applied to the input element if present. */\n this.name = null;\n /** A unique id for the slide-toggle input. If none is supplied, it will be auto-generated. */\n this.id = this._uniqueId;\n /** Whether the label should appear after or before the slide-toggle. Defaults to 'after'. */\n this.labelPosition = 'after';\n /** Used to set the aria-label attribute on the underlying input element. */\n this.ariaLabel = null;\n /** Used to set the aria-labelledby attribute on the underlying input element. */\n this.ariaLabelledby = null;\n /** An event will be dispatched each time the slide-toggle changes its value. */\n this.change = new EventEmitter();\n /**\n * An event will be dispatched each time the slide-toggle input is toggled.\n * This event is always emitted when the user toggles the slide toggle, but this does not mean\n * the slide toggle's value has changed.\n */\n this.toggleChange = new EventEmitter();\n this.tabIndex = parseInt(tabIndex) || 0;\n }\n /** Whether the slide-toggle is required. */\n get required() { return this._required; }\n set required(value) { this._required = coerceBooleanProperty(value); }\n /** Whether the slide-toggle element is checked or not. */\n get checked() { return this._checked; }\n set checked(value) {\n this._checked = coerceBooleanProperty(value);\n this._changeDetectorRef.markForCheck();\n }\n /** Returns the unique id for the visual hidden input. */\n get inputId() { return `${this.id || this._uniqueId}-input`; }\n ngAfterContentInit() {\n this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(focusOrigin => {\n // Only forward focus manually when it was received programmatically or through the\n // keyboard. We should not do this for mouse/touch focus for two reasons:\n // 1. It can prevent clicks from landing in Chrome (see #18269).\n // 2. They're already handled by the wrapping `label` element.\n if (focusOrigin === 'keyboard' || focusOrigin === 'program') {\n this._inputElement.nativeElement.focus();\n }\n else if (!focusOrigin) {\n // When a focused element becomes disabled, the browser *immediately* fires a blur event.\n // Angular does not expect events to be raised during change detection, so any state\n // change (such as a form control's 'ng-touched') will cause a changed-after-checked\n // error. See https://github.com/angular/angular/issues/17793. To work around this,\n // we defer telling the form control it has been touched until the next tick.\n Promise.resolve().then(() => this._onTouched());\n }\n });\n }\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n /** Method being called whenever the underlying input emits a change event. */\n _onChangeEvent(event) {\n // We always have to stop propagation on the change event.\n // Otherwise the change event, from the input element, will bubble up and\n // emit its event object to the component's `change` output.\n event.stopPropagation();\n this.toggleChange.emit();\n // When the slide toggle's config disables toggle change event by setting\n // `disableToggleValue: true`, the slide toggle's value does not change, and the\n // checked state of the underlying input needs to be changed back.\n if (this.defaults.disableToggleValue) {\n this._inputElement.nativeElement.checked = this.checked;\n return;\n }\n // Sync the value from the underlying input element with the component instance.\n this.checked = this._inputElement.nativeElement.checked;\n // Emit our custom change event only if the underlying input emitted one. This ensures that\n // there is no change event, when the checked state changes programmatically.\n this._emitChangeEvent();\n }\n /** Method being called whenever the slide-toggle has been clicked. */\n _onInputClick(event) {\n // We have to stop propagation for click events on the visual hidden input element.\n // By default, when a user clicks on a label element, a generated click event will be\n // dispatched on the associated input element. Since we are using a label element as our\n // root container, the click event on the `slide-toggle` will be executed twice.\n // The real click event will bubble up, and the generated click event also tries to bubble up.\n // This will lead to multiple click events.\n // Preventing bubbling for the second event will solve that issue.\n event.stopPropagation();\n }\n /** Implemented as part of ControlValueAccessor. */\n writeValue(value) {\n this.checked = !!value;\n }\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn) {\n this._onChange = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn) {\n this._onTouched = fn;\n }\n /** Implemented as a part of ControlValueAccessor. */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this._changeDetectorRef.markForCheck();\n }\n /** Focuses the slide-toggle. */\n focus(options, origin) {\n if (origin) {\n this._focusMonitor.focusVia(this._inputElement, origin, options);\n }\n else {\n this._inputElement.nativeElement.focus(options);\n }\n }\n /** Toggles the checked state of the slide-toggle. */\n toggle() {\n this.checked = !this.checked;\n this._onChange(this.checked);\n }\n /**\n * Emits a change event on the `change` output. Also notifies the FormControl about the change.\n */\n _emitChangeEvent() {\n this._onChange(this.checked);\n this.change.emit(new MatSlideToggleChange(this, this.checked));\n }\n /** Method being called whenever the label text changes. */\n _onLabelTextChange() {\n // Since the event of the `cdkObserveContent` directive runs outside of the zone, the\n // slide-toggle component will be only marked for check, but no actual change detection runs\n // automatically. Instead of going back into the zone in order to trigger a change detection\n // which causes *all* components to be checked (if explicitly marked or not using OnPush),\n // we only trigger an explicit change detection for the slide-toggle view and its children.\n this._changeDetectorRef.detectChanges();\n }\n}\nMatSlideToggle.ɵfac = function MatSlideToggle_Factory(t) { return new (t || MatSlideToggle)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵinjectAttribute('tabindex'), ɵngcc0.ɵɵdirectiveInject(MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatSlideToggle.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSlideToggle, selectors: [[\"mat-slide-toggle\"]], viewQuery: function MatSlideToggle_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c0, 5);\n ɵngcc0.ɵɵviewQuery(_c1, 5);\n ɵngcc0.ɵɵviewQuery(_c2, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._thumbEl = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._thumbBarEl = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._inputElement = _t.first);\n } }, hostAttrs: [1, \"mat-slide-toggle\"], hostVars: 12, hostBindings: function MatSlideToggle_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵhostProperty(\"id\", ctx.id);\n ɵngcc0.ɵɵattribute(\"tabindex\", ctx.disabled ? null : -1)(\"aria-label\", null)(\"aria-labelledby\", null);\n ɵngcc0.ɵɵclassProp(\"mat-checked\", ctx.checked)(\"mat-disabled\", ctx.disabled)(\"mat-slide-toggle-label-before\", ctx.labelPosition == \"before\")(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n } }, inputs: { disabled: \"disabled\", disableRipple: \"disableRipple\", color: \"color\", tabIndex: \"tabIndex\", name: \"name\", id: \"id\", labelPosition: \"labelPosition\", ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], required: \"required\", checked: \"checked\" }, outputs: { change: \"change\", toggleChange: \"toggleChange\" }, exportAs: [\"matSlideToggle\"], features: [ɵngcc0.ɵɵProvidersFeature([MAT_SLIDE_TOGGLE_VALUE_ACCESSOR]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c4, decls: 16, vars: 18, consts: [[1, \"mat-slide-toggle-label\"], [\"label\", \"\"], [1, \"mat-slide-toggle-bar\"], [\"toggleBar\", \"\"], [\"type\", \"checkbox\", \"role\", \"switch\", 1, \"mat-slide-toggle-input\", \"cdk-visually-hidden\", 3, \"id\", \"required\", \"tabIndex\", \"checked\", \"disabled\", \"change\", \"click\"], [\"input\", \"\"], [1, \"mat-slide-toggle-thumb-container\"], [\"thumbContainer\", \"\"], [1, \"mat-slide-toggle-thumb\"], [\"mat-ripple\", \"\", 1, \"mat-slide-toggle-ripple\", \"mat-focus-indicator\", 3, \"matRippleTrigger\", \"matRippleDisabled\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\"], [1, \"mat-ripple-element\", \"mat-slide-toggle-persistent-ripple\"], [1, \"mat-slide-toggle-content\", 3, \"cdkObserveContent\"], [\"labelContent\", \"\"], [2, \"display\", \"none\"]], template: function MatSlideToggle_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"label\", 0, 1);\n ɵngcc0.ɵɵelementStart(2, \"div\", 2, 3);\n ɵngcc0.ɵɵelementStart(4, \"input\", 4, 5);\n ɵngcc0.ɵɵlistener(\"change\", function MatSlideToggle_Template_input_change_4_listener($event) { return ctx._onChangeEvent($event); })(\"click\", function MatSlideToggle_Template_input_click_4_listener($event) { return ctx._onInputClick($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(6, \"div\", 6, 7);\n ɵngcc0.ɵɵelement(8, \"div\", 8);\n ɵngcc0.ɵɵelementStart(9, \"div\", 9);\n ɵngcc0.ɵɵelement(10, \"div\", 10);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(11, \"span\", 11, 12);\n ɵngcc0.ɵɵlistener(\"cdkObserveContent\", function MatSlideToggle_Template_span_cdkObserveContent_11_listener() { return ctx._onLabelTextChange(); });\n ɵngcc0.ɵɵelementStart(13, \"span\", 13);\n ɵngcc0.ɵɵtext(14, \"\\u00A0\");\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵprojection(15);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n const _r0 = ɵngcc0.ɵɵreference(1);\n const _r4 = ɵngcc0.ɵɵreference(12);\n ɵngcc0.ɵɵattribute(\"for\", ctx.inputId);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"mat-slide-toggle-bar-no-side-margin\", !_r4.textContent || !_r4.textContent.trim());\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"id\", ctx.inputId)(\"required\", ctx.required)(\"tabIndex\", ctx.tabIndex)(\"checked\", ctx.checked)(\"disabled\", ctx.disabled);\n ɵngcc0.ɵɵattribute(\"name\", ctx.name)(\"aria-checked\", ctx.checked.toString())(\"aria-label\", ctx.ariaLabel)(\"aria-labelledby\", ctx.ariaLabelledby);\n ɵngcc0.ɵɵadvance(5);\n ɵngcc0.ɵɵproperty(\"matRippleTrigger\", _r0)(\"matRippleDisabled\", ctx.disableRipple || ctx.disabled)(\"matRippleCentered\", true)(\"matRippleRadius\", 20)(\"matRippleAnimation\", ɵngcc0.ɵɵpureFunction0(17, _c3));\n } }, directives: [ɵngcc2.MatRipple, ɵngcc3.CdkObserveContent], styles: [\".mat-slide-toggle{display:inline-block;height:24px;max-width:100%;line-height:24px;white-space:nowrap;outline:none;-webkit-tap-highlight-color:transparent}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(16px, 0, 0)}[dir=rtl] .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(-16px, 0, 0)}.mat-slide-toggle.mat-disabled{opacity:.38}.mat-slide-toggle.mat-disabled .mat-slide-toggle-label,.mat-slide-toggle.mat-disabled .mat-slide-toggle-thumb-container{cursor:default}.mat-slide-toggle-label{display:flex;flex:1;flex-direction:row;align-items:center;height:inherit;cursor:pointer}.mat-slide-toggle-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-slide-toggle-label-before .mat-slide-toggle-label{order:1}.mat-slide-toggle-label-before .mat-slide-toggle-bar{order:2}[dir=rtl] .mat-slide-toggle-label-before .mat-slide-toggle-bar,.mat-slide-toggle-bar{margin-right:8px;margin-left:0}[dir=rtl] .mat-slide-toggle-bar,.mat-slide-toggle-label-before .mat-slide-toggle-bar{margin-left:8px;margin-right:0}.mat-slide-toggle-bar-no-side-margin{margin-left:0;margin-right:0}.mat-slide-toggle-thumb-container{position:absolute;z-index:1;width:20px;height:20px;top:-3px;left:0;transform:translate3d(0, 0, 0);transition:all 80ms linear;transition-property:transform}._mat-animation-noopable .mat-slide-toggle-thumb-container{transition:none}[dir=rtl] .mat-slide-toggle-thumb-container{left:auto;right:0}.mat-slide-toggle-thumb{height:20px;width:20px;border-radius:50%}.mat-slide-toggle-bar{position:relative;width:36px;height:14px;flex-shrink:0;border-radius:8px}.mat-slide-toggle-input{bottom:0;left:10px}[dir=rtl] .mat-slide-toggle-input{left:auto;right:10px}.mat-slide-toggle-bar,.mat-slide-toggle-thumb{transition:all 80ms linear;transition-property:background-color;transition-delay:50ms}._mat-animation-noopable .mat-slide-toggle-bar,._mat-animation-noopable .mat-slide-toggle-thumb{transition:none}.mat-slide-toggle .mat-slide-toggle-ripple{position:absolute;top:calc(50% - 20px);left:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-slide-toggle .mat-slide-toggle-ripple .mat-ripple-element:not(.mat-slide-toggle-persistent-ripple){opacity:.12}.mat-slide-toggle-persistent-ripple{width:100%;height:100%;transform:none}.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:.04}.mat-slide-toggle:not(.mat-disabled).cdk-keyboard-focused .mat-slide-toggle-persistent-ripple{opacity:.12}.mat-slide-toggle-persistent-ripple,.mat-slide-toggle.mat-disabled .mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:0}@media(hover: none){.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{display:none}}.cdk-high-contrast-active .mat-slide-toggle-thumb,.cdk-high-contrast-active .mat-slide-toggle-bar{border:1px solid}.cdk-high-contrast-active .mat-slide-toggle.cdk-keyboard-focused .mat-slide-toggle-bar{outline:2px dotted;outline-offset:5px}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatSlideToggle.ctorParameters = () => [\n { type: ElementRef },\n { type: FocusMonitor },\n { type: ChangeDetectorRef },\n { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] },\n { type: undefined, decorators: [{ type: Inject, args: [MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS,] }] },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatSlideToggle.propDecorators = {\n _thumbEl: [{ type: ViewChild, args: ['thumbContainer',] }],\n _thumbBarEl: [{ type: ViewChild, args: ['toggleBar',] }],\n name: [{ type: Input }],\n id: [{ type: Input }],\n labelPosition: [{ type: Input }],\n ariaLabel: [{ type: Input, args: ['aria-label',] }],\n ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],\n required: [{ type: Input }],\n checked: [{ type: Input }],\n change: [{ type: Output }],\n toggleChange: [{ type: Output }],\n _inputElement: [{ type: ViewChild, args: ['input',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSlideToggle, [{\n type: Component,\n args: [{\n selector: 'mat-slide-toggle',\n exportAs: 'matSlideToggle',\n host: {\n 'class': 'mat-slide-toggle',\n '[id]': 'id',\n // Needs to be `-1` so it can still receive programmatic focus.\n '[attr.tabindex]': 'disabled ? null : -1',\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n '[class.mat-checked]': 'checked',\n '[class.mat-disabled]': 'disabled',\n '[class.mat-slide-toggle-label-before]': 'labelPosition == \"before\"',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"'\n },\n template: \"<label [attr.for]=\\\"inputId\\\" class=\\\"mat-slide-toggle-label\\\" #label>\\n <div #toggleBar class=\\\"mat-slide-toggle-bar\\\"\\n [class.mat-slide-toggle-bar-no-side-margin]=\\\"!labelContent.textContent || !labelContent.textContent.trim()\\\">\\n\\n <input #input class=\\\"mat-slide-toggle-input cdk-visually-hidden\\\" type=\\\"checkbox\\\"\\n role=\\\"switch\\\"\\n [id]=\\\"inputId\\\"\\n [required]=\\\"required\\\"\\n [tabIndex]=\\\"tabIndex\\\"\\n [checked]=\\\"checked\\\"\\n [disabled]=\\\"disabled\\\"\\n [attr.name]=\\\"name\\\"\\n [attr.aria-checked]=\\\"checked.toString()\\\"\\n [attr.aria-label]=\\\"ariaLabel\\\"\\n [attr.aria-labelledby]=\\\"ariaLabelledby\\\"\\n (change)=\\\"_onChangeEvent($event)\\\"\\n (click)=\\\"_onInputClick($event)\\\">\\n\\n <div class=\\\"mat-slide-toggle-thumb-container\\\" #thumbContainer>\\n <div class=\\\"mat-slide-toggle-thumb\\\"></div>\\n <div class=\\\"mat-slide-toggle-ripple mat-focus-indicator\\\" mat-ripple\\n [matRippleTrigger]=\\\"label\\\"\\n [matRippleDisabled]=\\\"disableRipple || disabled\\\"\\n [matRippleCentered]=\\\"true\\\"\\n [matRippleRadius]=\\\"20\\\"\\n [matRippleAnimation]=\\\"{enterDuration: 150}\\\">\\n\\n <div class=\\\"mat-ripple-element mat-slide-toggle-persistent-ripple\\\"></div>\\n </div>\\n </div>\\n\\n </div>\\n\\n <span class=\\\"mat-slide-toggle-content\\\" #labelContent (cdkObserveContent)=\\\"_onLabelTextChange()\\\">\\n <!-- Add an invisible span so JAWS can read the label -->\\n <span style=\\\"display:none\\\"> </span>\\n <ng-content></ng-content>\\n </span>\\n</label>\\n\",\n providers: [MAT_SLIDE_TOGGLE_VALUE_ACCESSOR],\n inputs: ['disabled', 'disableRipple', 'color', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\".mat-slide-toggle{display:inline-block;height:24px;max-width:100%;line-height:24px;white-space:nowrap;outline:none;-webkit-tap-highlight-color:transparent}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(16px, 0, 0)}[dir=rtl] .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(-16px, 0, 0)}.mat-slide-toggle.mat-disabled{opacity:.38}.mat-slide-toggle.mat-disabled .mat-slide-toggle-label,.mat-slide-toggle.mat-disabled .mat-slide-toggle-thumb-container{cursor:default}.mat-slide-toggle-label{display:flex;flex:1;flex-direction:row;align-items:center;height:inherit;cursor:pointer}.mat-slide-toggle-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-slide-toggle-label-before .mat-slide-toggle-label{order:1}.mat-slide-toggle-label-before .mat-slide-toggle-bar{order:2}[dir=rtl] .mat-slide-toggle-label-before .mat-slide-toggle-bar,.mat-slide-toggle-bar{margin-right:8px;margin-left:0}[dir=rtl] .mat-slide-toggle-bar,.mat-slide-toggle-label-before .mat-slide-toggle-bar{margin-left:8px;margin-right:0}.mat-slide-toggle-bar-no-side-margin{margin-left:0;margin-right:0}.mat-slide-toggle-thumb-container{position:absolute;z-index:1;width:20px;height:20px;top:-3px;left:0;transform:translate3d(0, 0, 0);transition:all 80ms linear;transition-property:transform}._mat-animation-noopable .mat-slide-toggle-thumb-container{transition:none}[dir=rtl] .mat-slide-toggle-thumb-container{left:auto;right:0}.mat-slide-toggle-thumb{height:20px;width:20px;border-radius:50%}.mat-slide-toggle-bar{position:relative;width:36px;height:14px;flex-shrink:0;border-radius:8px}.mat-slide-toggle-input{bottom:0;left:10px}[dir=rtl] .mat-slide-toggle-input{left:auto;right:10px}.mat-slide-toggle-bar,.mat-slide-toggle-thumb{transition:all 80ms linear;transition-property:background-color;transition-delay:50ms}._mat-animation-noopable .mat-slide-toggle-bar,._mat-animation-noopable .mat-slide-toggle-thumb{transition:none}.mat-slide-toggle .mat-slide-toggle-ripple{position:absolute;top:calc(50% - 20px);left:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-slide-toggle .mat-slide-toggle-ripple .mat-ripple-element:not(.mat-slide-toggle-persistent-ripple){opacity:.12}.mat-slide-toggle-persistent-ripple{width:100%;height:100%;transform:none}.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:.04}.mat-slide-toggle:not(.mat-disabled).cdk-keyboard-focused .mat-slide-toggle-persistent-ripple{opacity:.12}.mat-slide-toggle-persistent-ripple,.mat-slide-toggle.mat-disabled .mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:0}@media(hover: none){.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{display:none}}.cdk-high-contrast-active .mat-slide-toggle-thumb,.cdk-high-contrast-active .mat-slide-toggle-bar{border:1px solid}.cdk-high-contrast-active .mat-slide-toggle.cdk-keyboard-focused .mat-slide-toggle-bar{outline:2px dotted;outline-offset:5px}\\n\"]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc0.ChangeDetectorRef }, { type: String, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS]\n }] }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, { name: [{\n type: Input\n }], id: [{\n type: Input\n }], labelPosition: [{\n type: Input\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], ariaLabelledby: [{\n type: Input,\n args: ['aria-labelledby']\n }], change: [{\n type: Output\n }], toggleChange: [{\n type: Output\n }], required: [{\n type: Input\n }], checked: [{\n type: Input\n }], _thumbEl: [{\n type: ViewChild,\n args: ['thumbContainer']\n }], _thumbBarEl: [{\n type: ViewChild,\n args: ['toggleBar']\n }], _inputElement: [{\n type: ViewChild,\n args: ['input']\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MatSlideToggleRequiredValidator),\n multi: true\n};\n/**\n * Validator for Material slide-toggle components with the required attribute in a\n * template-driven form. The default validator for required form controls asserts\n * that the control value is not undefined but that is not appropriate for a slide-toggle\n * where the value is always defined.\n *\n * Required slide-toggle form controls are valid when checked.\n */\nclass MatSlideToggleRequiredValidator extends CheckboxRequiredValidator {\n}\nMatSlideToggleRequiredValidator.ɵfac = /*@__PURE__*/ function () { let ɵMatSlideToggleRequiredValidator_BaseFactory; return function MatSlideToggleRequiredValidator_Factory(t) { return (ɵMatSlideToggleRequiredValidator_BaseFactory || (ɵMatSlideToggleRequiredValidator_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatSlideToggleRequiredValidator)))(t || MatSlideToggleRequiredValidator); }; }();\nMatSlideToggleRequiredValidator.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatSlideToggleRequiredValidator, selectors: [[\"mat-slide-toggle\", \"required\", \"\", \"formControlName\", \"\"], [\"mat-slide-toggle\", \"required\", \"\", \"formControl\", \"\"], [\"mat-slide-toggle\", \"required\", \"\", \"ngModel\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSlideToggleRequiredValidator, [{\n type: Directive,\n args: [{\n selector: `mat-slide-toggle[required][formControlName],\n mat-slide-toggle[required][formControl], mat-slide-toggle[required][ngModel]`,\n providers: [MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR]\n }]\n }], null, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** This module is used by both original and MDC-based slide-toggle implementations. */\nclass _MatSlideToggleRequiredValidatorModule {\n}\n_MatSlideToggleRequiredValidatorModule.ɵfac = function _MatSlideToggleRequiredValidatorModule_Factory(t) { return new (t || _MatSlideToggleRequiredValidatorModule)(); };\n_MatSlideToggleRequiredValidatorModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: _MatSlideToggleRequiredValidatorModule });\n_MatSlideToggleRequiredValidatorModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({});\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatSlideToggleRequiredValidatorModule, [{\n type: NgModule,\n args: [{\n exports: [MatSlideToggleRequiredValidator],\n declarations: [MatSlideToggleRequiredValidator]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(_MatSlideToggleRequiredValidatorModule, { declarations: [MatSlideToggleRequiredValidator], exports: [MatSlideToggleRequiredValidator] }); })();\nclass MatSlideToggleModule {\n}\nMatSlideToggleModule.ɵfac = function MatSlideToggleModule_Factory(t) { return new (t || MatSlideToggleModule)(); };\nMatSlideToggleModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatSlideToggleModule });\nMatSlideToggleModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[\n _MatSlideToggleRequiredValidatorModule,\n MatRippleModule,\n MatCommonModule,\n ObserversModule,\n ], _MatSlideToggleRequiredValidatorModule, MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSlideToggleModule, [{\n type: NgModule,\n args: [{\n imports: [\n _MatSlideToggleRequiredValidatorModule,\n MatRippleModule,\n MatCommonModule,\n ObserversModule,\n ],\n exports: [\n _MatSlideToggleRequiredValidatorModule,\n MatSlideToggle,\n MatCommonModule\n ],\n declarations: [MatSlideToggle]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatSlideToggleModule, { declarations: function () { return [MatSlideToggle]; }, imports: function () { return [_MatSlideToggleRequiredValidatorModule, MatRippleModule,\n MatCommonModule,\n ObserversModule]; }, exports: function () { return [_MatSlideToggleRequiredValidatorModule, MatSlideToggle, MatCommonModule]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS, MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR, MAT_SLIDE_TOGGLE_VALUE_ACCESSOR, MatSlideToggle, MatSlideToggleChange, MatSlideToggleModule, MatSlideToggleRequiredValidator, _MatSlideToggleRequiredValidatorModule };\n\n//# sourceMappingURL=slide-toggle.js.map","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var baseIteratee = require('./_baseIteratee'),\n baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n","import { SimpleOuterSubscriber, innerSubscribe, SimpleInnerSubscriber } from '../innerSubscribe';\nexport const defaultThrottleConfig = {\n leading: true,\n trailing: false\n};\nexport function throttle(durationSelector, config = defaultThrottleConfig) {\n return (source) => source.lift(new ThrottleOperator(durationSelector, !!config.leading, !!config.trailing));\n}\nclass ThrottleOperator {\n constructor(durationSelector, leading, trailing) {\n this.durationSelector = durationSelector;\n this.leading = leading;\n this.trailing = trailing;\n }\n call(subscriber, source) {\n return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));\n }\n}\nclass ThrottleSubscriber extends SimpleOuterSubscriber {\n constructor(destination, durationSelector, _leading, _trailing) {\n super(destination);\n this.destination = destination;\n this.durationSelector = durationSelector;\n this._leading = _leading;\n this._trailing = _trailing;\n this._hasValue = false;\n }\n _next(value) {\n this._hasValue = true;\n this._sendValue = value;\n if (!this._throttled) {\n if (this._leading) {\n this.send();\n }\n else {\n this.throttle(value);\n }\n }\n }\n send() {\n const { _hasValue, _sendValue } = this;\n if (_hasValue) {\n this.destination.next(_sendValue);\n this.throttle(_sendValue);\n }\n this._hasValue = false;\n this._sendValue = undefined;\n }\n throttle(value) {\n const duration = this.tryDurationSelector(value);\n if (!!duration) {\n this.add(this._throttled = innerSubscribe(duration, new SimpleInnerSubscriber(this)));\n }\n }\n tryDurationSelector(value) {\n try {\n return this.durationSelector(value);\n }\n catch (err) {\n this.destination.error(err);\n return null;\n }\n }\n throttlingDone() {\n const { _throttled, _trailing } = this;\n if (_throttled) {\n _throttled.unsubscribe();\n }\n this._throttled = undefined;\n if (_trailing) {\n this.send();\n }\n }\n notifyNext() {\n this.throttlingDone();\n }\n notifyComplete() {\n this.throttlingDone();\n }\n}\n//# sourceMappingURL=throttle.js.map","import { Subscriber } from '../Subscriber';\nimport { async } from '../scheduler/async';\nimport { defaultThrottleConfig } from './throttle';\nexport function throttleTime(duration, scheduler = async, config = defaultThrottleConfig) {\n return (source) => source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing));\n}\nclass ThrottleTimeOperator {\n constructor(duration, scheduler, leading, trailing) {\n this.duration = duration;\n this.scheduler = scheduler;\n this.leading = leading;\n this.trailing = trailing;\n }\n call(subscriber, source) {\n return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));\n }\n}\nclass ThrottleTimeSubscriber extends Subscriber {\n constructor(destination, duration, scheduler, leading, trailing) {\n super(destination);\n this.duration = duration;\n this.scheduler = scheduler;\n this.leading = leading;\n this.trailing = trailing;\n this._hasTrailingValue = false;\n this._trailingValue = null;\n }\n _next(value) {\n if (this.throttled) {\n if (this.trailing) {\n this._trailingValue = value;\n this._hasTrailingValue = true;\n }\n }\n else {\n this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));\n if (this.leading) {\n this.destination.next(value);\n }\n else if (this.trailing) {\n this._trailingValue = value;\n this._hasTrailingValue = true;\n }\n }\n }\n _complete() {\n if (this._hasTrailingValue) {\n this.destination.next(this._trailingValue);\n this.destination.complete();\n }\n else {\n this.destination.complete();\n }\n }\n clearThrottle() {\n const throttled = this.throttled;\n if (throttled) {\n if (this.trailing && this._hasTrailingValue) {\n this.destination.next(this._trailingValue);\n this._trailingValue = null;\n this._hasTrailingValue = false;\n }\n throttled.unsubscribe();\n this.remove(throttled);\n this.throttled = null;\n }\n }\n}\nfunction dispatchNext(arg) {\n const { subscriber } = arg;\n subscriber.clearThrottle();\n}\n//# sourceMappingURL=throttleTime.js.map","import { DriveFolder } from '../../folders/models/driveFolder';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { ConfirmModalData } from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { UploadedFile } from '@common/uploads/uploaded-file';\nimport { SortColumn, SortDirection } from '../../entries/available-sorts';\nimport { LoadEntriesAction } from './events';\nimport { DriveApiIndexParams } from '../../drive-entry-api.service';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { ShareableLink } from '../../sharing/links/models/shareable-link';\nimport { MatDialogConfig } from '@angular/material/dialog';\nimport { User } from '../../../../common/core/types/models/User';\nimport { Workspace } from '../../../../common/workspaces/types/workspace';\nimport { DrivePage } from '../models/drive-page';\n\nexport class LoadUserFolders {\n static readonly type = '[Drive] Load User Folders';\n}\n\nexport class LoadUserSpaceUsage {\n static readonly type = '[Drive] Load User Space Usage';\n}\n\nexport class BuildFolderTree {\n static readonly type = '[Drive] Build Folder Tree';\n constructor(public folders?: DriveFolder[]) {}\n}\n\nexport class OpenFolder {\n static readonly type = '[Drive] Open Folder';\n constructor(public folder?: DriveFolder) {}\n}\n\nexport class OpenSearchPage {\n static readonly type = '[Drive] Open Search Page';\n constructor(public queryParams?: {\n filters?: string,\n query?: string,\n }) {}\n}\n\nexport class SelectEntries {\n static readonly type = '[Drive] Select Entries';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class SelectAllEntries {\n static readonly type = '[Drive] Select All Entries';\n}\n\nexport class DeselectAllEntries {\n static readonly type = '[Drive] Deselect All Entries';\n}\n\nexport class DeleteSelectedEntries {\n static readonly type = '[Drive] Delete Selected Entries';\n}\n\nexport class OpenUploadsPanel {\n static readonly type = '[Drive] Open UploadsApiService Panel';\n}\n\nexport class CloseUploadsPanel {\n static readonly type = '[Drive] Close UploadsApiService Panel';\n}\n\nexport class AddEntries {\n static readonly type = '[Drive] Add Entries';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class MoveEntries {\n static readonly type = '[Drive API] Move Entries';\n constructor(public destination: DriveFolder, public entries?: DriveEntry[]) {}\n}\n\nexport class OpenDialog {\n static readonly type = '[Drive] Open Dialog';\n constructor(public dialog: ComponentType<any>, public data?: object, public config?: MatDialogConfig) {}\n}\n\nexport class OpenConfirmDialog {\n static readonly type = '[Drive] Open Confirm Dialog';\n constructor(public data: ConfirmModalData, public confirmAction: any) {}\n}\n\nexport class SetViewMode {\n static readonly type = '[Drive] Set View Mode';\n constructor(public mode: 'list'|'grid') {}\n}\n\nexport class ToggleDetailsSidebar {\n static readonly type = '[Drive] Toggle Details';\n}\n\nexport class ToggleSidebar {\n static readonly type = '[Drive] Toggle Sidebar';\n}\n\nexport class UploadFiles {\n static readonly type = '[Drive] Upload Files';\n constructor(public files: UploadedFile[]) {}\n}\n\nexport class RestoreTrashedEntries {\n static readonly type = '[Drive] Restore Trashed Entries';\n constructor(public entries?: DriveEntry[]) {}\n}\n\nexport class DeleteTrashedEntriesForever {\n static readonly type = '[Drive] Delete Trashed Entries Forever';\n}\n\nexport class EmptyTrash {\n static readonly type = '[Drive] Empty Trash';\n}\n\nexport class OpenFilePreview {\n static readonly type = '[Drive] Open File Preview Overlay';\n constructor(public entries?: DriveEntry[]) {}\n}\n\nexport class DownloadEntries {\n static readonly type = '[Drive] Download Files';\n constructor(public entries?: FileEntry[], public link?: ShareableLink, public password?: string) {}\n}\n\nexport class AddStar {\n static readonly type = '[Drive] Add a Star';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class RemoveStar {\n static readonly type = '[Drive] Remove Star';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class RemoveEntries {\n static readonly type = '[Drive] Remove Entries';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class ChangeSort {\n static readonly type = '[Drive] Change Sort';\n constructor(public sort: SortColumn, public direction: SortDirection = 'desc') {}\n}\n\nexport class LoadMoreEntries implements LoadEntriesAction {\n static readonly type = '[Drive Infinite Scroll] Load More Entries';\n public loadMore = true;\n constructor(public queryParams: DriveApiIndexParams = {}) {}\n}\n\nexport class ReloadPageEntries implements LoadEntriesAction {\n static readonly type = '[Drive] Reload Page Entries';\n constructor(public queryParams: DriveApiIndexParams = {}, public page?: DrivePage) {}\n}\n\nexport class CopySelectedEntries {\n static readonly type = '[Drive] Copy Selected Entries';\n}\n\nexport class OpenUploadWindow {\n static readonly type = '[Drive] Open Upload Window';\n constructor(public type: 'file'|'directory') {}\n}\n\nexport class ShowLoadingToast {\n static readonly type = '[Drive] Show Loading Toast';\n constructor(public message: string) {}\n}\n\nexport class HideLoadingToast {\n static readonly type = '[Drive] Hide Loading Toast';\n}\n\nexport class ResetState {\n static readonly type = '[Drive] Reset State';\n}\n\nexport class UpdateEntries {\n static readonly type = '[Drive] Update Entries';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class SetCurrentUser {\n static readonly type = '[Drive] Set Current User';\n constructor(public user: User) {}\n}\n\nexport class SetWorkspace {\n static readonly type = '[Drive] Set Workspace';\n constructor(public workspace: Workspace) {}\n}\n\nexport class UpdateEntryDescription {\n static readonly type = '[Drive] Update Entry Description';\n constructor(public entry: FileEntry, public description: string) {}\n}\n\n\n\n\n\n","import { DrivePageType } from './available-pages';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { SortColumn, SortDirection } from '../../entries/available-sorts';\n\nexport const DRIVE_PAGE_NAMES: {[key: string]: DrivePageType} = {\n FOLDER: 'folder',\n RECENT: 'recent',\n TRASH: 'trash',\n SHARES: 'shares',\n STARRED: 'starred',\n SEARCH: 'search',\n WORKSPACES: 'workspaces',\n};\n\nexport interface DrivePageParams {\n name: DrivePageType;\n viewName: string;\n folder?: DriveFolder;\n folderHash?: string;\n hasActions?: boolean;\n disableSort?: boolean;\n sortColumn?: SortColumn;\n queryParams?: object;\n sortDirection?: SortDirection;\n}\n\nexport class DrivePage implements DrivePageParams {\n name = null;\n viewName = null;\n folder = null;\n folderHash = null;\n hasActions = false;\n sortColumn = 'updated_at' as SortColumn;\n sortDirection = 'desc' as SortDirection;\n queryParams = {};\n\n constructor(params: DrivePageParams) {\n Object.keys(params).forEach(key => {\n this[key] = params[key];\n });\n }\n}\n\nexport const RECENT_PAGE = new DrivePage({\n name: DRIVE_PAGE_NAMES.RECENT,\n viewName: 'Recent',\n disableSort: true,\n sortColumn: 'created_at',\n sortDirection: 'desc',\n queryParams: {\n recentOnly: true,\n }\n});\n\nexport const SEARCH_PAGE = new DrivePage({\n name: DRIVE_PAGE_NAMES.SEARCH,\n viewName: 'Search results',\n});\n\nexport const SHARES_PAGE = new DrivePage({\n name: DRIVE_PAGE_NAMES.SHARES,\n viewName: 'Shared',\n queryParams: {\n sharedOnly: true,\n }\n});\n\nexport const TRASH_PAGE = new DrivePage({\n name: DRIVE_PAGE_NAMES.TRASH,\n viewName: 'Trash',\n hasActions: true,\n queryParams: {\n deletedOnly: true,\n }\n});\n\nexport const WORKSPACE_INDEX_PAGE = new DrivePage({\n name: DRIVE_PAGE_NAMES.WORKSPACES,\n viewName: 'Workspaces',\n});\n\nexport const STARRED_PAGE = new DrivePage({\n name: DRIVE_PAGE_NAMES.STARRED,\n viewName: 'Starred',\n queryParams: {\n starredOnly: true,\n }\n});\n\nexport class FolderPage extends DrivePage {\n constructor(folder?: DriveFolder) {\n super({\n name: DRIVE_PAGE_NAMES.FOLDER,\n viewName: folder?.name,\n folder,\n folderHash: folder?.hash,\n hasActions: true\n });\n }\n}\n","import { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { DriveApiIndexParams } from '../../drive-entry-api.service';\nimport { SortColumn } from '../../entries/available-sorts';\nimport {\n DrivePage,\n FolderPage,\n RECENT_PAGE,\n SEARCH_PAGE,\n SHARES_PAGE,\n STARRED_PAGE,\n TRASH_PAGE,\n WORKSPACE_INDEX_PAGE,\n} from '../models/drive-page';\n\nexport interface LoadEntriesAction {\n queryParams: DriveApiIndexParams;\n page?: DrivePage;\n folder?: DriveFolder;\n loadMore?: boolean;\n}\n\nexport class RecentEntriesPageOpened implements LoadEntriesAction {\n static readonly type = '[Drive] Recent Entries Page Opened';\n public page = RECENT_PAGE;\n public queryParams = {orderBy: 'created_at' as SortColumn, recentOnly: true};\n}\n\nexport class FolderPageOpened implements LoadEntriesAction {\n static readonly type = '[Drive] Folder Page Opened';\n public page: DrivePage;\n public queryParams = {};\n constructor(folderHash: string|null) {\n this.page = new FolderPage({hash: folderHash} as DriveFolder);\n }\n}\n\nexport class SharesFolderOpened implements LoadEntriesAction {\n static readonly type = '[Drive] Shared folder opened';\n public page = SHARES_PAGE;\n public queryParams = {sharedOnly: true};\n}\n\nexport class TrashPageOpened implements LoadEntriesAction {\n static readonly type = '[Drive] Trash Page Opened';\n public page = TRASH_PAGE;\n public queryParams = {deletedOnly: true};\n}\n\nexport class WorkspacesIndexPageOpened {\n static readonly type = '[Drive] Workspaces Index Page Opened';\n public page = WORKSPACE_INDEX_PAGE;\n}\n\nexport class SearchPageOpened implements LoadEntriesAction {\n static readonly type = '[Drive] Search Page Opened';\n public page = SEARCH_PAGE;\n constructor(public queryParams: {\n filters?: string;\n query?: string;\n } = {}) {}\n}\n\nexport class StarredPageOpened implements LoadEntriesAction {\n static readonly type = '[Drive] Starred Entries Page Opened';\n public page = STARRED_PAGE;\n public queryParams = {starredOnly: true};\n}\n\nexport class EntriesSelectedViaDrag {\n static readonly type = '[Drive] Entries Selected Via Drag';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class EntrySelectedViaContextMenu {\n static readonly type = '[Drive] File Selected Via ContextMenu';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class EntryTapped {\n static readonly type = '[Drive] User Tapped File';\n constructor(public entry: DriveEntry, public ctrlKey = false) {}\n}\n\nexport class EntryDoubleTapped {\n static readonly type = '[Drive] User Double Tapped Entry';\n constructor(public entry: DriveEntry) {}\n}\n\nexport class FileDeleteSuccess {\n static readonly type = '[Drive] Successfully Deleted Files';\n constructor(public deletedFiles: DriveEntry[]) {}\n}\n\nexport class EntryContextMenuOpened {\n static readonly type = '[Drive] Entry Context Menu Opened';\n constructor(public entry: DriveEntry) {}\n}\n\nexport class NewFolderCreated {\n static readonly type = '[Drive] New Folder Created';\n constructor(public folder: DriveFolder) {}\n}\n\nexport class EntryRenamed {\n static readonly type = '[Drive] Entry Renamed';\n constructor(public entry: DriveEntry, public newName: string) {}\n}\n\nexport class StartedDragging {\n static readonly type = '[Drive] Started Dragging';\n}\n\nexport class StoppedDragging {\n static readonly type = '[Drive] Stopped Dragging';\n}\n\nexport class MoveEntriesSuccess {\n static readonly type = '[Drive API] Move Entries Success';\n constructor(\n public destination: number,\n public oldLocation: number,\n public entries: DriveEntry[]\n ) {}\n}\n\nexport class MoveEntriesFailed {\n static readonly type = '[Drive API] Move Entries Failed';\n constructor(public messages: object) {}\n}\n\nexport class TrashedEntriesDeleteSuccess {\n static readonly type = '[Drive API] Trashed Entries Delete Forever Success';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class TrashedEntriesRestoreSuccess {\n static readonly type = '[Drive API] Trashed Entries Restore Success';\n constructor(public entries: DriveEntry[]) {}\n}\n\nexport class NotEnoughSpaceError {\n static readonly type = '[Drive] Not Enough Space Error';\n}\n\nexport class UserSpaceUsageChanged {\n static readonly type = '[Drive] User Space Usage Changed';\n}\n\nexport class BreakpointChanged {\n static readonly type = '[Drive] BreakpointChanged';\n constructor(public status: {isMobile: boolean}) {}\n}\n\n\n","import { SortColumn, SortDirection } from '../../entries/available-sorts';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { DrivePage } from './drive-page';\nimport { UserSpaceUsage } from './user-space-usage';\nimport { User } from '@common/core/types/models/User';\nimport { Workspace } from '../../../../common/workspaces/types/workspace';\n\nexport interface DriveStateModel {\n isMobile: boolean;\n activePage: DrivePage;\n folderTree: DriveFolder[];\n flatFolders: DriveFolder[];\n userFoldersLoaded: boolean;\n entries: DriveEntry[];\n selectedEntries: DriveEntry[];\n spaceUsage: UserSpaceUsage;\n rootFolder?: DriveFolder;\n meta: {\n currentPage: number;\n lastPage: number;\n sortColumn: SortColumn;\n sortDirection: SortDirection;\n filters?: string|null,\n query?: string|null\n };\n dragging: boolean;\n loading: boolean;\n uploadsPanelOpen: boolean;\n viewMode: 'list'|'grid';\n detailsVisible: boolean;\n sidebarOpen: boolean;\n currentUser: User|null;\n activeWorkspace: Workspace|null;\n}\n\nexport const VIEW_MODE_KEY = 'bedrive.viewMode';\n","import { DriveStateModel } from './drive-state-model';\n\nexport const DRIVE_STATE_MODEL_DEFAULTS: DriveStateModel = {\n isMobile: false,\n activePage: null,\n folderTree: [],\n flatFolders: [],\n userFoldersLoaded: false,\n entries: [],\n selectedEntries: [],\n dragging: false,\n loading: false,\n uploadsPanelOpen: false,\n viewMode: 'grid' as 'grid'|'list',\n detailsVisible: true,\n sidebarOpen: true,\n currentUser: null,\n activeWorkspace: null,\n spaceUsage: {\n available: null,\n used: null,\n },\n meta: {\n sortColumn: 'updated_at',\n sortDirection: 'desc',\n currentPage: 0,\n lastPage: 0,\n },\n};\n","export enum LoadingToastMessages {\n copyEntries = 'Copying items...',\n emptyTrash = 'Emptying trash...',\n moveEntries = 'Moving items...',\n}\n","import { InjectionToken } from '@angular/core';\nimport { UploadInputConfig } from '../../common/uploads/upload-input-config';\n\nexport const DRIVE_UPLOAD_INPUT_CONFIG = new InjectionToken<UploadInputConfig>('DRIVE_UPLOAD_INPUT_CONFIG');","export enum FOLDERS_API_ROUTES {\n GET_ALL = 'drive/folders',\n CREATE = 'drive/folders',\n}\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {FOLDERS_API_ROUTES} from './folders-api-routes.enum';\nimport {DriveFolder} from '../models/driveFolder';\nimport {CurrentUser} from '@common/auth/current-user';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { PaginatedBackendResponse } from '@common/core/types/pagination/paginated-backend-response';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FoldersApiService {\n\n constructor(\n private http: AppHttpClient,\n private currentUser: CurrentUser\n ) {}\n\n public getAll(params?: {userId?: number}): PaginatedBackendResponse<DriveFolder> {\n return this.http.get(FOLDERS_API_ROUTES.GET_ALL, params);\n }\n\n public getAllForCurrentUser(): BackendResponse<{folders: DriveFolder[], rootFolder: DriveFolder}> {\n return this.http.get('drive/users/' + this.currentUser.get('id') + '/folders');\n }\n\n public create(params: {name: string, parentId: number|null}): BackendResponse<{folder: DriveFolder}> {\n return this.http.post(FOLDERS_API_ROUTES.CREATE, params);\n }\n\n public getByHash(hash: string): BackendResponse<{folder: DriveFolder}> {\n return this.http.get('drive/folders/find', {hash});\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AppHttpClient } from '@common/core/http/app-http-client.service';\nimport { DriveEntry } from './files/models/drive-entry';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { DriveFolder } from './folders/models/driveFolder';\nimport { Observable } from 'rxjs';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { Tag } from '@common/core/types/models/Tag';\nimport { SortColumn, SortDirection } from './entries/available-sorts';\nimport { UserSpaceUsage } from './state/models/user-space-usage';\nimport { PaginationResponse } from '@common/core/types/pagination/pagination-response';\n\nexport interface DriveApiIndexParams {\n orderBy?: SortColumn;\n orderDir?: SortDirection;\n folderId?: number;\n userId?: number;\n query?: string;\n filters?: string;\n deletedOnly?: boolean;\n starredOnly?: boolean;\n sharedOnly?: boolean;\n per_page?: number;\n page?: number;\n recentOnly?: boolean;\n}\n\nexport interface DriveEntriesPaginationResponse extends PaginationResponse<DriveFolder> {\n folder: DriveFolder;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DriveEntryApiService {\n constructor(private http: AppHttpClient, private currentUser: CurrentUser) {}\n\n public getEntriesForFolder(params: DriveApiIndexParams = {}): Observable<DriveEntriesPaginationResponse> {\n return this.http.get('drive/entries', params);\n }\n\n public getCurrentUserEntries(params: DriveApiIndexParams): Observable<DriveEntriesPaginationResponse> {\n params.userId = this.currentUser.get('id');\n return this.http.get('drive/entries', params);\n }\n\n public update(entryId: number, params: {name?: string, description?: string}): BackendResponse<{fileEntry: DriveEntry}> {\n return this.http.put('uploads/' + entryId, params);\n }\n\n public delete(params: {entryIds?: number[], deleteForever?: boolean, emptyTrash?: boolean}): BackendResponse<void> {\n return this.http.delete('drive/entries', params);\n }\n\n public copy(params: {entryIds: number[]}): BackendResponse<{entries: DriveEntry[]}> {\n return this.http.post('drive/entries/copy', params);\n }\n\n public restore(params: {entryIds: number[]}): BackendResponse<void> {\n return this.http.post('drive/entries/restore', params);\n }\n\n public emptyTrash(): BackendResponse<void> {\n return this.delete({emptyTrash: true});\n }\n\n public moveEntries(params: {entryIds: number[], destination: number}): BackendResponse<{entries: DriveEntry[]}> {\n return this.http.post('drive/entries/move', params);\n }\n\n public addStar(entryIds: number[]): BackendResponse<{tag: Tag}> {\n return this.http.post('drive/entries/star', {entryIds});\n }\n\n public removeStar(entryIds: number[]): BackendResponse<{tag: Tag}> {\n return this.http.post('drive/entries/unstar', {entryIds});\n }\n\n public getSpaceUsage(): BackendResponse<UserSpaceUsage> {\n return this.http.get('drive/user/space-usage');\n }\n}\n","import { Injectable } from '@angular/core';\nimport { DriveFolder } from './folders/models/driveFolder';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DriveUrlsService {\n public driveRoot() {\n return '/drive';\n }\n\n public folder(folder: DriveFolder) {\n if ( ! folder?.id) {\n return this.driveRoot();\n } else {\n return `/drive/folders/${(folder as DriveFolder).hash}`;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { UploadValidator } from '@common/uploads/validation/upload-validator';\nimport { FileSizeValidation } from '@common/uploads/validation/validations/file-size-validation';\nimport { convertToBytes } from '@common/core/utils/convertToBytes';\nimport { AllowedExtensionsValidation } from '@common/uploads/validation/validations/allowed-extensions-validation';\nimport { BlockedExtensionsValidation } from '@common/uploads/validation/validations/blocked-extensions-validation';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DriveUploadValidator extends UploadValidator {\n protected readonly DEFAULT_MAX_FILE_SIZE_MB = 8;\n\n protected initValidations() {\n this.validations.push(\n new FileSizeValidation(\n {maxSize: this.getMaxFileSize()},\n this.i18n\n )\n );\n\n const allowedExtensions = this.getAllowedExtensions(),\n blockedExtensions = this.getBlockedExtensions();\n\n if (allowedExtensions && allowedExtensions.length) {\n this.validations.push(new AllowedExtensionsValidation(\n {extensions: allowedExtensions}, this.i18n\n ));\n }\n\n if (blockedExtensions && blockedExtensions.length) {\n this.validations.push(new BlockedExtensionsValidation(\n {extensions: blockedExtensions}, this.i18n\n ));\n }\n }\n\n protected getMaxFileSize(): number {\n return this.settings.get(\n 'uploads.max_size',\n convertToBytes(this.DEFAULT_MAX_FILE_SIZE_MB, 'MB')\n );\n }\n\n protected getAllowedExtensions() {\n return this.settings.getJson('uploads.allowed_extensions');\n }\n\n protected getBlockedExtensions() {\n return this.settings.getJson('uploads.blocked_extensions');\n }\n}\n","import {DriveFolder} from '../folders/models/driveFolder';\nimport {DriveEntry} from '../files/models/drive-entry';\nimport {Action, Selector, State, StateContext, Store} from '@ngxs/store';\nimport {FoldersApiService} from '../folders/api/folders-api.service';\nimport {finalize, tap} from 'rxjs/operators';\nimport {DriveApiIndexParams, DriveEntryApiService} from '../drive-entry-api.service';\nimport {Router} from '@angular/router';\nimport {DriveUrlsService} from '../drive-urls.service';\nimport {\n AddEntries,\n AddStar,\n BuildFolderTree,\n CopySelectedEntries,\n DeleteSelectedEntries,\n DeleteTrashedEntriesForever,\n DeselectAllEntries,\n EmptyTrash,\n HideLoadingToast,\n LoadMoreEntries,\n LoadUserFolders,\n LoadUserSpaceUsage,\n MoveEntries,\n OpenConfirmDialog,\n OpenFilePreview,\n OpenFolder,\n OpenSearchPage,\n OpenUploadsPanel,\n OpenUploadWindow,\n ReloadPageEntries,\n RemoveEntries,\n RemoveStar,\n ResetState,\n RestoreTrashedEntries,\n SelectAllEntries,\n SelectEntries,\n SetCurrentUser,\n SetViewMode,\n SetWorkspace,\n ShowLoadingToast,\n ToggleDetailsSidebar,\n ToggleSidebar,\n UpdateEntries,\n UpdateEntryDescription,\n UploadFiles,\n} from './actions/commands';\nimport {\n BreakpointChanged,\n EntriesSelectedViaDrag,\n EntryContextMenuOpened,\n EntryDoubleTapped,\n EntryRenamed,\n EntrySelectedViaContextMenu,\n EntryTapped,\n FileDeleteSuccess,\n FolderPageOpened,\n LoadEntriesAction,\n MoveEntriesFailed,\n MoveEntriesSuccess,\n NewFolderCreated,\n NotEnoughSpaceError,\n RecentEntriesPageOpened,\n SearchPageOpened,\n SharesFolderOpened,\n StarredPageOpened,\n StartedDragging,\n StoppedDragging,\n TrashedEntriesDeleteSuccess,\n TrashedEntriesRestoreSuccess,\n TrashPageOpened,\n UserSpaceUsageChanged,\n WorkspacesIndexPageOpened,\n} from './actions/events';\nimport {DriveStateModel, VIEW_MODE_KEY} from './models/drive-state-model';\nimport {DRIVE_STATE_MODEL_DEFAULTS} from './models/drive-state-model-defaults';\nimport {LocalStorage} from '@common/core/services/local-storage.service';\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\nimport {DriveUploadValidator} from '../uploads/drive-upload-validator';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {Inject, Injectable} from '@angular/core';\nimport {UploadInputConfig} from '@common/uploads/upload-input-config';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {UserSpaceUsage} from './models/user-space-usage';\nimport {LoadingToastMessages} from '../messages/loading-toast/loading-toast-messages';\nimport {User} from '@common/core/types/models/User';\nimport {DRIVE_PAGE_NAMES, DrivePage, TRASH_PAGE} from './models/drive-page';\nimport {DRIVE_UPLOAD_INPUT_CONFIG} from '../upload-input-config';\nimport {Tag} from '@common/core/types/models/Tag';\nimport {FileEntry} from '@common/uploads/types/file-entry';\nimport {hasKey} from '@common/core/utils/has-key';\nimport {BackendErrorResponse} from '../../../common/core/types/backend-error-response';\nimport {buildFolderTree} from '../sidebar/folders-tree/build-folder-tree';\nimport {WorkspacesService} from '../../../common/workspaces/workspaces.service';\nimport {Workspace} from '../../../common/workspaces/types/workspace';\nimport {Toast} from '../../../common/core/ui/toast.service';\n\n@State<DriveStateModel>({\n name: 'drive',\n defaults: DRIVE_STATE_MODEL_DEFAULTS,\n})\n@Injectable()\nexport class DriveState {\n constructor(\n private foldersApi: FoldersApiService,\n private entriesApi: DriveEntryApiService,\n private router: Router,\n private driveUrls: DriveUrlsService,\n private uploads: UploadQueueService,\n private store: Store,\n private localStore: LocalStorage,\n private validator: DriveUploadValidator,\n private workspaces: WorkspacesService,\n private toast: Toast,\n @Inject(DRIVE_UPLOAD_INPUT_CONFIG) private uploadInputConfig: UploadInputConfig\n ) {}\n\n @Selector()\n static flatFolders(state: DriveStateModel) {\n return state.flatFolders;\n }\n\n @Selector()\n static userFoldersLoaded(state: DriveStateModel) {\n return state.userFoldersLoaded;\n }\n\n @Selector()\n static activePage(state: DriveStateModel) {\n return state.activePage;\n }\n\n @Selector()\n static activePageName(state: DriveStateModel) {\n return state.activePage.name;\n }\n\n @Selector()\n static userFolders(state: DriveStateModel) {\n return state.folderTree;\n }\n\n @Selector()\n static selectedEntries(state: DriveStateModel) {\n return state.selectedEntries;\n }\n\n @Selector([DriveState.selectedEntries])\n static selectedEntryIds(state: DriveStateModel, selectedEntries: DriveEntry[]) {\n return selectedEntries.map(entry => entry.id);\n }\n\n @Selector([DriveState.selectedEntries])\n static selectedEntry(state: DriveStateModel, selected: DriveEntry[]) {\n return selected ? selected[selected.length - 1] : null;\n }\n\n @Selector([DriveState.selectedEntry])\n static selectedEntryOrActiveFolder(state: DriveStateModel, selected: DriveEntry[]) {\n return selected || state.activePage.folder;\n }\n\n @Selector([DriveState.selectedEntryOrActiveFolder, DriveState.flatFolders])\n static selectedEntryParent(\n state: DriveStateModel,\n selected: DriveFolder,\n folders: DriveFolder[]\n ) {\n if (!selected || !folders || !selected.parent_id) {\n return state.rootFolder;\n }\n return folders.find(f => f.id === selected.parent_id);\n }\n\n @Selector([DriveState.selectedEntries])\n static anythingSelected(state: DriveStateModel, selectedEntries: DriveEntry[]) {\n return selectedEntries.length > 0;\n }\n\n @Selector([DriveState.selectedEntries])\n static allSelectedEntriesStarred(\n state: DriveStateModel,\n selectedEntries: DriveEntry[]\n ) {\n return selectedEntries.every(\n entry => !!entry.tags.find(tag => tag.name === 'starred')\n );\n }\n\n @Selector([DriveState.selectedEntries])\n static onlyFoldersSelected(state: DriveStateModel, selectedEntries: DriveEntry[]) {\n return selectedEntries.every(entry => entry.type === 'folder');\n }\n\n @Selector()\n static entries(state: DriveStateModel) {\n return state.entries;\n }\n\n @Selector()\n static entriesEmpty(state: DriveStateModel) {\n // only return true if entries have already loaded\n return state.meta.currentPage && !state.loading && state.entries.length === 0;\n }\n\n @Selector([DriveState.selectedEntries])\n static multipleEntriesSelected(\n state: DriveStateModel,\n selectedEntries: DriveEntry[]\n ) {\n return selectedEntries.length > 1;\n }\n\n @Selector()\n static activeFolder(state: DriveStateModel) {\n return state.activePage.folder;\n }\n\n @Selector()\n static rootFolder(state: DriveStateModel) {\n return state.rootFolder;\n }\n\n @Selector()\n static meta(state: DriveStateModel) {\n return state.meta;\n }\n\n @Selector()\n static dragging(state: DriveStateModel) {\n return state.dragging;\n }\n\n @Selector()\n static loading(state: DriveStateModel) {\n return state.loading;\n }\n\n @Selector()\n static currentPage(state: DriveStateModel) {\n return state.meta.currentPage;\n }\n\n @Selector()\n static viewMode(state: DriveStateModel) {\n return state.viewMode;\n }\n\n @Selector()\n static detailsOpen(state: DriveStateModel) {\n return state.detailsVisible;\n }\n\n @Selector()\n static sidebarOpen(state: DriveStateModel) {\n return state.sidebarOpen;\n }\n\n @Selector()\n static sortColumn(state: DriveStateModel) {\n return state.meta.sortColumn;\n }\n\n @Selector()\n static sortDirection(state: DriveStateModel) {\n return state.meta.sortDirection;\n }\n\n @Selector()\n static canLoadMoreEntries(state: DriveStateModel) {\n return state.meta.currentPage < state.meta.lastPage;\n }\n\n @Selector()\n static userSpaceUsed(state: DriveStateModel) {\n return state.spaceUsage.used;\n }\n\n @Selector()\n static userSpaceAvailable(state: DriveStateModel) {\n return state.spaceUsage.available;\n }\n\n @Selector([DriveState.userSpaceUsed, DriveState.userSpaceAvailable])\n static spaceUsedPercent(\n state: DriveStateModel,\n spaceUsed: number,\n spaceAvail: number\n ) {\n // null means that user has unlimited space available\n return spaceAvail === null ? 0 : (spaceUsed * 100) / spaceAvail;\n }\n\n @Selector()\n static isMobile(state: DriveStateModel) {\n return state.isMobile;\n }\n\n static userHasPermission(\n permission: 'edit' | 'owner',\n folder: DriveEntry,\n user: User\n ) {\n // we are not in a folder view, can bail\n if (!folder || !user) return false;\n\n // check if user is the owner of currently open folder\n const folderUser = (folder as DriveEntry).users.find(u => u.id === user.id);\n if (folderUser.owns_entry || folderUser.entry_permissions[permission]) {\n return true;\n }\n }\n\n @Selector()\n static currentUser(state: DriveStateModel) {\n return state.currentUser;\n }\n\n @Selector()\n static activeWorkspace(state: DriveStateModel) {\n return state.activeWorkspace;\n }\n\n @Selector([DriveState.activeFolder, DriveState.currentUser])\n static userOwnsActiveFolder(\n state: DriveStateModel,\n activeFolder: DriveEntry,\n currentUser: User\n ) {\n return DriveState.userHasPermission('owner', activeFolder, currentUser);\n }\n\n @Selector([DriveState.selectedEntries, DriveState.currentUser])\n static userOwnsSelectedEntries(\n state: DriveStateModel,\n selectedEntries: DriveEntry[],\n currentUser: User\n ) {\n return selectedEntries.every(entry => {\n return DriveState.userHasPermission('owner', entry, currentUser);\n });\n }\n\n @Selector([DriveState.selectedEntries, DriveState.currentUser])\n static userCanEditSelectedEntries(\n state: DriveStateModel,\n entries: DriveEntry[],\n currentUser: User\n ) {\n return entries.every(entry => {\n const user = entry.users.find(u => u.id === currentUser.id);\n return user && (user.owns_entry || user.entry_permissions.edit);\n });\n }\n\n @Selector([DriveState.activePage, DriveState.currentUser, DriveState.activeWorkspace])\n static canUpload(\n state: DriveStateModel,\n page: DrivePage,\n currentUser: User,\n workspace: Workspace\n ) {\n if (!page.folder || !currentUser || !workspace) {\n return false;\n }\n\n // check if user can create files in this workspace\n if (workspace?.id && page.folder.workspace_id === workspace.id) {\n const member = workspace.currentUser;\n return (\n member &&\n (member.is_owner ||\n member.permissions.findIndex(p => p.name === 'files.create') > -1)\n );\n\n // check if user has \"edit\" permission for folder if it's not part of workspace\n } else {\n return DriveState.userHasPermission('edit', page.folder, currentUser);\n }\n }\n\n @Action(LoadUserFolders)\n loadUserFolders(ctx: StateContext<DriveStateModel>) {\n return this.foldersApi.getAllForCurrentUser().pipe(\n tap(response => {\n ctx.patchState({rootFolder: response.rootFolder});\n return ctx.dispatch(new BuildFolderTree(response.folders));\n })\n );\n }\n\n @Action(BuildFolderTree)\n buildFolderTree(ctx: StateContext<DriveStateModel>, action: BuildFolderTree) {\n const flatFolders = action.folders || ctx.getState().flatFolders;\n const tree = buildFolderTree(flatFolders);\n ctx.patchState({\n folderTree: tree,\n flatFolders,\n userFoldersLoaded: true,\n });\n }\n\n @Action(WorkspacesIndexPageOpened)\n workspacesIndexPageOpened(\n ctx: StateContext<DriveStateModel>,\n action: WorkspacesIndexPageOpened\n ) {\n ctx.patchState({activePage: action.page});\n }\n\n @Action(FolderPageOpened)\n @Action(RecentEntriesPageOpened)\n @Action(TrashPageOpened)\n @Action(StarredPageOpened)\n @Action(SearchPageOpened, {cancelUncompleted: true}) // cancel search when typing in search bar\n @Action(SharesFolderOpened)\n @Action(ReloadPageEntries)\n @Action(LoadMoreEntries)\n loadDriveEntries(ctx: StateContext<DriveStateModel>, action: LoadEntriesAction) {\n const oldState = ctx.getState();\n const newState = {\n loading: true,\n meta: {...oldState.meta},\n } as Partial<DriveStateModel>;\n\n // only replace active page if it's actually specified, this way\n // \"Reload\" and \"LoadMore\" actions will not remove active page\n newState.activePage = action.page ? action.page : oldState.activePage;\n\n // set sorting from specified query params or specified page or currently active page\n newState.meta.sortColumn =\n action.queryParams.orderBy ||\n oldState.meta.sortColumn ||\n newState.activePage.sortColumn;\n newState.meta.sortDirection =\n action.queryParams.orderDir ||\n oldState.meta.sortDirection ||\n newState.activePage.sortDirection;\n\n // if it's not search page, clear type and query\n if (newState.activePage.name !== DRIVE_PAGE_NAMES.SEARCH) {\n newState.meta.query = null;\n newState.meta.filters = null;\n }\n\n newState.meta.query = action.queryParams.query || newState.meta.query;\n newState.meta.filters = action.queryParams.filters || newState.meta.filters;\n\n ctx.patchState(newState);\n const params = this.transformQueryParams({\n ...action.queryParams,\n ...newState.activePage.queryParams,\n });\n\n if (\n newState.activePage.name === DRIVE_PAGE_NAMES.SEARCH &&\n !newState.meta.query &&\n !newState.meta.filters\n ) {\n return ctx.patchState({\n entries: [],\n loading: false,\n activePage: newState.activePage,\n meta: {\n ...newState.meta,\n lastPage: 1,\n currentPage: 1,\n },\n });\n }\n\n return this.entriesApi.getEntriesForFolder(params).pipe(\n tap(\n response => {\n const entries = action.loadMore ? oldState.entries : [];\n\n const state = {\n entries: entries.concat(response.data),\n meta: {\n ...newState.meta,\n lastPage: response.last_page,\n currentPage: response.current_page,\n },\n loading: false,\n } as Partial<DriveStateModel>;\n\n state.activePage = {\n ...newState.activePage,\n folder: response.folder,\n };\n\n return ctx.patchState(state);\n },\n () => {\n return ctx.patchState({loading: false});\n }\n )\n );\n }\n\n @Action(OpenFolder, {cancelUncompleted: true})\n openFolder(ctx: StateContext<DriveStateModel>, action: OpenFolder) {\n const currentFolder = ctx.getState().activePage.folder;\n if (currentFolder && action.folder.id === currentFolder.id) return;\n\n if (action.folder && action.folder.deleted_at) {\n return ctx.dispatch(\n new OpenConfirmDialog(\n {\n title: 'Folder is in trash',\n body: 'To view this folder, you need to restore it first.',\n ok: 'Restore',\n },\n new RestoreTrashedEntries([action.folder as DriveFolder])\n )\n );\n } else {\n ctx.patchState({loading: true});\n return this.router.navigate([this.driveUrls.folder(action.folder)]);\n }\n }\n\n @Action(OpenSearchPage, {cancelUncompleted: true})\n openSearchPage(ctx: StateContext<DriveStateModel>, action: OpenSearchPage) {\n ctx.patchState({loading: true});\n return this.router.navigate(['/drive/search'], {queryParams: action.queryParams});\n }\n\n @Action(EntriesSelectedViaDrag)\n @Action(EntrySelectedViaContextMenu)\n @Action(SelectEntries)\n selectEntries(\n ctx: StateContext<DriveStateModel>,\n action: EntriesSelectedViaDrag | EntrySelectedViaContextMenu | SelectEntries\n ) {\n ctx.patchState({selectedEntries: action.entries});\n }\n\n @Action(DeselectAllEntries)\n deselectAllEntries(ctx: StateContext<DriveStateModel>) {\n if (!ctx.getState().selectedEntries.length) return;\n ctx.patchState({selectedEntries: []});\n }\n\n @Action(SelectAllEntries)\n SelectAllEntries(ctx: StateContext<DriveStateModel>) {\n ctx.patchState({selectedEntries: ctx.getState().entries.slice()});\n }\n\n @Action(EntryTapped)\n entryTapped(ctx: StateContext<DriveStateModel>, action: EntryTapped) {\n const current = ctx.getState().selectedEntries.slice();\n let alreadySelected = false;\n\n // remove entry with matching ID (if exists) to avoid duplicates\n const i = current.findIndex(curr => curr.id === action.entry.id);\n if (i > -1) {\n current.splice(i, 1);\n alreadySelected = true;\n }\n\n if (action.ctrlKey) {\n if (alreadySelected) {\n ctx.patchState({selectedEntries: current});\n } else {\n ctx.patchState({selectedEntries: [...current, action.entry]});\n }\n } else {\n ctx.patchState({selectedEntries: [action.entry]});\n }\n\n if (ctx.getState().isMobile) {\n this.entryDoubleTapped(ctx, action);\n }\n }\n\n @Action(EntryDoubleTapped)\n entryDoubleTapped(ctx: StateContext<DriveStateModel>, action: EntryDoubleTapped) {\n if (action.entry.type === 'folder') {\n return ctx.dispatch(new OpenFolder(action.entry as DriveFolder));\n } else {\n return ctx.dispatch(new OpenFilePreview([action.entry]));\n }\n }\n\n @Action(DeleteSelectedEntries)\n deleteSelectedEntries(ctx: StateContext<DriveStateModel>) {\n const entries = this.store.selectSnapshot(DriveState.selectedEntries),\n entryIds = this.store.selectSnapshot(DriveState.selectedEntryIds),\n flatFolders = this.store.selectSnapshot(DriveState.flatFolders),\n activePage = ctx.getState().activePage;\n\n return this.entriesApi.delete({entryIds}).pipe(\n tap(() => {\n // filter out deleted entries\n const newEntries = ctx\n .getState()\n .entries.filter(entry => entryIds.indexOf(entry.id) === -1);\n\n const newState = {entries: newEntries} as Partial<DriveStateModel>,\n actions = [new FileDeleteSuccess(entries)] as any[];\n\n // clear selected entries\n newState.selectedEntries = [];\n\n // if selected folder was active, navigate to its parent\n if (activePage.folder && entryIds.indexOf(activePage.folder.id) > -1) {\n this.store.dispatch(\n new OpenFolder(\n this.store.selectSnapshot(DriveState.selectedEntryParent)\n )\n );\n }\n\n // rebuild folders tree\n const folders = entries.filter(entry => entry.type === 'folder');\n if (folders.length) {\n folders.forEach(folder => delete flatFolders[folder.id]);\n newState.flatFolders = flatFolders;\n actions.push(new BuildFolderTree());\n }\n\n ctx.patchState(newState);\n return ctx.dispatch(actions);\n })\n );\n }\n\n @Action(EntryContextMenuOpened)\n fileContextMenuOpened(\n ctx: StateContext<DriveStateModel>,\n action: EntryContextMenuOpened\n ) {\n if (!action?.entry?.id) return;\n\n const fileAlreadySelected = ctx\n .getState()\n .selectedEntries.find(entry => entry.id === action.entry.id);\n\n if (!fileAlreadySelected) {\n return ctx.dispatch(new EntrySelectedViaContextMenu([action.entry]));\n }\n }\n\n @Action(NewFolderCreated)\n newFolderCreated(ctx: StateContext<DriveStateModel>, action: NewFolderCreated) {\n const state = ctx.getState();\n const parentFolderId = action.folder.parent_id;\n\n // start new folder into user folders cache\n const newState: Partial<DriveStateModel> = {\n flatFolders: [...state.flatFolders, action.folder],\n };\n\n // push new folder into parent folder entries, if parent is currently open\n if (parentFolderId === state.activePage.folder.id) {\n newState.entries = [action.folder, ...state.entries];\n }\n\n ctx.patchState(newState);\n\n // rebuild folder tree\n return ctx.dispatch(new BuildFolderTree());\n }\n\n @Action(EntryRenamed)\n entryRenamed(ctx: StateContext<DriveStateModel>, action: EntryRenamed) {\n const state = ctx.getState(),\n newState = {entries: state.entries.slice()} as Partial<DriveStateModel>,\n i = newState.entries.findIndex(curr => curr.id === action.entry.id);\n\n // rename entry inside main entries array\n if (i > -1) {\n newState.entries[i] = {...newState.entries[i], name: action.newName};\n }\n\n // rename entry inside selected entries array\n newState.selectedEntries = [{...state.selectedEntries[0], name: action.newName}];\n\n // rename active folder\n if (state.activePage.folder && state.activePage.folder.id === action.entry.id) {\n newState.activePage = {...state.activePage, folder: action.entry};\n }\n\n // rebuild folder tree\n if (action.entry.type === 'folder') {\n const flatFolders = {...state.flatFolders};\n flatFolders[action.entry.id] = {\n ...flatFolders[action.entry.id],\n name: action.newName,\n };\n newState.flatFolders = flatFolders;\n ctx.dispatch(new BuildFolderTree());\n }\n\n ctx.patchState(newState);\n }\n\n @Action(StartedDragging)\n startedDragging(ctx: StateContext<DriveStateModel>) {\n ctx.patchState({dragging: true});\n }\n\n @Action(StoppedDragging)\n stoppedDragging(ctx: StateContext<DriveStateModel>) {\n ctx.patchState({dragging: false});\n }\n\n @Action(MoveEntries)\n movieEntries(ctx: StateContext<DriveStateModel>, action: MoveEntries) {\n const entries = action.entries || ctx.getState().selectedEntries;\n\n if (!DriveState.canMoveEntriesTo(entries, action.destination)) return;\n\n ctx.dispatch(new ShowLoadingToast(LoadingToastMessages.moveEntries));\n\n const oldLocation = entries[0].parent_id;\n\n return this.entriesApi\n .moveEntries({\n entryIds: entries.map(entry => entry.id),\n destination: action.destination?.id,\n })\n .pipe(\n finalize(() => ctx.dispatch(new HideLoadingToast())),\n tap(\n response => {\n return ctx.dispatch(\n new MoveEntriesSuccess(\n action.destination?.id,\n oldLocation,\n response.entries\n )\n );\n },\n (errResponse: BackendErrorResponse) => {\n return ctx.dispatch(new MoveEntriesFailed(errResponse.errors));\n }\n )\n );\n }\n\n @Action(MoveEntriesSuccess)\n moveEntriesSuccess(ctx: StateContext<DriveStateModel>, action: MoveEntriesSuccess) {\n const state = ctx.getState(),\n entryIds = action.entries.map(entry => entry.id),\n folders = action.entries.filter(entry => entry.type === 'folder');\n\n // remove moved entries from old folder\n const newState = {\n selectedEntries: [],\n entries: state.entries.filter(entry => entryIds.indexOf(entry.id) === -1),\n } as Partial<DriveStateModel>;\n\n // rebuild folder tree\n if (folders.length) {\n newState.flatFolders = {...state.flatFolders};\n action.entries\n .filter(entry => entry.type === 'folder')\n .forEach(\n entry => (newState.flatFolders[entry.id] = entry as DriveFolder)\n );\n }\n\n // update active folder\n if (state.activePage.folder) {\n const folder = action.entries.find(\n entry => state.activePage.folder.id === entry.id\n );\n if (folder) newState.activePage = {...state.activePage, folder};\n }\n\n ctx.patchState(newState);\n return ctx.dispatch(new BuildFolderTree());\n }\n\n @Action(SetViewMode)\n setViewMode(ctx: StateContext<DriveStateModel>, action: SetViewMode) {\n this.localStore.set(VIEW_MODE_KEY, action.mode);\n ctx.patchState({viewMode: action.mode});\n }\n\n @Action(ToggleDetailsSidebar)\n toggleDetailsSidebar(ctx: StateContext<DriveStateModel>) {\n ctx.patchState({\n detailsVisible: !ctx.getState().detailsVisible,\n });\n }\n\n @Action(ToggleSidebar)\n toggleSidebar(ctx: StateContext<DriveStateModel>) {\n ctx.patchState({\n sidebarOpen: !ctx.getState().sidebarOpen,\n });\n }\n\n @Action(AddEntries)\n addEntries(ctx: StateContext<DriveStateModel>, action: AddEntries) {\n const currentEntries = ctx.getState().entries,\n spaceUsage = ctx.getState().spaceUsage;\n\n const newEntries = action.entries.filter(\n entry => !currentEntries.find(curr => curr.id === entry.id)\n );\n\n const newSize = newEntries\n .filter(entry => entry.type !== 'folder')\n .reduce((sum, entry) => sum + entry.file_size, 0);\n\n ctx.patchState({\n entries: [...newEntries, ...currentEntries],\n spaceUsage: {...spaceUsage, used: spaceUsage.used + newSize},\n });\n }\n\n @Action(UploadFiles)\n uploadFiles(ctx: StateContext<DriveStateModel>, action: UploadFiles) {\n if (!this.enoughSpaceLeftToUpload(ctx.getState().spaceUsage, action.files)) {\n return ctx.dispatch(new NotEnoughSpaceError());\n }\n\n if (!action.files.length) return;\n\n ctx.dispatch(new OpenUploadsPanel());\n\n const state = ctx.getState();\n const destinationPage = state.activePage;\n const destinationId = destinationPage.folder.id || null;\n\n const config = {\n httpParams: {parentId: destinationId},\n validator: this.validator,\n };\n\n return this.uploads.start(action.files, config).pipe(\n tap(response => {\n // get parent folders, if user has uploaded folders and not single files\n const entries = [...response.fileEntry.all_parents, response.fileEntry];\n\n // remove all entries that are not direct child of currently open folder\n const newEntries = entries.filter(\n newEntry => newEntry && newEntry.parent_id === destinationId\n );\n const currentPage = ctx.getState().activePage;\n\n // add newly uploaded files and created folders\n if (currentPage.folder && currentPage.folder.id === destinationId) {\n ctx.dispatch(new AddEntries(newEntries as DriveEntry[]));\n }\n\n // rebuild folder tree, if there are any folders\n const folders = entries.filter(entry => entry && entry.type === 'folder');\n if (folders.length) {\n const flatFolders = [\n ...ctx.getState().flatFolders,\n ...folders,\n ] as DriveFolder[];\n ctx.patchState({flatFolders});\n ctx.dispatch(new BuildFolderTree());\n }\n })\n );\n }\n\n @Action(DeleteTrashedEntriesForever)\n deleteTrashedEntriesForever(ctx: StateContext<DriveStateModel>) {\n const selectedEntries = this.store.selectSnapshot(DriveState.selectedEntries),\n entryIds = selectedEntries.map(entry => entry.id);\n\n const newEntries = ctx\n .getState()\n .entries.filter(entry => entryIds.indexOf(entry.id) === -1);\n\n return this.entriesApi.delete({entryIds, deleteForever: true}).pipe(\n tap(() => {\n ctx.patchState({\n entries: newEntries,\n selectedEntries: [],\n });\n\n return ctx.dispatch([\n new TrashedEntriesDeleteSuccess(selectedEntries),\n new UserSpaceUsageChanged(),\n ]);\n })\n );\n }\n\n @Action(RestoreTrashedEntries)\n restoreTrashedEntries(\n ctx: StateContext<DriveStateModel>,\n action: RestoreTrashedEntries\n ) {\n const activePage = this.store.selectSnapshot(DriveState.activePage);\n const restoredEntries =\n action.entries || this.store.selectSnapshot(DriveState.selectedEntries);\n const entryIds = restoredEntries.map(entry => entry.id);\n let newEntries: DriveEntry[];\n\n if (activePage.name === TRASH_PAGE.name) {\n newEntries = ctx\n .getState()\n .entries.filter(entry => entryIds.indexOf(entry.id) === -1);\n } else {\n newEntries = [...ctx.getState().entries, ...action.entries];\n }\n\n return this.entriesApi.restore({entryIds}).pipe(\n tap(() => {\n ctx.patchState({\n entries: newEntries,\n selectedEntries: [],\n });\n\n return ctx.dispatch(new TrashedEntriesRestoreSuccess(restoredEntries));\n })\n );\n }\n\n @Action(EmptyTrash, {cancelUncompleted: true})\n emptyTrash(ctx: StateContext<DriveStateModel>) {\n ctx.dispatch(new ShowLoadingToast(LoadingToastMessages.emptyTrash));\n\n return this.entriesApi.emptyTrash().pipe(\n finalize(() => ctx.dispatch(new HideLoadingToast())),\n tap(() => {\n ctx.patchState({\n entries: [],\n selectedEntries: [],\n });\n\n return ctx.dispatch(new UserSpaceUsageChanged());\n })\n );\n }\n\n @Action(AddStar, {cancelUncompleted: true})\n addStar(ctx: StateContext<DriveStateModel>, action: AddStar) {\n const state = ctx.getState();\n const ids = action.entries.map(entry => entry.id);\n\n return this.entriesApi.addStar(ids).pipe(\n tap(response => {\n const newEntries = state.entries.map(entry => {\n if (ids.indexOf(entry.id) > -1) {\n if (!entry.tags) entry.tags = [];\n entry.tags.push(response.tag);\n }\n return entry;\n });\n\n const selectedEntries = state.selectedEntries.map(entry => {\n entry.tags.push(response.tag);\n return entry;\n });\n\n ctx.patchState({\n entries: newEntries,\n selectedEntries,\n });\n })\n );\n }\n\n @Action(RemoveStar, {cancelUncompleted: true})\n removeStar(ctx: StateContext<DriveStateModel>, action: RemoveStar) {\n const state = ctx.getState(),\n ids = action.entries.map(entry => entry.id);\n\n return this.entriesApi.removeStar(ids).pipe(\n tap(response => {\n const newEntries = state.entries.map(entry => {\n if (ids.indexOf(entry.id) > -1) this.removeTag(entry, response.tag);\n return entry;\n });\n\n const selectedEntries = state.selectedEntries.map(entry =>\n this.removeTag(entry, response.tag)\n );\n\n ctx.patchState({\n entries: newEntries,\n selectedEntries,\n });\n })\n );\n }\n\n @Action(RemoveEntries)\n removeEntries(ctx: StateContext<DriveStateModel>, action: RemoveEntries) {\n const ids = action.entries.map(entry => entry.id);\n const newEntries = ctx\n .getState()\n .entries.filter(entry => ids.indexOf(entry.id) === -1);\n ctx.patchState({\n entries: newEntries,\n });\n this.toast.open({\n message: 'Removed :count items.',\n replacements: {count: ids.length},\n });\n }\n\n @Action(CopySelectedEntries)\n copySelectedEntries(ctx: StateContext<DriveStateModel>) {\n const entries = this.store.selectSnapshot(DriveState.selectedEntries),\n entryIds = entries.map(entry => entry.id),\n folders = entries.filter(entry => entry.type === 'folder'),\n oldState = ctx.getState();\n\n if (!this.enoughSpaceLeftToUpload(ctx.getState().spaceUsage, entries)) {\n return ctx.dispatch(new NotEnoughSpaceError());\n }\n\n ctx.dispatch(new ShowLoadingToast(LoadingToastMessages.copyEntries));\n\n return this.entriesApi.copy({entryIds}).pipe(\n finalize(() => ctx.dispatch(new HideLoadingToast())),\n tap(response => {\n const newState = {} as Partial<DriveStateModel>;\n\n // show copied entries, if we are in a folder view\n if (ctx.getState().activePage.folder) {\n newState.entries = oldState.entries.concat(response.entries);\n }\n\n // rebuild folder tree\n if (folders.length) {\n newState.flatFolders = {...oldState.flatFolders};\n response.entries\n .filter(folder => folder.type === 'folder')\n .forEach(folder =>\n newState.flatFolders.push(folder as DriveFolder)\n );\n }\n\n ctx.patchState(newState);\n\n // update user space usage\n ctx.dispatch(new UserSpaceUsageChanged());\n\n // rebuild folder tree\n if (folders.length) ctx.dispatch(new BuildFolderTree());\n\n const activePage = this.store.selectSnapshot(DriveState.activePage);\n const location =\n activePage.name === DRIVE_PAGE_NAMES.SHARES\n ? `${this.workspaces.activeWorkspace$.value.name} workspace`\n : activePage.folder.name;\n this.toast.open({\n message: `Copied :count file(s) into :location.`,\n replacements: {count: entryIds.length, location},\n });\n })\n );\n }\n\n @Action(OpenUploadWindow)\n openUploadWindow(ctx: StateContext<DriveStateModel>, action: OpenUploadWindow) {\n const config = {\n ...this.uploadInputConfig,\n directory: action.type === 'directory',\n };\n\n openUploadWindow(config).then(files => {\n if (!files || !files.length) return;\n ctx.dispatch(new UploadFiles(files));\n });\n }\n\n @Action(LoadUserSpaceUsage)\n @Action(UserSpaceUsageChanged)\n loadUserSpaceUsage(ctx: StateContext<DriveStateModel>) {\n return this.entriesApi.getSpaceUsage().pipe(\n tap(spaceUsage => {\n ctx.patchState({\n spaceUsage: {used: spaceUsage.used, available: spaceUsage.available},\n });\n })\n );\n }\n\n @Action(UpdateEntries)\n updateEntries(ctx: StateContext<DriveStateModel>, action: UpdateEntries) {\n const mainEntries = ctx.getState().entries.slice(),\n selectedEntries = ctx.getState().selectedEntries.slice();\n\n action.entries.forEach(updatedEntry => {\n // update main entries\n const mainIndex = mainEntries.findIndex(\n entry => updatedEntry.id === entry.id\n );\n mainEntries[mainIndex] = {...mainEntries[mainIndex], ...updatedEntry};\n\n // update selected entries\n const selectedIndex = selectedEntries.findIndex(\n entry => updatedEntry.id === entry.id\n );\n if (selectedIndex > -1) {\n selectedEntries[selectedIndex] = {\n ...selectedEntries[selectedIndex],\n ...updatedEntry,\n };\n }\n });\n\n ctx.patchState({entries: mainEntries, selectedEntries});\n }\n\n @Action(UpdateEntryDescription)\n updateEntryDescription(\n ctx: StateContext<DriveStateModel>,\n {entry, description}: UpdateEntryDescription\n ) {\n return this.entriesApi.update(entry.id, {description}).pipe(\n tap(response => {\n ctx.dispatch(new UpdateEntries([response.fileEntry]));\n })\n );\n }\n\n @Action(BreakpointChanged)\n breakpointChanged(ctx: StateContext<DriveStateModel>, action: BreakpointChanged) {\n ctx.patchState({\n isMobile: action.status.isMobile,\n sidebarOpen: !action.status.isMobile,\n detailsVisible: !action.status.isMobile,\n });\n }\n\n @Action(SetCurrentUser)\n setCurrentUser(ctx: StateContext<DriveStateModel>, action: SetCurrentUser) {\n ctx.patchState({currentUser: action.user});\n }\n\n @Action(SetWorkspace)\n setWorkspace(ctx: StateContext<DriveStateModel>, action: SetWorkspace) {\n ctx.patchState({activeWorkspace: action.workspace});\n }\n\n @Action(ResetState)\n resetState(ctx: StateContext<DriveStateModel>) {\n ctx.setState({...DRIVE_STATE_MODEL_DEFAULTS, viewMode: ctx.getState().viewMode});\n }\n\n private transformQueryParams(params: DriveApiIndexParams): DriveApiIndexParams {\n const page = this.store.selectSnapshot(DriveState.activePage),\n meta = this.store.selectSnapshot(DriveState.meta);\n\n const queryParams = {\n orderBy: meta.sortColumn,\n orderDir: meta.sortDirection,\n ...params,\n };\n\n if (page.name === DRIVE_PAGE_NAMES.FOLDER) {\n queryParams.folderId = page.folderHash;\n }\n if (meta.query) queryParams.query = meta.query;\n if (meta.filters) queryParams.filters = meta.filters;\n\n return queryParams;\n }\n\n /**\n * Check if user has enough space left to upload all specified files.\n */\n private enoughSpaceLeftToUpload(\n spaceUsage: UserSpaceUsage,\n files: (UploadedFile | FileEntry)[]\n ) {\n const newSize = files.reduce((sum, file) => {\n const size = hasKey('size', file) ? file.size : file.file_size;\n return sum + size;\n }, 0);\n const currentlyUsing = spaceUsage.used;\n const availableSpace = spaceUsage.available;\n return newSize + currentlyUsing < availableSpace;\n }\n\n private removeTag(entry: DriveEntry, tag: Tag) {\n entry.tags = entry.tags.filter(t => t.id !== tag.id);\n return entry;\n }\n\n static canMoveEntriesTo(movingEntries: DriveEntry[], destination?: DriveFolder) {\n if (destination && destination.type !== 'folder') return false;\n\n // should not be able to move folder into it's\n // own child or same folder it's already in\n return movingEntries.every(entry => {\n // entry is already in this folder\n if (destination?.id === entry.parent_id) return false;\n\n // trying to move folder into it's own child\n if (destination && destination.path.startsWith(entry.path)) return false;\n\n return true;\n });\n }\n}\n","import { DriveFolder } from '../../folders/models/driveFolder';\n\nexport function buildFolderTree(folders: DriveFolder[]) {\n const hashTable = {}; const tree = [];\n\n for (let i = 0, len = folders.length; i < len; i++) {\n const folder = folders[i];\n // clear children from previous builds, to prevent duplicates\n folder.children = [];\n hashTable[folder.id] = folder;\n }\n\n for (const treeHash in hashTable) {\n if ( ! hashTable.hasOwnProperty(treeHash)) continue;\n const folder = hashTable[treeHash];\n if (folder.parent_id) {\n const parent = hashTable[folder.parent_id];\n if (parent) {\n parent.children.push(folder);\n }\n } else {\n tree.push(folder);\n }\n }\n\n return tree;\n}\n","export const SUPPORTED_ENTRY_TYPES = [\n 'audio',\n 'video',\n 'text',\n 'pdf',\n 'archive',\n 'folder',\n 'shared-folder',\n 'image',\n 'powerPoint',\n 'word',\n 'spreadsheet',\n];\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, OnChanges } from '@angular/core';\nimport { SUPPORTED_ENTRY_TYPES } from '../../../entries/supported-entry-types';\nimport { kebabCase } from '@common/core/utils/kebab-case';\n\n@Component({\n selector: 'file-icon',\n templateUrl: './file-icon.component.html',\n styleUrls: ['./file-icon.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FileIconComponent implements OnChanges {\n @Input() type: string;\n @Input() mime: string;\n\n ngOnChanges() {\n if ( ! this.type && this.mime) {\n this.type = this.mime.split('/')[0];\n }\n if ( ! SUPPORTED_ENTRY_TYPES.includes(this.type)) {\n this.type = 'default';\n }\n }\n\n public getType() {\n return kebabCase(this.type);\n }\n}\n","import { snakeCase } from './snake-case';\n\nexport function kebabCase(text: string) {\n return snakeCase(text).replace('_', '-');\n}\n","<mat-icon\n [svgIcon]=\"getType() + '-file-custom'\"\n class=\"file-color\"\n [ngClass]=\"getType() + '-file'\"\n></mat-icon>","<ng-container *ngIf=\"entries | async as selectedEntries\">\n <ng-container *ngIf=\"selectedEntries[0]\">\n <file-icon [type]=\"selectedEntries[0].type\"></file-icon>\n <div class=\"text\">{{selectedEntries[0].name}}</div>\n <div class=\"selected-entry-count\" *ngIf=\"selectedEntries.length > 1\">{{selectedEntries.length}}</div>\n </ng-container>\n</ng-container>","import { Component, ViewEncapsulation, ChangeDetectionStrategy, HostBinding } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DriveEntry } from '../../files/models/drive-entry';\n\n@Component({\n selector: 'entry-drag-preview',\n templateUrl: './entry-drag-preview.component.html',\n styleUrls: ['./entry-drag-preview.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntryDragPreviewComponent {\n @Select(DriveState.selectedEntries) entries: Observable<DriveEntry[]>;\n @HostBinding('class') className = 'files-grid-item-footer';\n @HostBinding('class.hidden') get dragging() {\n return !this.store.selectSnapshot(DriveState.dragging);\n }\n\n constructor(private store: Store) {}\n}\n","export interface DriveEntryPermissions {\n edit?: boolean;\n view?: boolean;\n download?: boolean;\n}\n\nexport const DRIVE_ENTRY_FULL_PERMISSIONS = {\n edit: true,\n view: true,\n download: true,\n};\n","import { Injectable } from '@angular/core';\nimport { AppHttpClient } from '@common/core/http/app-http-client.service';\nimport { DriveEntryUser } from '../files/models/drive-entry';\nimport { DriveEntryPermissions } from '../permissions/drive-entry-permissions';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { FileEntry } from '@common/uploads/types/file-entry';\n\nexport interface DriveEntryApiParams {\n entries: FileEntry[];\n emails: string[];\n permissions: DriveEntryPermissions;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SharesApiService {\n constructor(private http: AppHttpClient) {}\n\n public changePermissions(userId: number, entryIds: number[], permissions: DriveEntryPermissions): BackendResponse<{users: DriveEntryUser[]}> {\n return this.http.put(`drive/shares/change-permissions/${userId}`, {permissions, entryIds});\n }\n\n /**\n * Attach specified users to entries.\n */\n public shareEntries(params: DriveEntryApiParams): BackendResponse<{users: DriveEntryUser[]}> {\n return this.http.post('drive/shares/add-users', {\n ...params,\n entryIds: params.entries.map(entry => entry.id)\n });\n }\n\n /**\n * Detach specified user from entries.\n */\n public detachUser(userId: number, entryIds: number[]): BackendResponse<{users: DriveEntryUser[]}> {\n return this.http.post('drive/shares/remove-user/' + userId, {entryIds});\n }\n}\n","import { Action, Selector, State, StateContext, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { DriveEntryUser } from '../../files/models/drive-entry';\nimport { DriveEntryPermissions } from '../../permissions/drive-entry-permissions';\nimport { finalize, tap } from 'rxjs/operators';\nimport { SharesApiService } from '../shares-api.service';\nimport isEqual from 'lodash/isEqual';\nimport cloneDeep from 'lodash/cloneDeep';\nimport uniqBy from 'lodash/uniqBy';\nimport {\n BackendErrorMessages, BackendErrorResponse\n} from '@common/core/types/backend-error-response';\nimport { ShareDialogEntryPermissions } from '../share-dialog/types/ShareDialogEntryPermissions';\nimport { UpdateEntries } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\n\nexport class SetInitialUsers {\n static readonly type = '[ShareDialog] Set Initial Users';\n}\n\nexport class UpdateUserPermissions {\n static readonly type = '[ShareDialog] Update User Permissions';\n constructor(public user: DriveEntryUser, public permissions: DriveEntryPermissions) {}\n}\n\nexport class RemoveUser {\n static readonly type = '[ShareDialog] Remove User';\n constructor(public user: DriveEntryUser) {}\n}\n\nexport class SetUsers {\n static readonly type = '[ShareDialog] Set Users';\n constructor(public users: DriveEntryUser[]) {}\n}\n\nexport class ResetState {\n static readonly type = '[ShareDialog] Reset';\n}\n\nexport class ShareEntries {\n static readonly type = '[ShareDialog] Share Entries';\n constructor(public payload: {emails: string[], permissions: DriveEntryPermissions}) {}\n}\n\nexport class ShareEntriesFailed {\n static readonly type = '[ShareDialog] Share Entries Failed';\n constructor(public messages: BackendErrorMessages) {}\n}\n\nexport interface ShareDialogEntryUser extends DriveEntryUser {\n removed?: boolean;\n entry_permissions: ShareDialogEntryPermissions;\n}\n\nexport interface ShareDialogStateModel {\n loading: boolean;\n loadingUsers: number[];\n original: ShareDialogEntryUser[];\n usersWithAccess: ShareDialogEntryUser[];\n}\n\n@State<ShareDialogStateModel>({\n name: 'shareDialog',\n defaults: {\n usersWithAccess: [],\n original: [],\n loading: false,\n loadingUsers: [],\n }\n})\n@Injectable()\nexport class ShareDialogState {\n constructor(\n private store: Store,\n private sharesApi: SharesApiService\n ) {}\n\n @Selector()\n static usersWithAccess(state: ShareDialogStateModel) {\n return state.usersWithAccess;\n }\n\n @Selector()\n static dirty(state: ShareDialogStateModel) {\n return !isEqual(state.original, state.usersWithAccess);\n }\n\n @Selector()\n static loading(state: ShareDialogStateModel) {\n return state.loading;\n }\n\n @Selector()\n static loadingUsers(state: ShareDialogStateModel) {\n return state.loadingUsers;\n }\n\n @Action(SetInitialUsers)\n setInitialUsers(ctx: StateContext<ShareDialogStateModel>) {\n const entries = this.store.selectSnapshot(DriveState.selectedEntries);\n\n let users = entries\n .map(entry => entry.users)\n .reduce((all, curr) => all.concat(curr), []);\n\n // make sure we don't override anything in main drive store\n users = cloneDeep(users);\n users = users.filter(user => !!user);\n\n // multiple entries might contain same users\n const uniqueUsers = uniqBy(users, user => user.id) as ShareDialogEntryUser[];\n\n // if permissions for same user are not same on\n // all selected entries, show \"varies\" permission\n if (entries.length > 1) {\n uniqueUsers.forEach(user => {\n const permissions = entries\n .map(entry => entry.users.find(u => u.id === user.id))\n .filter(u => !!u)\n .map(u => Object.assign({}, u.entry_permissions));\n\n if (entries.length !== permissions.length || permissions.some(p => !isEqual(p, permissions[0]))) {\n user.entry_permissions = {varies: true};\n }\n });\n }\n\n ctx.patchState({\n usersWithAccess: cloneDeep(uniqueUsers),\n original: uniqueUsers,\n });\n }\n\n @Action(SetUsers)\n setUsers(ctx: StateContext<ShareDialogStateModel>, action: SetUsers) {\n ctx.patchState({\n usersWithAccess: action.users,\n original: cloneDeep(action.users)\n });\n }\n\n @Action(UpdateUserPermissions)\n updateUserPermissions(ctx: StateContext<ShareDialogStateModel>, action: UpdateUserPermissions) {\n this.toggleUserLoading(ctx, action.user.id, true);\n const entryIds = this.store.selectSnapshot(DriveState.selectedEntries).map(e => e.id);\n const userId = action.user.id;\n return this.sharesApi.changePermissions(userId, entryIds, action.permissions).pipe(\n finalize(() => this.toggleUserLoading(ctx, action.user.id, false)),\n tap(response => this.updateUsers(ctx, response.users))\n );\n }\n\n @Action(RemoveUser)\n removeUser(ctx: StateContext<ShareDialogStateModel>, action: RemoveUser) {\n this.toggleUserLoading(ctx, action.user.id, true);\n return this.sharesApi.detachUser(\n action.user.id,\n this.store.selectSnapshot(DriveState.selectedEntries).map(e => e.id)\n ).pipe(\n finalize(() => this.toggleUserLoading(ctx, action.user.id, false)),\n tap(response => this.updateUsers(ctx, response.users))\n );\n }\n\n @Action(ResetState)\n resetState(ctx: StateContext<ShareDialogStateModel>) {\n ctx.setState({\n loading: false,\n usersWithAccess: [],\n original: [],\n loadingUsers: [],\n });\n }\n\n @Action(ShareEntries, {cancelUncompleted: true})\n shareEntries(ctx: StateContext<ShareDialogStateModel>, action: ShareEntries) {\n ctx.patchState({loading: true});\n\n const payload = {\n ...action.payload,\n entries: this.store.selectSnapshot(DriveState.selectedEntries)\n };\n\n return this.sharesApi.shareEntries(payload)\n .pipe(\n finalize(() => ctx.patchState({loading: false})),\n tap(response => {\n ctx.dispatch(new SetUsers(response.users));\n this.updateEntriesInDriveStore(response.users);\n }, (errorResponse: BackendErrorResponse) => {\n ctx.dispatch(new ShareEntriesFailed(errorResponse.errors));\n })\n );\n }\n\n private toggleUserLoading(ctx: StateContext<ShareDialogStateModel>, userId: number, isLoading: boolean) {\n if (isLoading) {\n ctx.patchState({loadingUsers: [...ctx.getState().loadingUsers, userId]});\n } else {\n ctx.patchState({loadingUsers: ctx.getState().loadingUsers.filter(u => u !== userId)});\n }\n }\n\n private updateUsers(ctx, newUsers: DriveEntryUser[]) {\n ctx.patchState({\n usersWithAccess: newUsers,\n original: cloneDeep(newUsers),\n });\n this.updateEntriesInDriveStore(newUsers);\n }\n\n private updateEntriesInDriveStore(newUsers: DriveEntryUser[]) {\n const entries = this.store.selectSnapshot(DriveState.selectedEntries);\n\n // update permissions in main drive store, otherwise we'll get old\n // permissions if user re-opens share dialog without page reload\n const updatedEntries = entries.map(entry => {\n entry.users = newUsers;\n return entry;\n });\n\n this.store.dispatch(new UpdateEntries(updatedEntries));\n }\n}\n","<button mat-flat-button color=\"gray\" [matMenuTriggerFor]=\"shareMenu\" [disabled]=\"(loadingUsers$ | async).includes(user?.id)\">\n <ng-container *ngIf=\"overallPermission() === 'varies'\">\n <mat-icon class=\"button-icon\" svgIcon=\"priority-high\"></mat-icon>\n <span class=\"button-text\" trans>Varies</span>\n </ng-container>\n\n <ng-container *ngIf=\"overallPermission() === 'edit'\">\n <mat-icon class=\"button-icon\" svgIcon=\"edit\"></mat-icon>\n <span class=\"button-text\" trans>Can edit</span>\n </ng-container>\n\n <ng-container *ngIf=\"overallPermission() === 'view'\">\n <mat-icon class=\"button-icon\" svgIcon=\"remove-red-eye\"></mat-icon>\n <span class=\"button-text\" trans>Can View</span>\n </ng-container>\n\n <ng-container *ngIf=\"overallPermission() === 'download'\">\n <mat-icon class=\"button-icon\" svgIcon=\"file-download\"></mat-icon>\n <span class=\"button-text\" trans>Can Download</span>\n </ng-container>\n\n <mat-icon class=\"dropdown-icon\" svgIcon=\"arrow-drop-down\"></mat-icon>\n</button>\n\n<mat-menu #shareMenu=\"matMenu\" classList=\"mat-menu-with-description\">\n <div mat-menu-item (click)=\"selectPermission('edit')\">\n <mat-icon class=\"mat-icon\" svgIcon=\"check\" [class.visually-hidden]=\"overallPermission() !== 'edit'\"></mat-icon>\n <div>\n <div trans>Can edit</div>\n <div class=\"description\" trans>People can edit, delete and copy the item to their own drive.</div>\n </div>\n </div>\n <div mat-menu-item (click)=\"selectPermission('download')\">\n <mat-icon class=\"mat-icon\" svgIcon=\"check\" [class.visually-hidden]=\"overallPermission() !== 'download'\"></mat-icon>\n <div>\n <div trans>Can download</div>\n <div class=\"description\" trans>People can view and download the item.</div>\n </div>\n </div>\n\n <div mat-menu-item (click)=\"selectPermission('view')\">\n <mat-icon class=\"mat-icon\" svgIcon=\"check\" [class.visually-hidden]=\"overallPermission() !== 'view'\"></mat-icon>\n <div>\n <div trans>Can view</div>\n <div class=\"description\" trans>People can view the item.</div>\n </div>\n </div>\n</mat-menu>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Input,\n Output,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n DRIVE_ENTRY_FULL_PERMISSIONS, DriveEntryPermissions\n} from '../../permissions/drive-entry-permissions';\nimport { ShareDialogEntryPermissions } from '../share-dialog/types/ShareDialogEntryPermissions';\nimport { Select, Store } from '@ngxs/store';\nimport { SharesApiService } from '../shares-api.service';\nimport { Toast } from '../../../../common/core/ui/toast.service';\nimport {\n ShareDialogEntryUser, ShareDialogState, UpdateUserPermissions\n} from '../state/share-dialog.state';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'sharing-permissions-button',\n templateUrl: './sharing-permissions-button.component.html',\n styleUrls: ['./sharing-permissions-button.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SharingPermissionsButtonComponent {\n @Input() permissions: ShareDialogEntryPermissions = DRIVE_ENTRY_FULL_PERMISSIONS;\n @Input() user: ShareDialogEntryUser;\n @Output() change: EventEmitter<DriveEntryPermissions> = new EventEmitter();\n @Input() @HostBinding('class.compact') compact = false;\n @Select(ShareDialogState.loadingUsers) loadingUsers$: Observable<number[]>;\n\n constructor(\n private store: Store,\n private api: SharesApiService,\n private toast: Toast,\n ) {}\n\n public overallPermission(): keyof ShareDialogEntryPermissions {\n if (this.permissions.varies) {\n return 'varies';\n } else if (this.permissions.edit) {\n return 'edit';\n } else if (this.permissions.download) {\n return 'download';\n } else {\n return 'view';\n }\n }\n\n public selectPermission(permission: keyof ShareDialogEntryPermissions) {\n if (permission === 'edit') {\n this.permissions = {...DRIVE_ENTRY_FULL_PERMISSIONS};\n } else if (permission === 'download') {\n this.permissions = {...DRIVE_ENTRY_FULL_PERMISSIONS, edit: false};\n } else {\n this.permissions = {...DRIVE_ENTRY_FULL_PERMISSIONS, edit: false, download: false};\n }\n\n if (this.user) {\n this.updateUserPermissions(this.permissions);\n } else {\n this.change.emit(this.permissions);\n }\n }\n\n public updateUserPermissions(newPermissions: DriveEntryPermissions) {\n this.store.dispatch(new UpdateUserPermissions(this.user, newPermissions))\n .subscribe(() => {\n this.toast.open('Changed permissions.');\n });\n }\n}\n","<div class=\"header\" trans>Who has access</div>\n<div class=\"users-list\">\n <div class=\"list-item\" *ngIf=\"activeWorkspace$ | async as workspace\">\n <mat-icon svgIcon=\"groups\" class=\"list-item-img\"></mat-icon>\n <div class=\"text\">\n <div class=\"display_name\" [transValues]=\"{workspace: workspace.name}\" trans>Everyone at \":workspace\" workspace</div>\n <div class=\"email\">{{workspace.members_count}} {{ 'members' | trans }}</div>\n </div>\n </div>\n <div class=\"list-item\" *ngFor=\"let user of users | async; trackBy: trackByUser\" [class.removed]=\"user.removed\" [@flyInOut]=\"'in'\">\n <img [src]=\"user.avatar\" class=\"list-item-img\" alt=\"\">\n <div class=\"text\">\n <div class=\"display_name\">{{user.display_name}}</div>\n <div class=\"email\">{{user.email}}</div>\n </div>\n <div class=\"actions\">\n <span class=\"owner-label\" *ngIf=\"user.owns_entry || (currentUser.getModel().id === user.id); else permissionSelector\" trans>\n {{ user.owns_entry ? 'Owner' : 'You' }}\n </span>\n\n <ng-template #permissionSelector>\n <sharing-permissions-button [permissions]=\"user.entry_permissions\" [user]=\"user\"></sharing-permissions-button>\n <button mat-icon-button [disabled]=\"(loadingUsers$ | async).includes(user.id)\" (click)=\"removeUser(user)\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n </ng-template>\n </div>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { Observable } from 'rxjs';\nimport { DriveEntryUser } from '../../files/models/drive-entry';\nimport {\n RemoveUser, ShareDialogEntryUser, ShareDialogState\n} from '../state/share-dialog.state';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\nimport { CurrentUser } from '../../../../common/auth/current-user';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\nimport { DriveState } from '../../state/drive-state';\nimport { filter, map, switchMap } from 'rxjs/operators';\n\n@Component({\n selector: 'entries-access-table',\n templateUrl: './entries-access-table.component.html',\n styleUrls: ['./entries-access-table.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('flyInOut', [\n state('in', style({transform: 'translateX(0)'})),\n transition('void => *', [\n style({transform: 'translateX(-100%)'}),\n animate(100)\n ]),\n transition('* => void', [\n animate(100, style({transform: 'translateX(100%)'}))\n ])\n ])\n ]\n})\nexport class EntriesAccessTableComponent {\n @Select(ShareDialogState.usersWithAccess) users: Observable<ShareDialogEntryUser[]>;\n @Select(ShareDialogState.loadingUsers) loadingUsers$: Observable<number[]>;\n public activeWorkspace$ = this.store.select(DriveState.selectedEntries)\n .pipe(\n map(entries => entries.every(e => e.workspace_id)),\n filter(x => !!x),\n switchMap(() => this.workspaces.activeWorkspace$)\n );\n\n constructor(\n private store: Store,\n public currentUser: CurrentUser,\n public workspaces: WorkspacesService,\n ) {}\n\n public removeUser(user: DriveEntryUser) {\n this.store.dispatch(new RemoveUser(user));\n }\n\n trackByUser(index: number, user: DriveEntryUser): number { return user.id; }\n}\n","<div class=\"modal-header\">\n <h2 mat-dialog-title trans>Add people</h2>\n <button type=\"button\" mat-icon-button (click)=\"dialogRef.close()\" class=\"close-button\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <div class=\"emails-container\">\n <chip-input [formControl]=\"shareModel.emails\" [emailsInput]=\"true\" [suggestFn]=\"settings.get('share.suggest_emails') ? suggestUserEmails : null\" placeholder=\"Enter email addresses...\" email required></chip-input>\n <sharing-permissions-button [compact]=\"true\" (change)=\"shareModel.permissions = $event\"></sharing-permissions-button>\n </div>\n\n <div class=\"errors\">\n <div class=\"error\" *ngFor=\"let error of errors | async | keyvalue\">{{error.value}}</div>\n </div>\n\n <entries-access-table></entries-access-table>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\" [disabled]=\"loading$ | async\" trans>Close</button>\n <button type=\"submit\" mat-raised-button color=\"accent\" (click)=\"share()\" [disabled]=\"(loading$ | async)\" *ngIf=\"shareModel.emails.value?.length\" trans>Share</button>\n</mat-dialog-actions>\n\n","import { ChangeDetectionStrategy, Component, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { Actions, ofActionDispatched, Select, Store } from '@ngxs/store';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { DRIVE_ENTRY_FULL_PERMISSIONS, DriveEntryPermissions } from '../../permissions/drive-entry-permissions';\nimport { ResetState, SetInitialUsers, ShareDialogState, ShareEntries, ShareEntriesFailed } from '../state/share-dialog.state';\nimport { FormControl } from '@angular/forms';\nimport { BackendErrorMessages } from '@common/core/types/backend-error-response';\nimport { map, takeUntil } from 'rxjs/operators';\nimport { Users } from '@common/auth/users.service';\nimport { Settings } from '@common/core/config/settings.service';\n\n@Component({\n selector: 'share-dialog',\n templateUrl: './share-dialog.component.html',\n styleUrls: ['./share-dialog.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ShareDialogComponent implements OnDestroy {\n @Select(ShareDialogState.loading) loading$: Observable<boolean>;\n\n private destroyed$ = new Subject();\n public errors: BehaviorSubject<BackendErrorMessages> = new BehaviorSubject({});\n public shareModel: { emails: FormControl, permissions: DriveEntryPermissions};\n\n constructor(\n public dialogRef: MatDialogRef<ShareDialogComponent>,\n public settings: Settings,\n private store: Store,\n private actions$: Actions,\n private users: Users,\n ) {\n this.resetModel();\n this.store.dispatch(new SetInitialUsers());\n\n this.bindToShareError();\n this.bindToShareModel();\n }\n\n ngOnDestroy() {\n this.store.dispatch(new ResetState());\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n public share() {\n const payload = {\n emails: this.shareModel.emails.value,\n permissions: this.shareModel.permissions,\n };\n\n this.store.dispatch(new ShareEntries(payload)).subscribe(() => {\n this.setErrorMessages();\n this.resetModel();\n });\n }\n\n private resetModel() {\n this.shareModel = {\n emails: new FormControl([]),\n permissions: DRIVE_ENTRY_FULL_PERMISSIONS\n };\n }\n\n private setErrorMessages(messages?: BackendErrorMessages) {\n this.errors.next(messages || {});\n }\n\n private bindToShareModel() {\n this.shareModel.emails.valueChanges\n .pipe(takeUntil(this.destroyed$))\n .subscribe(() => this.setErrorMessages());\n }\n\n private bindToShareError() {\n this.actions$.pipe(\n takeUntil(this.destroyed$),\n ofActionDispatched(ShareEntriesFailed)\n ).subscribe((action: ShareEntriesFailed) => {\n this.setErrorMessages(action.messages);\n });\n }\n\n suggestUserEmails = (query: string): Observable<string[]> => {\n return this.users.getAll({query, perPage: 7})\n .pipe(map(users => users.map(u => u.email)));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { ShareableLink } from './models/shareable-link';\nimport { AppHttpClient } from '@common/core/http/app-http-client.service';\nimport { ShareableLinkOptions } from './models/shareable-link-options';\nimport { User } from '@common/core/types/models/User';\nimport { PaginationResponse } from '@common/core/types/pagination/pagination-response';\nimport { FileEntry } from '@common/uploads/types/file-entry';\n\nexport interface GetLinkData {\n link: ShareableLink;\n folderChildren: PaginationResponse<FileEntry>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ShareableLinksApiService {\n constructor(private http: AppHttpClient) {}\n\n public findByEntryId(entryId: number, params: {autoCreate?: boolean}): BackendResponse<{ link: ShareableLink }> {\n return this.http.get(`drive/entries/${entryId}/shareable-link`, params);\n }\n\n public findByHash(hash: string, params?: {withEntries?: boolean, page?: number, order?: string}): BackendResponse<GetLinkData> {\n return this.http.get(`drive/shareable-links/${hash}`, params);\n }\n\n public create(entryId: number, params: Partial<ShareableLinkOptions>): BackendResponse<{ link: ShareableLink }> {\n return this.http.post(`drive/entries/${entryId}/shareable-link`, params);\n }\n\n public update(id: number, params: Partial<ShareableLinkOptions>): BackendResponse<{ link: ShareableLink }> {\n return this.http.put(`drive/shareable-links/${id}`, params);\n }\n\n public delete(id: number): BackendResponse<void> {\n return this.http.delete(`drive/shareable-links/${id})`);\n }\n\n public checkPassword(linkId: number, password: string): BackendResponse<{matches: boolean}> {\n return this.http.post(`drive/shareable-links/${linkId}/check-password`, {password});\n }\n\n /**\n * Import shareable link entry into current user's drive.\n */\n public importEntry(linkId: number, password?: string): BackendResponse<{users: User[]}> {\n return this.http.post(`drive/shareable-links/${linkId}/import`, {password});\n }\n}\n","import { Action, Selector, State, StateContext, Store } from '@ngxs/store';\nimport { ShareableLinkOptions } from './models/shareable-link-options';\nimport { ShareableLinksApiService } from './shareable-links-api.service';\nimport { ShareableLink } from './models/shareable-link';\nimport { finalize, tap } from 'rxjs/operators';\nimport { DriveState } from '../../state/drive-state';\nimport { Settings } from '@common/core/config/settings.service';\nimport {\n BackendErrorMessages, BackendErrorResponse\n} from '@common/core/types/backend-error-response';\nimport { Injectable } from '@angular/core';\n\nexport interface ShareLinkStateModel {\n cache: {[key: number]: ShareableLink};\n backendErrors: BackendErrorMessages;\n link: ShareableLink;\n loading: boolean;\n linkOptions: ShareableLinkOptions;\n optionsPanelVisible: boolean;\n}\n\nexport class LoadShareableLink {\n static readonly type = '[Shareable Link] Load From Backend';\n constructor(public options: {autoCreate?: boolean} = {}) {}\n}\n\nexport class UpdateShareableLink {\n static readonly type = '[Shareable Link] Update';\n constructor(public options: ShareableLinkOptions) {}\n}\n\nexport class CreateShareableLink {\n static readonly type = '[Shareable Link] Create';\n constructor(public options: ShareableLinkOptions) {}\n}\n\nexport class DeleteShareableLink {\n static readonly type = '[Shareable Link] Delete';\n}\n\nexport class ToggleOptionsPanel {\n static readonly type = '[Shareable Link] Toggle Options Panel Visibility';\n}\n\nexport class LinkCopySuccess {\n static readonly type = '[Shareable Link] Copy To Clipboard Success';\n}\n\nexport class ResetShareLinkState {\n static readonly type = '[Shareable Link] Reset State';\n}\n\nconst defaultState = {\n link: null,\n loading: false,\n optionsPanelVisible: true,\n backendErrors: {},\n cache: {},\n linkOptions: {\n allowDownload: false,\n allowEdit: false,\n expiresAt: null,\n password: null,\n }\n};\n\n@State<ShareLinkStateModel>({\n name: 'shareLink',\n defaults: defaultState\n})\n@Injectable()\nexport class ShareLinkState {\n constructor(\n private store: Store,\n private settings: Settings,\n private linksApi: ShareableLinksApiService\n ) {}\n\n @Selector()\n static loading(state: ShareLinkStateModel) {\n return state.loading;\n }\n\n @Selector()\n static link(state: ShareLinkStateModel) {\n return state.link;\n }\n\n @Selector()\n static optionsVisible(state: ShareLinkStateModel) {\n return ! state.loading && state.optionsPanelVisible;\n }\n\n @Selector()\n static backendErrors(state: ShareLinkStateModel) {\n return state.backendErrors;\n }\n\n @Action(CreateShareableLink)\n createShareableLink(ctx: StateContext<ShareLinkStateModel>, action: UpdateShareableLink) {\n const entryId = this.store.selectSnapshot(DriveState.selectedEntryIds)[0];\n\n ctx.patchState({loading: true});\n\n return this.linksApi.create(entryId, action.options)\n .pipe(\n finalize(() => ctx.patchState({loading: false, backendErrors: {}})),\n tap(response => {\n const link = response.link;\n ctx.patchState({\n cache: {...ctx.getState().cache, [link.entry_id]: link},\n link: response.link,\n optionsPanelVisible: false\n });\n }, (errorResponse: BackendErrorResponse) => {\n ctx.patchState({backendErrors: errorResponse.errors});\n })\n );\n }\n\n @Action(UpdateShareableLink)\n updateLink(ctx: StateContext<ShareLinkStateModel>, action: UpdateShareableLink) {\n const link = ctx.getState().link;\n\n ctx.patchState({loading: true});\n\n return this.linksApi.update(link.id, action.options)\n .pipe(\n finalize(() => ctx.patchState({loading: false, backendErrors: {}})),\n tap(response => ctx.patchState({\n link: response.link,\n cache: {...ctx.getState().cache, [link.entry_id]: response.link},\n optionsPanelVisible: false\n }), (errorResponse: BackendErrorResponse) => {\n ctx.patchState({backendErrors: errorResponse.errors});\n })\n );\n }\n\n @Action(LoadShareableLink)\n loadShareableLink(ctx: StateContext<ShareLinkStateModel>, action: LoadShareableLink) {\n const entryId = this.store.selectSnapshot(DriveState.selectedEntryIds)[0],\n cachedLink = ctx.getState().cache[entryId];\n\n if (cachedLink) {\n return ctx.patchState({link: cachedLink, optionsPanelVisible: false});\n }\n\n ctx.patchState({loading: true});\n\n return this.linksApi.findByEntryId(entryId, {autoCreate: action.options.autoCreate})\n .pipe(\n finalize(() => ctx.patchState({loading: false})),\n tap(response => ctx.patchState({\n link: response.link,\n optionsPanelVisible: false,\n cache: {...ctx.getState().cache, [response.link.entry_id]: response.link},\n }), () => {})\n );\n }\n\n @Action(DeleteShareableLink)\n deleteShareableLink(ctx: StateContext<ShareLinkStateModel>) {\n const link = ctx.getState().link;\n\n ctx.patchState({loading: true});\n\n return this.linksApi.delete(link.id)\n .pipe(\n finalize(() => ctx.patchState({loading: false})),\n tap(() => {\n const cache = ctx.getState().cache;\n delete cache[link.entry_id];\n\n ctx.patchState({\n link: null,\n cache: cache,\n });\n })\n );\n }\n\n @Action(ToggleOptionsPanel)\n toggleOptionsPanel(ctx: StateContext<ShareLinkStateModel>) {\n ctx.patchState({\n optionsPanelVisible: !ctx.getState().optionsPanelVisible\n });\n }\n\n @Action(ResetShareLinkState, {cancelUncompleted: true})\n resetShareLinkState(ctx: StateContext<ShareLinkStateModel>) {\n return ctx.patchState({...ctx.getState(), ...defaultState});\n }\n}\n","<form class=\"update-link-panel\" [formGroup]=\"form\" (ngSubmit)=\"saveChanges()\">\n <div class=\"link-options\">\n <div class=\"link-option\">\n <div class=\"label\" trans>Link expiration</div>\n <div class=\"content\">\n <mat-checkbox color=\"accent\" [formControl]=\"expirationVisible\" trans>Link is valid until:</mat-checkbox>\n <div class=\"input-container expiration-input-container\" formGroupName=\"expiresAt\" [class.hidden]=\"!expirationVisible.value\">\n <div class=\"date-input-container\">\n <input type=\"date\" formControlName=\"date\" class=\"date-input\" placeholder=\"Expiration date...\" trans-placeholder [min]=\"getMinDate()\">\n </div>\n <input type=\"time\" class=\"time-input\" formControlName=\"time\" placeholder=\"Expiration time...\" trans-placeholder>\n </div>\n <div class=\"error\" *ngIf=\"(backendErrors$ | async)?.expiresAt as error\">{{error}}</div>\n </div>\n </div>\n <div class=\"link-option\">\n <div class=\"label\" trans>Password Protect</div>\n <div class=\"content\">\n <mat-checkbox color=\"accent\" [formControl]=\"passwordVisible\" trans>Require password:</mat-checkbox>\n <ng-container *ngIf=\"passwordVisible.value\">\n <div class=\"input-container password-input-container\">\n <input type=\"password\" formControlName=\"password\" placeholder=\"Enter new password...\" trans-placeholder>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"link-option\">\n <div class=\"label\" trans>Allow editing</div>\n <mat-checkbox color=\"accent\" formControlName=\"allowEdit\" trans>Users with link can modify this item.</mat-checkbox>\n </div>\n <div class=\"link-option\">\n <div class=\"label\" trans>Allow download</div>\n <mat-checkbox color=\"accent\" formControlName=\"allowDownload\" trans>Users with link can download this item.</mat-checkbox>\n </div>\n </div>\n\n <button type=\"button\" (click)=\"toggleOptionsPanel()\" mat-button trans>Cancel</button>\n\n <button type=\"submit\" class=\"update-button\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\">\n {{ ((link$ | async) ? 'Update Link' : 'Create Link') | trans }}\n </button>\n</form>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, OnInit } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { Select, Store } from '@ngxs/store';\nimport { CreateShareableLink, ShareLinkState, ToggleOptionsPanel, UpdateShareableLink } from '../share-link.state';\nimport { Observable } from 'rxjs';\nimport { ShareableLink } from '../models/shareable-link';\nimport { filter } from 'rxjs/operators';\nimport { ShareableLinkOptions } from '../models/shareable-link-options';\nimport { BackendErrorMessages } from '@common/core/types/backend-error-response';\n\n@Component({\n selector: 'link-options',\n templateUrl: './link-options.component.html',\n styleUrls: ['./link-options.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LinkOptionsComponent implements OnInit {\n @Select(ShareLinkState.link) link$: Observable<ShareableLink>;\n @Select(ShareLinkState.loading) loading$: Observable<boolean>;\n @Select(ShareLinkState.backendErrors) backendErrors$: Observable<BackendErrorMessages>;\n\n public form = new FormGroup({\n password: new FormControl(),\n expiresAt: new FormGroup({\n date: new FormControl(),\n time: new FormControl(),\n }),\n allowEdit: new FormControl(false),\n allowDownload: new FormControl(true)\n });\n\n public passwordVisible = new FormControl(false);\n public expirationVisible = new FormControl(false);\n\n constructor(private store: Store) {}\n\n ngOnInit() {\n this.bindToLinkChange();\n }\n\n public toggleOptionsPanel() {\n this.store.dispatch(new ToggleOptionsPanel());\n }\n\n public saveChanges() {\n if (this.store.selectSnapshot(ShareLinkState.link)) {\n this.store.dispatch(new UpdateShareableLink(this.getPayload()));\n } else {\n this.store.dispatch(new CreateShareableLink(this.getPayload()));\n }\n }\n\n private getPayload() {\n const payload = {\n allowEdit: this.form.get('allowEdit').value,\n allowDownload: this.form.get('allowDownload').value,\n } as ShareableLinkOptions;\n\n if (this.expirationVisible.value) {\n payload.expiresAt = this.form.get('expiresAt.date').value;\n if (this.form.get('expiresAt.time').value) {\n payload.expiresAt += ' ' + this.form.get('expiresAt.time').value;\n }\n }\n\n // not sending \"password\" with request will remove it from link\n if (this.passwordVisible.value) {\n payload.password = this.form.get('password').value;\n }\n\n return payload;\n }\n\n private bindToLinkChange() {\n this.link$.pipe(filter(link => !!link))\n .subscribe(link => {\n this.hydrateExpirationForm(link);\n\n // show or hide password form field\n this.passwordVisible.setValue(!!link.password);\n this.expirationVisible.setValue(!!link.expires_at);\n\n this.form.patchValue({\n allowEdit: link.allow_edit,\n allowDownload: link.allow_download\n });\n });\n }\n\n private hydrateExpirationForm(link: ShareableLink) {\n if ( ! link || ! link.expires_at) return;\n\n const parts = link.expires_at.split(/[ T]/);\n\n this.form.get('expiresAt').setValue({\n date: parts[0],\n time: parts[1] ? parts[1].substr(0, 5) : '',\n });\n }\n\n public getMinDate(): string {\n return new Date().toJSON().split('T')[0];\n }\n}\n","<div class=\"modal-header\">\n <h2 mat-dialog-title trans>Shareable link</h2>\n <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <ng-container *ngIf=\"link$ | async\">\n <div class=\"title\">\n <div class=\"left\">\n {{ 'Link sharing is' | trans }}\n <span class=\"state on\"\n ><button class=\"on-text text no-style\" (click)=\"deleteLink()\" trans>\n on\n </button></span\n >\n </div>\n <div class=\"right\">\n <button type=\"button\" mat-icon-button (click)=\"deleteLink()\">\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"toggleOptionsPanel()\">\n <mat-icon svgIcon=\"settings\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"link-container\">\n <div class=\"link-input-container input-container\">\n <input\n type=\"text\"\n id=\"link-input\"\n readonly\n (click)=\"focusInput()\"\n (change)=\"focusInput()\"\n [value]=\"shareableLink$ | async\"\n tabindex=\"1\"\n />\n <button mat-flat-button color=\"accent\" (click)=\"copyLinkToClipboard()\" trans>\n Copy\n </button>\n </div>\n <div class=\"social-icons\">\n <button\n type=\"button\"\n mat-icon-button\n class=\"social-icon no-style facebook\"\n (click)=\"shareLink('facebook')\"\n >\n <mat-icon svgIcon=\"facebook\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n class=\"social-icon no-style twitter\"\n (click)=\"shareLink('twitter')\"\n >\n <mat-icon svgIcon=\"twitter\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n class=\"social-icon no-style mail\"\n (click)=\"shareLink('mail')\"\n >\n <mat-icon svgIcon=\"mail\"></mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n\n <link-options [@visibility]=\"optionsVisible$ | async\"></link-options>\n <loading-indicator\n [isVisible]=\"loading$ | async\"\n class=\"overlay-transparent\"\n ></loading-indicator>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <button\n type=\"button\"\n mat-button\n class=\"submit-button\"\n (click)=\"close()\"\n [disabled]=\"loading$ | async\"\n trans\n >\n Close\n </button>\n</mat-dialog-actions>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, OnInit, OnDestroy, AfterViewInit } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { Actions, ofActionDispatched, Select, Store } from '@ngxs/store';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport {\n DeleteShareableLink,\n LinkCopySuccess,\n LoadShareableLink, ResetShareLinkState,\n ShareLinkState,\n ToggleOptionsPanel\n} from '../links/share-link.state';\nimport { Settings } from '@common/core/config/settings.service';\nimport { ShareableLink } from '../links/models/shareable-link';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\nimport copy from 'copy-to-clipboard';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { ShareableNetworks, shareLinkSocially } from '@common/core/utils/share-link-socially';\n\n@Component({\n selector: 'share-link-dialog',\n templateUrl: './share-link-dialog.component.html',\n styleUrls: ['./share-link-dialog.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('visibility', [\n state('true', style({\n height: '*',\n padding: '*',\n opacity: '1',\n overflow: '*',\n })),\n state('false', style({\n height: '0',\n padding: '0',\n opacity: '0',\n overflow: 'hidden',\n })),\n transition('true <=> false', animate('225ms cubic-bezier(.4,0,.2,1)'))\n ]),\n ],\n})\nexport class ShareLinkDialogComponent implements AfterViewInit, OnInit, OnDestroy {\n @Select(ShareLinkState.loading) loading$: Observable<boolean>;\n @Select(ShareLinkState.link) link$: Observable<ShareableLink>;\n @Select(ShareLinkState.optionsVisible) optionsVisible$: Observable<boolean>;\n public shareableLink$ = new BehaviorSubject(null);\n private subscriptions: Subscription[] = [];\n\n constructor(\n protected store: Store,\n protected toast: Toast,\n protected actions$: Actions,\n protected settings: Settings,\n protected dialogRef: MatDialogRef<ShareLinkDialogComponent>,\n ) {}\n\n ngOnInit() {\n this.store.dispatch(new LoadShareableLink());\n this.bindToOptionsPanelToggle();\n }\n\n ngAfterViewInit() {\n this.bindToLinkChange();\n }\n\n ngOnDestroy() {\n this.store.dispatch(new ResetShareLinkState());\n this.subscriptions.forEach(s => s.unsubscribe());\n }\n\n public toggleOptionsPanel() {\n this.store.dispatch(new ToggleOptionsPanel());\n }\n\n public deleteLink() {\n this.store.dispatch(new DeleteShareableLink()).subscribe(() => {\n this.toast.open('Link deleted.');\n this.dialogRef.close();\n });\n }\n\n public copyLinkToClipboard() {\n this.focusInput();\n const success = copy(this.shareableLink$.value);\n\n if (success) {\n this.store.dispatch(new LinkCopySuccess());\n }\n }\n\n private bindToLinkChange() {\n this.link$.subscribe(link => {\n if ( ! link) return;\n this.shareableLink$.next(this.settings.getBaseUrl() + '/drive/s/' + link.hash);\n setTimeout(() => this.focusInput());\n });\n }\n\n private bindToOptionsPanelToggle() {\n const sub = this.actions$.pipe(ofActionDispatched(ToggleOptionsPanel))\n .subscribe(() => {\n // close dialog if user canceled link creation\n if ( ! this.store.selectSnapshot(ShareLinkState.optionsVisible) && ! this.shareableLink$.value) {\n this.close();\n }\n });\n this.subscriptions.push(sub);\n }\n\n public shareLink(network: ShareableNetworks) {\n shareLinkSocially(network, this.shareableLink$.value);\n }\n\n public focusInput() {\n const input = document.getElementById('link-input') as HTMLInputElement;\n input.focus();\n input.select();\n }\n\n public close() {\n this.dialogRef.close();\n }\n}\n","export type ShareableNetworks = 'facebook'|'twitter'|'pinterest'|'tumblr'|'blogger'|'mail';\n\nexport function shareLinkSocially(network: ShareableNetworks, link: string, name?: string, image?: string) {\n const url = generateShareUrl(network, link, name, image);\n\n if (network === 'mail') {\n window.location.href = url;\n } else {\n openNewWindow(url);\n }\n}\n\nfunction openNewWindow(url: string) {\n const width = 575,\n height = 400,\n left = (window.innerWidth - width) / 2,\n top = (window.innerHeight - height) / 2,\n opts = 'status=1, scrollbars=1' + ',width=' + width + ',height=' + height + ',top=' + top + ',left=' + left;\n\n window.open(url, 'share', opts);\n}\n\nfunction generateShareUrl(type: string, link: string, name?: string, image?: string) {\n switch (type) {\n case 'facebook':\n return 'https://www.facebook.com/sharer/sharer.php?u=' + link ;\n case 'twitter':\n return `https://twitter.com/intent/tweet?text=${name}&url=${link}`;\n case 'google-plus':\n return 'https://plus.google.com/share?url=' + link ;\n case 'pinterest':\n return 'https://pinterest.com/pin/create/button/?url=' + link + '&media=' + image;\n case 'tumblr':\n const base = 'https://www.tumblr.com/widgets/share/tool?shareSource=legacy&canonicalUrl=&posttype=photo&title=&caption=';\n return base + name + '&content=' + image + '&url=' + link ;\n case 'blogger':\n return 'https://www.blogger.com/blog_this.pyra?t&u=' + link + '&n=' + name;\n case 'mail':\n return `mailto:?subject=Check out this link.&body=${link}`;\n }\n}\n","<div class=\"modal-header\">\n <h2 mat-dialog-title trans>New Folder</h2>\n <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<form ngNativeValidate (ngSubmit)=\"confirm()\">\n <mat-dialog-content class=\"many-inputs\">\n <div class=\"input-container\">\n <input type=\"text\" [formControl]=\"folderName\" placeholder=\"Folder name...\" trans-placeholder required min=\"3\">\n <div class=\"error\" *ngIf=\"errors.name\">{{errors.name}}</div>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button (click)=\"close()\" type=\"button\" mat-button class=\"cancel-button\" trans>Cancel</button>\n <button type=\"submit\" mat-raised-button color=\"accent\" class=\"submit-button\" [disabled]=\"loading | async\" trans>Create</button>\n </mat-dialog-actions>\n</form>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { DriveFolder } from '../../models/driveFolder';\nimport { FoldersApiService } from '../../api/folders-api.service';\nimport { Store } from '@ngxs/store';\nimport { BackendErrorResponse } from '@common/core/types/backend-error-response';\nimport { DriveState } from '../../../state/drive-state';\nimport { finalize } from 'rxjs/operators';\nimport { NewFolderCreated } from '../../../state/actions/events';\n\nexport interface CrupdateFolderDialogData {\n folder?: DriveFolder;\n}\n\nexport interface CrupdateFolderErrors {\n name?: string;\n}\n\n@Component({\n selector: 'crupdate-folder-dialog',\n templateUrl: './crupdate-folder-dialog.component.html',\n styleUrls: ['./crupdate-folder-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CrupdateFolderDialogComponent {\n public folderName = new FormControl();\n public loading = new BehaviorSubject(false);\n public errors: CrupdateFolderErrors = {};\n\n constructor(\n private dialogRef: MatDialogRef<CrupdateFolderDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: CrupdateFolderDialogData,\n private store: Store,\n private foldersApi: FoldersApiService,\n private changeDetection: ChangeDetectorRef,\n ) {}\n\n public confirm() {\n this.loading.next(true);\n\n const activeFolder = this.data.folder || this.store.selectSnapshot(DriveState.activeFolder);\n const params = {\n name: this.folderName.value,\n parentId: activeFolder?.id || null,\n };\n\n return this.foldersApi.create(params)\n .pipe(finalize(() => this.loading.next(false)))\n .subscribe(response => {\n this.setErrors();\n this.store.dispatch(new NewFolderCreated(response.folder));\n this.close();\n }, response => this.setErrors(response));\n }\n\n public setErrors(response?: BackendErrorResponse<CrupdateFolderErrors>) {\n this.errors = response ? response.errors : {};\n this.changeDetection.detectChanges();\n }\n\n public close() {\n this.dialogRef.close();\n }\n}\n","import { SelectionModel, isDataSource } from '@angular/cdk/collections';\nimport { isObservable, Subject, BehaviorSubject, of } from 'rxjs';\nimport { take, filter, takeUntil } from 'rxjs/operators';\nimport { InjectionToken, Directive, ViewContainerRef, Inject, Optional, TemplateRef, Component, ViewEncapsulation, ChangeDetectionStrategy, IterableDiffers, ChangeDetectorRef, Input, ViewChild, ContentChildren, ElementRef, HostListener, NgModule } from '@angular/core';\nimport { coerceNumberProperty, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Directionality } from '@angular/cdk/bidi';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Base tree control. It has basic toggle/expand/collapse operations on a single data node. */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/bidi';\nclass BaseTreeControl {\n constructor() {\n /** A selection model with multi-selection to track expansion status. */\n this.expansionModel = new SelectionModel(true);\n }\n /** Toggles one single data node's expanded/collapsed state. */\n toggle(dataNode) {\n this.expansionModel.toggle(this._trackByValue(dataNode));\n }\n /** Expands one single data node. */\n expand(dataNode) {\n this.expansionModel.select(this._trackByValue(dataNode));\n }\n /** Collapses one single data node. */\n collapse(dataNode) {\n this.expansionModel.deselect(this._trackByValue(dataNode));\n }\n /** Whether a given data node is expanded or not. Returns true if the data node is expanded. */\n isExpanded(dataNode) {\n return this.expansionModel.isSelected(this._trackByValue(dataNode));\n }\n /** Toggles a subtree rooted at `node` recursively. */\n toggleDescendants(dataNode) {\n this.expansionModel.isSelected(this._trackByValue(dataNode)) ?\n this.collapseDescendants(dataNode) :\n this.expandDescendants(dataNode);\n }\n /** Collapse all dataNodes in the tree. */\n collapseAll() {\n this.expansionModel.clear();\n }\n /** Expands a subtree rooted at given data node recursively. */\n expandDescendants(dataNode) {\n let toBeProcessed = [dataNode];\n toBeProcessed.push(...this.getDescendants(dataNode));\n this.expansionModel.select(...toBeProcessed.map(value => this._trackByValue(value)));\n }\n /** Collapses a subtree rooted at given data node recursively. */\n collapseDescendants(dataNode) {\n let toBeProcessed = [dataNode];\n toBeProcessed.push(...this.getDescendants(dataNode));\n this.expansionModel.deselect(...toBeProcessed.map(value => this._trackByValue(value)));\n }\n _trackByValue(value) {\n return this.trackBy ? this.trackBy(value) : value;\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Flat tree control. Able to expand/collapse a subtree recursively for flattened tree. */\nclass FlatTreeControl extends BaseTreeControl {\n /** Construct with flat tree data node functions getLevel and isExpandable. */\n constructor(getLevel, isExpandable, options) {\n super();\n this.getLevel = getLevel;\n this.isExpandable = isExpandable;\n this.options = options;\n if (this.options) {\n this.trackBy = this.options.trackBy;\n }\n }\n /**\n * Gets a list of the data node's subtree of descendent data nodes.\n *\n * To make this working, the `dataNodes` of the TreeControl must be flattened tree nodes\n * with correct levels.\n */\n getDescendants(dataNode) {\n const startIndex = this.dataNodes.indexOf(dataNode);\n const results = [];\n // Goes through flattened tree nodes in the `dataNodes` array, and get all descendants.\n // The level of descendants of a tree node must be greater than the level of the given\n // tree node.\n // If we reach a node whose level is equal to the level of the tree node, we hit a sibling.\n // If we reach a node whose level is greater than the level of the tree node, we hit a\n // sibling of an ancestor.\n for (let i = startIndex + 1; i < this.dataNodes.length && this.getLevel(dataNode) < this.getLevel(this.dataNodes[i]); i++) {\n results.push(this.dataNodes[i]);\n }\n return results;\n }\n /**\n * Expands all data nodes in the tree.\n *\n * To make this working, the `dataNodes` variable of the TreeControl must be set to all flattened\n * data nodes of the tree.\n */\n expandAll() {\n this.expansionModel.select(...this.dataNodes.map(node => this._trackByValue(node)));\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Nested tree control. Able to expand/collapse a subtree recursively for NestedNode type. */\nclass NestedTreeControl extends BaseTreeControl {\n /** Construct with nested tree function getChildren. */\n constructor(getChildren, options) {\n super();\n this.getChildren = getChildren;\n this.options = options;\n if (this.options) {\n this.trackBy = this.options.trackBy;\n }\n }\n /**\n * Expands all dataNodes in the tree.\n *\n * To make this working, the `dataNodes` variable of the TreeControl must be set to all root level\n * data nodes of the tree.\n */\n expandAll() {\n this.expansionModel.clear();\n const allNodes = this.dataNodes.reduce((accumulator, dataNode) => [...accumulator, ...this.getDescendants(dataNode), dataNode], []);\n this.expansionModel.select(...allNodes.map(node => this._trackByValue(node)));\n }\n /** Gets a list of descendant dataNodes of a subtree rooted at given data node recursively. */\n getDescendants(dataNode) {\n const descendants = [];\n this._getDescendants(descendants, dataNode);\n // Remove the node itself\n return descendants.splice(1);\n }\n /** A helper function to get descendants recursively. */\n _getDescendants(descendants, dataNode) {\n descendants.push(dataNode);\n const childrenNodes = this.getChildren(dataNode);\n if (Array.isArray(childrenNodes)) {\n childrenNodes.forEach((child) => this._getDescendants(descendants, child));\n }\n else if (isObservable(childrenNodes)) {\n // TypeScript as of version 3.5 doesn't seem to treat `Boolean` like a function that\n // returns a `boolean` specifically in the context of `filter`, so we manually clarify that.\n childrenNodes.pipe(take(1), filter(Boolean))\n .subscribe(children => {\n for (const child of children) {\n this._getDescendants(descendants, child);\n }\n });\n }\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injection token used to provide a `CdkTreeNode` to its outlet.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst CDK_TREE_NODE_OUTLET_NODE = new InjectionToken('CDK_TREE_NODE_OUTLET_NODE');\n/**\n * Outlet for nested CdkNode. Put `[cdkTreeNodeOutlet]` on a tag to place children dataNodes\n * inside the outlet.\n */\nclass CdkTreeNodeOutlet {\n constructor(viewContainer, _node) {\n this.viewContainer = viewContainer;\n this._node = _node;\n }\n}\nCdkTreeNodeOutlet.ɵfac = function CdkTreeNodeOutlet_Factory(t) { return new (t || CdkTreeNodeOutlet)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(CDK_TREE_NODE_OUTLET_NODE, 8)); };\nCdkTreeNodeOutlet.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodeOutlet, selectors: [[\"\", \"cdkTreeNodeOutlet\", \"\"]] });\nCdkTreeNodeOutlet.ctorParameters = () => [\n { type: ViewContainerRef },\n { type: undefined, decorators: [{ type: Inject, args: [CDK_TREE_NODE_OUTLET_NODE,] }, { type: Optional }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodeOutlet, [{\n type: Directive,\n args: [{\n selector: '[cdkTreeNodeOutlet]'\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [CDK_TREE_NODE_OUTLET_NODE]\n }, {\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Context provided to the tree node component. */\nclass CdkTreeNodeOutletContext {\n constructor(data) {\n this.$implicit = data;\n }\n}\n/**\n * Data node definition for the CdkTree.\n * Captures the node's template and a when predicate that describes when this node should be used.\n */\nclass CdkTreeNodeDef {\n /** @docs-private */\n constructor(template) {\n this.template = template;\n }\n}\nCdkTreeNodeDef.ɵfac = function CdkTreeNodeDef_Factory(t) { return new (t || CdkTreeNodeDef)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nCdkTreeNodeDef.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodeDef, selectors: [[\"\", \"cdkTreeNodeDef\", \"\"]], inputs: { when: [\"cdkTreeNodeDefWhen\", \"when\"] } });\nCdkTreeNodeDef.ctorParameters = () => [\n { type: TemplateRef }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodeDef, [{\n type: Directive,\n args: [{\n selector: '[cdkTreeNodeDef]',\n inputs: [\n 'when: cdkTreeNodeDefWhen'\n ]\n }]\n }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Returns an error to be thrown when there is no usable data.\n * @docs-private\n */\nfunction getTreeNoValidDataSourceError() {\n return Error(`A valid data source must be provided.`);\n}\n/**\n * Returns an error to be thrown when there are multiple nodes that are missing a when function.\n * @docs-private\n */\nfunction getTreeMultipleDefaultNodeDefsError() {\n return Error(`There can only be one default row without a when predicate function.`);\n}\n/**\n * Returns an error to be thrown when there are no matching node defs for a particular set of data.\n * @docs-private\n */\nfunction getTreeMissingMatchingNodeDefError() {\n return Error(`Could not find a matching node definition for the provided node data.`);\n}\n/**\n * Returns an error to be thrown when there are tree control.\n * @docs-private\n */\nfunction getTreeControlMissingError() {\n return Error(`Could not find a tree control for the tree.`);\n}\n/**\n * Returns an error to be thrown when tree control did not implement functions for flat/nested node.\n * @docs-private\n */\nfunction getTreeControlFunctionsMissingError() {\n return Error(`Could not find functions for nested/flat tree in tree control.`);\n}\n\n/**\n * CDK tree component that connects with a data source to retrieve data of type `T` and renders\n * dataNodes with hierarchy. Updates the dataNodes when new data is provided by the data source.\n */\nclass CdkTree {\n constructor(_differs, _changeDetectorRef) {\n this._differs = _differs;\n this._changeDetectorRef = _changeDetectorRef;\n /** Subject that emits when the component has been destroyed. */\n this._onDestroy = new Subject();\n /** Level of nodes */\n this._levels = new Map();\n // TODO(tinayuangao): Setup a listener for scrolling, emit the calculated view to viewChange.\n // Remove the MAX_VALUE in viewChange\n /**\n * Stream containing the latest information on what rows are being displayed on screen.\n * Can be used by the data source to as a heuristic of what data should be provided.\n */\n this.viewChange = new BehaviorSubject({ start: 0, end: Number.MAX_VALUE });\n }\n /**\n * Provides a stream containing the latest data array to render. Influenced by the tree's\n * stream of view window (what dataNodes are currently on screen).\n * Data source can be an observable of data array, or a data array to render.\n */\n get dataSource() { return this._dataSource; }\n set dataSource(dataSource) {\n if (this._dataSource !== dataSource) {\n this._switchDataSource(dataSource);\n }\n }\n ngOnInit() {\n this._dataDiffer = this._differs.find([]).create(this.trackBy);\n if (!this.treeControl && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTreeControlMissingError();\n }\n }\n ngOnDestroy() {\n this._nodeOutlet.viewContainer.clear();\n this.viewChange.complete();\n this._onDestroy.next();\n this._onDestroy.complete();\n if (this._dataSource && typeof this._dataSource.disconnect === 'function') {\n this.dataSource.disconnect(this);\n }\n if (this._dataSubscription) {\n this._dataSubscription.unsubscribe();\n this._dataSubscription = null;\n }\n }\n ngAfterContentChecked() {\n const defaultNodeDefs = this._nodeDefs.filter(def => !def.when);\n if (defaultNodeDefs.length > 1 && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTreeMultipleDefaultNodeDefsError();\n }\n this._defaultNodeDef = defaultNodeDefs[0];\n if (this.dataSource && this._nodeDefs && !this._dataSubscription) {\n this._observeRenderChanges();\n }\n }\n // TODO(tinayuangao): Work on keyboard traversal and actions, make sure it's working for RTL\n // and nested trees.\n /**\n * Switch to the provided data source by resetting the data and unsubscribing from the current\n * render change subscription if one exists. If the data source is null, interpret this by\n * clearing the node outlet. Otherwise start listening for new data.\n */\n _switchDataSource(dataSource) {\n if (this._dataSource && typeof this._dataSource.disconnect === 'function') {\n this.dataSource.disconnect(this);\n }\n if (this._dataSubscription) {\n this._dataSubscription.unsubscribe();\n this._dataSubscription = null;\n }\n // Remove the all dataNodes if there is now no data source\n if (!dataSource) {\n this._nodeOutlet.viewContainer.clear();\n }\n this._dataSource = dataSource;\n if (this._nodeDefs) {\n this._observeRenderChanges();\n }\n }\n /** Set up a subscription for the data provided by the data source. */\n _observeRenderChanges() {\n let dataStream;\n if (isDataSource(this._dataSource)) {\n dataStream = this._dataSource.connect(this);\n }\n else if (isObservable(this._dataSource)) {\n dataStream = this._dataSource;\n }\n else if (Array.isArray(this._dataSource)) {\n dataStream = of(this._dataSource);\n }\n if (dataStream) {\n this._dataSubscription = dataStream.pipe(takeUntil(this._onDestroy))\n .subscribe(data => this.renderNodeChanges(data));\n }\n else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throw getTreeNoValidDataSourceError();\n }\n }\n /** Check for changes made in the data and render each change (node added/removed/moved). */\n renderNodeChanges(data, dataDiffer = this._dataDiffer, viewContainer = this._nodeOutlet.viewContainer, parentData) {\n const changes = dataDiffer.diff(data);\n if (!changes) {\n return;\n }\n changes.forEachOperation((item, adjustedPreviousIndex, currentIndex) => {\n if (item.previousIndex == null) {\n this.insertNode(data[currentIndex], currentIndex, viewContainer, parentData);\n }\n else if (currentIndex == null) {\n viewContainer.remove(adjustedPreviousIndex);\n this._levels.delete(item.item);\n }\n else {\n const view = viewContainer.get(adjustedPreviousIndex);\n viewContainer.move(view, currentIndex);\n }\n });\n this._changeDetectorRef.detectChanges();\n }\n /**\n * Finds the matching node definition that should be used for this node data. If there is only\n * one node definition, it is returned. Otherwise, find the node definition that has a when\n * predicate that returns true with the data. If none return true, return the default node\n * definition.\n */\n _getNodeDef(data, i) {\n if (this._nodeDefs.length === 1) {\n return this._nodeDefs.first;\n }\n const nodeDef = this._nodeDefs.find(def => def.when && def.when(i, data)) || this._defaultNodeDef;\n if (!nodeDef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTreeMissingMatchingNodeDefError();\n }\n return nodeDef;\n }\n /**\n * Create the embedded view for the data node template and place it in the correct index location\n * within the data node view container.\n */\n insertNode(nodeData, index, viewContainer, parentData) {\n const node = this._getNodeDef(nodeData, index);\n // Node context that will be provided to created embedded view\n const context = new CdkTreeNodeOutletContext(nodeData);\n // If the tree is flat tree, then use the `getLevel` function in flat tree control\n // Otherwise, use the level of parent node.\n if (this.treeControl.getLevel) {\n context.level = this.treeControl.getLevel(nodeData);\n }\n else if (typeof parentData !== 'undefined' && this._levels.has(parentData)) {\n context.level = this._levels.get(parentData) + 1;\n }\n else {\n context.level = 0;\n }\n this._levels.set(nodeData, context.level);\n // Use default tree nodeOutlet, or nested node's nodeOutlet\n const container = viewContainer ? viewContainer : this._nodeOutlet.viewContainer;\n container.createEmbeddedView(node.template, context, index);\n // Set the data to just created `CdkTreeNode`.\n // The `CdkTreeNode` created from `createEmbeddedView` will be saved in static variable\n // `mostRecentTreeNode`. We get it from static variable and pass the node data to it.\n if (CdkTreeNode.mostRecentTreeNode) {\n CdkTreeNode.mostRecentTreeNode.data = nodeData;\n }\n }\n}\nCdkTree.ɵfac = function CdkTree_Factory(t) { return new (t || CdkTree)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.IterableDiffers), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nCdkTree.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: CdkTree, selectors: [[\"cdk-tree\"]], contentQueries: function CdkTree_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CdkTreeNodeDef, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._nodeDefs = _t);\n } }, viewQuery: function CdkTree_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(CdkTreeNodeOutlet, 7);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._nodeOutlet = _t.first);\n } }, hostAttrs: [\"role\", \"tree\", 1, \"cdk-tree\"], inputs: { dataSource: \"dataSource\", treeControl: \"treeControl\", trackBy: \"trackBy\" }, exportAs: [\"cdkTree\"], decls: 1, vars: 0, consts: [[\"cdkTreeNodeOutlet\", \"\"]], template: function CdkTree_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0, 0);\n } }, directives: [CdkTreeNodeOutlet], encapsulation: 2 });\nCdkTree.ctorParameters = () => [\n { type: IterableDiffers },\n { type: ChangeDetectorRef }\n];\nCdkTree.propDecorators = {\n dataSource: [{ type: Input }],\n treeControl: [{ type: Input }],\n trackBy: [{ type: Input }],\n _nodeOutlet: [{ type: ViewChild, args: [CdkTreeNodeOutlet, { static: true },] }],\n _nodeDefs: [{ type: ContentChildren, args: [CdkTreeNodeDef, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTree, [{\n type: Component,\n args: [{\n selector: 'cdk-tree',\n exportAs: 'cdkTree',\n template: `<ng-container cdkTreeNodeOutlet></ng-container>`,\n host: {\n 'class': 'cdk-tree',\n 'role': 'tree'\n },\n encapsulation: ViewEncapsulation.None,\n // The \"OnPush\" status for the `CdkTree` component is effectively a noop, so we are removing it.\n // The view for `CdkTree` consists entirely of templates declared in other views. As they are\n // declared elsewhere, they are checked when their declaration points are checked.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default\n }]\n }], function () { return [{ type: ɵngcc0.IterableDiffers }, { type: ɵngcc0.ChangeDetectorRef }]; }, { dataSource: [{\n type: Input\n }], treeControl: [{\n type: Input\n }], trackBy: [{\n type: Input\n }], _nodeOutlet: [{\n type: ViewChild,\n args: [CdkTreeNodeOutlet, { static: true }]\n }], _nodeDefs: [{\n type: ContentChildren,\n args: [CdkTreeNodeDef, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n }]\n }] }); })();\n/**\n * Tree node for CdkTree. It contains the data in the tree node.\n */\nclass CdkTreeNode {\n constructor(_elementRef, _tree) {\n this._elementRef = _elementRef;\n this._tree = _tree;\n /** Subject that emits when the component has been destroyed. */\n this._destroyed = new Subject();\n /** Emits when the node's data has changed. */\n this._dataChanges = new Subject();\n CdkTreeNode.mostRecentTreeNode = this;\n // The classes are directly added here instead of in the host property because classes on\n // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n // it is not set by the time it's children nodes try to read the class from it.\n // TODO: move to host after View Engine deprecation\n this._elementRef.nativeElement.classList.add('cdk-tree-node');\n this.role = 'treeitem';\n }\n /**\n * The role of the tree node.\n * @deprecated The correct role is 'treeitem', 'group' should not be used. This input will be\n * removed in a future version.\n * @breaking-change 12.0.0 Remove this input\n */\n get role() { return 'treeitem'; }\n set role(_role) {\n // TODO: move to host after View Engine deprecation\n this._elementRef.nativeElement.setAttribute('role', _role);\n }\n /** The tree node's data. */\n get data() { return this._data; }\n set data(value) {\n if (value !== this._data) {\n this._data = value;\n this._setRoleFromData();\n this._dataChanges.next();\n }\n }\n get isExpanded() {\n return this._tree.treeControl.isExpanded(this._data);\n }\n _setExpanded(_expanded) {\n this._isAriaExpanded = _expanded;\n this._elementRef.nativeElement.setAttribute('aria-expanded', `${_expanded}`);\n }\n get level() {\n // If the treeControl has a getLevel method, use it to get the level. Otherwise read the\n // aria-level off the parent node and use it as the level for this node (note aria-level is\n // 1-indexed, while this property is 0-indexed, so we don't need to increment).\n return this._tree.treeControl.getLevel ?\n this._tree.treeControl.getLevel(this._data) : this._parentNodeAriaLevel;\n }\n ngOnInit() {\n this._parentNodeAriaLevel = getParentNodeAriaLevel(this._elementRef.nativeElement);\n this._elementRef.nativeElement.setAttribute('aria-level', `${this.level + 1}`);\n }\n ngDoCheck() {\n // aria-expanded is be set here because the expanded state is stored in the tree control and\n // the node isn't aware when the state is changed.\n // It is not set using a @HostBinding because they sometimes get lost with Mixin based classes.\n // TODO: move to host after View Engine deprecation\n if (this.isExpanded != this._isAriaExpanded) {\n this._setExpanded(this.isExpanded);\n }\n }\n ngOnDestroy() {\n // If this is the last tree node being destroyed,\n // clear out the reference to avoid leaking memory.\n if (CdkTreeNode.mostRecentTreeNode === this) {\n CdkTreeNode.mostRecentTreeNode = null;\n }\n this._dataChanges.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Focuses the menu item. Implements for FocusableOption. */\n focus() {\n this._elementRef.nativeElement.focus();\n }\n // TODO: role should eventually just be set in the component host\n _setRoleFromData() {\n if (!this._tree.treeControl.isExpandable && !this._tree.treeControl.getChildren &&\n (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTreeControlFunctionsMissingError();\n }\n this.role = 'treeitem';\n }\n}\nCdkTreeNode.ɵfac = function CdkTreeNode_Factory(t) { return new (t || CdkTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(CdkTree)); };\nCdkTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNode, selectors: [[\"cdk-tree-node\"]], inputs: { role: \"role\" }, exportAs: [\"cdkTreeNode\"] });\n/**\n * The most recently created `CdkTreeNode`. We save it in static variable so we can retrieve it\n * in `CdkTree` and set the data to it.\n */\nCdkTreeNode.mostRecentTreeNode = null;\nCdkTreeNode.ctorParameters = () => [\n { type: ElementRef },\n { type: CdkTree }\n];\nCdkTreeNode.propDecorators = {\n role: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNode, [{\n type: Directive,\n args: [{\n selector: 'cdk-tree-node',\n exportAs: 'cdkTreeNode'\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: CdkTree }]; }, { role: [{\n type: Input\n }] }); })();\nfunction getParentNodeAriaLevel(nodeElement) {\n let parent = nodeElement.parentElement;\n while (parent && !isNodeElement(parent)) {\n parent = parent.parentElement;\n }\n if (!parent) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n throw Error('Incorrect tree structure containing detached node.');\n }\n else {\n return -1;\n }\n }\n else if (parent.classList.contains('cdk-nested-tree-node')) {\n return coerceNumberProperty(parent.getAttribute('aria-level'));\n }\n else {\n // The ancestor element is the cdk-tree itself\n return 0;\n }\n}\nfunction isNodeElement(element) {\n const classList = element.classList;\n return !!((classList === null || classList === void 0 ? void 0 : classList.contains('cdk-nested-tree-node')) || (classList === null || classList === void 0 ? void 0 : classList.contains('cdk-tree')));\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Nested node is a child of `<cdk-tree>`. It works with nested tree.\n * By using `cdk-nested-tree-node` component in tree node template, children of the parent node will\n * be added in the `cdkTreeNodeOutlet` in tree node template.\n * The children of node will be automatically added to `cdkTreeNodeOutlet`.\n */\nclass CdkNestedTreeNode extends CdkTreeNode {\n constructor(_elementRef, _tree, _differs) {\n super(_elementRef, _tree);\n this._elementRef = _elementRef;\n this._tree = _tree;\n this._differs = _differs;\n // The classes are directly added here instead of in the host property because classes on\n // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n // it is not set by the time it's children nodes try to read the class from it.\n // TODO: move to host after View Engine deprecation\n this._elementRef.nativeElement.classList.add('cdk-nested-tree-node');\n }\n ngAfterContentInit() {\n this._dataDiffer = this._differs.find([]).create(this._tree.trackBy);\n if (!this._tree.treeControl.getChildren && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getTreeControlFunctionsMissingError();\n }\n const childrenNodes = this._tree.treeControl.getChildren(this.data);\n if (Array.isArray(childrenNodes)) {\n this.updateChildrenNodes(childrenNodes);\n }\n else if (isObservable(childrenNodes)) {\n childrenNodes.pipe(takeUntil(this._destroyed))\n .subscribe(result => this.updateChildrenNodes(result));\n }\n this.nodeOutlet.changes.pipe(takeUntil(this._destroyed))\n .subscribe(() => this.updateChildrenNodes());\n }\n // This is a workaround for https://github.com/angular/angular/issues/23091\n // In aot mode, the lifecycle hooks from parent class are not called.\n ngOnInit() {\n super.ngOnInit();\n }\n ngDoCheck() {\n super.ngDoCheck();\n }\n ngOnDestroy() {\n this._clear();\n super.ngOnDestroy();\n }\n /** Add children dataNodes to the NodeOutlet */\n updateChildrenNodes(children) {\n const outlet = this._getNodeOutlet();\n if (children) {\n this._children = children;\n }\n if (outlet && this._children) {\n const viewContainer = outlet.viewContainer;\n this._tree.renderNodeChanges(this._children, this._dataDiffer, viewContainer, this._data);\n }\n else {\n // Reset the data differ if there's no children nodes displayed\n this._dataDiffer.diff([]);\n }\n }\n /** Clear the children dataNodes. */\n _clear() {\n const outlet = this._getNodeOutlet();\n if (outlet) {\n outlet.viewContainer.clear();\n this._dataDiffer.diff([]);\n }\n }\n /** Gets the outlet for the current node. */\n _getNodeOutlet() {\n const outlets = this.nodeOutlet;\n // Note that since we use `descendants: true` on the query, we have to ensure\n // that we don't pick up the outlet of a child node by accident.\n return outlets && outlets.find(outlet => !outlet._node || outlet._node === this);\n }\n}\nCdkNestedTreeNode.ɵfac = function CdkNestedTreeNode_Factory(t) { return new (t || CdkNestedTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(CdkTree), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.IterableDiffers)); };\nCdkNestedTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkNestedTreeNode, selectors: [[\"cdk-nested-tree-node\"]], contentQueries: function CdkNestedTreeNode_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, CdkTreeNodeOutlet, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.nodeOutlet = _t);\n } }, inputs: { role: \"role\", disabled: \"disabled\", tabIndex: \"tabIndex\" }, exportAs: [\"cdkNestedTreeNode\"], features: [ɵngcc0.ɵɵProvidersFeature([\n { provide: CdkTreeNode, useExisting: CdkNestedTreeNode },\n { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: CdkNestedTreeNode }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nCdkNestedTreeNode.ctorParameters = () => [\n { type: ElementRef },\n { type: CdkTree },\n { type: IterableDiffers }\n];\nCdkNestedTreeNode.propDecorators = {\n nodeOutlet: [{ type: ContentChildren, args: [CdkTreeNodeOutlet, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkNestedTreeNode, [{\n type: Directive,\n args: [{\n selector: 'cdk-nested-tree-node',\n exportAs: 'cdkNestedTreeNode',\n inputs: ['role', 'disabled', 'tabIndex'],\n providers: [\n { provide: CdkTreeNode, useExisting: CdkNestedTreeNode },\n { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: CdkNestedTreeNode }\n ]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: CdkTree }, { type: ɵngcc0.IterableDiffers }]; }, { nodeOutlet: [{\n type: ContentChildren,\n args: [CdkTreeNodeOutlet, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n }]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Regex used to split a string on its CSS units. */\nconst cssUnitPattern = /([A-Za-z%]+)$/;\n/**\n * Indent for the children tree dataNodes.\n * This directive will add left-padding to the node to show hierarchy.\n */\nclass CdkTreeNodePadding {\n constructor(_treeNode, _tree, _element, _dir) {\n this._treeNode = _treeNode;\n this._tree = _tree;\n this._element = _element;\n this._dir = _dir;\n /** Subject that emits when the component has been destroyed. */\n this._destroyed = new Subject();\n /** CSS units used for the indentation value. */\n this.indentUnits = 'px';\n this._indent = 40;\n this._setPadding();\n if (_dir) {\n _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._setPadding(true));\n }\n // In Ivy the indentation binding might be set before the tree node's data has been added,\n // which means that we'll miss the first render. We have to subscribe to changes in the\n // data to ensure that everything is up to date.\n _treeNode._dataChanges.subscribe(() => this._setPadding());\n }\n /** The level of depth of the tree node. The padding will be `level * indent` pixels. */\n get level() { return this._level; }\n set level(value) { this._setLevelInput(value); }\n /**\n * The indent for each level. Can be a number or a CSS string.\n * Default number 40px from material design menu sub-menu spec.\n */\n get indent() { return this._indent; }\n set indent(indent) { this._setIndentInput(indent); }\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** The padding indent value for the tree node. Returns a string with px numbers if not null. */\n _paddingIndent() {\n const nodeLevel = (this._treeNode.data && this._tree.treeControl.getLevel)\n ? this._tree.treeControl.getLevel(this._treeNode.data)\n : null;\n const level = this._level == null ? nodeLevel : this._level;\n return typeof level === 'number' ? `${level * this._indent}${this.indentUnits}` : null;\n }\n _setPadding(forceChange = false) {\n const padding = this._paddingIndent();\n if (padding !== this._currentPadding || forceChange) {\n const element = this._element.nativeElement;\n const paddingProp = this._dir && this._dir.value === 'rtl' ? 'paddingRight' : 'paddingLeft';\n const resetProp = paddingProp === 'paddingLeft' ? 'paddingRight' : 'paddingLeft';\n element.style[paddingProp] = padding || '';\n element.style[resetProp] = '';\n this._currentPadding = padding;\n }\n }\n /**\n * This has been extracted to a util because of TS 4 and VE.\n * View Engine doesn't support property rename inheritance.\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n * @docs-private\n */\n _setLevelInput(value) {\n // Set to null as the fallback value so that _setPadding can fall back to the node level if the\n // consumer set the directive as `cdkTreeNodePadding=\"\"`. We still want to take this value if\n // they set 0 explicitly.\n this._level = coerceNumberProperty(value, null);\n this._setPadding();\n }\n /**\n * This has been extracted to a util because of TS 4 and VE.\n * View Engine doesn't support property rename inheritance.\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n * @docs-private\n */\n _setIndentInput(indent) {\n let value = indent;\n let units = 'px';\n if (typeof indent === 'string') {\n const parts = indent.split(cssUnitPattern);\n value = parts[0];\n units = parts[1] || units;\n }\n this.indentUnits = units;\n this._indent = coerceNumberProperty(value);\n this._setPadding();\n }\n}\nCdkTreeNodePadding.ɵfac = function CdkTreeNodePadding_Factory(t) { return new (t || CdkTreeNodePadding)(ɵngcc0.ɵɵdirectiveInject(CdkTreeNode), ɵngcc0.ɵɵdirectiveInject(CdkTree), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Directionality, 8)); };\nCdkTreeNodePadding.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodePadding, selectors: [[\"\", \"cdkTreeNodePadding\", \"\"]], inputs: { level: [\"cdkTreeNodePadding\", \"level\"], indent: [\"cdkTreeNodePaddingIndent\", \"indent\"] } });\nCdkTreeNodePadding.ctorParameters = () => [\n { type: CdkTreeNode },\n { type: CdkTree },\n { type: ElementRef },\n { type: Directionality, decorators: [{ type: Optional }] }\n];\nCdkTreeNodePadding.propDecorators = {\n level: [{ type: Input, args: ['cdkTreeNodePadding',] }],\n indent: [{ type: Input, args: ['cdkTreeNodePaddingIndent',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodePadding, [{\n type: Directive,\n args: [{\n selector: '[cdkTreeNodePadding]'\n }]\n }], function () { return [{ type: CdkTreeNode }, { type: CdkTree }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.Directionality, decorators: [{\n type: Optional\n }] }]; }, { level: [{\n type: Input,\n args: ['cdkTreeNodePadding']\n }], indent: [{\n type: Input,\n args: ['cdkTreeNodePaddingIndent']\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Node toggle to expand/collapse the node.\n */\nclass CdkTreeNodeToggle {\n constructor(_tree, _treeNode) {\n this._tree = _tree;\n this._treeNode = _treeNode;\n this._recursive = false;\n }\n /** Whether expand/collapse the node recursively. */\n get recursive() { return this._recursive; }\n set recursive(value) { this._recursive = coerceBooleanProperty(value); }\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritten.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n _toggle(event) {\n this.recursive\n ? this._tree.treeControl.toggleDescendants(this._treeNode.data)\n : this._tree.treeControl.toggle(this._treeNode.data);\n event.stopPropagation();\n }\n}\nCdkTreeNodeToggle.ɵfac = function CdkTreeNodeToggle_Factory(t) { return new (t || CdkTreeNodeToggle)(ɵngcc0.ɵɵdirectiveInject(CdkTree), ɵngcc0.ɵɵdirectiveInject(CdkTreeNode)); };\nCdkTreeNodeToggle.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodeToggle, selectors: [[\"\", \"cdkTreeNodeToggle\", \"\"]], hostBindings: function CdkTreeNodeToggle_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"click\", function CdkTreeNodeToggle_click_HostBindingHandler($event) { return ctx._toggle($event); });\n } }, inputs: { recursive: [\"cdkTreeNodeToggleRecursive\", \"recursive\"] } });\nCdkTreeNodeToggle.ctorParameters = () => [\n { type: CdkTree },\n { type: CdkTreeNode }\n];\nCdkTreeNodeToggle.propDecorators = {\n recursive: [{ type: Input, args: ['cdkTreeNodeToggleRecursive',] }],\n _toggle: [{ type: HostListener, args: ['click', ['$event'],] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodeToggle, [{\n type: Directive,\n args: [{ selector: '[cdkTreeNodeToggle]' }]\n }], function () { return [{ type: CdkTree }, { type: CdkTreeNode }]; }, { recursive: [{\n type: Input,\n args: ['cdkTreeNodeToggleRecursive']\n }], \n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritten.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n _toggle: [{\n type: HostListener,\n args: ['click', ['$event']]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst EXPORTED_DECLARATIONS = [\n CdkNestedTreeNode,\n CdkTreeNodeDef,\n CdkTreeNodePadding,\n CdkTreeNodeToggle,\n CdkTree,\n CdkTreeNode,\n CdkTreeNodeOutlet,\n];\nclass CdkTreeModule {\n}\nCdkTreeModule.ɵfac = function CdkTreeModule_Factory(t) { return new (t || CdkTreeModule)(); };\nCdkTreeModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: CdkTreeModule });\nCdkTreeModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({});\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeModule, [{\n type: NgModule,\n args: [{\n exports: EXPORTED_DECLARATIONS,\n declarations: EXPORTED_DECLARATIONS\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(CdkTreeModule, { declarations: [CdkNestedTreeNode, CdkTreeNodeDef, CdkTreeNodePadding, CdkTreeNodeToggle, CdkTree, CdkTreeNode, CdkTreeNodeOutlet], exports: [CdkNestedTreeNode, CdkTreeNodeDef, CdkTreeNodePadding, CdkTreeNodeToggle, CdkTree, CdkTreeNode, CdkTreeNodeOutlet] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { BaseTreeControl, CDK_TREE_NODE_OUTLET_NODE, CdkNestedTreeNode, CdkTree, CdkTreeModule, CdkTreeNode, CdkTreeNodeDef, CdkTreeNodeOutlet, CdkTreeNodeOutletContext, CdkTreeNodePadding, CdkTreeNodeToggle, FlatTreeControl, NestedTreeControl, getTreeControlFunctionsMissingError, getTreeControlMissingError, getTreeMissingMatchingNodeDefError, getTreeMultipleDefaultNodeDefsError, getTreeNoValidDataSourceError };\n\n//# sourceMappingURL=tree.js.map","import { CdkTreeNode, CdkTree, CdkTreeNodeDef, CdkNestedTreeNode, CDK_TREE_NODE_OUTLET_NODE, CdkTreeNodePadding, CdkTreeNodeOutlet, CdkTreeNodeToggle, CdkTreeModule } from '@angular/cdk/tree';\nimport { Directive, ElementRef, Attribute, Input, IterableDiffers, ViewContainerRef, Inject, Optional, Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinDisabled, MatCommonModule } from '@angular/material/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, merge } from 'rxjs';\nimport { take, map } from 'rxjs/operators';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/tree';\nconst _MatTreeNodeMixinBase = mixinTabIndex(mixinDisabled(CdkTreeNode));\n/**\n * Wrapper for the CdkTree node with Material design styles.\n */\nclass MatTreeNode extends _MatTreeNodeMixinBase {\n constructor(_elementRef, _tree, tabIndex) {\n super(_elementRef, _tree);\n this._elementRef = _elementRef;\n this._tree = _tree;\n this.tabIndex = Number(tabIndex) || 0;\n // The classes are directly added here instead of in the host property because classes on\n // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n // it is not set by the time it's children nodes try to read the class from it.\n // TODO: move to host after View Engine deprecation\n this._elementRef.nativeElement.classList.add('mat-tree-node');\n }\n // This is a workaround for https://github.com/angular/angular/issues/23091\n // In aot mode, the lifecycle hooks from parent class are not called.\n ngOnInit() {\n super.ngOnInit();\n }\n ngDoCheck() {\n super.ngDoCheck();\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n }\n}\nMatTreeNode.ɵfac = function MatTreeNode_Factory(t) { return new (t || MatTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.CdkTree), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNode, selectors: [[\"mat-tree-node\"]], inputs: { role: \"role\", disabled: \"disabled\", tabIndex: \"tabIndex\" }, exportAs: [\"matTreeNode\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNode, useExisting: MatTreeNode }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNode.ctorParameters = () => [\n { type: ElementRef },\n { type: CdkTree },\n { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNode, [{\n type: Directive,\n args: [{\n selector: 'mat-tree-node',\n exportAs: 'matTreeNode',\n inputs: ['role', 'disabled', 'tabIndex'],\n providers: [{ provide: CdkTreeNode, useExisting: MatTreeNode }]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.CdkTree }, { type: String, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }]; }, null); })();\n/**\n * Wrapper for the CdkTree node definition with Material design styles.\n * Captures the node's template and a when predicate that describes when this node should be used.\n */\nclass MatTreeNodeDef extends CdkTreeNodeDef {\n}\nMatTreeNodeDef.ɵfac = /*@__PURE__*/ function () { let ɵMatTreeNodeDef_BaseFactory; return function MatTreeNodeDef_Factory(t) { return (ɵMatTreeNodeDef_BaseFactory || (ɵMatTreeNodeDef_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTreeNodeDef)))(t || MatTreeNodeDef); }; }();\nMatTreeNodeDef.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodeDef, selectors: [[\"\", \"matTreeNodeDef\", \"\"]], inputs: { when: [\"matTreeNodeDefWhen\", \"when\"], data: [\"matTreeNode\", \"data\"] }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNodeDef, useExisting: MatTreeNodeDef }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNodeDef.propDecorators = {\n data: [{ type: Input, args: ['matTreeNode',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodeDef, [{\n type: Directive,\n args: [{\n selector: '[matTreeNodeDef]',\n inputs: [\n 'when: matTreeNodeDefWhen'\n ],\n providers: [{ provide: CdkTreeNodeDef, useExisting: MatTreeNodeDef }]\n }]\n }], null, { data: [{\n type: Input,\n args: ['matTreeNode']\n }] }); })();\n/**\n * Wrapper for the CdkTree nested node with Material design styles.\n */\nclass MatNestedTreeNode extends CdkNestedTreeNode {\n constructor(_elementRef, _tree, _differs, tabIndex) {\n super(_elementRef, _tree, _differs);\n this._elementRef = _elementRef;\n this._tree = _tree;\n this._differs = _differs;\n this._disabled = false;\n this.tabIndex = Number(tabIndex) || 0;\n // The classes are directly added here instead of in the host property because classes on\n // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n // it is not set by the time it's children nodes try to read the class from it.\n // TODO: move to host after View Engine deprecation\n this._elementRef.nativeElement.classList.add('mat-nested-tree-node');\n }\n /** Whether the node is disabled. */\n get disabled() { return this._disabled; }\n set disabled(value) { this._disabled = coerceBooleanProperty(value); }\n /** Tabindex for the node. */\n get tabIndex() { return this.disabled ? -1 : this._tabIndex; }\n set tabIndex(value) {\n // If the specified tabIndex value is null or undefined, fall back to the default value.\n this._tabIndex = value != null ? value : 0;\n }\n // This is a workaround for https://github.com/angular/angular/issues/19145\n // In aot mode, the lifecycle hooks from parent class are not called.\n // TODO(tinayuangao): Remove when the angular issue #19145 is fixed\n ngOnInit() {\n super.ngOnInit();\n }\n ngDoCheck() {\n super.ngDoCheck();\n }\n ngAfterContentInit() {\n super.ngAfterContentInit();\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n }\n}\nMatNestedTreeNode.ɵfac = function MatNestedTreeNode_Factory(t) { return new (t || MatNestedTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.CdkTree), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.IterableDiffers), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatNestedTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatNestedTreeNode, selectors: [[\"mat-nested-tree-node\"]], inputs: { role: \"role\", disabled: \"disabled\", tabIndex: \"tabIndex\", node: [\"matNestedTreeNode\", \"node\"] }, exportAs: [\"matNestedTreeNode\"], features: [ɵngcc0.ɵɵProvidersFeature([\n { provide: CdkNestedTreeNode, useExisting: MatNestedTreeNode },\n { provide: CdkTreeNode, useExisting: MatNestedTreeNode },\n { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: MatNestedTreeNode }\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatNestedTreeNode.ctorParameters = () => [\n { type: ElementRef },\n { type: CdkTree },\n { type: IterableDiffers },\n { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\nMatNestedTreeNode.propDecorators = {\n node: [{ type: Input, args: ['matNestedTreeNode',] }],\n disabled: [{ type: Input }],\n tabIndex: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatNestedTreeNode, [{\n type: Directive,\n args: [{\n selector: 'mat-nested-tree-node',\n exportAs: 'matNestedTreeNode',\n inputs: ['role', 'disabled', 'tabIndex'],\n providers: [\n { provide: CdkNestedTreeNode, useExisting: MatNestedTreeNode },\n { provide: CdkTreeNode, useExisting: MatNestedTreeNode },\n { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: MatNestedTreeNode }\n ]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.CdkTree }, { type: ɵngcc0.IterableDiffers }, { type: String, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }]; }, { tabIndex: [{\n type: Input\n }], disabled: [{\n type: Input\n }], node: [{\n type: Input,\n args: ['matNestedTreeNode']\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Wrapper for the CdkTree padding with Material design styles.\n */\nclass MatTreeNodePadding extends CdkTreeNodePadding {\n /** The level of depth of the tree node. The padding will be `level * indent` pixels. */\n get level() { return this._level; }\n set level(value) { this._setLevelInput(value); }\n /** The indent for each level. Default number 40px from material design menu sub-menu spec. */\n get indent() { return this._indent; }\n set indent(indent) { this._setIndentInput(indent); }\n}\nMatTreeNodePadding.ɵfac = /*@__PURE__*/ function () { let ɵMatTreeNodePadding_BaseFactory; return function MatTreeNodePadding_Factory(t) { return (ɵMatTreeNodePadding_BaseFactory || (ɵMatTreeNodePadding_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTreeNodePadding)))(t || MatTreeNodePadding); }; }();\nMatTreeNodePadding.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodePadding, selectors: [[\"\", \"matTreeNodePadding\", \"\"]], inputs: { level: [\"matTreeNodePadding\", \"level\"], indent: [\"matTreeNodePaddingIndent\", \"indent\"] }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNodePadding, useExisting: MatTreeNodePadding }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNodePadding.propDecorators = {\n level: [{ type: Input, args: ['matTreeNodePadding',] }],\n indent: [{ type: Input, args: ['matTreeNodePaddingIndent',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodePadding, [{\n type: Directive,\n args: [{\n selector: '[matTreeNodePadding]',\n providers: [{ provide: CdkTreeNodePadding, useExisting: MatTreeNodePadding }]\n }]\n }], null, { level: [{\n type: Input,\n args: ['matTreeNodePadding']\n }], indent: [{\n type: Input,\n args: ['matTreeNodePaddingIndent']\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Outlet for nested CdkNode. Put `[matTreeNodeOutlet]` on a tag to place children dataNodes\n * inside the outlet.\n */\nclass MatTreeNodeOutlet {\n constructor(viewContainer, _node) {\n this.viewContainer = viewContainer;\n this._node = _node;\n }\n}\nMatTreeNodeOutlet.ɵfac = function MatTreeNodeOutlet_Factory(t) { return new (t || MatTreeNodeOutlet)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(CDK_TREE_NODE_OUTLET_NODE, 8)); };\nMatTreeNodeOutlet.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodeOutlet, selectors: [[\"\", \"matTreeNodeOutlet\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([{\n provide: CdkTreeNodeOutlet,\n useExisting: MatTreeNodeOutlet\n }])] });\nMatTreeNodeOutlet.ctorParameters = () => [\n { type: ViewContainerRef },\n { type: undefined, decorators: [{ type: Inject, args: [CDK_TREE_NODE_OUTLET_NODE,] }, { type: Optional }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodeOutlet, [{\n type: Directive,\n args: [{\n selector: '[matTreeNodeOutlet]',\n providers: [{\n provide: CdkTreeNodeOutlet,\n useExisting: MatTreeNodeOutlet\n }]\n }]\n }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [CDK_TREE_NODE_OUTLET_NODE]\n }, {\n type: Optional\n }] }]; }, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Wrapper for the CdkTable with Material design styles.\n */\nclass MatTree extends CdkTree {\n}\nMatTree.ɵfac = /*@__PURE__*/ function () { let ɵMatTree_BaseFactory; return function MatTree_Factory(t) { return (ɵMatTree_BaseFactory || (ɵMatTree_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTree)))(t || MatTree); }; }();\nMatTree.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatTree, selectors: [[\"mat-tree\"]], viewQuery: function MatTree_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(MatTreeNodeOutlet, 7);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._nodeOutlet = _t.first);\n } }, hostAttrs: [\"role\", \"tree\", 1, \"mat-tree\", \"cdk-tree\"], exportAs: [\"matTree\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTree, useExisting: MatTree }]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 1, vars: 0, consts: [[\"matTreeNodeOutlet\", \"\"]], template: function MatTree_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementContainer(0, 0);\n } }, directives: [MatTreeNodeOutlet], styles: [\".mat-tree{display:block}.mat-tree-node{display:flex;align-items:center;flex:1;word-wrap:break-word}.mat-nested-tree-node{border-bottom-width:0}\\n\"], encapsulation: 2 });\nMatTree.propDecorators = {\n _nodeOutlet: [{ type: ViewChild, args: [MatTreeNodeOutlet, { static: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTree, [{\n type: Component,\n args: [{\n selector: 'mat-tree',\n exportAs: 'matTree',\n template: `<ng-container matTreeNodeOutlet></ng-container>`,\n host: {\n // The 'cdk-tree' class needs to be included here because classes set in the host in the\n // parent class are not inherited with View Engine. The 'cdk-tree' class in CdkTreeNode has\n // to be set in the host because:\n // if it is set as a @HostBinding it is not set by the time the tree nodes try to read the\n // class from it.\n // the ElementRef is not available in the constructor so the class can't be applied directly\n // without a breaking constructor change.\n 'class': 'mat-tree cdk-tree',\n 'role': 'tree'\n },\n encapsulation: ViewEncapsulation.None,\n // See note on CdkTree for explanation on why this uses the default change detection strategy.\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [{ provide: CdkTree, useExisting: MatTree }],\n styles: [\".mat-tree{display:block}.mat-tree-node{display:flex;align-items:center;flex:1;word-wrap:break-word}.mat-nested-tree-node{border-bottom-width:0}\\n\"]\n }]\n }], null, { _nodeOutlet: [{\n type: ViewChild,\n args: [MatTreeNodeOutlet, { static: true }]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Wrapper for the CdkTree's toggle with Material design styles.\n */\n// tslint:disable-next-line: coercion-types\nclass MatTreeNodeToggle extends CdkTreeNodeToggle {\n get recursive() { return this._recursive; }\n set recursive(value) {\n // TODO: when we remove support for ViewEngine, change this setter to an input\n // alias in the decorator metadata.\n this._recursive = coerceBooleanProperty(value);\n }\n}\nMatTreeNodeToggle.ɵfac = /*@__PURE__*/ function () { let ɵMatTreeNodeToggle_BaseFactory; return function MatTreeNodeToggle_Factory(t) { return (ɵMatTreeNodeToggle_BaseFactory || (ɵMatTreeNodeToggle_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTreeNodeToggle)))(t || MatTreeNodeToggle); }; }();\nMatTreeNodeToggle.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodeToggle, selectors: [[\"\", \"matTreeNodeToggle\", \"\"]], inputs: { recursive: [\"matTreeNodeToggleRecursive\", \"recursive\"] }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNodeToggle, useExisting: MatTreeNodeToggle }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNodeToggle.propDecorators = {\n recursive: [{ type: Input, args: ['matTreeNodeToggleRecursive',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodeToggle, [{\n type: Directive,\n args: [{\n selector: '[matTreeNodeToggle]',\n providers: [{ provide: CdkTreeNodeToggle, useExisting: MatTreeNodeToggle }]\n }]\n }], null, { recursive: [{\n type: Input,\n args: ['matTreeNodeToggleRecursive']\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst MAT_TREE_DIRECTIVES = [\n MatNestedTreeNode,\n MatTreeNodeDef,\n MatTreeNodePadding,\n MatTreeNodeToggle,\n MatTree,\n MatTreeNode,\n MatTreeNodeOutlet\n];\nclass MatTreeModule {\n}\nMatTreeModule.ɵfac = function MatTreeModule_Factory(t) { return new (t || MatTreeModule)(); };\nMatTreeModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatTreeModule });\nMatTreeModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[CdkTreeModule, MatCommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeModule, [{\n type: NgModule,\n args: [{\n imports: [CdkTreeModule, MatCommonModule],\n exports: [MatCommonModule, MAT_TREE_DIRECTIVES],\n declarations: MAT_TREE_DIRECTIVES\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatTreeModule, { declarations: function () { return [MatNestedTreeNode, MatTreeNodeDef, MatTreeNodePadding, MatTreeNodeToggle, MatTree, MatTreeNode, MatTreeNodeOutlet]; }, imports: function () { return [CdkTreeModule, MatCommonModule]; }, exports: function () { return [MatCommonModule, MatNestedTreeNode, MatTreeNodeDef, MatTreeNodePadding, MatTreeNodeToggle, MatTree, MatTreeNode, MatTreeNodeOutlet]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Tree flattener to convert a normal type of node to node with children & level information.\n * Transform nested nodes of type `T` to flattened nodes of type `F`.\n *\n * For example, the input data of type `T` is nested, and contains its children data:\n * SomeNode: {\n * key: 'Fruits',\n * children: [\n * NodeOne: {\n * key: 'Apple',\n * },\n * NodeTwo: {\n * key: 'Pear',\n * }\n * ]\n * }\n * After flattener flatten the tree, the structure will become\n * SomeNode: {\n * key: 'Fruits',\n * expandable: true,\n * level: 1\n * },\n * NodeOne: {\n * key: 'Apple',\n * expandable: false,\n * level: 2\n * },\n * NodeTwo: {\n * key: 'Pear',\n * expandable: false,\n * level: 2\n * }\n * and the output flattened type is `F` with additional information.\n */\nclass MatTreeFlattener {\n constructor(transformFunction, getLevel, isExpandable, getChildren) {\n this.transformFunction = transformFunction;\n this.getLevel = getLevel;\n this.isExpandable = isExpandable;\n this.getChildren = getChildren;\n }\n _flattenNode(node, level, resultNodes, parentMap) {\n const flatNode = this.transformFunction(node, level);\n resultNodes.push(flatNode);\n if (this.isExpandable(flatNode)) {\n const childrenNodes = this.getChildren(node);\n if (childrenNodes) {\n if (Array.isArray(childrenNodes)) {\n this._flattenChildren(childrenNodes, level, resultNodes, parentMap);\n }\n else {\n childrenNodes.pipe(take(1)).subscribe(children => {\n this._flattenChildren(children, level, resultNodes, parentMap);\n });\n }\n }\n }\n return resultNodes;\n }\n _flattenChildren(children, level, resultNodes, parentMap) {\n children.forEach((child, index) => {\n let childParentMap = parentMap.slice();\n childParentMap.push(index != children.length - 1);\n this._flattenNode(child, level + 1, resultNodes, childParentMap);\n });\n }\n /**\n * Flatten a list of node type T to flattened version of node F.\n * Please note that type T may be nested, and the length of `structuredData` may be different\n * from that of returned list `F[]`.\n */\n flattenNodes(structuredData) {\n let resultNodes = [];\n structuredData.forEach(node => this._flattenNode(node, 0, resultNodes, []));\n return resultNodes;\n }\n /**\n * Expand flattened node with current expansion status.\n * The returned list may have different length.\n */\n expandFlattenedNodes(nodes, treeControl) {\n let results = [];\n let currentExpand = [];\n currentExpand[0] = true;\n nodes.forEach(node => {\n let expand = true;\n for (let i = 0; i <= this.getLevel(node); i++) {\n expand = expand && currentExpand[i];\n }\n if (expand) {\n results.push(node);\n }\n if (this.isExpandable(node)) {\n currentExpand[this.getLevel(node) + 1] = treeControl.isExpanded(node);\n }\n });\n return results;\n }\n}\n/**\n * Data source for flat tree.\n * The data source need to handle expansion/collapsion of the tree node and change the data feed\n * to `MatTree`.\n * The nested tree nodes of type `T` are flattened through `MatTreeFlattener`, and converted\n * to type `F` for `MatTree` to consume.\n */\nclass MatTreeFlatDataSource extends DataSource {\n constructor(_treeControl, _treeFlattener, initialData = []) {\n super();\n this._treeControl = _treeControl;\n this._treeFlattener = _treeFlattener;\n this._flattenedData = new BehaviorSubject([]);\n this._expandedData = new BehaviorSubject([]);\n this._data = new BehaviorSubject(initialData);\n }\n get data() { return this._data.value; }\n set data(value) {\n this._data.next(value);\n this._flattenedData.next(this._treeFlattener.flattenNodes(this.data));\n this._treeControl.dataNodes = this._flattenedData.value;\n }\n connect(collectionViewer) {\n const changes = [\n collectionViewer.viewChange,\n this._treeControl.expansionModel.changed,\n this._flattenedData\n ];\n return merge(...changes).pipe(map(() => {\n this._expandedData.next(this._treeFlattener.expandFlattenedNodes(this._flattenedData.value, this._treeControl));\n return this._expandedData.value;\n }));\n }\n disconnect() {\n // no op\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Data source for nested tree.\n *\n * The data source for nested tree doesn't have to consider node flattener, or the way to expand\n * or collapse. The expansion/collapsion will be handled by TreeControl and each non-leaf node.\n */\nclass MatTreeNestedDataSource extends DataSource {\n constructor() {\n super(...arguments);\n this._data = new BehaviorSubject([]);\n }\n /**\n * Data for the nested tree\n */\n get data() { return this._data.value; }\n set data(value) { this._data.next(value); }\n connect(collectionViewer) {\n return merge(...[collectionViewer.viewChange, this._data])\n .pipe(map(() => {\n return this.data;\n }));\n }\n disconnect() {\n // no op\n }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatNestedTreeNode, MatTree, MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule, MatTreeNestedDataSource, MatTreeNode, MatTreeNodeDef, MatTreeNodeOutlet, MatTreeNodePadding, MatTreeNodeToggle };\n\n//# sourceMappingURL=tree.js.map","import { Injectable } from '@angular/core';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { Observable, of as observableOf } from 'rxjs';\n\n/** Flat node with expandable and level information */\nexport interface FolderFlatNode extends DriveFolder {\n level: number;\n expandable: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FoldersTreeService {\n public control: FlatTreeControl<FolderFlatNode>;\n public flattener: MatTreeFlattener<DriveFolder, FolderFlatNode>;\n public dataSource: MatTreeFlatDataSource<DriveFolder, FolderFlatNode>;\n public set data(items: DriveFolder[]) {\n this.dataSource.data = items;\n }\n\n constructor() {\n this.createTreeFlattener();\n this.createTreeControl();\n this.createTreeDataSource();\n }\n\n private createTreeFlattener() {\n this.flattener = new MatTreeFlattener(\n this.transformer,\n this.getLevel,\n this.isExpandable, this.getChildren\n );\n }\n\n private createTreeControl() {\n this.control = new FlatTreeControl<FolderFlatNode>(\n this.getLevel,\n this.isExpandable\n );\n }\n\n private createTreeDataSource() {\n this.dataSource = new MatTreeFlatDataSource(\n this.control,\n this.flattener\n );\n }\n\n public transformer(node: DriveFolder, level: number) {\n const flatNode = Object.assign({}, node) as FolderFlatNode;\n flatNode.level = level;\n flatNode.expandable = !!node.children;\n return flatNode;\n }\n\n private getLevel(node: FolderFlatNode): number {\n return node.level;\n }\n\n private isExpandable(node: FolderFlatNode): boolean {\n return node.expandable;\n }\n\n private getChildren(node: DriveFolder): Observable<DriveFolder[]> {\n return observableOf(node.children);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const AVAILABLE_CONTEXT_MENUS = new InjectionToken<any>('AVAILABLE_CONTEXT_MENUS');\n","import {OverlayRef} from '@angular/cdk/overlay';\n\nexport class ContextMenuRef<T> {\n constructor(private overlayRef: OverlayRef) {}\n\n public close() {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n }\n }\n\n public backdropClick() {\n return this.overlayRef.backdropClick();\n }\n\n public attachments() {\n return this.overlayRef.attachments();\n }\n\n public detachments() {\n return this.overlayRef.detachments();\n }\n\n public backdropElement() {\n return this.overlayRef.backdropElement;\n }\n\n public contextMenuElement() {\n return this.overlayRef.overlayElement;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const CONTEXT_MENU_DATA = new InjectionToken<{ [key: string]: any }>('CONTEXT_MENU_DATA');\n","import {ComponentFactoryResolver, ElementRef, Injectable, Injector, NgZone} from '@angular/core';\nimport {NavigationStart, Router} from '@angular/router';\nimport {ComponentPortal, ComponentType, PortalInjector} from '@angular/cdk/portal';\nimport {Overlay, PositionStrategy} from '@angular/cdk/overlay';\nimport {filter} from 'rxjs/operators';\nimport {ContextMenuRef} from './context-menu-ref';\nimport {CONTEXT_MENU_DATA} from './context-menu-data';\n\nexport interface ContextMenuParams {\n data?: { [key: string]: any };\n offsetX?: number;\n offsetY?: number;\n originX?: 'start' | 'center' | 'end';\n originY?: 'top' | 'center' | 'bottom';\n overlayX?: 'start' | 'center' | 'end';\n overlayY?: 'top' | 'center' | 'bottom';\n}\n\ntype MenuOrigin = MouseEvent | EventTarget | HTMLElement;\n\nconst ORIGIN_ID = 'dynamic-context-menu-origin';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ContextMenu {\n private lastOrigin: HTMLElement;\n private openContextMenu: ContextMenuRef<any>|null;\n\n constructor(\n private router: Router,\n private zone: NgZone,\n private injector: Injector,\n private resolver: ComponentFactoryResolver,\n private overlay: Overlay,\n ) {\n this.router.events\n .pipe(filter(e => e instanceof NavigationStart))\n .subscribe(() => this.close());\n }\n\n public open<T>(component: ComponentType<T>, e: MenuOrigin, params: ContextMenuParams = {}): ContextMenuRef<T> {\n this.close();\n\n if ( ! component) {\n return;\n }\n\n const overlayRef = this.createOverlay(e, params);\n this.openContextMenu = new ContextMenuRef(overlayRef);\n\n const injector = new PortalInjector(this.injector, new WeakMap<any, any>([\n [CONTEXT_MENU_DATA, params.data],\n [ContextMenuRef, this.openContextMenu],\n ]));\n\n const portal = new ComponentPortal(component, null, injector);\n\n overlayRef.attach(portal);\n this.bindEventsToOverlay();\n\n return this.openContextMenu;\n }\n\n /**\n * Close currently open context menu.\n */\n public close() {\n this.removeLastOrigin();\n\n if (this.openContextMenu) {\n this.openContextMenu.close();\n this.openContextMenu = null;\n }\n }\n\n private createOverlay(e: MenuOrigin, params: ContextMenuParams) {\n return this.overlay.create({\n positionStrategy: this.getMenuPositionStrategy(e, params),\n scrollStrategy: this.overlay.scrollStrategies.close(),\n hasBackdrop: true,\n backdropClass: 'context-menu-backdrop',\n panelClass: 'context-menu-overlay'\n });\n }\n\n private bindEventsToOverlay() {\n this.openContextMenu.contextMenuElement().addEventListener('click', () => {\n this.close();\n });\n\n this.openContextMenu.backdropClick().subscribe(() => {\n this.close();\n });\n\n this.openContextMenu.backdropElement().addEventListener('contextmenu', e => {\n e.preventDefault();\n this.close();\n });\n\n this.openContextMenu.detachments().subscribe(() => {\n this.close();\n });\n }\n\n private getMenuPositionStrategy(e: MenuOrigin, params: ContextMenuParams): PositionStrategy {\n this.createOriginFromEvent(e, params);\n\n const primary = {\n originX: params.originX || 'center',\n originY: params.originY || 'bottom',\n overlayX: params.overlayX || 'center',\n overlayY: params.overlayY || 'top',\n };\n\n return this.overlay.position().flexibleConnectedTo(new ElementRef(this.lastOrigin))\n .withPositions([\n primary,\n {originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom'},\n {originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top'},\n {originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'bottom'}\n ]);\n }\n\n private createOriginFromEvent(e: MenuOrigin, params: ContextMenuParams) {\n this.removeLastOrigin();\n\n if (e instanceof HTMLElement || e instanceof EventTarget) {\n this.lastOrigin = e as HTMLElement;\n } else {\n this.lastOrigin = document.createElement('div');\n this.lastOrigin.style.position = 'fixed';\n this.lastOrigin.style.top = e.clientY + (params.offsetY || 0) + 'px';\n this.lastOrigin.style.left = e.clientX + (params.offsetX || 0) + 'px';\n this.lastOrigin.id = ORIGIN_ID;\n document.body.appendChild(this.lastOrigin);\n }\n }\n\n private removeLastOrigin() {\n if (this.lastOrigin && this.lastOrigin.id === ORIGIN_ID) {\n this.lastOrigin.remove();\n }\n }\n}\n","import {Directive, ElementRef, Inject, Input, OnInit} from '@angular/core';\nimport {ContextMenu} from './context-menu.service';\nimport { AVAILABLE_CONTEXT_MENUS } from './available-context-menus';\n\n@Directive({\n selector: '[contextMenu]'\n})\nexport class ContextMenuDirective implements OnInit {\n @Input('contextMenu') params: string|{type: string, [key: string]: any};\n @Input('disableContextMenu') disableContextMenu = false;\n\n public availableMenus: object = {};\n\n constructor(\n private el: ElementRef,\n private contextMenu: ContextMenu,\n @Inject(AVAILABLE_CONTEXT_MENUS) _availableMenus: object[]\n ) {\n _availableMenus.forEach(config => {\n Object.assign(this.availableMenus, config);\n });\n }\n\n ngOnInit() {\n this.el.nativeElement.addEventListener('contextmenu', e => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.disableContextMenu) return;\n\n this.contextMenu.open(\n this.getMenuComponent(),\n e,\n {\n overlayX: 'start',\n overlayY: 'top',\n data: this.getMenuData()\n }\n );\n });\n }\n\n private getMenuComponent() {\n if (typeof this.params === 'string') {\n return this.availableMenus[this.params];\n } else {\n return this.availableMenus[this.params.type];\n }\n }\n\n private getMenuData() {\n return (typeof this.params === 'string') ? {type: this.params} : this.params;\n }\n}\n","import { Directive, ElementRef, OnDestroy, OnInit } from '@angular/core';\nimport { Select } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable, fromEvent, Subscription } from 'rxjs';\n\n@Directive()\nexport abstract class BaseDropTarget implements OnInit, OnDestroy {\n @Select(DriveState.dragging) dragging: Observable<boolean>;\n protected subs: Subscription[] = [];\n protected active: boolean;\n protected abstract el: ElementRef<HTMLElement>;\n\n ngOnInit() {\n this.dragging.subscribe(dragging => {\n if (dragging) {\n this.onDragStart();\n } else {\n this.onDragEnd();\n }\n });\n }\n\n ngOnDestroy() {\n this.unsubscribe();\n }\n\n protected abstract canDrop();\n protected abstract executeAction();\n\n protected onDragStart() {\n const enter = fromEvent(this.el.nativeElement, 'mouseenter')\n .subscribe(() => this.onDragEnter());\n\n const leave = fromEvent(this.el.nativeElement, 'mouseleave')\n .subscribe(() => this.onDragLeave());\n\n this.subs.push(enter, leave);\n }\n\n protected onDragEnter() {\n const canDrop = this.canDrop(),\n classes = ['drag-over'];\n if (canDrop) {\n this.active = true;\n classes.push('can-drop');\n }\n this.el.nativeElement.classList.add(...classes);\n }\n\n protected onDragLeave() {\n this.active = false;\n this.removeDragOverClass();\n }\n\n protected onDragEnd() {\n this.unsubscribe();\n this.removeDragOverClass();\n\n // pointer never left element before drag stop,\n // we can assume that user dropped on this el\n if (this.active && this.canDrop()) {\n this.executeAction();\n this.active = false;\n }\n }\n\n protected unsubscribe() {\n this.subs.forEach(sub => sub && sub.unsubscribe());\n }\n\n protected removeDragOverClass() {\n this.el.nativeElement.classList.remove(...['drag-over', 'can-drop']);\n }\n}\n","import { Directive, ElementRef, Input } from '@angular/core';\nimport { BaseDropTarget } from './base-drop-target';\nimport { DriveState} from '../../state/drive-state';\nimport { Store } from '@ngxs/store';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { MoveEntries } from '../../state/actions/commands';\n\n@Directive({\n selector: '[folderDropTarget]'\n})\nexport class FolderDropTargetDirective extends BaseDropTarget {\n @Input('folderDropTarget') folder: DriveFolder;\n\n constructor(\n protected el: ElementRef,\n protected store: Store,\n ) {\n super();\n }\n\n protected canDrop(): boolean {\n const entries = this.store.selectSnapshot(DriveState.selectedEntries),\n folder = this.folder as DriveFolder;\n\n return DriveState.canMoveEntriesTo(entries, folder);\n }\n\n protected executeAction() {\n return this.store.dispatch(new MoveEntries(this.folder));\n }\n}\n","<div class=\"mat-tree-node root-tree-node\" *ngIf=\"showRootNode\" (click)=\"selectFolder()\" [class.active]=\"!(selectedFolderId$ | async)\">\n <mat-icon svgIcon=\"network-drive-custom\" class=\"folder-icon\"></mat-icon>\n <span class=\"text\" trans>My Drive</span>\n</div>\n<mat-tree [dataSource]=\"tree.dataSource\" [treeControl]=\"tree.control\">\n <mat-tree-node\n *matTreeNodeDef=\"let node\"\n matTreeNodePadding\n [matTreeNodePaddingIndent]=\"showRootNode ? 40 : 24\"\n [contextMenu]=\"{type: 'entry', entry: node}\"\n [disableContextMenu]=\"disableContextMenu\"\n [folderDropTarget]=\"node\"\n [class.active]=\"(selectedFolderId$ | async) === node.hash\"\n class=\"tree-node\"\n >\n <mat-icon class=\"toggle-expansion-icon\"\n matTreeNodeToggle\n [class.expanded]=\"tree.control.isExpanded(node)\"\n svgIcon=\"arrow-drop-down\"\n ></mat-icon>\n <button type=\"button\" class=\"no-style folder-button\" (click)=\"selectFolder(node)\">\n <mat-icon svgIcon=\"folder\" class=\"folder-icon\"></mat-icon>\n <span class=\"folder-name text\">{{node.name}}</span>\n </button>\n </mat-tree-node>\n</mat-tree>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewEncapsulation\n} from '@angular/core';\nimport { FoldersTreeService } from './folders-tree.service';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n selector: 'folders-tree',\n templateUrl: './folders-tree.component.html',\n styleUrls: ['./folders-tree.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [FoldersTreeService],\n})\nexport class FoldersTreeComponent implements OnInit, OnDestroy {\n @HostBinding('class.expanded') @Input() expanded = false;\n @HostBinding('class.has-root-node') @Input() showRootNode = false;\n @Input() disableContextMenu = false;\n @Output() folderSelected: EventEmitter<DriveFolder> = new EventEmitter();\n\n // TODO: start trackBy function when it's fixed on angular material side\n private subscriptions: Subscription[] = [];\n public selectedFolderId$ = new BehaviorSubject<string>(null);\n constructor(public tree: FoldersTreeService, private store: Store) {}\n\n public selectFolder(folder?: DriveFolder) {\n this.selectedFolderId$.next(folder?.hash);\n this.folderSelected.emit(folder);\n }\n\n public toggle() {\n this.expanded = !this.expanded;\n }\n\n ngOnInit() {\n const sub1 = this.store.select(DriveState.userFolders)\n .pipe(filter(fs => !!fs))\n .subscribe(folders => {\n this.tree.data = folders;\n });\n\n const sub2 = this.store.select(DriveState.activePage).subscribe(page => {\n this.selectedFolderId$.next(page.folderHash);\n });\n\n this.subscriptions.push(sub1, sub2);\n }\n\n ngOnDestroy() {\n this.subscriptions.forEach(s => s.unsubscribe());\n }\n}\n","import {\n ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewEncapsulation\n} from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { Actions, ofAction, Select, Store } from '@ngxs/store';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { DriveState } from '../../state/drive-state';\nimport { map, take } from 'rxjs/operators';\nimport { MoveEntries } from '../../state/actions/commands';\nimport { MoveEntriesFailed, MoveEntriesSuccess } from '../../state/actions/events';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveFolder } from '../../folders/models/driveFolder';\n\n@Component({\n selector: 'move-entries-dialog',\n templateUrl: './move-entries-dialog.component.html',\n styleUrls: ['./move-entries-dialog.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MoveEntriesDialogComponent implements OnInit, OnDestroy {\n @Select(DriveState.selectedEntries) selectedEntries$: Observable<DriveEntry[]>;\n public destination$ = new BehaviorSubject<DriveFolder>(this.store.selectSnapshot(DriveState.activePage).folder);\n public loading$ = new BehaviorSubject<boolean>(false);\n private subscriptions: Subscription[] = [];\n public canMove$ = this.destination$.pipe(map(destination => {\n const movingEntries = this.store.selectSnapshot(DriveState.selectedEntries);\n return DriveState.canMoveEntriesTo(movingEntries, destination);\n }));\n\n constructor(\n protected dialogRef: MatDialogRef<MoveEntriesDialogComponent>,\n protected store: Store,\n protected actions: Actions,\n ) {}\n\n ngOnInit() {\n const failure = this.actions.pipe(ofAction(MoveEntriesFailed)).subscribe(() => {\n this.loading$.next(false);\n });\n const success = this.actions.pipe(ofAction(MoveEntriesSuccess), take(1))\n .subscribe(() => {\n this.close();\n });\n this.subscriptions.push(...[success, failure]);\n }\n\n ngOnDestroy() {\n this.subscriptions.forEach(s => s.unsubscribe());\n }\n\n public confirm() {\n this.loading$.next(true);\n this.store.dispatch(new MoveEntries(this.destination$.value))\n .subscribe(() => {\n this.loading$.next(false);\n });\n }\n\n public close() {\n this.dialogRef.close();\n }\n}\n","<div class=\"modal-header\">\n <h2 mat-dialog-title trans>Rename</h2>\n <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<form ngNativeValidate (ngSubmit)=\"confirm()\">\n <mat-dialog-content class=\"many-inputs\">\n <div class=\"input-container\">\n <input type=\"text\" [formControl]=\"entryName\" placeholder=\"Enter a name...\" trans-placeholder required min=\"3\">\n <div class=\"error\" *ngIf=\"errors.name\">{{errors.name}}</div>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button (click)=\"close()\" type=\"button\" mat-button class=\"cancel-button\" trans>Cancel</button>\n <button type=\"submit\" mat-raised-button color=\"accent\" class=\"submit-button\" [disabled]=\"loading | async\" trans>Rename</button>\n </mat-dialog-actions>\n</form>","<div class=\"modal-header\">\n <h2 mat-dialog-title trans>Move items</h2>\n <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<form ngNativeValidate (ngSubmit)=\"confirm()\">\n <mat-dialog-content>\n <folders-tree\n [expanded]=\"true\"\n [disableContextMenu]=\"true\"\n [showRootNode]=\"true\"\n (folderSelected)=\"destination$.next($event)\"\n ></folders-tree>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button (click)=\"close()\" type=\"button\" mat-button class=\"cancel-button\" trans>Cancel</button>\n <button type=\"submit\" mat-raised-button color=\"accent\" class=\"submit-button\" [disabled]=\"!(canMove$ | async) || (loading$ | async)\" trans>Move</button>\n </mat-dialog-actions>\n</form>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { BackendErrorResponse } from '@common/core/types/backend-error-response';\nimport { DriveState } from '../../state/drive-state';\nimport { Store } from '@ngxs/store';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { finalize } from 'rxjs/operators';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveEntryApiService } from '../../drive-entry-api.service';\nimport { EntryRenamed } from '../../state/actions/events';\n\nexport interface RenameEntryDialogErrors {\n name?: string;\n}\n\n@Component({\n selector: 'rename-entry-dialog',\n templateUrl: './rename-entry-dialog.component.html',\n styleUrls: ['./rename-entry-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class RenameEntryDialogComponent implements OnInit {\n public entryName = new FormControl();\n public loading = new BehaviorSubject(false);\n public errors: RenameEntryDialogErrors = {};\n public entry: DriveEntry;\n\n constructor(\n private dialogRef: MatDialogRef<RenameEntryDialogComponent>,\n private store: Store,\n private toast: Toast,\n private entriesApi: DriveEntryApiService,\n private changeDetection: ChangeDetectorRef,\n ) {}\n\n ngOnInit() {\n this.entry = this.store.selectSnapshot(DriveState.selectedEntries)[0];\n this.entryName.setValue(this.entry.name);\n }\n\n public confirm() {\n const newName = this.entryName.value;\n\n // entry name was not changed\n if (newName === this.entry.name) {\n return this.close();\n }\n\n this.loading.next(true);\n\n return this.entriesApi.update(this.entry.id, {name: newName})\n .pipe(finalize(() => this.loading.next(false)))\n .subscribe(() => {\n this.setErrors();\n this.store.dispatch(new EntryRenamed(this.entry, newName));\n this.close();\n }, response => this.setErrors(response));\n }\n\n public setErrors(response?: BackendErrorResponse<RenameEntryDialogErrors>) {\n this.loading.next(false);\n this.errors = response ? response.errors : {};\n this.changeDetection.detectChanges();\n }\n\n public close() {\n this.dialogRef.close();\n }\n}\n","import { Store } from '@ngxs/store';\nimport { DriveState } from '../state/drive-state';\nimport { DriveContextAction } from './types/drive-context-action';\nimport { Injectable } from '@angular/core';\nimport { WorkspacesService } from '../../../common/workspaces/workspaces.service';\nimport { OpenUploadWindow } from '../state/actions/commands';\nimport { CurrentUser } from '../../../common/auth/current-user';\nimport { DriveFolder } from '../folders/models/driveFolder';\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class DriveContextActions {\n protected multipleEntriesSelected: boolean;\n protected allStarred: boolean;\n protected onlyFoldersSelected: boolean;\n\n protected abstract actions: DriveContextAction[];\n\n constructor(\n protected store: Store,\n protected workspaces: WorkspacesService,\n protected currentUser: CurrentUser,\n ) {}\n\n public getActions() {\n this.updateStatus();\n return this.actions;\n }\n\n protected getSelectedEntries() {\n return this.store.selectSnapshot(DriveState.selectedEntries);\n }\n\n protected updateStatus() {\n this.multipleEntriesSelected = this.store.selectSnapshot(DriveState.multipleEntriesSelected);\n this.allStarred = this.store.selectSnapshot(DriveState.allSelectedEntriesStarred);\n this.onlyFoldersSelected = this.store.selectSnapshot(DriveState.onlyFoldersSelected);\n }\n\n protected hasPermission(permission: string): boolean {\n if (permission === 'files.create') {\n const activeFolder = this.store.selectSnapshot(DriveState.activePage).folder;\n\n // upload either to the folder user right clicked on or the folder that is currently open\n const target = (!this.multipleEntriesSelected && this.getSelectedFolder()) || activeFolder;\n return (target?.permissions || [])['files.update'];\n } else {\n return this.getSelectedEntries().every(entry => {\n return entry.permissions[permission];\n });\n }\n }\n\n protected getSelectedFolder(): DriveFolder {\n return this.getSelectedEntries().find(f => f.type === 'folder') as DriveFolder;\n }\n\n protected openUploadWindow(type: 'file'|'directory') {\n this.store.dispatch(new OpenUploadWindow(type));\n }\n}\n","import {\n AddStar,\n CopySelectedEntries,\n DeleteSelectedEntries,\n DownloadEntries,\n OpenDialog,\n OpenFilePreview,\n RemoveStar\n} from '../../state/actions/commands';\nimport { ShareDialogComponent } from '../../sharing/share-dialog/share-dialog.component';\nimport { ShareLinkDialogComponent } from '../../sharing/share-link-dialog/share-link-dialog.component';\nimport { CrupdateFolderDialogComponent } from '../../folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\nimport { Injectable } from '@angular/core';\nimport { MoveEntriesDialogComponent } from '../../entries/move-entries-dialog/move-entries-dialog.component';\nimport { RenameEntryDialogComponent } from '../../entries/rename-entry-dialog/rename-entry-dialog.component';\nimport { DriveContextActions } from '../drive-context-actions';\nimport { DriveState } from '../../state/drive-state';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EntryActions extends DriveContextActions {\n protected actions = [\n {\n viewName: 'Preview',\n icon: 'visibility',\n showInCompact: true,\n execute: () => {\n this.store.dispatch(new OpenFilePreview());\n },\n visible: () => {\n return !this.onlyFoldersSelected;\n },\n },\n {\n viewName: 'Manage People',\n icon: 'person-add',\n showInCompact: true,\n execute: () => {\n this.store.dispatch(new OpenDialog(ShareDialogComponent));\n },\n visible: () => this.hasPermission('files.update'),\n },\n {\n viewName: 'Get shareable link',\n icon: 'link',\n execute: () => {\n this.store.dispatch(new OpenDialog(ShareLinkDialogComponent, null, {\n panelClass: 'share-link-dialog-container',\n autoFocus: false,\n }));\n },\n visible: () => !this.multipleEntriesSelected && this.hasPermission('files.update'),\n },\n {\n viewName: 'Add a star',\n icon: 'star',\n execute: () => {\n this.store.dispatch(new AddStar(this.getSelectedEntries()));\n },\n visible: () => !this.allStarred\n },\n {\n viewName: 'Remove star',\n icon: 'star-border',\n execute: () => {\n this.store.dispatch(new RemoveStar(this.getSelectedEntries()));\n },\n visible: () => this.allStarred\n },\n {\n viewName: 'New Folder',\n icon: 'create-new-folder',\n separatorBefore: this.store.selectSnapshot(DriveState.isMobile),\n execute: () => {\n this.store.dispatch(new OpenDialog(CrupdateFolderDialogComponent, {folder: this.getSelectedFolder()}));\n },\n visible: () => this.hasPermission('files.create')\n },\n {\n viewName: 'Upload Files',\n icon: 'cloud-upload',\n execute: () => {\n this.openUploadWindow('file');\n },\n visible: () => this.hasPermission('files.create') && this.store.selectSnapshot(DriveState.isMobile),\n },\n {\n viewName: 'Upload Folder',\n icon: 'upload-folder-custom',\n execute: () => {\n this.openUploadWindow('directory');\n },\n visible: () => this.hasPermission('files.create') && this.store.selectSnapshot(DriveState.isMobile),\n },\n {\n viewName: 'Move to',\n icon: 'subdirectory-arrow-right',\n separatorBefore: this.store.selectSnapshot(DriveState.isMobile),\n execute: () => {\n this.store.dispatch(new OpenDialog(MoveEntriesDialogComponent, null, {panelClass: 'move-entries-dialog-container'}));\n },\n visible: () => this.hasPermission('files.update'),\n },\n {\n viewName: 'Rename',\n icon: 'edit',\n execute: () => {\n this.store.dispatch(new OpenDialog(RenameEntryDialogComponent));\n },\n visible: () => {\n return !this.multipleEntriesSelected && this.hasPermission('files.update');\n }\n },\n {\n viewName: 'Make a copy',\n icon: 'file-copy',\n execute: () => {\n this.store.dispatch(new CopySelectedEntries());\n },\n visible: () => this.hasPermission('files.create'),\n },\n {\n viewName: 'Download',\n icon: 'file-download',\n execute: () => {\n this.store.dispatch(new DownloadEntries());\n },\n visible: () => this.hasPermission('files.download'),\n },\n {\n viewName: 'Delete',\n icon: 'delete',\n showInCompact: true,\n separatorBefore: true,\n execute: () => {\n this.store.dispatch(new DeleteSelectedEntries());\n },\n visible: () => this.hasPermission('files.delete'),\n },\n ];\n}\n","import { OpenDialog, } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\nimport { CrupdateFolderDialogComponent } from '../../folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FolderActions extends DriveContextActions {\n protected actions = [\n {\n viewName: 'New Folder',\n icon: 'create-new-folder',\n execute: () => {\n this.store.dispatch(new OpenDialog(CrupdateFolderDialogComponent));\n },\n visible: () => this.hasPermission('files.create'),\n },\n {\n viewName: 'Upload Files',\n icon: 'cloud-upload',\n separatorBefore: true,\n execute: () => {\n this.openUploadWindow('file');\n },\n visible: () => this.hasPermission('files.create'),\n },\n {\n viewName: 'Upload Folder',\n icon: 'upload-folder-custom',\n execute: () => {\n this.openUploadWindow('directory');\n },\n visible: () => this.hasPermission('files.create'),\n },\n ];\n}\n","import {\n CopySelectedEntries, DownloadEntries, OpenDialog, OpenFilePreview, RemoveEntries,\n} from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\nimport { ShareLinkDialogComponent } from '../../sharing/share-link-dialog/share-link-dialog.component';\nimport { Store } from '@ngxs/store';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { SharesApiService } from '../../sharing/shares-api.service';\nimport { ShareDialogComponent } from '../../sharing/share-dialog/share-dialog.component';\nimport { RenameEntryDialogComponent } from '../../entries/rename-entry-dialog/rename-entry-dialog.component';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\n\nconst noopTrue = () => true;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SharesActions extends DriveContextActions {\n protected actions = [\n {\n viewName: 'Preview',\n icon: 'visibility',\n execute: () => {\n this.store.dispatch(new OpenFilePreview());\n },\n visible: () => {\n return !this.onlyFoldersSelected;\n },\n },\n {\n viewName: 'Manage People',\n icon: 'person-add',\n showInCompact: true,\n execute: () => {\n this.store.dispatch(new OpenDialog(ShareDialogComponent));\n },\n visible: () => {\n return this.hasPermission('files.update');\n },\n },\n {\n viewName: 'Get shareable link',\n icon: 'link',\n execute: () => {\n this.store.dispatch(new OpenDialog(ShareLinkDialogComponent, null, {\n panelClass: 'share-link-dialog-container',\n autoFocus: false,\n }));\n },\n visible: () => {\n return !this.multipleEntriesSelected && this.hasPermission('files.update');\n }\n },\n {\n viewName: 'Rename',\n icon: 'edit',\n execute: () => {\n this.store.dispatch(new OpenDialog(RenameEntryDialogComponent));\n },\n visible: () => {\n return !this.multipleEntriesSelected && this.hasPermission('files.update');\n }\n },\n {\n viewName: 'Make a copy',\n icon: 'file-copy',\n execute: () => {\n this.store.dispatch(new CopySelectedEntries());\n },\n visible: () => {\n return this.hasPermission('files.download') && this.hasPermission('files.create');\n },\n },\n {\n viewName: 'Download',\n icon: 'file-download',\n execute: () => {\n this.store.dispatch(new DownloadEntries());\n },\n visible: () => {\n return this.hasPermission('files.download');\n },\n },\n {\n viewName: 'Remove',\n icon: 'delete',\n showInCompact: true,\n execute: () => {\n const entries = this.getSelectedEntries();\n this.shares.detachUser(\n this.currentUser.get('id'),\n entries.map(e => e.id),\n ).subscribe(() => {\n this.store.dispatch(new RemoveEntries(entries));\n });\n },\n visible: noopTrue,\n },\n ];\n\n constructor(\n protected store: Store,\n protected currentUser: CurrentUser,\n protected shares: SharesApiService,\n protected workspaces: WorkspacesService\n ) {\n super(store, workspaces, currentUser);\n }\n}\n","import { DeleteTrashedEntriesForever, OpenConfirmDialog, RestoreTrashedEntries, } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TrashActions extends DriveContextActions {\n protected actions = [\n {\n viewName: 'Restore',\n icon: 'restore',\n showInCompact: true,\n execute: () => {\n this.store.dispatch(new RestoreTrashedEntries());\n },\n visible: () => this.hasPermission('files.update'),\n },\n {\n viewName: 'Delete Forever',\n icon: 'delete-forever',\n showInCompact: true,\n execute: () => {\n this.deleteForever();\n },\n visible: () => this.hasPermission('files.delete'),\n },\n ];\n\n public deleteForever() {\n this.store.dispatch(new OpenConfirmDialog({\n title: 'Delete Forever',\n body: 'This will permanently delete selected items.',\n bodyBold: 'This action can not be undone.',\n ok: 'Delete Forever',\n }, new DeleteTrashedEntriesForever()));\n }\n}\n","import { EmptyTrash, OpenConfirmDialog, } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TrashPageActions extends DriveContextActions {\n protected actions = [\n {\n viewName: 'Empty Trash',\n icon: 'delete-forever',\n execute: () => {\n this.emptyTrash();\n },\n visible: () => this.hasPermission('files.delete'),\n },\n ];\n\n public emptyTrash() {\n this.store.dispatch(new OpenConfirmDialog({\n title: 'Empty Trash',\n body: 'All files and folders in your trash will be permanently deleted.',\n bodyBold: 'This action can not be undone.',\n ok: 'Empty Trash'\n }, new EmptyTrash()));\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DriveDomCacheService {\n public scrollCont: HTMLElement;\n public filesCont: HTMLElement;\n public filesContRect: ClientRect;\n public scrollContRect: ClientRect;\n public dragPreview: HTMLElement;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {Store} from '@ngxs/store';\nimport {OpenSearchPage} from '../state/actions/commands';\nimport {debounceTime, distinctUntilChanged, skip, startWith} from 'rxjs/operators';\nimport {DriveEntryApiService} from '../drive-entry-api.service';\nimport {BehaviorSubject, combineLatest, Subscription} from 'rxjs';\nimport {Router} from '@angular/router';\nimport {RouterState} from '@ngxs/router-plugin';\nimport isEqual from 'lodash/isEqual';\nimport {DriveState} from '../state/drive-state';\nimport {SearchInputWithFiltersComponent} from '../../../common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.component';\nimport {driveSearchFilters} from './drive-search-filters';\nimport {CurrentUser} from '../../../common/auth/current-user';\n\n@Component({\n selector: 'main-searchbar',\n templateUrl: './main-searchbar.component.html',\n styleUrls: ['./main-searchbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MainSearchbarComponent implements OnInit, OnDestroy {\n @ViewChild(SearchInputWithFiltersComponent, {read: ElementRef, static: true})\n searchEl: ElementRef<HTMLElement>;\n filters = driveSearchFilters(this.currentUser);\n searchControl = new FormControl();\n filterChange$ = new BehaviorSubject<string>(null);\n private metaSub: Subscription;\n\n constructor(\n private store: Store,\n private driveApi: DriveEntryApiService,\n private router: Router,\n private currentUser: CurrentUser\n ) {}\n\n ngOnInit() {\n // TODO: navigate from search page to drive homepage on blur\n // TODO: refactor permissions into advanced and remove mail template stuff\n this.metaSub = this.store.select(DriveState.meta).subscribe(meta => {\n // make sure nav searchbar color is always white if there are any filters set\n if (meta.query || meta.filters) {\n this.searchEl.nativeElement.classList.add('always-white');\n } else {\n this.searchEl.nativeElement.classList.remove('always-white');\n }\n });\n\n combineLatest([\n this.searchControl.valueChanges.pipe(distinctUntilChanged(), startWith(null)),\n this.filterChange$,\n ])\n // skip initial \"null\" values\n .pipe(skip(1), debounceTime(0))\n .subscribe(([query, filters]) => {\n const params = {query, filters};\n const oldParams = this.store.selectSnapshot(RouterState.state).root\n .queryParams;\n\n // if both filter and query are null it means form was reset and \"resetForm\" fn will be called\n const filtersOrQueryChanged =\n (query || filters) && !isEqual(oldParams, params);\n\n if (filtersOrQueryChanged) {\n this.store.dispatch(new OpenSearchPage(params));\n } else if (!filters && !query && this.inSearchPage()) {\n this.router.navigate(['/drive']);\n }\n });\n }\n\n ngOnDestroy() {\n this.metaSub?.unsubscribe();\n }\n\n openSearchPage() {\n // open search page on input focus if not already in search page\n if (!this.inSearchPage()) {\n this.store.dispatch(new OpenSearchPage());\n }\n }\n\n private inSearchPage(): boolean {\n return this.router.routerState.snapshot.url.includes('/drive/search');\n }\n}\n","import {\n DatatableFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {\n CreatedAtFilter,\n UpdatedAtFilter,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\nimport {FILE_ENTRY_TYPE_FILTER} from '../../../common/admin/file-entry-index/file-entry-index-filters';\nimport {CurrentUser} from '../../../common/auth/current-user';\n\nexport function driveSearchFilters(currentUSer: CurrentUser): DatatableFilter[] {\n return [\n FILE_ENTRY_TYPE_FILTER,\n new DatatableFilter({\n type: FilterControlType.Select,\n key: 'owner_id',\n label: 'Owner',\n description: 'User that this file was uploaded by',\n defaultValue: currentUSer.get('id'),\n options: [\n {key: 'Anyone', value: {value: null, operator: '!='}},\n {key: 'Owned by me', value: currentUSer.get('id')},\n {\n key: 'Not owned by me',\n value: {value: currentUSer.get('id'), operator: '!='},\n },\n ],\n }),\n new CreatedAtFilter({\n description: 'Date file was uploaded',\n }),\n new UpdatedAtFilter({\n description: 'Date file was last changed',\n }),\n new DatatableFilter({\n type: FilterControlType.StaticValue,\n key: 'deleted_at',\n label: 'Trashed',\n defaultOperator: FilterOperator.ne,\n defaultValue: null,\n description: 'Only show files that are in the trash',\n }),\n new DatatableFilter({\n type: FilterControlType.StaticValue,\n key: 'shareableLink',\n label: 'Has Shareable Link',\n description: 'Only show files that have a shareable link',\n defaultValue: '*',\n defaultOperator: FilterOperator.has,\n }),\n new DatatableFilter({\n type: FilterControlType.StaticValue,\n key: 'sharedByMe',\n label: 'Shared By Me',\n defaultValue: true,\n description:\n 'Only show files that are shared with someone',\n }),\n ];\n}\n","<search-input-with-filters\n class=\"nav-searchbar\"\n [compact]=\"true\"\n [searchControl]=\"searchControl\"\n [filters]=\"filters\"\n (inputFocus)=\"openSearchPage()\"\n (filterChange)=\"filterChange$.next($event)\"\n pluralName=\"files\"\n></search-input-with-filters>\n","import { Subscriber } from '../Subscriber';\nexport function mapTo(value) {\n return (source) => source.lift(new MapToOperator(value));\n}\nclass MapToOperator {\n constructor(value) {\n this.value = value;\n }\n call(subscriber, source) {\n return source.subscribe(new MapToSubscriber(subscriber, this.value));\n }\n}\nclass MapToSubscriber extends Subscriber {\n constructor(destination, value) {\n super(destination);\n this.value = value;\n }\n _next(x) {\n this.destination.next(this.value);\n }\n}\n//# sourceMappingURL=mapTo.js.map","import { Platform, PlatformModule } from '@angular/cdk/platform';\nimport { CdkScrollable, ScrollDispatcher, ViewportRuler, CdkScrollableModule } from '@angular/cdk/scrolling';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport { InjectionToken, Component, ChangeDetectionStrategy, ViewEncapsulation, ChangeDetectorRef, Inject, forwardRef, ElementRef, NgZone, EventEmitter, Optional, Input, HostBinding, Output, HostListener, QueryList, ContentChildren, ContentChild, ViewChild, NgModule } from '@angular/core';\nimport { MatCommonModule } from '@angular/material/core';\nimport { FocusTrapFactory, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nimport { Subject, fromEvent, merge } from 'rxjs';\nimport { filter, map, mapTo, takeUntil, distinctUntilChanged, take, startWith, debounceTime } from 'rxjs/operators';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Animations used by the Material drawers.\n * @docs-private\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/scrolling';\nimport * as ɵngcc2 from '@angular/cdk/a11y';\nimport * as ɵngcc3 from '@angular/cdk/platform';\nimport * as ɵngcc4 from '@angular/cdk/bidi';\nimport * as ɵngcc5 from '@angular/common';\n\nconst _c0 = [\"*\"];\nfunction MatDrawerContainer_div_0_Template(rf, ctx) { if (rf & 1) {\n const _r3 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 2);\n ɵngcc0.ɵɵlistener(\"click\", function MatDrawerContainer_div_0_Template_div_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r3); const ctx_r2 = ɵngcc0.ɵɵnextContext(); return ctx_r2._onBackdropClicked(); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r0 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassProp(\"mat-drawer-shown\", ctx_r0._isShowingBackdrop());\n} }\nfunction MatDrawerContainer_mat_drawer_content_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"mat-drawer-content\");\n ɵngcc0.ɵɵprojection(1, 2);\n ɵngcc0.ɵɵelementEnd();\n} }\nconst _c1 = [[[\"mat-drawer\"]], [[\"mat-drawer-content\"]], \"*\"];\nconst _c2 = [\"mat-drawer\", \"mat-drawer-content\", \"*\"];\nfunction MatSidenavContainer_div_0_Template(rf, ctx) { if (rf & 1) {\n const _r3 = ɵngcc0.ɵɵgetCurrentView();\n ɵngcc0.ɵɵelementStart(0, \"div\", 2);\n ɵngcc0.ɵɵlistener(\"click\", function MatSidenavContainer_div_0_Template_div_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r3); const ctx_r2 = ɵngcc0.ɵɵnextContext(); return ctx_r2._onBackdropClicked(); });\n ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n const ctx_r0 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵclassProp(\"mat-drawer-shown\", ctx_r0._isShowingBackdrop());\n} }\nfunction MatSidenavContainer_mat_sidenav_content_3_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵelementStart(0, \"mat-sidenav-content\", 3);\n ɵngcc0.ɵɵprojection(1, 2);\n ɵngcc0.ɵɵelementEnd();\n} }\nconst _c3 = [[[\"mat-sidenav\"]], [[\"mat-sidenav-content\"]], \"*\"];\nconst _c4 = [\"mat-sidenav\", \"mat-sidenav-content\", \"*\"];\nconst _c5 = \".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\\n\";\nconst matDrawerAnimations = {\n /** Animation that slides a drawer in and out. */\n transformDrawer: trigger('transform', [\n // We remove the `transform` here completely, rather than setting it to zero, because:\n // 1. Having a transform can cause elements with ripples or an animated\n // transform to shift around in Chrome with an RTL layout (see #10023).\n // 2. 3d transforms causes text to appear blurry on IE and Edge.\n state('open, open-instant', style({\n 'transform': 'none',\n 'visibility': 'visible',\n })),\n state('void', style({\n // Avoids the shadow showing up when closed in SSR.\n 'box-shadow': 'none',\n 'visibility': 'hidden',\n })),\n transition('void => open-instant', animate('0ms')),\n transition('void <=> open, open-instant => void', animate('400ms cubic-bezier(0.25, 0.8, 0.25, 1)'))\n ])\n};\n\n/**\n * Throws an exception when two MatDrawer are matching the same position.\n * @docs-private\n */\nfunction throwMatDuplicatedDrawerError(position) {\n throw Error(`A drawer was already declared for 'position=\"${position}\"'`);\n}\n/** Configures whether drawers should use auto sizing by default. */\nconst MAT_DRAWER_DEFAULT_AUTOSIZE = new InjectionToken('MAT_DRAWER_DEFAULT_AUTOSIZE', {\n providedIn: 'root',\n factory: MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY,\n});\n/**\n * Used to provide a drawer container to a drawer while avoiding circular references.\n * @docs-private\n */\nconst MAT_DRAWER_CONTAINER = new InjectionToken('MAT_DRAWER_CONTAINER');\n/** @docs-private */\nfunction MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY() {\n return false;\n}\nclass MatDrawerContent extends CdkScrollable {\n constructor(_changeDetectorRef, _container, elementRef, scrollDispatcher, ngZone) {\n super(elementRef, scrollDispatcher, ngZone);\n this._changeDetectorRef = _changeDetectorRef;\n this._container = _container;\n }\n ngAfterContentInit() {\n this._container._contentMarginChanges.subscribe(() => {\n this._changeDetectorRef.markForCheck();\n });\n }\n}\nMatDrawerContent.ɵfac = function MatDrawerContent_Factory(t) { return new (t || MatDrawerContent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(forwardRef(() => MatDrawerContainer)), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ScrollDispatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nMatDrawerContent.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatDrawerContent, selectors: [[\"mat-drawer-content\"]], hostAttrs: [1, \"mat-drawer-content\"], hostVars: 4, hostBindings: function MatDrawerContent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"margin-left\", ctx._container._contentMargins.left, \"px\")(\"margin-right\", ctx._container._contentMargins.right, \"px\");\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function MatDrawerContent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2, changeDetection: 0 });\nMatDrawerContent.ctorParameters = () => [\n { type: ChangeDetectorRef },\n { type: MatDrawerContainer, decorators: [{ type: Inject, args: [forwardRef(() => MatDrawerContainer),] }] },\n { type: ElementRef },\n { type: ScrollDispatcher },\n { type: NgZone }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatDrawerContent, [{\n type: Component,\n args: [{\n selector: 'mat-drawer-content',\n template: '<ng-content></ng-content>',\n host: {\n 'class': 'mat-drawer-content',\n '[style.margin-left.px]': '_container._contentMargins.left',\n '[style.margin-right.px]': '_container._contentMargins.right'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n }]\n }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: MatDrawerContainer, decorators: [{\n type: Inject,\n args: [forwardRef(() => MatDrawerContainer)]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.ScrollDispatcher }, { type: ɵngcc0.NgZone }]; }, null); })();\n/**\n * This component corresponds to a drawer that can be opened on the drawer container.\n */\nclass MatDrawer {\n constructor(_elementRef, _focusTrapFactory, _focusMonitor, _platform, _ngZone, _doc, _container) {\n this._elementRef = _elementRef;\n this._focusTrapFactory = _focusTrapFactory;\n this._focusMonitor = _focusMonitor;\n this._platform = _platform;\n this._ngZone = _ngZone;\n this._doc = _doc;\n this._container = _container;\n this._elementFocusedBeforeDrawerWasOpened = null;\n /** Whether the drawer is initialized. Used for disabling the initial animation. */\n this._enableAnimations = false;\n this._position = 'start';\n this._mode = 'over';\n this._disableClose = false;\n this._opened = false;\n /** Emits whenever the drawer has started animating. */\n this._animationStarted = new Subject();\n /** Emits whenever the drawer is done animating. */\n this._animationEnd = new Subject();\n /** Current state of the sidenav animation. */\n // @HostBinding is used in the class as it is expected to be extended. Since @Component decorator\n // metadata is not inherited by child classes, instead the host binding data is defined in a way\n // that can be inherited.\n // tslint:disable:no-host-decorator-in-concrete\n this._animationState = 'void';\n /** Event emitted when the drawer open state is changed. */\n this.openedChange = \n // Note this has to be async in order to avoid some issues with two-bindings (see #8872).\n new EventEmitter(/* isAsync */ true);\n /** Event emitted when the drawer has been opened. */\n this._openedStream = this.openedChange.pipe(filter(o => o), map(() => { }));\n /** Event emitted when the drawer has started opening. */\n this.openedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState.indexOf('open') === 0), mapTo(undefined));\n /** Event emitted when the drawer has been closed. */\n this._closedStream = this.openedChange.pipe(filter(o => !o), map(() => { }));\n /** Event emitted when the drawer has started closing. */\n this.closedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState === 'void'), mapTo(undefined));\n /** Emits when the component is destroyed. */\n this._destroyed = new Subject();\n /** Event emitted when the drawer's position changes. */\n // tslint:disable-next-line:no-output-on-prefix\n this.onPositionChanged = new EventEmitter();\n /**\n * An observable that emits when the drawer mode changes. This is used by the drawer container to\n * to know when to when the mode changes so it can adapt the margins on the content.\n */\n this._modeChanged = new Subject();\n this.openedChange.subscribe((opened) => {\n if (opened) {\n if (this._doc) {\n this._elementFocusedBeforeDrawerWasOpened = this._doc.activeElement;\n }\n this._takeFocus();\n }\n else if (this._isFocusWithinDrawer()) {\n this._restoreFocus();\n }\n });\n /**\n * Listen to `keydown` events outside the zone so that change detection is not run every\n * time a key is pressed. Instead we re-enter the zone only if the `ESC` key is pressed\n * and we don't have close disabled.\n */\n this._ngZone.runOutsideAngular(() => {\n fromEvent(this._elementRef.nativeElement, 'keydown').pipe(filter(event => {\n return event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event);\n }), takeUntil(this._destroyed)).subscribe(event => this._ngZone.run(() => {\n this.close();\n event.stopPropagation();\n event.preventDefault();\n }));\n });\n // We need a Subject with distinctUntilChanged, because the `done` event\n // fires twice on some browsers. See https://github.com/angular/angular/issues/24084\n this._animationEnd.pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n })).subscribe((event) => {\n const { fromState, toState } = event;\n if ((toState.indexOf('open') === 0 && fromState === 'void') ||\n (toState === 'void' && fromState.indexOf('open') === 0)) {\n this.openedChange.emit(this._opened);\n }\n });\n }\n /** The side that the drawer is attached to. */\n get position() { return this._position; }\n set position(value) {\n // Make sure we have a valid value.\n value = value === 'end' ? 'end' : 'start';\n if (value != this._position) {\n this._position = value;\n this.onPositionChanged.emit();\n }\n }\n /** Mode of the drawer; one of 'over', 'push' or 'side'. */\n get mode() { return this._mode; }\n set mode(value) {\n this._mode = value;\n this._updateFocusTrapState();\n this._modeChanged.next();\n }\n /** Whether the drawer can be closed with the escape key or by clicking on the backdrop. */\n get disableClose() { return this._disableClose; }\n set disableClose(value) { this._disableClose = coerceBooleanProperty(value); }\n /**\n * Whether the drawer should focus the first focusable element automatically when opened.\n * Defaults to false in when `mode` is set to `side`, otherwise defaults to `true`. If explicitly\n * enabled, focus will be moved into the sidenav in `side` mode as well.\n */\n get autoFocus() {\n const value = this._autoFocus;\n // Note that usually we disable auto focusing in `side` mode, because we don't know how the\n // sidenav is being used, but in some cases it still makes sense to do it. If the consumer\n // explicitly enabled `autoFocus`, we take it as them always wanting to enable it.\n return value == null ? this.mode !== 'side' : value;\n }\n set autoFocus(value) { this._autoFocus = coerceBooleanProperty(value); }\n /**\n * Whether the drawer is opened. We overload this because we trigger an event when it\n * starts or end.\n */\n get opened() { return this._opened; }\n set opened(value) { this.toggle(coerceBooleanProperty(value)); }\n /**\n * Moves focus into the drawer. Note that this works even if\n * the focus trap is disabled in `side` mode.\n */\n _takeFocus() {\n if (!this.autoFocus || !this._focusTrap) {\n return;\n }\n this._focusTrap.focusInitialElementWhenReady().then(hasMovedFocus => {\n // If there were no focusable elements, focus the sidenav itself so the keyboard navigation\n // still works. We need to check that `focus` is a function due to Universal.\n if (!hasMovedFocus && typeof this._elementRef.nativeElement.focus === 'function') {\n this._elementRef.nativeElement.focus();\n }\n });\n }\n /**\n * Restores focus to the element that was originally focused when the drawer opened.\n * If no element was focused at that time, the focus will be restored to the drawer.\n */\n _restoreFocus() {\n if (!this.autoFocus) {\n return;\n }\n // Note that we don't check via `instanceof HTMLElement` so that we can cover SVGs as well.\n if (this._elementFocusedBeforeDrawerWasOpened) {\n this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened, this._openedVia);\n }\n else {\n this._elementRef.nativeElement.blur();\n }\n this._elementFocusedBeforeDrawerWasOpened = null;\n this._openedVia = null;\n }\n /** Whether focus is currently within the drawer. */\n _isFocusWithinDrawer() {\n var _a;\n const activeEl = (_a = this._doc) === null || _a === void 0 ? void 0 : _a.activeElement;\n return !!activeEl && this._elementRef.nativeElement.contains(activeEl);\n }\n ngAfterContentInit() {\n this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);\n this._updateFocusTrapState();\n }\n ngAfterContentChecked() {\n // Enable the animations after the lifecycle hooks have run, in order to avoid animating\n // drawers that are open by default. When we're on the server, we shouldn't enable the\n // animations, because we don't want the drawer to animate the first time the user sees\n // the page.\n if (this._platform.isBrowser) {\n this._enableAnimations = true;\n }\n }\n ngOnDestroy() {\n if (this._focusTrap) {\n this._focusTrap.destroy();\n }\n this._animationStarted.complete();\n this._animationEnd.complete();\n this._modeChanged.complete();\n this._destroyed.next();\n this._destroyed.complete();\n }\n /**\n * Open the drawer.\n * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n * Used for focus management after the sidenav is closed.\n */\n open(openedVia) {\n return this.toggle(true, openedVia);\n }\n /** Close the drawer. */\n close() {\n return this.toggle(false);\n }\n /** Closes the drawer with context that the backdrop was clicked. */\n _closeViaBackdropClick() {\n // If the drawer is closed upon a backdrop click, we always want to restore focus. We\n // don't need to check whether focus is currently in the drawer, as clicking on the\n // backdrop causes blurring of the active element.\n return this._setOpen(/* isOpen */ false, /* restoreFocus */ true);\n }\n /**\n * Toggle this drawer.\n * @param isOpen Whether the drawer should be open.\n * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n * Used for focus management after the sidenav is closed.\n */\n toggle(isOpen = !this.opened, openedVia) {\n // If the focus is currently inside the drawer content and we are closing the drawer,\n // restore the focus to the initially focused element (when the drawer opened).\n return this._setOpen(isOpen, /* restoreFocus */ !isOpen && this._isFocusWithinDrawer(), openedVia);\n }\n /**\n * Toggles the opened state of the drawer.\n * @param isOpen Whether the drawer should open or close.\n * @param restoreFocus Whether focus should be restored on close.\n * @param openedVia Focus origin that can be optionally set when opening a drawer. The\n * origin will be used later when focus is restored on drawer close.\n */\n _setOpen(isOpen, restoreFocus, openedVia = 'program') {\n this._opened = isOpen;\n if (isOpen) {\n this._animationState = this._enableAnimations ? 'open' : 'open-instant';\n this._openedVia = openedVia;\n }\n else {\n this._animationState = 'void';\n if (restoreFocus) {\n this._restoreFocus();\n }\n }\n this._updateFocusTrapState();\n return new Promise(resolve => {\n this.openedChange.pipe(take(1)).subscribe(open => resolve(open ? 'open' : 'close'));\n });\n }\n _getWidth() {\n return this._elementRef.nativeElement ? (this._elementRef.nativeElement.offsetWidth || 0) : 0;\n }\n /** Updates the enabled state of the focus trap. */\n _updateFocusTrapState() {\n if (this._focusTrap) {\n // The focus trap is only enabled when the drawer is open in any mode other than side.\n this._focusTrap.enabled = this.opened && this.mode !== 'side';\n }\n }\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritten.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n _animationStartListener(event) {\n this._animationStarted.next(event);\n }\n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritten.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n _animationDoneListener(event) {\n this._animationEnd.next(event);\n }\n}\nMatDrawer.ɵfac = function MatDrawer_Factory(t) { return new (t || MatDrawer)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.FocusTrapFactory), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.Platform), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(MAT_DRAWER_CONTAINER, 8)); };\nMatDrawer.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatDrawer, selectors: [[\"mat-drawer\"]], hostAttrs: [\"tabIndex\", \"-1\", 1, \"mat-drawer\"], hostVars: 12, hostBindings: function MatDrawer_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵsyntheticHostListener(\"@transform.start\", function MatDrawer_animation_transform_start_HostBindingHandler($event) { return ctx._animationStartListener($event); })(\"@transform.done\", function MatDrawer_animation_transform_done_HostBindingHandler($event) { return ctx._animationDoneListener($event); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"align\", null);\n ɵngcc0.ɵɵsyntheticHostProperty(\"@transform\", ctx._animationState);\n ɵngcc0.ɵɵclassProp(\"mat-drawer-end\", ctx.position === \"end\")(\"mat-drawer-over\", ctx.mode === \"over\")(\"mat-drawer-push\", ctx.mode === \"push\")(\"mat-drawer-side\", ctx.mode === \"side\")(\"mat-drawer-opened\", ctx.opened);\n } }, inputs: { position: \"position\", mode: \"mode\", disableClose: \"disableClose\", autoFocus: \"autoFocus\", opened: \"opened\" }, outputs: { openedChange: \"openedChange\", _openedStream: \"opened\", openedStart: \"openedStart\", _closedStream: \"closed\", closedStart: \"closedStart\", onPositionChanged: \"positionChanged\" }, exportAs: [\"matDrawer\"], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[\"cdkScrollable\", \"\", 1, \"mat-drawer-inner-container\"]], template: function MatDrawer_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵelementEnd();\n } }, directives: [ɵngcc1.CdkScrollable], encapsulation: 2, data: { animation: [matDrawerAnimations.transformDrawer] }, changeDetection: 0 });\nMatDrawer.ctorParameters = () => [\n { type: ElementRef },\n { type: FocusTrapFactory },\n { type: FocusMonitor },\n { type: Platform },\n { type: NgZone },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n { type: MatDrawerContainer, decorators: [{ type: Optional }, { type: Inject, args: [MAT_DRAWER_CONTAINER,] }] }\n];\nMatDrawer.propDecorators = {\n position: [{ type: Input }],\n mode: [{ type: Input }],\n disableClose: [{ type: Input }],\n autoFocus: [{ type: Input }],\n opened: [{ type: Input }],\n _animationState: [{ type: HostBinding, args: ['@transform',] }],\n openedChange: [{ type: Output }],\n _openedStream: [{ type: Output, args: ['opened',] }],\n openedStart: [{ type: Output }],\n _closedStream: [{ type: Output, args: ['closed',] }],\n closedStart: [{ type: Output }],\n onPositionChanged: [{ type: Output, args: ['positionChanged',] }],\n _animationStartListener: [{ type: HostListener, args: ['@transform.start', ['$event'],] }],\n _animationDoneListener: [{ type: HostListener, args: ['@transform.done', ['$event'],] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatDrawer, [{\n type: Component,\n args: [{\n selector: 'mat-drawer',\n exportAs: 'matDrawer',\n template: \"<div class=\\\"mat-drawer-inner-container\\\" cdkScrollable>\\r\\n <ng-content></ng-content>\\r\\n</div>\\r\\n\",\n animations: [matDrawerAnimations.transformDrawer],\n host: {\n 'class': 'mat-drawer',\n // must prevent the browser from aligning text based on value\n '[attr.align]': 'null',\n '[class.mat-drawer-end]': 'position === \"end\"',\n '[class.mat-drawer-over]': 'mode === \"over\"',\n '[class.mat-drawer-push]': 'mode === \"push\"',\n '[class.mat-drawer-side]': 'mode === \"side\"',\n '[class.mat-drawer-opened]': 'opened',\n 'tabIndex': '-1'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc2.FocusTrapFactory }, { type: ɵngcc2.FocusMonitor }, { type: ɵngcc3.Platform }, { type: ɵngcc0.NgZone }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: MatDrawerContainer, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DRAWER_CONTAINER]\n }] }]; }, { _animationState: [{\n type: HostBinding,\n args: ['@transform']\n }], openedChange: [{\n type: Output\n }], _openedStream: [{\n type: Output,\n args: ['opened']\n }], openedStart: [{\n type: Output\n }], _closedStream: [{\n type: Output,\n args: ['closed']\n }], closedStart: [{\n type: Output\n }], onPositionChanged: [{\n type: Output,\n args: ['positionChanged']\n }], position: [{\n type: Input\n }], mode: [{\n type: Input\n }], disableClose: [{\n type: Input\n }], autoFocus: [{\n type: Input\n }], opened: [{\n type: Input\n }], \n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritten.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n _animationStartListener: [{\n type: HostListener,\n args: ['@transform.start', ['$event']]\n }], \n // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n // ViewEngine they're overwritten.\n // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n // tslint:disable-next-line:no-host-decorator-in-concrete\n _animationDoneListener: [{\n type: HostListener,\n args: ['@transform.done', ['$event']]\n }] }); })();\n/**\n * `<mat-drawer-container>` component.\n *\n * This is the parent component to one or two `<mat-drawer>`s that validates the state internally\n * and coordinates the backdrop and content styling.\n */\nclass MatDrawerContainer {\n constructor(_dir, _element, _ngZone, _changeDetectorRef, viewportRuler, defaultAutosize = false, _animationMode) {\n this._dir = _dir;\n this._element = _element;\n this._ngZone = _ngZone;\n this._changeDetectorRef = _changeDetectorRef;\n this._animationMode = _animationMode;\n /** Drawers that belong to this container. */\n this._drawers = new QueryList();\n /** Event emitted when the drawer backdrop is clicked. */\n this.backdropClick = new EventEmitter();\n /** Emits when the component is destroyed. */\n this._destroyed = new Subject();\n /** Emits on every ngDoCheck. Used for debouncing reflows. */\n this._doCheckSubject = new Subject();\n /**\n * Margins to be applied to the content. These are used to push / shrink the drawer content when a\n * drawer is open. We use margin rather than transform even for push mode because transform breaks\n * fixed position elements inside of the transformed element.\n */\n this._contentMargins = { left: null, right: null };\n this._contentMarginChanges = new Subject();\n // If a `Dir` directive exists up the tree, listen direction changes\n // and update the left/right properties to point to the proper start/end.\n if (_dir) {\n _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {\n this._validateDrawers();\n this.updateContentMargins();\n });\n }\n // Since the minimum width of the sidenav depends on the viewport width,\n // we need to recompute the margins if the viewport changes.\n viewportRuler.change()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this.updateContentMargins());\n this._autosize = defaultAutosize;\n }\n /** The drawer child with the `start` position. */\n get start() { return this._start; }\n /** The drawer child with the `end` position. */\n get end() { return this._end; }\n /**\n * Whether to automatically resize the container whenever\n * the size of any of its drawers changes.\n *\n * **Use at your own risk!** Enabling this option can cause layout thrashing by measuring\n * the drawers on every change detection cycle. Can be configured globally via the\n * `MAT_DRAWER_DEFAULT_AUTOSIZE` token.\n */\n get autosize() { return this._autosize; }\n set autosize(value) { this._autosize = coerceBooleanProperty(value); }\n /**\n * Whether the drawer container should have a backdrop while one of the sidenavs is open.\n * If explicitly set to `true`, the backdrop will be enabled for drawers in the `side`\n * mode as well.\n */\n get hasBackdrop() {\n if (this._backdropOverride == null) {\n return !this._start || this._start.mode !== 'side' || !this._end || this._end.mode !== 'side';\n }\n return this._backdropOverride;\n }\n set hasBackdrop(value) {\n this._backdropOverride = value == null ? null : coerceBooleanProperty(value);\n }\n /** Reference to the CdkScrollable instance that wraps the scrollable content. */\n get scrollable() {\n return this._userContent || this._content;\n }\n ngAfterContentInit() {\n this._allDrawers.changes\n .pipe(startWith(this._allDrawers), takeUntil(this._destroyed))\n .subscribe((drawer) => {\n this._drawers.reset(drawer.filter(item => !item._container || item._container === this));\n this._drawers.notifyOnChanges();\n });\n this._drawers.changes.pipe(startWith(null)).subscribe(() => {\n this._validateDrawers();\n this._drawers.forEach((drawer) => {\n this._watchDrawerToggle(drawer);\n this._watchDrawerPosition(drawer);\n this._watchDrawerMode(drawer);\n });\n if (!this._drawers.length ||\n this._isDrawerOpen(this._start) ||\n this._isDrawerOpen(this._end)) {\n this.updateContentMargins();\n }\n this._changeDetectorRef.markForCheck();\n });\n // Avoid hitting the NgZone through the debounce timeout.\n this._ngZone.runOutsideAngular(() => {\n this._doCheckSubject.pipe(debounceTime(10), // Arbitrary debounce time, less than a frame at 60fps\n takeUntil(this._destroyed)).subscribe(() => this.updateContentMargins());\n });\n }\n ngOnDestroy() {\n this._contentMarginChanges.complete();\n this._doCheckSubject.complete();\n this._drawers.destroy();\n this._destroyed.next();\n this._destroyed.complete();\n }\n /** Calls `open` of both start and end drawers */\n open() {\n this._drawers.forEach(drawer => drawer.open());\n }\n /** Calls `close` of both start and end drawers */\n close() {\n this._drawers.forEach(drawer => drawer.close());\n }\n /**\n * Recalculates and updates the inline styles for the content. Note that this should be used\n * sparingly, because it causes a reflow.\n */\n updateContentMargins() {\n // 1. For drawers in `over` mode, they don't affect the content.\n // 2. For drawers in `side` mode they should shrink the content. We do this by adding to the\n // left margin (for left drawer) or right margin (for right the drawer).\n // 3. For drawers in `push` mode the should shift the content without resizing it. We do this by\n // adding to the left or right margin and simultaneously subtracting the same amount of\n // margin from the other side.\n let left = 0;\n let right = 0;\n if (this._left && this._left.opened) {\n if (this._left.mode == 'side') {\n left += this._left._getWidth();\n }\n else if (this._left.mode == 'push') {\n const width = this._left._getWidth();\n left += width;\n right -= width;\n }\n }\n if (this._right && this._right.opened) {\n if (this._right.mode == 'side') {\n right += this._right._getWidth();\n }\n else if (this._right.mode == 'push') {\n const width = this._right._getWidth();\n right += width;\n left -= width;\n }\n }\n // If either `right` or `left` is zero, don't set a style to the element. This\n // allows users to specify a custom size via CSS class in SSR scenarios where the\n // measured widths will always be zero. Note that we reset to `null` here, rather\n // than below, in order to ensure that the types in the `if` below are consistent.\n left = left || null;\n right = right || null;\n if (left !== this._contentMargins.left || right !== this._contentMargins.right) {\n this._contentMargins = { left, right };\n // Pull back into the NgZone since in some cases we could be outside. We need to be careful\n // to do it only when something changed, otherwise we can end up hitting the zone too often.\n this._ngZone.run(() => this._contentMarginChanges.next(this._contentMargins));\n }\n }\n ngDoCheck() {\n // If users opted into autosizing, do a check every change detection cycle.\n if (this._autosize && this._isPushed()) {\n // Run outside the NgZone, otherwise the debouncer will throw us into an infinite loop.\n this._ngZone.runOutsideAngular(() => this._doCheckSubject.next());\n }\n }\n /**\n * Subscribes to drawer events in order to set a class on the main container element when the\n * drawer is open and the backdrop is visible. This ensures any overflow on the container element\n * is properly hidden.\n */\n _watchDrawerToggle(drawer) {\n drawer._animationStarted.pipe(filter((event) => event.fromState !== event.toState), takeUntil(this._drawers.changes))\n .subscribe((event) => {\n // Set the transition class on the container so that the animations occur. This should not\n // be set initially because animations should only be triggered via a change in state.\n if (event.toState !== 'open-instant' && this._animationMode !== 'NoopAnimations') {\n this._element.nativeElement.classList.add('mat-drawer-transition');\n }\n this.updateContentMargins();\n this._changeDetectorRef.markForCheck();\n });\n if (drawer.mode !== 'side') {\n drawer.openedChange.pipe(takeUntil(this._drawers.changes)).subscribe(() => this._setContainerClass(drawer.opened));\n }\n }\n /**\n * Subscribes to drawer onPositionChanged event in order to\n * re-validate drawers when the position changes.\n */\n _watchDrawerPosition(drawer) {\n if (!drawer) {\n return;\n }\n // NOTE: We need to wait for the microtask queue to be empty before validating,\n // since both drawers may be swapping positions at the same time.\n drawer.onPositionChanged.pipe(takeUntil(this._drawers.changes)).subscribe(() => {\n this._ngZone.onMicrotaskEmpty.pipe(take(1)).subscribe(() => {\n this._validateDrawers();\n });\n });\n }\n /** Subscribes to changes in drawer mode so we can run change detection. */\n _watchDrawerMode(drawer) {\n if (drawer) {\n drawer._modeChanged.pipe(takeUntil(merge(this._drawers.changes, this._destroyed)))\n .subscribe(() => {\n this.updateContentMargins();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n /** Toggles the 'mat-drawer-opened' class on the main 'mat-drawer-container' element. */\n _setContainerClass(isAdd) {\n const classList = this._element.nativeElement.classList;\n const className = 'mat-drawer-container-has-open';\n if (isAdd) {\n classList.add(className);\n }\n else {\n classList.remove(className);\n }\n }\n /** Validate the state of the drawer children components. */\n _validateDrawers() {\n this._start = this._end = null;\n // Ensure that we have at most one start and one end drawer.\n this._drawers.forEach(drawer => {\n if (drawer.position == 'end') {\n if (this._end != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throwMatDuplicatedDrawerError('end');\n }\n this._end = drawer;\n }\n else {\n if (this._start != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throwMatDuplicatedDrawerError('start');\n }\n this._start = drawer;\n }\n });\n this._right = this._left = null;\n // Detect if we're LTR or RTL.\n if (this._dir && this._dir.value === 'rtl') {\n this._left = this._end;\n this._right = this._start;\n }\n else {\n this._left = this._start;\n this._right = this._end;\n }\n }\n /** Whether the container is being pushed to the side by one of the drawers. */\n _isPushed() {\n return (this._isDrawerOpen(this._start) && this._start.mode != 'over') ||\n (this._isDrawerOpen(this._end) && this._end.mode != 'over');\n }\n _onBackdropClicked() {\n this.backdropClick.emit();\n this._closeModalDrawersViaBackdrop();\n }\n _closeModalDrawersViaBackdrop() {\n // Close all open drawers where closing is not disabled and the mode is not `side`.\n [this._start, this._end]\n .filter(drawer => drawer && !drawer.disableClose && this._canHaveBackdrop(drawer))\n .forEach(drawer => drawer._closeViaBackdropClick());\n }\n _isShowingBackdrop() {\n return (this._isDrawerOpen(this._start) && this._canHaveBackdrop(this._start)) ||\n (this._isDrawerOpen(this._end) && this._canHaveBackdrop(this._end));\n }\n _canHaveBackdrop(drawer) {\n return drawer.mode !== 'side' || !!this._backdropOverride;\n }\n _isDrawerOpen(drawer) {\n return drawer != null && drawer.opened;\n }\n}\nMatDrawerContainer.ɵfac = function MatDrawerContainer_Factory(t) { return new (t || MatDrawerContainer)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ViewportRuler), ɵngcc0.ɵɵdirectiveInject(MAT_DRAWER_DEFAULT_AUTOSIZE), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatDrawerContainer.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatDrawerContainer, selectors: [[\"mat-drawer-container\"]], contentQueries: function MatDrawerContainer_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatDrawerContent, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatDrawer, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._content = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._allDrawers = _t);\n } }, viewQuery: function MatDrawerContainer_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(MatDrawerContent, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._userContent = _t.first);\n } }, hostAttrs: [1, \"mat-drawer-container\"], hostVars: 2, hostBindings: function MatDrawerContainer_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"mat-drawer-container-explicit-backdrop\", ctx._backdropOverride);\n } }, inputs: { autosize: \"autosize\", hasBackdrop: \"hasBackdrop\" }, outputs: { backdropClick: \"backdropClick\" }, exportAs: [\"matDrawerContainer\"], features: [ɵngcc0.ɵɵProvidersFeature([{\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatDrawerContainer\n }])], ngContentSelectors: _c2, decls: 4, vars: 2, consts: [[\"class\", \"mat-drawer-backdrop\", 3, \"mat-drawer-shown\", \"click\", 4, \"ngIf\"], [4, \"ngIf\"], [1, \"mat-drawer-backdrop\", 3, \"click\"]], template: function MatDrawerContainer_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c1);\n ɵngcc0.ɵɵtemplate(0, MatDrawerContainer_div_0_Template, 1, 2, \"div\", 0);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵprojection(2, 1);\n ɵngcc0.ɵɵtemplate(3, MatDrawerContainer_mat_drawer_content_3_Template, 2, 0, \"mat-drawer-content\", 1);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.hasBackdrop);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx._content);\n } }, directives: [ɵngcc5.NgIf, MatDrawerContent], styles: [_c5], encapsulation: 2, changeDetection: 0 });\nMatDrawerContainer.ctorParameters = () => [\n { type: Directionality, decorators: [{ type: Optional }] },\n { type: ElementRef },\n { type: NgZone },\n { type: ChangeDetectorRef },\n { type: ViewportRuler },\n { type: undefined, decorators: [{ type: Inject, args: [MAT_DRAWER_DEFAULT_AUTOSIZE,] }] },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatDrawerContainer.propDecorators = {\n _allDrawers: [{ type: ContentChildren, args: [MatDrawer, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n },] }],\n _content: [{ type: ContentChild, args: [MatDrawerContent,] }],\n _userContent: [{ type: ViewChild, args: [MatDrawerContent,] }],\n autosize: [{ type: Input }],\n hasBackdrop: [{ type: Input }],\n backdropClick: [{ type: Output }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatDrawerContainer, [{\n type: Component,\n args: [{\n selector: 'mat-drawer-container',\n exportAs: 'matDrawerContainer',\n template: \"<div class=\\\"mat-drawer-backdrop\\\" (click)=\\\"_onBackdropClicked()\\\" *ngIf=\\\"hasBackdrop\\\"\\n [class.mat-drawer-shown]=\\\"_isShowingBackdrop()\\\"></div>\\n\\n<ng-content select=\\\"mat-drawer\\\"></ng-content>\\n\\n<ng-content select=\\\"mat-drawer-content\\\">\\n</ng-content>\\n<mat-drawer-content *ngIf=\\\"!_content\\\">\\n <ng-content></ng-content>\\n</mat-drawer-content>\\n\",\n host: {\n 'class': 'mat-drawer-container',\n '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [{\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatDrawerContainer\n }],\n styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\\n\"]\n }]\n }], function () { return [{ type: ɵngcc4.Directionality, decorators: [{\n type: Optional\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.ViewportRuler }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_DRAWER_DEFAULT_AUTOSIZE]\n }] }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }]; }, { backdropClick: [{\n type: Output\n }], autosize: [{\n type: Input\n }], hasBackdrop: [{\n type: Input\n }], _allDrawers: [{\n type: ContentChildren,\n args: [MatDrawer, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n }]\n }], _content: [{\n type: ContentChild,\n args: [MatDrawerContent]\n }], _userContent: [{\n type: ViewChild,\n args: [MatDrawerContent]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSidenavContent extends MatDrawerContent {\n constructor(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone) {\n super(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone);\n }\n}\nMatSidenavContent.ɵfac = function MatSidenavContent_Factory(t) { return new (t || MatSidenavContent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(forwardRef(() => MatSidenavContainer)), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ScrollDispatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nMatSidenavContent.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSidenavContent, selectors: [[\"mat-sidenav-content\"]], hostAttrs: [1, \"mat-drawer-content\", \"mat-sidenav-content\"], hostVars: 4, hostBindings: function MatSidenavContent_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"margin-left\", ctx._container._contentMargins.left, \"px\")(\"margin-right\", ctx._container._contentMargins.right, \"px\");\n } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function MatSidenavContent_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵprojection(0);\n } }, encapsulation: 2, changeDetection: 0 });\nMatSidenavContent.ctorParameters = () => [\n { type: ChangeDetectorRef },\n { type: MatSidenavContainer, decorators: [{ type: Inject, args: [forwardRef(() => MatSidenavContainer),] }] },\n { type: ElementRef },\n { type: ScrollDispatcher },\n { type: NgZone }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenavContent, [{\n type: Component,\n args: [{\n selector: 'mat-sidenav-content',\n template: '<ng-content></ng-content>',\n host: {\n 'class': 'mat-drawer-content mat-sidenav-content',\n '[style.margin-left.px]': '_container._contentMargins.left',\n '[style.margin-right.px]': '_container._contentMargins.right'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n }]\n }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: MatSidenavContainer, decorators: [{\n type: Inject,\n args: [forwardRef(() => MatSidenavContainer)]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.ScrollDispatcher }, { type: ɵngcc0.NgZone }]; }, null); })();\nclass MatSidenav extends MatDrawer {\n constructor() {\n super(...arguments);\n this._fixedInViewport = false;\n this._fixedTopGap = 0;\n this._fixedBottomGap = 0;\n }\n /** Whether the sidenav is fixed in the viewport. */\n get fixedInViewport() { return this._fixedInViewport; }\n set fixedInViewport(value) { this._fixedInViewport = coerceBooleanProperty(value); }\n /**\n * The gap between the top of the sidenav and the top of the viewport when the sidenav is in fixed\n * mode.\n */\n get fixedTopGap() { return this._fixedTopGap; }\n set fixedTopGap(value) { this._fixedTopGap = coerceNumberProperty(value); }\n /**\n * The gap between the bottom of the sidenav and the bottom of the viewport when the sidenav is in\n * fixed mode.\n */\n get fixedBottomGap() { return this._fixedBottomGap; }\n set fixedBottomGap(value) { this._fixedBottomGap = coerceNumberProperty(value); }\n}\nMatSidenav.ɵfac = /*@__PURE__*/ function () { let ɵMatSidenav_BaseFactory; return function MatSidenav_Factory(t) { return (ɵMatSidenav_BaseFactory || (ɵMatSidenav_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatSidenav)))(t || MatSidenav); }; }();\nMatSidenav.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSidenav, selectors: [[\"mat-sidenav\"]], hostAttrs: [\"tabIndex\", \"-1\", 1, \"mat-drawer\", \"mat-sidenav\"], hostVars: 17, hostBindings: function MatSidenav_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"align\", null);\n ɵngcc0.ɵɵstyleProp(\"top\", ctx.fixedInViewport ? ctx.fixedTopGap : null, \"px\")(\"bottom\", ctx.fixedInViewport ? ctx.fixedBottomGap : null, \"px\");\n ɵngcc0.ɵɵclassProp(\"mat-drawer-end\", ctx.position === \"end\")(\"mat-drawer-over\", ctx.mode === \"over\")(\"mat-drawer-push\", ctx.mode === \"push\")(\"mat-drawer-side\", ctx.mode === \"side\")(\"mat-drawer-opened\", ctx.opened)(\"mat-sidenav-fixed\", ctx.fixedInViewport);\n } }, inputs: { fixedInViewport: \"fixedInViewport\", fixedTopGap: \"fixedTopGap\", fixedBottomGap: \"fixedBottomGap\" }, exportAs: [\"matSidenav\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[\"cdkScrollable\", \"\", 1, \"mat-drawer-inner-container\"]], template: function MatSidenav_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵelementEnd();\n } }, directives: [ɵngcc1.CdkScrollable], encapsulation: 2, data: { animation: [matDrawerAnimations.transformDrawer] }, changeDetection: 0 });\nMatSidenav.propDecorators = {\n fixedInViewport: [{ type: Input }],\n fixedTopGap: [{ type: Input }],\n fixedBottomGap: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenav, [{\n type: Component,\n args: [{\n selector: 'mat-sidenav',\n exportAs: 'matSidenav',\n template: \"<div class=\\\"mat-drawer-inner-container\\\" cdkScrollable>\\r\\n <ng-content></ng-content>\\r\\n</div>\\r\\n\",\n animations: [matDrawerAnimations.transformDrawer],\n host: {\n 'class': 'mat-drawer mat-sidenav',\n 'tabIndex': '-1',\n // must prevent the browser from aligning text based on value\n '[attr.align]': 'null',\n '[class.mat-drawer-end]': 'position === \"end\"',\n '[class.mat-drawer-over]': 'mode === \"over\"',\n '[class.mat-drawer-push]': 'mode === \"push\"',\n '[class.mat-drawer-side]': 'mode === \"side\"',\n '[class.mat-drawer-opened]': 'opened',\n '[class.mat-sidenav-fixed]': 'fixedInViewport',\n '[style.top.px]': 'fixedInViewport ? fixedTopGap : null',\n '[style.bottom.px]': 'fixedInViewport ? fixedBottomGap : null'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n }]\n }], null, { fixedInViewport: [{\n type: Input\n }], fixedTopGap: [{\n type: Input\n }], fixedBottomGap: [{\n type: Input\n }] }); })();\nclass MatSidenavContainer extends MatDrawerContainer {\n}\nMatSidenavContainer.ɵfac = /*@__PURE__*/ function () { let ɵMatSidenavContainer_BaseFactory; return function MatSidenavContainer_Factory(t) { return (ɵMatSidenavContainer_BaseFactory || (ɵMatSidenavContainer_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatSidenavContainer)))(t || MatSidenavContainer); }; }();\nMatSidenavContainer.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSidenavContainer, selectors: [[\"mat-sidenav-container\"]], contentQueries: function MatSidenavContainer_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatSidenavContent, 5);\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatSidenav, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._content = _t.first);\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._allDrawers = _t);\n } }, hostAttrs: [1, \"mat-drawer-container\", \"mat-sidenav-container\"], hostVars: 2, hostBindings: function MatSidenavContainer_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵclassProp(\"mat-drawer-container-explicit-backdrop\", ctx._backdropOverride);\n } }, exportAs: [\"matSidenavContainer\"], features: [ɵngcc0.ɵɵProvidersFeature([{\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatSidenavContainer\n }]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c4, decls: 4, vars: 2, consts: [[\"class\", \"mat-drawer-backdrop\", 3, \"mat-drawer-shown\", \"click\", 4, \"ngIf\"], [\"cdkScrollable\", \"\", 4, \"ngIf\"], [1, \"mat-drawer-backdrop\", 3, \"click\"], [\"cdkScrollable\", \"\"]], template: function MatSidenavContainer_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef(_c3);\n ɵngcc0.ɵɵtemplate(0, MatSidenavContainer_div_0_Template, 1, 2, \"div\", 0);\n ɵngcc0.ɵɵprojection(1);\n ɵngcc0.ɵɵprojection(2, 1);\n ɵngcc0.ɵɵtemplate(3, MatSidenavContainer_mat_sidenav_content_3_Template, 2, 0, \"mat-sidenav-content\", 1);\n } if (rf & 2) {\n ɵngcc0.ɵɵproperty(\"ngIf\", ctx.hasBackdrop);\n ɵngcc0.ɵɵadvance(3);\n ɵngcc0.ɵɵproperty(\"ngIf\", !ctx._content);\n } }, directives: [ɵngcc5.NgIf, MatSidenavContent, ɵngcc1.CdkScrollable], styles: [_c5], encapsulation: 2, changeDetection: 0 });\nMatSidenavContainer.propDecorators = {\n _allDrawers: [{ type: ContentChildren, args: [MatSidenav, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n },] }],\n _content: [{ type: ContentChild, args: [MatSidenavContent,] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenavContainer, [{\n type: Component,\n args: [{\n selector: 'mat-sidenav-container',\n exportAs: 'matSidenavContainer',\n template: \"<div class=\\\"mat-drawer-backdrop\\\" (click)=\\\"_onBackdropClicked()\\\" *ngIf=\\\"hasBackdrop\\\"\\n [class.mat-drawer-shown]=\\\"_isShowingBackdrop()\\\"></div>\\n\\n<ng-content select=\\\"mat-sidenav\\\"></ng-content>\\n\\n<ng-content select=\\\"mat-sidenav-content\\\">\\n</ng-content>\\n<mat-sidenav-content *ngIf=\\\"!_content\\\" cdkScrollable>\\n <ng-content></ng-content>\\n</mat-sidenav-content>\\n\",\n host: {\n 'class': 'mat-drawer-container mat-sidenav-container',\n '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [{\n provide: MAT_DRAWER_CONTAINER,\n useExisting: MatSidenavContainer\n }],\n styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\\n\"]\n }]\n }], null, { _allDrawers: [{\n type: ContentChildren,\n args: [MatSidenav, {\n // We need to use `descendants: true`, because Ivy will no longer match\n // indirect descendants if it's left as false.\n descendants: true\n }]\n }], _content: [{\n type: ContentChild,\n args: [MatSidenavContent]\n }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSidenavModule {\n}\nMatSidenavModule.ɵfac = function MatSidenavModule_Factory(t) { return new (t || MatSidenavModule)(); };\nMatSidenavModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatSidenavModule });\nMatSidenavModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[\n CommonModule,\n MatCommonModule,\n PlatformModule,\n CdkScrollableModule,\n ], CdkScrollableModule,\n MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenavModule, [{\n type: NgModule,\n args: [{\n imports: [\n CommonModule,\n MatCommonModule,\n PlatformModule,\n CdkScrollableModule,\n ],\n exports: [\n CdkScrollableModule,\n MatCommonModule,\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent,\n ],\n declarations: [\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatSidenav,\n MatSidenavContainer,\n MatSidenavContent,\n ]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatSidenavModule, { declarations: function () { return [MatDrawer, MatDrawerContainer, MatDrawerContent, MatSidenav, MatSidenavContainer, MatSidenavContent]; }, imports: function () { return [CommonModule,\n MatCommonModule,\n PlatformModule,\n CdkScrollableModule]; }, exports: function () { return [CdkScrollableModule,\n MatCommonModule, MatDrawer, MatDrawerContainer, MatDrawerContent, MatSidenav, MatSidenavContainer, MatSidenavContent]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_DRAWER_DEFAULT_AUTOSIZE, MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY, MatDrawer, MatDrawerContainer, MatDrawerContent, MatSidenav, MatSidenavContainer, MatSidenavContent, MatSidenavModule, matDrawerAnimations, throwMatDuplicatedDrawerError, MAT_DRAWER_CONTAINER as ɵangular_material_src_material_sidenav_sidenav_a };\n\n//# sourceMappingURL=sidenav.js.map","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Inject } from '@angular/core';\nimport { Modal } from '@common/core/ui/dialogs/modal.service';\nimport { CrupdateFolderDialogComponent } from '../../folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\nimport { Select, Store } from '@ngxs/store';\nimport { UploadFiles } from '../../state/actions/commands';\nimport { UploadedFile } from '@common/uploads/uploaded-file';\nimport { UploadInputConfig } from '@common/uploads/upload-input-config';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DRIVE_UPLOAD_INPUT_CONFIG } from '../../upload-input-config';\n\n@Component({\n selector: 'sidebar-action-buttons',\n templateUrl: './sidebar-action-buttons.component.html',\n styleUrls: ['./sidebar-action-buttons.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SidebarActionButtonsComponent {\n @Select(DriveState.canUpload) canUpload$: Observable<boolean>;\n\n constructor(\n private dialog: Modal,\n private store: Store,\n @Inject(DRIVE_UPLOAD_INPUT_CONFIG) public uploadInputConfig: UploadInputConfig,\n ) {}\n\n public openNewFolderDialog() {\n this.dialog.open(CrupdateFolderDialogComponent);\n }\n\n public openUploadsPanel(files: UploadedFile[]) {\n this.store.dispatch(new UploadFiles(files));\n }\n}\n","<button\n mat-raised-button\n color=\"accent\"\n class=\"upload-button\"\n [disabled]=\"!(canUpload$ | async)\"\n [uploadButton]=\"uploadInputConfig\"\n (filesSelected)=\"openUploadsPanel($event)\"\n>\n <mat-icon svgIcon=\"cloud-upload\"></mat-icon>\n <span trans>Upload</span>\n</button>\n\n<button\n mat-raised-button\n color=\"accent\"\n class=\"new-folder-button\"\n [disabled]=\"!(canUpload$ | async)\"\n (click)=\"openNewFolderDialog()\"\n>\n <mat-icon svgIcon=\"create-new-folder\"></mat-icon>\n</button>\n","<mat-progress-bar mode=\"determinate\" color=\"accent\" [value]=\"spaceUsedPercent$ | async\"></mat-progress-bar>\n\n<div class=\"usage-info\" *ngIf=\"(spaceUsed$ | async) !== null; else skeleton\" @fadeIn>\n {{spaceUsed$ | async | formattedFileSize}} {{'of' | trans}} {{spaceAvailable$ | async | formattedFileSize }} {{'used' | trans}}\n</div>\n<ng-template #skeleton>\n <skeleton class=\"usage-info\" @fadeOut></skeleton>\n</ng-template>\n\n\n<div *ngIf=\"settings.get('billing.enable') && (!(workspaces.activeId$ | async) || (workspaces.activeWorkspace$ | async)?.currentUser?.is_owner)\">\n <a class=\"upgrade-link\" mat-button routerLink=\"/billing/upgrade\" target=\"_blank\" trans>Upgrade Storage</a>\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Select } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { Settings } from '@common/core/config/settings.service';\nimport { SKELETON_ANIMATIONS } from '../../../../common/core/ui/skeleton/skeleton-animations';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\n\n@Component({\n selector: 'available-space-indicator',\n templateUrl: './available-space-indicator.component.html',\n styleUrls: ['./available-space-indicator.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [SKELETON_ANIMATIONS],\n})\nexport class AvailableSpaceIndicatorComponent {\n @Select(DriveState.userSpaceUsed) spaceUsed$: Observable<number>;\n @Select(DriveState.userSpaceAvailable) spaceAvailable$: Observable<number>;\n @Select(DriveState.spaceUsedPercent) spaceUsedPercent$: Observable<number>;\n\n constructor(public settings: Settings, public workspaces: WorkspacesService) {}\n}\n","<div [matMenuTriggerFor]=\"workspaceMenu\" *ngIf=\"workspaces.activeWorkspace$ | async as selected\">\n <div class=\"left\">\n <div class=\"role-name\" trans>{{selected.name}}</div>\n <div class=\"member-count\">\n <span *ngIf=\"selected.default\" trans>Personal workspace</span>\n <span *ngIf=\"!selected.default\" trans>{{ ':count members' | trans:{count: selected?.members_count || 0} }}</span>\n </div>\n </div>\n <div class=\"right\">\n <mat-icon svgIcon=\"unfold-more\"></mat-icon>\n </div>\n</div>\n\n<mat-menu #workspaceMenu=\"matMenu\" class=\"workspace-menu\">\n <div mat-menu-item class=\"workspace-menu-item\" [class.active]=\"(workspaces.activeId$ | async) === workspace.id\" *ngFor=\"let workspace of workspaces.available$ | async\" (click)=\"selectWorkspace(workspace)\">\n <mat-icon svgIcon=\"check\" [class.visually-hidden]=\"(workspaces.activeId$ | async) !== workspace.id\"></mat-icon>\n <div>\n <div class=\"name\" trans>{{workspace.name}}</div>\n <div class=\"member-count\">\n <span *ngIf=\"workspace.default\" trans>Personal workspace</span>\n <span *ngIf=\"!workspace.default\" trans>{{ ':count members' | trans:{count: workspace?.members_count || 0} }}</span>\n </div>\n </div>\n <button type=\"button\" class=\"settings-button\" mat-icon-button *ngIf=\"!workspace.default\" (click)=\"openWorkspaceMembersModal(workspace); $event.stopPropagation()\">\n <mat-icon svgIcon=\"settings\"></mat-icon>\n </button>\n </div>\n <div mat-menu-item class=\"new-workspace-menu-item\" (click)=\"openCrupdateWorkspaceModal()\" *ngIf=\"currentUser.hasPermission('workspaces.create')\">\n <mat-icon svgIcon=\"add\"></mat-icon>\n <span trans>Create new workspace</span>\n </div>\n</mat-menu>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n OnInit,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport {Workspace} from '../types/workspace';\nimport {MatMenuTrigger} from '@angular/material/menu';\nimport {WorkspacesService} from '../workspaces.service';\nimport {Modal} from '../../core/ui/dialogs/modal.service';\nimport {CurrentUser} from '../../auth/current-user';\nimport {BackendErrorResponse} from '../../core/types/backend-error-response';\nimport {HttpErrors} from '../../core/http/errors/http-errors.enum';\nimport {ConfirmModalComponent} from '../../core/ui/confirm-modal/confirm-modal.component';\nimport {filter} from 'rxjs/operators';\nimport {DELETE_RESOURCE_MESSAGE} from '../../datatable/delete-resource-message';\nimport {Toast} from '../../core/ui/toast.service';\n\n@Component({\n selector: 'workspace-selector',\n templateUrl: './workspace-selector.component.html',\n styleUrls: ['./workspace-selector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkspaceSelectorComponent implements OnInit {\n @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger;\n\n constructor(\n private modal: Modal,\n public workspaces: WorkspacesService,\n public currentUser: CurrentUser,\n private toast: Toast,\n private vcr: ViewContainerRef,\n private cd: ChangeDetectorRef\n ) {}\n\n ngOnInit() {\n this.workspaces.indexUserWorkspaces().subscribe();\n }\n\n public openCrupdateWorkspaceModal(workspace?: Workspace) {\n import('src/common/workspaces/workspace.module').then(m => {\n // will have wrong WorkspacesService instance without passing viewContainerRef\n this.modal.open(\n m.WorkspaceModule.components.crupdateModal,\n {workspace},\n {viewContainerRef: this.vcr}\n );\n this.cd.markForCheck();\n });\n }\n\n public openWorkspaceMembersModal(workspace: Workspace) {\n import('src/common/workspaces/workspace.module').then(m => {\n this.modal.open(\n m.WorkspaceModule.components.manageMembers,\n {workspace},\n {viewContainerRef: this.vcr}\n );\n this.cd.markForCheck();\n this.menuTrigger.closeMenu();\n });\n }\n\n public maybeDeleteWorkspace(workspace: Workspace) {\n const data = {\n ...DELETE_RESOURCE_MESSAGE,\n replacements: {resource: 'workspace'},\n };\n this.modal\n .open(ConfirmModalComponent, data)\n .afterClosed()\n .pipe(filter(confirmed => confirmed))\n .subscribe(() => {\n this.workspaces.delete([workspace.id]).subscribe(\n () => {\n this.toast.open('Workspace deleted.');\n },\n (errResponse: BackendErrorResponse) => {\n this.toast.open(\n errResponse.message || HttpErrors.Default\n );\n }\n );\n });\n }\n\n public selectWorkspace(workspace: Workspace) {\n this.workspaces.select(workspace.id);\n this.menuTrigger.closeMenu();\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { DriveUrlsService } from '../drive-urls.service';\nimport { DriveState } from '../state/drive-state';\nimport { Select, Store } from '@ngxs/store';\nimport { Observable } from 'rxjs';\nimport { OpenFolder } from '../state/actions/commands';\nimport { DrivePage } from '../state/models/drive-page';\nimport { DriveFolder } from '../folders/models/driveFolder';\n\n@Component({\n selector: 'sidebar',\n templateUrl: './sidebar.component.html',\n styleUrls: ['./sidebar.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SidebarComponent {\n @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n @Select(DriveState.rootFolder) rootFolder$: Observable<DriveFolder>;\n\n constructor(\n public urls: DriveUrlsService,\n private store: Store\n ) {}\n\n public openFolder(folder: DriveFolder) {\n this.store.dispatch(new OpenFolder(folder));\n }\n}\n","<div class=\"sidebar-body\">\n <sidebar-action-buttons></sidebar-action-buttons>\n\n <div class=\"drive-folders\">\n <div class=\"sidebar-menu-item\" [routerLink]=\"urls.driveRoot()\" routerLinkActive=\"active\" [routerLinkActiveOptions]=\"{exact: true}\" [folderDropTarget]=\"rootFolder$ | async\">\n <mat-icon svgIcon=\"arrow-drop-down\" class=\"toggle-expansion-icon\" [class.expanded]=\"driveTree.expanded\" (click)=\"driveTree.toggle(); $event.stopPropagation()\"></mat-icon>\n <mat-icon svgIcon=\"network-drive-custom\"></mat-icon>\n <span class=\"text\" trans>All Files</span>\n </div>\n <folders-tree (folderSelected)=\"openFolder($event)\" #driveTree></folders-tree>\n </div>\n\n <custom-menu class=\"sidebar-menu\" position=\"drive-sidebar\" itemClass=\"sidebar-menu-item\"></custom-menu>\n\n <div class=\"usage-container\">\n <mat-icon svgIcon=\"storage\"></mat-icon>\n <available-space-indicator></available-space-indicator>\n </div>\n</div>\n\n<div class=\"sidebar-footer\">\n <workspace-selector></workspace-selector>\n</div>\n\n\n","<ng-container *ngIf=\"entry$ | async as entry\">\n <ng-container *ngIf=\"savingDescription$ | async; else descriptionSaved\">\n <span trans>Saving...</span>\n </ng-container>\n <ng-template #descriptionSaved>\n <div class=\"input-container\" *ngIf=\"editingDescription$ | async; else descriptionEl\">\n <label for=\"description\" class=\"hidden\" trans>Description</label>\n <textarea\n rows=\"4\"\n id=\"description\"\n #textArea\n [value]=\"entry.description\"\n (enterKeybind)=\"textArea.blur()\"\n (blur)=\"updateDescription(entry, textArea.value)\"\n ></textarea>\n </div>\n <ng-template #descriptionEl>\n <div class=\"description-text\" (click)=\"editDescription()\">{{entry.description || ('Add a description' | trans)}}</div>\n <button mat-icon-button (click)=\"editDescription()\" [matTooltip]=\"'Edit description' | trans\">\n <mat-icon svgIcon=\"edit\"></mat-icon>\n </button>\n </ng-template>\n </ng-template>\n</ng-container>","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, QueryList, ViewChildren, ViewEncapsulation } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { UpdateEntryDescription } from '../../../state/actions/commands';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../../state/drive-state';\nimport { DriveEntry } from '../../../files/models/drive-entry';\nimport { finalize } from 'rxjs/operators';\n\n@Component({\n selector: 'entry-description-panel',\n templateUrl: './entry-description-panel.component.html',\n styleUrls: ['./entry-description-panel.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntryDescriptionPanelComponent implements AfterViewInit {\n @Select(DriveState.selectedEntryOrActiveFolder) entry$: Observable<DriveEntry>;\n @ViewChildren('textArea') textArea: QueryList<ElementRef<HTMLTextAreaElement>>;\n public editingDescription$ = new BehaviorSubject(false);\n public savingDescription$ = new BehaviorSubject(false);\n\n constructor(private store: Store) {}\n\n public ngAfterViewInit() {\n this.textArea.changes.subscribe(queryList => {\n queryList.length && queryList.first.nativeElement.focus();\n });\n }\n\n public editDescription() {\n this.editingDescription$.next(true);\n }\n\n public updateDescription(entry: FileEntry, value: string) {\n this.editingDescription$.next(false);\n if (entry.description === value) return;\n this.savingDescription$.next(true);\n this.store.dispatch(new UpdateEntryDescription(entry, value))\n .pipe(finalize(() => this.savingDescription$.next(false)))\n .subscribe();\n }\n}\n","<img [src]=\"getPreviewUrl()\"\n *ngIf=\"file.type === 'image'\"\n [ngClass]=\"file.type+'-file'\"\n class=\"file-color\"\n draggable=\"false\">\n\n<file-icon *ngIf=\"file.type !== 'image'\" [type]=\"file.type === 'folder' ? getFolderIcon() : file.type\"></file-icon>","import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { DriveEntry } from '../../models/drive-entry';\n\n@Component({\n selector: 'file-thumbnail',\n templateUrl: './file-thumbnail.component.html',\n styleUrls: ['./file-thumbnail.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FileThumbnailComponent {\n @Input() file: DriveEntry;\n\n public getPreviewUrl(): string {\n let url = this.file.url;\n if (this.file.thumbnail) {\n const separator = url.includes('?') ? '&' : '?';\n url += separator + 'thumbnail=true';\n }\n return url;\n }\n\n public getFolderIcon() {\n if (this.file.users && this.file.users.length > 1) {\n return 'shared-folder';\n } else {\n return 'folder';\n }\n }\n}\n","<ng-container *ngIf=\"entry$ | async as entry; else nothingSelected\">\n <ng-container *ngIf=\"entry.updated_at; else nothingSelected\">\n <file-thumbnail *ngIf=\"entry.type === 'image'\" class=\"preview\" [file]=\"entry\"></file-thumbnail>\n <div class=\"users-list\">\n <mat-icon class=\"users-list-img workspace-img\" svgIcon=\"groups\" *ngIf=\"entry.workspace_id\" [matTooltip]=\"'Everyone at :workspace workspace' | trans:{workspace: (workspaces.activeWorkspace$ | async)?.name}\"></mat-icon>\n <img class=\"users-list-img\" *ngFor=\"let user of entry.users\" [src]=\"user.avatar\" [matTooltip]=\"user.display_name\">\n </div>\n <div class=\"details-list\">\n <div class=\"item\">\n <div class=\"name\" trans>Type</div>\n <div class=\"value type-value\">{{entry.type | trans}}</div>\n </div>\n <div class=\"item\">\n <div class=\"name\" trans>Size</div>\n <div class=\"value\">{{entry.file_size | formattedFileSize}}</div>\n </div>\n <div class=\"item\">\n <div class=\"name\" trans>Storage Used</div>\n <div class=\"value\">{{entry.file_size | formattedFileSize}}</div>\n </div>\n <div class=\"item location-item\">\n <div class=\"name\" trans>Location</div>\n <div class=\"value\" (click)=\"openLocation()\">\n <mat-icon svgIcon=\"folder\"></mat-icon>\n <span class=\"text\">{{(parent$ | async)?.name || ('All Files') | trans}}</span>\n </div>\n </div>\n <div class=\"item\" *ngIf=\"owner$ | async as owner\">\n <div class=\"name\" trans>Owner</div>\n <div class=\"value\">{{owner.display_name}}</div>\n </div>\n <div class=\"item\">\n <div class=\"name\" trans>Last Updated</div>\n <div class=\"value\">{{entry.updated_at | formattedDate}}</div>\n </div>\n <div class=\"item\">\n <div class=\"name\" trans>Created</div>\n <div class=\"value\">{{entry.created_at | formattedDate}}</div>\n </div>\n <entry-description-panel></entry-description-panel>\n </div>\n </ng-container>\n</ng-container>\n\n<ng-template #nothingSelected>\n <div class=\"nothing-selected\">\n <mat-icon svgIcon=\"selection-tool-custom\" class=\"icon\"></mat-icon>\n <div class=\"text\" trans>Select file or folder to view its details.</div>\n </div>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { OpenFolder } from '../../state/actions/commands';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\nimport { map } from 'rxjs/operators';\n\n@Component({\n selector: 'details-panel',\n templateUrl: './details-panel.component.html',\n styleUrls: ['./details-panel.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DetailsPanelComponent {\n @Select(DriveState.selectedEntryOrActiveFolder) entry$: Observable<DriveEntry>;\n @Select(DriveState.selectedEntryParent) parent$: Observable<DriveFolder>;\n public owner$ = this.store.select(DriveState.selectedEntryOrActiveFolder)\n .pipe(map(e => (e?.users || []).find(u => u.owns_entry)));\n\n constructor(\n private store: Store,\n public workspaces: WorkspacesService,\n ) {}\n\n public openLocation() {\n const parent = this.store.selectSnapshot(DriveState.selectedEntryParent);\n this.store.dispatch(new OpenFolder(parent));\n }\n}\n","<div class=\"header\">\n <div class=\"title\">\n <ng-container *ngIf=\"entry$ | async as entry; else defaultTitle\">\n <ng-container *ngIf=\"entry.type; else defaultTitle\">\n <file-icon [type]=\"entry.type\"></file-icon>\n <div class=\"name\">{{entry.name}}</div>\n </ng-container>\n </ng-container>\n <ng-template #defaultTitle>\n <file-icon type=\"folder\"></file-icon>\n <div class=\"name\">{{ ((activePage$ | async)?.viewName) | trans }}</div>\n </ng-template>\n <button mat-icon-button class=\"close-button\" (click)=\"close()\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n </div>\n</div>\n<details-panel></details-panel>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState} from '../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DriveEntry } from '../files/models/drive-entry';\nimport { ToggleDetailsSidebar } from '../state/actions/commands';\nimport { DrivePage } from '../state/models/drive-page';\n\n@Component({\n selector: 'details-sidebar',\n templateUrl: './details-sidebar.component.html',\n styleUrls: ['./details-sidebar.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DetailsSidebarComponent {\n @Select(DriveState.selectedEntryOrActiveFolder) entry$: Observable<DriveEntry>;\n @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n\n constructor(private store: Store) {}\n\n public close() {\n this.store.dispatch(new ToggleDetailsSidebar());\n }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, HostBinding } from '@angular/core';\nimport { DriveEntry } from '../../../models/drive-entry';\n\n@Component({\n selector: 'files-grid-item',\n templateUrl: './files-grid-item.component.html',\n styleUrls: ['./files-grid-item.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilesGridItemComponent {\n @HostBinding('class.drive-entry') driveEntry = true;\n @Input() entry: DriveEntry;\n\n @HostBinding('attr.data-id') get fileId() {\n return this.entry.id;\n }\n}\n","<div class=\"preview-container\">\n <file-thumbnail class=\"preview\" [file]=\"entry\"></file-thumbnail>\n</div>\n<figcaption class=\"files-grid-item-footer\">\n <file-icon [type]=\"entry.type\"></file-icon>\n <div class=\"text\">{{entry.name}}</div>\n</figcaption>\n","import { Injectable } from '@angular/core';\nimport { EntriesSelectedViaDrag } from '../state/actions/events';\nimport { Store } from '@ngxs/store';\nimport { DriveDomCacheService } from './drive-dom-cache.service';\nimport { DriveState } from '../state/drive-state';\n\nconst GRID_ITEM_SELECTOR = '.drive-entry';\n\ntype AreaEdge = 'top'|'left'|'right'|'bottom'|false;\n\ninterface SelectorRect extends ClientRect {\n height: number;\n width: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesDragSelectService {\n private selectBox: HTMLDivElement;\n private initial = {x: 0, y: 0, scrollTop: 0};\n private lastPanEvent: HammerInput|null;\n private scrollListener: EventListener;\n private gridElements: HTMLElement[];\n\n constructor(\n private store: Store,\n private cache: DriveDomCacheService,\n ) {}\n\n public start(e: HammerInput) {\n this.cacheClientRects();\n this.createSelectBox();\n this.bindScroll();\n this.gridElements = this.getGridElements();\n\n this.initial = {\n ...this.hammerToRelative(e),\n scrollTop: this.cache.scrollCont.scrollTop,\n };\n\n this.selectBox.style.top = this.initial.y + 'px';\n this.selectBox.style.left = this.initial.x + 'px';\n\n\n }\n\n public move(e: HammerInput) {\n this.lastPanEvent = e;\n this.resizeBox(e);\n }\n\n public end() {\n this.removeSelectBox();\n this.dispatchSelectedAction();\n this.unbindScroll();\n this.gridElements = [];\n }\n\n public resizeBox(e?: HammerInput|null) {\n if ( ! e) e = this.lastPanEvent;\n if ( ! e || ! this.selectBox) return;\n const newPos = this.getNewSelectorPosition(e);\n this.scrollAndRepositionSelector(newPos);\n this.selectIntersectingElements();\n }\n\n /**\n * Calculate new position of selector box.\n */\n private getNewSelectorPosition(e: HammerInput): SelectorRect {\n const current = this.hammerToRelative(e);\n\n let tmp,\n x1 = this.initial.x,\n y1 = this.initial.y,\n x2 = current.x,\n y2 = current.y;\n\n if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }\n if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }\n\n return {\n width: x2 - x1,\n height: y2 - y1,\n top: y1,\n right: x1 + (x2 - x1), // left + width\n bottom: y1 + (y2 - y1), // top + height\n left: x1,\n };\n }\n\n /**\n * Check if specified position intersects any container edge.\n */\n private reachedAreaEdge(newPos: ClientRect): AreaEdge {\n const area = this.rectToRelative(this.cache.filesContRect);\n\n if (newPos.left <= area.left) {\n return 'left';\n } else if (newPos.top <= area.top) {\n return 'top';\n } else if (newPos.right >= area.right) {\n return 'right';\n } else if (newPos.bottom >= area.bottom) {\n return 'bottom';\n }\n\n return false;\n }\n\n /**\n * Auto scroll container (if needed) and reposition selector box.\n */\n private scrollAndRepositionSelector(newPos: SelectorRect) {\n const area = this.cache.scrollCont,\n edge = this.reachedAreaEdge(newPos);\n\n // make sure top always starts at the same coordinates\n // regardless of any scrolling done during dragging\n newPos.top += this.initial.scrollTop;\n\n // auto scroll when cursor reaches container edge\n if (edge === 'bottom') {\n area.scrollBy({top: 4});\n } else if (edge === 'top') {\n area.scrollBy({top: -4});\n }\n\n // scroll diff between drag start and now (auto scroll or mouse wheel)\n const scrollDiff = this.cache.scrollCont.scrollTop - this.initial.scrollTop,\n scrollValue = Math.abs(scrollDiff);\n\n // top needs to be changed only if scroll direction is top\n if (scrollDiff < 0) {\n newPos.top -= scrollValue;\n }\n\n // height needs to be changed regardless of direction and method\n newPos.height += scrollValue;\n\n // check if we have reached bottom edge again, after scroll values are applied\n const reachedBottom = (newPos.top + newPos.height) >= this.cache.scrollCont.scrollHeight;\n\n // if any select area edge is reached, bail\n if (edge === 'left' || edge === 'right' || reachedBottom) return;\n\n // finally, reposition select box with scroll values applied\n this.applyPosition(newPos);\n }\n\n /**\n * Apply specified position to selector box.\n */\n private applyPosition(newPos: ClientRect) {\n this.selectBox.style.width = newPos.width + 'px';\n this.selectBox.style.height = newPos.height + 'px';\n this.selectBox.style.left = newPos.left + 'px';\n this.selectBox.style.top = newPos.top + 'px';\n }\n\n private selectIntersectingElements() {\n const selectedBoxRect = this.selectBox.getBoundingClientRect();\n this.gridElements.forEach((gridItem: HTMLElement) => {\n const rect = gridItem.getBoundingClientRect();\n\n // item intersects the select box\n if (rect.top + rect.height > selectedBoxRect.top\n && rect.left + rect.width > selectedBoxRect.left\n && rect.bottom - rect.height < selectedBoxRect.bottom\n && rect.right - rect.width < selectedBoxRect.right) {\n gridItem.classList.add('selected');\n } else {\n gridItem.classList.remove('selected');\n }\n });\n }\n\n /**\n * Transform absolute container client rect into relative.\n */\n private rectToRelative(rect: ClientRect): ClientRect {\n return {\n width: rect.width,\n height: rect.height,\n left: rect.left - this.cache.filesContRect.left,\n top: rect.top - this.cache.filesContRect.top,\n right: rect.right - this.cache.filesContRect.left,\n bottom: rect.bottom - this.cache.filesContRect.top\n };\n }\n\n /**\n * Transform hammer absolute event to relative coordinates.\n */\n private hammerToRelative(e: HammerInput) {\n return {\n x: e.center.x - this.cache.filesContRect.left,\n y: e.center.y - this.cache.filesContRect.top\n };\n }\n\n private dispatchSelectedAction() {\n const ids = this.gridElements\n .filter(el => el.classList.contains('selected'))\n .map(el => +el.dataset.id);\n\n const entries = this.store.selectSnapshot(DriveState.entries)\n .filter(entry => ids.indexOf(entry.id) > -1);\n\n this.store.dispatch(new EntriesSelectedViaDrag(entries));\n }\n\n private createSelectBox() {\n this.selectBox = document.createElement('div');\n this.selectBox.classList.add('files-select-box');\n this.cache.filesCont.appendChild(this.selectBox);\n }\n\n public removeSelectBox() {\n if ( ! this.selectBox) return;\n this.selectBox.remove();\n this.selectBox = null;\n }\n\n public dragging() {\n return !!this.selectBox;\n }\n\n private cacheClientRects() {\n this.cache.filesContRect = this.cache.filesCont.getBoundingClientRect();\n this.cache.scrollContRect = this.cache.scrollCont.getBoundingClientRect();\n }\n\n private getGridElements(): HTMLElement[] {\n return Array.from(this.cache.filesCont.querySelectorAll(GRID_ITEM_SELECTOR));\n }\n\n private bindScroll() {\n this.scrollListener = () => this.resizeBox();\n this.cache.scrollCont.addEventListener('scroll', this.scrollListener);\n }\n\n private unbindScroll() {\n this.cache.scrollCont.removeEventListener('scroll', this.scrollListener);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { DriveDomCacheService } from './drive-dom-cache.service';\nimport { Store } from '@ngxs/store';\nimport { StoppedDragging } from '../state/actions/events';\nimport { StartedDragging } from '../state/actions/events';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DragEntryService {\n constructor(\n private domCache: DriveDomCacheService,\n private store: Store\n ) {}\n\n public start(e: HammerInput) {\n this.store.dispatch(new StartedDragging());\n }\n\n public move(e: HammerInput) {\n this.domCache.dragPreview.style.top = e.center.y + 'px';\n this.domCache.dragPreview.style.left = e.center.x + 'px';\n }\n\n public end() {\n this.store.dispatch(new StoppedDragging());\n }\n}\n","import {\n ContentChildren, Directive, ElementRef, NgZone, OnDestroy, OnInit, QueryList\n} from '@angular/core';\nimport { FilesGridItemComponent } from '../files/components/files-grid/files-grid-item/files-grid-item.component';\nimport { Store } from '@ngxs/store';\nimport { EntryDoubleTapped, EntryTapped } from '../state/actions/events';\nimport { DragEntryService } from './drag-entry.service';\nimport { DeselectAllEntries, SelectEntries } from '../state/actions/commands';\nimport { DriveState } from '../state/drive-state';\nimport { DriveEntry } from '../files/models/drive-entry';\nimport { FilesDragSelectService } from './files-drag-select.service';\nimport { DriveDomCacheService } from './drive-dom-cache.service';\nimport { Subscription } from 'rxjs';\n\n@Directive({\n selector: '[driveHammerInteractions]'\n})\nexport class DriveHammerInteractionsDirective implements OnInit, OnDestroy {\n @ContentChildren(FilesGridItemComponent, {descendants: true}) gridItems: QueryList<FilesGridItemComponent>;\n\n private hammerManager: HammerManager;\n private panService: FilesDragSelectService|DragEntryService|null;\n private subscriptions: Subscription[] = [];\n\n constructor(\n private zone: NgZone,\n private el: ElementRef,\n private store: Store,\n private dragSelect: FilesDragSelectService,\n private dragEntry: DragEntryService,\n private domCache: DriveDomCacheService,\n ) {}\n\n ngOnInit() {\n this.bindToHammer();\n\n // disable \"pan\" on mobile as it will prevent scrolling\n const sub = this.store.select(DriveState.isMobile).subscribe(isMobile => {\n this.hammerManager.get('pan').set({\n enable: !isMobile\n });\n this.hammerManager.get('doubletap').set({\n enable: !isMobile\n });\n });\n\n this.subscriptions.push(sub);\n }\n\n ngOnDestroy() {\n this.dragSelect.removeSelectBox();\n this.subscriptions.forEach(sub => sub.unsubscribe());\n }\n\n private bindToHammer() {\n this.createHammerManager();\n this.onPanStart();\n this.onPan();\n this.onPanEnd();\n this.onTap();\n this.onDoubleTap();\n }\n\n private createHammerManager() {\n this.zone.runOutsideAngular(() => {\n this.hammerManager = new Hammer.Manager(this.domCache.filesCont);\n\n const tap = new Hammer.Tap(),\n pan = new Hammer.Pan(),\n doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });\n\n this.hammerManager.add([tap, doubleTap, pan]);\n this.hammerManager.get('doubletap').recognizeWith('tap');\n });\n }\n\n private onPanStart() {\n this.hammerManager.on('panstart', e => {\n const gridElement = this.getEntryEl(e);\n\n if (gridElement) {\n this.panService = this.dragEntry;\n const entry = this.getEntryByEl(gridElement),\n selectedEntries = this.store.selectSnapshot(DriveState.selectedEntries);\n\n // select entry, if not already selected\n if ( ! selectedEntries.find(en => en.id === entry.id)) {\n this.store.dispatch(new SelectEntries([this.getEntryByEl(gridElement)]));\n }\n } else {\n this.panService = this.dragSelect;\n }\n\n this.panService.start(e);\n });\n }\n\n private onPan() {\n this.hammerManager.on('pan', e => {\n if (this.panService) this.panService.move(e);\n });\n }\n\n private onPanEnd() {\n this.hammerManager.on('panend', () => {\n if (this.panService) this.panService.end();\n });\n }\n\n private onTap() {\n this.hammerManager.on('tap', e => {\n const entryEl = this.getEntryEl(e);\n this.dragSelect.removeSelectBox();\n\n if (entryEl) {\n this.store.dispatch(new EntryTapped(this.getEntryByEl(entryEl), e.srcEvent.ctrlKey || e.srcEvent.metaKey));\n } else if (e.target.closest('.files-container')) {\n this.store.dispatch(new DeselectAllEntries());\n }\n });\n }\n\n private onDoubleTap() {\n this.hammerManager.on('doubletap', e => {\n const gridElement = this.getEntryEl(e);\n if ( ! gridElement) return;\n\n this.store.dispatch(new EntryDoubleTapped(\n this.getEntryByEl(gridElement)\n ));\n });\n }\n\n private getEntryEl(e: HammerInput) {\n return e.target.closest('.drive-entry') as HTMLElement;\n }\n\n private getEntryByEl(el: HTMLElement): DriveEntry {\n const id = +el.dataset.id;\n return this.store.selectSnapshot(DriveState.entries)\n .find(curr => curr.id === +id);\n }\n}\n","import { AfterViewInit, Directive, ElementRef } from '@angular/core';\nimport { Select } from '@ngxs/store';\nimport { DriveState } from '../state/drive-state';\nimport { Observable } from 'rxjs';\n\n@Directive({\n selector: '[toggleSelectedClass]'\n})\nexport class ToggleSelectedClassDirective implements AfterViewInit {\n @Select(DriveState.selectedEntryIds) selectedEntryIds: Observable<number[]>;\n\n constructor(private el: ElementRef) {}\n\n ngAfterViewInit() {\n this.selectedEntryIds.subscribe(ids => {\n const els = this.el.nativeElement.querySelectorAll('.drive-entry');\n if ( ! els.length) return;\n\n Array.from(els).forEach((el: HTMLElement) => {\n const selected = ids.indexOf(parseInt(el.dataset.id, 10)) > -1;\n\n if (selected) {\n el.classList.add('selected');\n } else {\n el.classList.remove('selected');\n }\n });\n });\n }\n}\n","import { UploadedFile } from '../uploaded-file';\n\nexport async function readUploadedFolders(entries: WebKitEntry[]): Promise<UploadedFile[]> {\n let files = [];\n\n for (const key in entries) {\n const entry = entries[key];\n\n if ( ! entry.isDirectory) {\n files.push(await transformFileEntry(entry as WebKitFileEntry));\n } else {\n files = files.concat(await readDirRecursive(entry as WebKitDirectoryEntry));\n }\n }\n\n return files;\n}\n\nasync function readDirRecursive(entry: WebKitDirectoryEntry, files = []) {\n const entries = await readEntries(entry);\n\n for (const key in entries) {\n const childEntry = entries[key];\n\n if (childEntry.isDirectory) {\n await readDirRecursive(childEntry as WebKitDirectoryEntry, files);\n } else {\n files.push(await transformFileEntry(childEntry as WebKitFileEntry));\n }\n }\n\n return files;\n}\n\nfunction readEntries(dir: WebKitDirectoryEntry): Promise<WebKitEntry[]> {\n return new Promise(resolve => {\n readEntriesRecursive(dir.createReader(), resolve);\n });\n}\n\nfunction readEntriesRecursive(reader: WebKitDirectoryReader, resolve, allEntries: WebKitEntry[] = []) {\n reader.readEntries(entries => {\n if (entries.length) {\n allEntries = allEntries.concat(entries);\n readEntriesRecursive(reader, resolve, allEntries);\n } else {\n resolve(allEntries);\n }\n });\n}\n\nfunction transformFileEntry(entry: WebKitFileEntry) {\n return new Promise(resolve => {\n entry.file((file: any) => {\n resolve(new UploadedFile(file as File, entry.fullPath));\n });\n });\n}\n","import { Directive, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { openUploadWindow } from '../utils/open-upload-window';\nimport { UploadedFile } from '../uploaded-file';\nimport { readUploadedFolders } from '../utils/read-uploaded-folders';\nimport { UploadInputConfig } from '@common/uploads/upload-input-config';\n\n@Directive({\n selector: '[fileDropzone]',\n})\nexport class UploadDropzoneDirective implements OnInit, OnDestroy {\n @Input() disableDropzoneClick = false;\n @Input() disableDropzone = false;\n @Input() clickButton: ElementRef;\n @Input('fileDropzone') uploadConfig: UploadInputConfig = {};\n @Output() filesDropped: EventEmitter<UploadedFile[]> = new EventEmitter();\n\n constructor(protected el: ElementRef) {}\n\n ngOnInit() {\n const el = this.el.nativeElement;\n el.addEventListener('dragenter', (e) => this.handleDragEnter(e));\n el.addEventListener('dragover', (e) => this.handleDragOver(e));\n el.addEventListener('dragleave', (e) => this.handleDragLeave(e));\n el.addEventListener('drop', (e) => this.handleDrop(e));\n\n if ( ! this.disableDropzoneClick) {\n const trigger = this.clickButton ? this.clickButton.nativeElement : el;\n trigger.addEventListener('click', () => this.handleClick());\n }\n }\n\n ngOnDestroy() {\n this.removeClassesFromDropzone();\n }\n\n protected handleClick() {\n if (this.disableDropzone) return;\n openUploadWindow(this.uploadConfig).then(files => {\n this.emitUploadEvent(files);\n });\n }\n\n public handleDragEnter(e) {\n if (this.dropzoneDisabled(e)) return;\n this.el.nativeElement.classList.add('file-over-dropzone');\n }\n\n public handleDragOver(e) {\n if (e.preventDefault) e.preventDefault();\n e.dataTransfer.dropEffect = this.dropzoneDisabled(e) ? 'none' : 'move';\n return false;\n }\n\n public handleDragLeave(e: MouseEvent) {\n const newEl = document.elementFromPoint(e.clientX, e.clientY);\n if (this.el.nativeElement.contains(newEl)) return;\n this.removeClassesFromDropzone();\n }\n\n public async handleDrop(e) {\n e.stopPropagation();\n e.preventDefault();\n this.removeClassesFromDropzone();\n if (this.dropzoneDisabled(e) || !e.dataTransfer.items) return;\n\n const items = Array.from(e.dataTransfer.items)\n .filter((item: DataTransferItem) => item.kind === 'file')\n .map((item: DataTransferItem) => {\n return item.webkitGetAsEntry();\n });\n\n if (items.length) {\n this.emitUploadEvent(await readUploadedFolders(items));\n }\n }\n\n protected emitUploadEvent(files: UploadedFile[]) {\n this.filesDropped.emit(files);\n }\n\n protected removeClassesFromDropzone() {\n this.el.nativeElement.classList.remove('file-over-dropzone');\n }\n\n protected dropzoneDisabled(e: DragEvent) {\n const hasFiles = e.dataTransfer.types.find(type => type.toLowerCase() === 'files');\n return this.disableDropzone || ! hasFiles;\n }\n}\n","import {Directive, ElementRef, NgZone, OnDestroy, OnInit} from '@angular/core';\nimport {fromEvent, Subscription} from 'rxjs';\nimport {debounceTime} from 'rxjs/operators';\n\n@Directive()\nexport abstract class InfiniteScroll implements OnInit, OnDestroy {\n protected scrollSub: Subscription;\n protected el: ElementRef<HTMLElement|Document>;\n protected abstract zone: NgZone;\n\n public threshold: number | string = 50;\n\n ngOnInit() {\n if ( ! this.el) {\n this.el = new ElementRef(document);\n }\n this.zone.runOutsideAngular(() => {\n this.scrollSub = fromEvent(this.getScrollContainer(), 'scroll', {capture: true, passive: true})\n .pipe(debounceTime(20))\n .subscribe((e: Event) => this.onScroll(e.target as HTMLElement));\n });\n }\n\n ngOnDestroy() {\n this.scrollSub && this.scrollSub.unsubscribe();\n }\n\n protected getScrollContainer() {\n return this.el ? this.el.nativeElement : document;\n }\n\n protected onScroll(target: HTMLElement) {\n if (!target || (target !== this.el.nativeElement) || !this.canLoadMore() || this.isLoading()) return;\n\n const offset = parseInt(this.threshold as string),\n targetCanScroll = this.el && (typeof target.scrollTop !== 'undefined');\n\n const currentScroll = targetCanScroll ?\n target.scrollTop + target.offsetHeight :\n window.scrollY + window.innerHeight;\n\n const heightWithoutOffset = targetCanScroll ?\n target.scrollHeight - offset :\n document.documentElement.scrollHeight - offset;\n\n if (currentScroll >= heightWithoutOffset) {\n this.zone.run(() => {\n this.loadMoreItems();\n });\n }\n }\n\n protected abstract loadMoreItems();\n\n protected abstract canLoadMore(): boolean;\n\n protected abstract isLoading(): boolean;\n}\n","import { Directive, ElementRef, NgZone } from '@angular/core';\nimport { LoadMoreEntries } from '../state/actions/commands';\nimport { Store } from '@ngxs/store';\nimport { DriveState } from '../state/drive-state';\nimport { InfiniteScroll } from '@common/core/ui/infinite-scroll/infinite.scroll';\n\n@Directive({\n selector: '[driveInfiniteScroll]'\n})\nexport class DriveInfiniteScrollDirective extends InfiniteScroll {\n constructor(\n protected el: ElementRef,\n protected store: Store,\n protected zone: NgZone,\n ) {\n super();\n }\n\n protected loadMoreItems() {\n const page = this.store.selectSnapshot(DriveState.currentPage) + 1;\n this.store.dispatch(new LoadMoreEntries({page}));\n }\n\n protected isLoading(): boolean {\n return this.store.selectSnapshot(DriveState.loading);\n }\n\n protected canLoadMore(): boolean {\n return this.store.selectSnapshot(DriveState.canLoadMoreEntries);\n }\n}\n","import { ChangeDetectionStrategy, Component, HostBinding, Inject, Optional, ViewEncapsulation } from '@angular/core';\nimport { Store } from '@ngxs/store';\nimport { DriveEntry } from '../../../files/models/drive-entry';\nimport { CONTEXT_MENU_DATA } from '@common/core/ui/context-menu/context-menu-data';\nimport { EntryContextMenuOpened } from '../../../state/actions/events';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { DeselectAllEntries } from '../../../state/actions/commands';\n\nexport interface FileContextMenuData {\n entry: DriveEntry;\n}\n\n@Component({\n selector: 'drive-context-menu',\n templateUrl: './drive-context-menu.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class DriveContextMenuComponent {\n @HostBinding('class.context-menu') contextMenu = true;\n\n constructor(\n @Optional() @Inject(CONTEXT_MENU_DATA) public data: FileContextMenuData,\n protected store: Store,\n protected currentUser: CurrentUser\n ) {\n if (this.data && this.data.entry) {\n this.store.dispatch(new EntryContextMenuOpened(this.data.entry));\n } else {\n this.store.dispatch(new DeselectAllEntries());\n }\n }\n}\n","<context-actions-container></context-actions-container>","<skeleton *ngIf=\"loading$ | async; else breadcrumbs\" @fadeOut></skeleton>\n<ng-template #breadcrumbs>\n <div class=\"breadcrumb-container\" @fadeIn>\n <ng-container *ngFor=\"let item of breadcrumb | async; last as last; first as first;\">\n <div class=\"breadcrumb-item\" (click)=\"last ? openContextMenu(item, button) : openPage(item)\" [class.no-action]=\"!item.hasActions\" #button>\n <span class=\"name\">{{first ? (item.viewName | trans) : item.viewName}}</span>\n <mat-icon svgIcon=\"arrow-drop-down\" *ngIf=\"last && item.hasActions\"></mat-icon>\n </div>\n <mat-icon class=\"separator\" svgIcon=\"keyboard-arrow-right\" *ngIf=\"!last\"></mat-icon>\n </ng-container>\n </div>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\nimport { DriveEntryApiService } from '../../drive-entry-api.service';\nimport { Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { BehaviorSubject, combineLatest, Subscription } from 'rxjs';\nimport { Translations } from '@common/core/translations/translations.service';\nimport {\n ContextMenu, ContextMenuParams\n} from '@common/core/ui/context-menu/context-menu.service';\nimport { DriveContextMenuComponent } from '../../context-actions/components/drive-context-menu/drive-context-menu.component';\nimport { distinctUntilChanged, filter, take } from 'rxjs/operators';\nimport { OpenFolder } from '../../state/actions/commands';\nimport {\n DRIVE_PAGE_NAMES, DrivePage, FolderPage, SHARES_PAGE,\n} from '../../state/models/drive-page';\nimport { Navigate } from '@ngxs/router-plugin';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { SKELETON_ANIMATIONS } from '../../../../common/core/ui/skeleton/skeleton-animations';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\n\n@Component({\n selector: 'entry-breadcrumbs',\n templateUrl: './entry-breadcrumbs.component.html',\n styleUrls: ['./entry-breadcrumbs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [SKELETON_ANIMATIONS],\n})\nexport class EntryBreadcrumbsComponent implements OnInit, OnDestroy {\n public breadcrumb: BehaviorSubject<DrivePage[]> = new BehaviorSubject([]);\n public loading$ = new BehaviorSubject<boolean>(true);\n private activePageSub: Subscription;\n\n constructor(\n private entriesApi: DriveEntryApiService,\n private i18n: Translations,\n private contextMenu: ContextMenu,\n private store: Store,\n private workspaces: WorkspacesService,\n ) {}\n\n ngOnInit() {\n // wait until entries and user folders are loaded\n combineLatest([\n this.store.select(DriveState.meta),\n this.store.select(DriveState.userFoldersLoaded),\n this.workspaces.activeWorkspace$,\n ]).pipe(\n filter(([meta, foldersLoaded, workspace]) => meta.currentPage && foldersLoaded && !!workspace),\n take(1)\n ).subscribe(() => {\n this.loading$.next(false);\n this.bindToActivePage();\n });\n }\n\n ngOnDestroy() {\n this.activePageSub && this.activePageSub.unsubscribe();\n }\n\n public openPage(page: DrivePage) {\n if (page.folder) {\n this.store.dispatch(new OpenFolder(page.folder));\n } else {\n this.store.dispatch(new Navigate(['/drive/shares']));\n }\n }\n\n public openContextMenu(item: DrivePage, origin: HTMLElement) {\n let params = {originX: 'start', overlayX: 'start'} as ContextMenuParams;\n switch (item.name) {\n case DRIVE_PAGE_NAMES.TRASH:\n return this.contextMenu.open(DriveContextMenuComponent, origin, params);\n case DRIVE_PAGE_NAMES.FOLDER:\n params = {data: {entry: this.store.selectSnapshot(DriveState.activeFolder)}, ...params};\n return this.contextMenu.open(DriveContextMenuComponent, origin, params);\n }\n }\n\n private generateBreadCrumb(page: DrivePage) {\n const breadcrumbs = [this.getRootBreadcrumb(page)];\n\n if (page.folder?.id) {\n const folderPath = this.getBreadcrumbForFolder(page.folder);\n breadcrumbs.push(...folderPath);\n }\n this.breadcrumb.next(breadcrumbs);\n }\n\n private getBreadcrumbForFolder(folder: DriveFolder) {\n const allFolders = this.store.selectSnapshot(DriveState.flatFolders) || [];\n const ids = (folder.path ? folder.path.split('/') : [folder.id]) as number[];\n return ids.map(id => {\n const pathFolder = folder.id === +id ? folder : allFolders.find(f => f.id === +id);\n if (pathFolder) {\n return new FolderPage(pathFolder);\n }\n }).filter(f => !!f);\n }\n\n private getRootBreadcrumb(page: DrivePage) {\n if (page.name === DRIVE_PAGE_NAMES.FOLDER) {\n const workspaceId = this.workspaces.activeId$.value;\n const ROOT_FOLDER_PAGE = new FolderPage(this.store.selectSnapshot(DriveState.rootFolder));\n if (workspaceId && page.folder.workspace_id === workspaceId) {\n return {...ROOT_FOLDER_PAGE, viewName: this.workspaces.activeWorkspace$.value.name};\n } else {\n return !this.store.selectSnapshot(DriveState.userOwnsActiveFolder) ? SHARES_PAGE : ROOT_FOLDER_PAGE;\n }\n } else {\n return page;\n }\n }\n\n private bindToActivePage() {\n this.activePageSub = combineLatest([\n this.store.select(DriveState.activePage),\n this.store.select(DriveState.flatFolders),\n ]).pipe(\n distinctUntilChanged(),\n filter(([activePage]) => {\n // wait until folder data is fully loaded\n return activePage.name === DRIVE_PAGE_NAMES.FOLDER ? activePage.folder?.name : true;\n })\n ).subscribe(([activePage]) => {\n this.generateBreadCrumb(activePage);\n });\n }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'drive-toolbar',\n templateUrl: './drive-toolbar.component.html',\n styleUrls: ['./drive-toolbar.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DriveToolbarComponent {\n}\n","<entry-breadcrumbs></entry-breadcrumbs>\n","export const AVAILABLE_SORTS: DriveSortOption[] = [\n {name: 'file_size', viewName: 'Size'},\n {name: 'name', viewName: 'Name'},\n {name: 'updated_at', viewName: 'Last Modified'},\n {name: 'created_at', viewName: 'Upload Date'},\n {name: 'type', viewName: 'Type'},\n {name: 'extension', viewName: 'Extension'},\n];\n\nexport interface DriveSortOption {\n name: SortColumn;\n viewName: string;\n}\n\nexport type SortColumn = 'file_size' | 'name' | 'updated_at' | 'created_at' | 'type' | 'extension';\nexport type SortDirection = 'desc'|'asc';\n\nexport interface SortValue {\n column: SortColumn;\n direction: SortDirection;\n}\n","<ng-container *ngIf=\"sort$ | async as sortValue\">\n <span class=\"label\" trans>Sort by</span>\n <button class=\"no-style\" [matMenuTriggerFor]=\"menu\" [disabled]=\"btnDisabled\">\n <span class=\"sort-button-content\">\n <span>{{getSortViewName(sortValue.column) | trans}}</span>\n <mat-icon svgIcon=\"keyboard-arrow-down\" class=\"arrow-icon\"></mat-icon>\n </span>\n <mat-icon svgIcon=\"sort\" class=\"mobile-sort-button-content\"></mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" class=\"drive-sort-menu\">\n <div class=\"title\" trans>Direction</div>\n <button mat-menu-item (click)=\"changeDirection('asc')\" [class.active]=\"sortValue.direction === 'asc'\">\n <mat-icon svgIcon=\"check\"></mat-icon>\n <span trans>Ascending</span>\n </button>\n <button mat-menu-item (click)=\"changeDirection('desc')\" [class.active]=\"sortValue.direction === 'desc'\">\n <mat-icon svgIcon=\"check\"></mat-icon>\n <span trans>Descending</span>\n </button>\n <div class=\"separator\"></div>\n <div class=\"title\" trans>Sort By</div>\n <button mat-menu-item *ngFor=\"let sort of availableSorts\" (click)=\"changeSort(sort)\" [class.active]=\"sortValue.column === sort.name\">\n <mat-icon svgIcon=\"check\"></mat-icon>\n <span trans>{{sort.viewName}}</span>\n </button>\n </mat-menu>\n</ng-container>","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input } from '@angular/core';\nimport { AVAILABLE_SORTS, DriveSortOption, SortColumn, SortDirection, SortValue } from '../../entries/available-sorts';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\n\nconst DEFAULT_VALUE: SortValue = {column: 'updated_at', direction: 'desc'};\n\n@Component({\n selector: 'entries-sort-button',\n templateUrl: './entries-sort-button.component.html',\n styleUrls: ['./entries-sort-button.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: EntriesSortButtonComponent,\n multi: true,\n }]\n})\nexport class EntriesSortButtonComponent implements ControlValueAccessor {\n @Input() btnDisabled = false;\n public availableSorts = AVAILABLE_SORTS;\n public propagateChange: Function;\n\n public sort$: BehaviorSubject<SortValue> = new BehaviorSubject(DEFAULT_VALUE);\n\n public changeSort(column: DriveSortOption) {\n this.sort$.next({...this.sort$.value, column: column.name});\n this.propagateChange(this.sort$.value);\n }\n\n public changeDirection(direction: SortDirection) {\n this.sort$.next({...this.sort$.value, direction});\n this.propagateChange(this.sort$.value);\n }\n\n public getSortViewName(column: SortColumn): string {\n return this.availableSorts.find(sort => sort.name === column).viewName;\n }\n\n public writeValue(value: SortValue) {\n this.sort$.next(value || DEFAULT_VALUE);\n }\n\n public registerOnChange(fn: Function) {\n this.propagateChange = fn;\n }\n\n public registerOnTouched() {}\n}\n","<ng-container *ngFor=\"let action of actions$ | async\">\n <ng-container *ngIf=\"action.visible()\">\n <div class=\"separator\" *ngIf=\"!compact && action.separatorBefore\"></div>\n\n <button class=\"context-menu-item\" *ngIf=\"!compact\" (click)=\"action.execute()\">\n <mat-icon [svgIcon]=\"action.icon\"></mat-icon>\n <span trans>{{action.viewName}}</span>\n </button>\n\n <button mat-icon-button (click)=\"action.execute()\" [matTooltip]=\"action.viewName | trans\" *ngIf=\"compact && action.showInCompact\">\n <mat-icon [svgIcon]=\"action.icon\"></mat-icon>\n </button>\n </ng-container>\n</ng-container>\n\n<button mat-icon-button (click)=\"openMoreActionsMenu()\" [matTooltip]=\"'More actions' | trans\" #moreActionsButton *ngIf=\"compact && hasMoreActions$ | async\">\n <mat-icon svgIcon=\"more-vert\"></mat-icon>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Injector,\n Input,\n OnDestroy,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { DriveState } from '../../../state/drive-state';\nimport { Store } from '@ngxs/store';\nimport { DriveContextAction } from '../../types/drive-context-action';\nimport { TrashActions } from '../../actions/trash-actions';\nimport { SharesActions } from '../../actions/shares-actions';\nimport { FolderActions } from '../../actions/folder-actions';\nimport { EntryActions } from '../../actions/entry-actions';\nimport { BehaviorSubject, combineLatest, Subscription } from 'rxjs';\nimport { DRIVE_PAGE_NAMES, DrivePage } from '../../../state/models/drive-page';\nimport { DriveContextMenuComponent } from '../drive-context-menu/drive-context-menu.component';\nimport { ContextMenu } from '@common/core/ui/context-menu/context-menu.service';\nimport { TrashPageActions } from '../../actions/trash-page-actions';\nimport { DriveEntry } from '../../../files/models/drive-entry';\n\n@Component({\n selector: 'context-actions-container',\n templateUrl: './context-actions-container.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ContextActionsContainerComponent implements OnDestroy {\n @ViewChild('moreActionsButton', { read: ElementRef }) moreActionsButton: ElementRef;\n @Input() @HostBinding('class.compact') compact = false;\n\n // whether there are more actions to display in \"compact\" mode\n public hasMoreActions$ = new BehaviorSubject(false);\n public actions$: BehaviorSubject<DriveContextAction[]> = new BehaviorSubject([]);\n private subscription: Subscription;\n\n constructor(\n private store: Store,\n private injector: Injector,\n private contextMenu: ContextMenu,\n ) {\n this.subscription = combineLatest([\n this.store.select(DriveState.activePage),\n this.store.select(DriveState.selectedEntry),\n ]).subscribe(combined => {\n this.setActions(combined[0], combined[1]);\n this.hasMoreActions$.next(this.actions$.value.some(action => !action.showInCompact));\n });\n }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n\n public openMoreActionsMenu() {\n const entry = this.store.selectSnapshot(DriveState.selectedEntryOrActiveFolder);\n this.contextMenu.open(\n DriveContextMenuComponent,\n this.moreActionsButton.nativeElement,\n {data: {entry}}\n );\n }\n\n private setActions(activePage: DrivePage, selectedEntry: DriveEntry) {\n // user clicked on \"trash\" page name in breadcrumb\n if (activePage?.name === DRIVE_PAGE_NAMES.TRASH && !selectedEntry) {\n this.actions$.next(this.injector.get(TrashPageActions).getActions());\n\n // context menu opened for selected entries while in \"trash\" or \"shares\" page\n } else if (activePage?.name === 'trash' && selectedEntry) {\n this.actions$.next(this.injector.get(TrashActions).getActions());\n } else if (activePage?.name === 'shares' && selectedEntry) {\n this.setActionsForEntry();\n // context menu opened by clicking on empty space in folder view or clicking on root folder breadcrumb\n } else if (activePage?.folder && !selectedEntry?.id) {\n this.actions$.next(this.injector.get(FolderActions).getActions());\n\n // show entries context menu for \"starred\" page\n } else if (activePage?.name === 'starred' || activePage?.name === 'recent') {\n this.actions$.next(this.injector.get(EntryActions).getActions());\n\n // default to entry actions if can't match to anything else\n } else if (selectedEntry) {\n this.setActionsForEntry();\n } else {\n this.actions$.next([]);\n }\n }\n\n private setActionsForEntry() {\n const entries = this.store.selectSnapshot(DriveState.selectedEntries).length\n ? this.store.selectSnapshot(DriveState.selectedEntries)\n : [this.store.selectSnapshot(DriveState.activeFolder)];\n let isOwner = this.store.selectSnapshot(DriveState.selectedEntries).length\n ? this.store.selectSnapshot(DriveState.userOwnsSelectedEntries)\n : this.store.selectSnapshot(DriveState.userOwnsActiveFolder);\n if (this.store.selectSnapshot(DriveState.activeWorkspace)?.id) {\n isOwner = entries.every(e => e.workspace_id === this.store.selectSnapshot(DriveState.activeWorkspace)?.id);\n }\n if (isOwner) {\n this.actions$.next(this.injector.get(EntryActions).getActions());\n } else {\n this.actions$.next(this.injector.get(SharesActions).getActions());\n }\n }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, ElementRef } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { ContextMenu } from '@common/core/ui/context-menu/context-menu.service';\nimport { DriveContextMenuComponent } from '../../context-actions/components/drive-context-menu/drive-context-menu.component';\nimport { ToggleDetailsSidebar, SetViewMode } from '../../state/actions/commands';\n\n@Component({\n selector: 'toolbar-actions',\n templateUrl: './toolbar-actions.component.html',\n styleUrls: ['./toolbar-actions.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ToolbarActionsComponent {\n @ViewChild('moreActionsButton', { read: ElementRef }) moreActionsButton: ElementRef;\n @Select(DriveState.anythingSelected) anythingSelected: Observable<boolean>;\n @Select(DriveState.viewMode) viewMode: Observable<'list'|'grid'>;\n @Select(DriveState.detailsOpen) activityOpen: Observable<boolean>;\n @Select(DriveState.multipleEntriesSelected) multipleEntriesSelected$: Observable<boolean>;\n\n constructor(\n protected store: Store,\n protected contextMenu: ContextMenu,\n ) {}\n\n public toggleViewMode() {\n const current = this.store.selectSnapshot(DriveState.viewMode);\n this.store.dispatch(new SetViewMode(current === 'list' ? 'grid' : 'list'));\n }\n\n public ToggleDetails() {\n this.store.dispatch(new ToggleDetailsSidebar());\n }\n\n public openMoreActionsMenu() {\n const entry = this.store.selectSnapshot(DriveState.selectedEntry);\n this.contextMenu.open(\n DriveContextMenuComponent,\n this.moreActionsButton.nativeElement,\n {data: {entry}}\n );\n }\n}\n","<context-actions-container [compact]=\"true\"></context-actions-container>\n\n<div class=\"always-visible-actions\">\n <button mat-icon-button (click)=\"toggleViewMode()\">\n <mat-icon [svgIcon]=\"(viewMode | async) === 'list' ? 'view-list' : 'view-module'\"></mat-icon>\n </button>\n <button mat-icon-button (click)=\"ToggleDetails()\" [class.active]=\"activityOpen | async\">\n <mat-icon svgIcon=\"info\"></mat-icon>\n </button>\n</div>\n\n","import {\n ChangeDetectionStrategy, Component, OnInit, ViewEncapsulation\n} from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { ReloadPageEntries } from '../../state/actions/commands';\nimport { SortColumn, SortValue } from '../../entries/available-sorts';\nimport { DriveState } from '../../state/drive-state';\nimport { combineLatest, Observable } from 'rxjs';\nimport { DrivePage } from '../../state/models/drive-page';\nimport { FormControl } from '@angular/forms';\n\n@Component({\n selector: 'file-list-header',\n templateUrl: './file-list-header.component.html',\n styleUrls: ['./file-list-header.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FileListHeaderComponent implements OnInit {\n @Select(DriveState.sortColumn) sortColumn$: Observable<SortColumn>;\n @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n\n public sortFormControl = new FormControl({\n column: this.store.selectSnapshot(DriveState.sortColumn),\n direction: this.store.selectSnapshot(DriveState.sortDirection),\n });\n\n constructor(private store: Store) {}\n\n ngOnInit() {\n combineLatest([\n this.store.select(DriveState.sortColumn),\n this.store.select(DriveState.sortDirection),\n ]).subscribe(([column, direction]) => {\n this.sortFormControl.setValue({column, direction}, {emitEvent: false});\n });\n this.sortFormControl.valueChanges.subscribe((sort: SortValue) => {\n this.store.dispatch(new ReloadPageEntries(\n {orderBy: sort.column, orderDir: sort.direction}\n ));\n });\n }\n}\n","<div class=\"sort-header\">\n <entries-sort-button [btnDisabled]=\"(activePage$ | async)?.disableSort\" [formControl]=\"sortFormControl\"></entries-sort-button>\n</div>\n<toolbar-actions></toolbar-actions>","<material-navbar\n [showToggleButton]=\"isMobile$ | async\"\n (toggleButtonClick)=\"toggleSidebar()\"\n menuPosition=\"drive-navbar\"\n>\n <main-searchbar></main-searchbar>\n</material-navbar>\n\n<mat-sidenav-container>\n <mat-sidenav\n [mode]=\"(isMobile$ | async) ? 'over' : 'side'\"\n [opened]=\"sidebarOpen$ | async\"\n class=\"left-sidebar\"\n >\n <sidebar></sidebar>\n </mat-sidenav>\n <mat-sidenav\n [opened]=\"activityOpen$ | async\"\n [mode]=\"(isMobile$ | async) ? 'over' : 'side'\"\n position=\"end\"\n class=\"right-sidebar\"\n >\n <details-sidebar></details-sidebar>\n </mat-sidenav>\n <mat-sidenav-content\n driveHammerInteractions\n [class.has-rek]=\"settings.has('ads.drive') && !currentUser.isSubscribed()\"\n >\n <ad-host slot=\"ads.drive\"></ad-host>\n <ng-container *ngIf=\"(activePage$ | async)?.name !== 'workspaces'\">\n <drive-toolbar></drive-toolbar>\n <file-list-header></file-list-header>\n </ng-container>\n <div class=\"loading-overlay-container\">\n <div\n class=\"files-container\"\n #filesContainer\n #scrollContainer\n toggleSelectedClass\n [class.dragging]=\"dragging | async\"\n contextMenu=\"entry\"\n [disableContextMenu]=\"!(canUpload$ | async)\"\n fileDropzone\n [disableDropzoneClick]=\"true\"\n [disableDropzone]=\"!(canUpload$ | async)\"\n driveInfiniteScroll\n (filesDropped)=\"uploadFiles($event)\"\n >\n <router-outlet></router-outlet>\n </div>\n <loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n </div>\n </mat-sidenav-content>\n</mat-sidenav-container>\n\n<entry-drag-preview></entry-drag-preview>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from './state/drive-state';\nimport { DriveDomCacheService } from './interactions/drive-dom-cache.service';\nimport { EntryDragPreviewComponent } from './interactions/entry-drag-preview/entry-drag-preview.component';\nimport { Observable, Subscription } from 'rxjs';\nimport {\n LoadUserFolders,\n LoadUserSpaceUsage,\n ReloadPageEntries,\n ResetState,\n SetCurrentUser,\n SetViewMode,\n SetWorkspace,\n ToggleSidebar,\n UploadFiles\n} from './state/actions/commands';\nimport { UploadedFile } from '@common/uploads/uploaded-file';\nimport { Settings } from '@common/core/config/settings.service';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { BreakpointObserver } from '@angular/cdk/layout';\nimport { BreakpointChanged, UserSpaceUsageChanged } from './state/actions/events';\nimport { VIEW_MODE_KEY } from './state/models/drive-state-model';\nimport { LocalStorage } from '@common/core/services/local-storage.service';\nimport { User } from '@common/core/types/models/User';\nimport { WorkspacesService } from '../../common/workspaces/workspaces.service';\nimport { filter, skip } from 'rxjs/operators';\nimport { DrivePage, FolderPage } from './state/models/drive-page';\nimport { EntryActions } from './context-actions/actions/entry-actions';\nimport { FolderActions } from './context-actions/actions/folder-actions';\nimport { SharesActions } from './context-actions/actions/shares-actions';\nimport { TrashActions } from './context-actions/actions/trash-actions';\nimport { TrashPageActions } from './context-actions/actions/trash-page-actions';\nimport { ContextMenu } from '../../common/core/ui/context-menu/context-menu.service';\n\nconst actions = [EntryActions, FolderActions, SharesActions, TrashActions, TrashPageActions];\n\n@Component({\n selector: 'drive',\n templateUrl: './drive.component.html',\n styleUrls: ['./drive.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n\n // scope workspaces to drive component and make sure context menus get correct instance\n providers: [...actions, ContextMenu, WorkspacesService],\n})\nexport class DriveComponent implements OnInit, OnDestroy {\n @ViewChild('scrollContainer', { read: ElementRef, static: true }) scrollContainer: ElementRef;\n @ViewChild('filesContainer', { static: true }) filesContainer: ElementRef;\n @ViewChild(EntryDragPreviewComponent, { read: ElementRef, static: true }) dragPreview: ElementRef;\n @Select(DriveState.dragging) dragging: Observable<boolean>;\n @Select(DriveState.detailsOpen) activityOpen$: Observable<boolean>;\n @Select(DriveState.sidebarOpen) sidebarOpen$: Observable<boolean>;\n @Select(DriveState.loading) loading$: Observable<boolean>;\n @Select(DriveState.isMobile) isMobile$: Observable<boolean>;\n @Select(DriveState.canUpload) canUpload$: Observable<boolean>;\n @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n\n private subscriptions: Subscription[] = [];\n\n constructor(\n private store: Store,\n private route: ActivatedRoute,\n public currentUser: CurrentUser,\n private localStorage: LocalStorage,\n private domCache: DriveDomCacheService,\n private breakpoints: BreakpointObserver,\n private workspaces: WorkspacesService,\n public settings: Settings,\n ) {}\n\n ngOnInit() {\n this.setViewMode();\n this.cacheDemoElements();\n this.observeBreakpointChanges();\n this.bindToWorkspace();\n this.store.dispatch(new LoadUserFolders());\n this.store.dispatch(new LoadUserSpaceUsage());\n\n // TODO: refactor this once auth is moved to it's own store\n this.store.dispatch(new SetCurrentUser(this.currentUser.getModel() as User));\n this.currentUser.model$.subscribe(user => {\n this.store.dispatch(new SetCurrentUser(user as User));\n });\n }\n\n ngOnDestroy() {\n this.store.dispatch(ResetState);\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.subscriptions = [];\n }\n\n public uploadFiles(files: UploadedFile[]) {\n this.store.dispatch(new UploadFiles(files));\n }\n\n public toggleSidebar() {\n this.store.dispatch(new ToggleSidebar());\n }\n\n private cacheDemoElements() {\n this.domCache.filesCont = this.filesContainer.nativeElement;\n this.domCache.scrollCont = this.scrollContainer.nativeElement;\n this.domCache.dragPreview = this.dragPreview.nativeElement;\n }\n\n private setViewMode() {\n this.store.dispatch(new SetViewMode(\n this.localStorage.get(VIEW_MODE_KEY, this.settings.get('drive.default_view', 'grid')))\n );\n }\n\n private observeBreakpointChanges() {\n const sub = this.breakpoints.observe('(max-width: 1100px)').subscribe(result => {\n this.store.dispatch(new BreakpointChanged({isMobile: result.matches}));\n });\n this.subscriptions.push(sub);\n }\n\n private bindToWorkspace() {\n // skip initially selected workspace\n const sub1 = this.workspaces.activeId$.pipe(skip(1)).subscribe(() => {\n this.store.dispatch([\n new ReloadPageEntries({}, new FolderPage(this.store.selectSnapshot(DriveState.rootFolder))),\n new UserSpaceUsageChanged(),\n new LoadUserFolders()\n ]);\n });\n const sub3 = this.workspaces.activeWorkspace$.pipe(filter(w => !!w))\n .subscribe(workspace => {\n this.store.dispatch(new SetWorkspace(workspace));\n });\n const sub2 = this.workspaces.bindToNotificationClick();\n this.subscriptions.push(sub1, sub2, sub3);\n }\n}\n","<files-grid-item\n *ngFor=\"let entry of entries; trackBy: trackById\"\n [entry]=\"entry\"\n [contextMenu]=\"{type: 'entry', entry: entry}\"\n [disableContextMenu]=\"disableInteractions\"\n [folderDropTarget]=\"entry\"\n></files-grid-item>","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input } from '@angular/core';\nimport { DriveEntry } from '../../models/drive-entry';\n\n@Component({\n selector: 'files-grid',\n templateUrl: './files-grid.component.html',\n styleUrls: ['./files-grid.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilesGridComponent {\n @Input() entries: DriveEntry[];\n @Input() disableInteractions = false;\n public trackById(index: number, entry: DriveEntry): number {\n return entry.id;\n }\n}\n","<table class=\"material-table\">\n <thead>\n <tr>\n <th table-sort-header class=\"name-column\" trans>Name</th>\n <th table-sort-header=\"updated_at\" class=\"last-updated-column\" trans>Last Updated</th>\n <th table-sort-header=\"file_size\" class=\"size-column\" trans>Size</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let file of entries; trackBy: trackById\" class=\"drive-entry\" [contextMenu]=\"{type: 'entry', entry: file}\" [disableContextMenu]=\"disableInteractions\" [attr.data-id]=\"file.id\" [folderDropTarget]=\"file\">\n <td data-label=\"Name\" class=\"name-column\">\n <div class=\"file-name-container\">\n <file-thumbnail [file]=\"file\"></file-thumbnail>\n <div class=\"file-name\">\n <span class=\"entry-name\">{{file.name}}</span>\n <mat-icon class=\"star-icon\" svgIcon=\"star\" *ngIf=\"isStarred(file)\" [matTooltip]=\"'Starred' | trans\"></mat-icon>\n </div>\n </div>\n </td>\n <td data-label=\"Last Updated\" class=\"last-updated-column\">{{file.updated_at | formattedDate}}</td>\n <td data-label=\"Size\" class=\"size-column\">{{file.file_size | formattedFileSize}}</td>\n </tr>\n </tbody>\n</table>\n","import {\n ChangeDetectionStrategy, Component, Input, OnDestroy, OnInit\n} from '@angular/core';\nimport { DriveEntry } from '../../models/drive-entry';\nimport { Store } from '@ngxs/store';\nimport { ReloadPageEntries } from '../../../state/actions/commands';\nimport { DatatableService } from '@common/datatable/datatable.service';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n selector: 'files-list',\n templateUrl: './files-list.component.html',\n styleUrls: ['./files-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [DatatableService],\n})\nexport class FilesListComponent implements OnInit, OnDestroy {\n @Input() entries: DriveEntry[];\n @Input() disableInteractions = false;\n\n constructor(private store: Store, private datatable: DatatableService<DriveEntry>) {}\n\n ngOnInit() {\n this.datatable.init({\n disableSort: this.disableInteractions,\n });\n\n this.datatable.sort$\n .pipe(filter(v => !!Object.keys(v).length))\n .subscribe(value => {\n this.store.dispatch(new ReloadPageEntries(value as any));\n });\n }\n\n ngOnDestroy() {\n this.datatable.destroy();\n }\n\n public isStarred(entry: DriveEntry): boolean {\n if ( ! entry.tags) return false;\n return !!entry.tags.find(tag => tag.name === 'starred');\n }\n\n public trackById(index: number, entry: DriveEntry): number {\n return entry.id;\n }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'no-recent-entries',\n templateUrl: './no-recent-entries.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoRecentEntriesComponent {\n}\n","<div class=\"no-results-message\">\n <svg-image name=\"time-management\" class=\"icon\"></svg-image>\n <div class=\"main\" trans>No recent entries.</div>\n <div class=\"secondary\" trans>You have not uploaded any files or folders yet.</div>\n</div>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'no-trashed-entries',\n templateUrl: './no-trashed-entries.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoTrashedEntriesComponent {\n}\n","<div class=\"no-results-message\">\n <svg-image name=\"throw-away\" class=\"icon\"></svg-image>\n <div class=\"main\" trans>Trash is empty.</div>\n <div class=\"secondary\" trans>There are no files or folders in your trash currently.</div>\n</div>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'no-starred-entries',\n templateUrl: './no-starred-entries.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoStarredEntriesComponent {\n}\n","<div class=\"no-results-message\">\n <svg-image name=\"loving-it\" class=\"icon\"></svg-image>\n <div class=\"main\" trans>Nothing is starred.</div>\n <div class=\"secondary\" trans>Add stars to files and folders that you want to easily find later.</div>\n</div>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'no-shared-entries',\n templateUrl: './no-shared-entries.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoSharedEntriesComponent {\n}\n","<div class=\"no-results-message\">\n <svg-image name=\"share\" class=\"icon\"></svg-image>\n <div class=\"main\" trans>Shared with me.</div>\n <div class=\"secondary\" trans>Files and folders other people have shared with you.</div>\n</div>\n","<div class=\"no-results-message\" *ngIf=\"noQueryOrFilters$ | async\">\n <svg-image name=\"file-searching\" class=\"icon\"></svg-image>\n <div class=\"main\" trans>Begin typing or select a filter to search</div>\n <div class=\"secondary\" trans>Search for files, folders and other content.</div>\n</div>\n\n<div class=\"no-results-message\" *ngIf=\"!(noQueryOrFilters$ | async)\">\n <svg-image name=\"file-searching\" class=\"icon\"></svg-image>\n <div class=\"main\" trans>No matches found.</div>\n <div class=\"secondary\" trans>Try another search with different query or filters.</div>\n</div>\n","import {ChangeDetectionStrategy, Component, ViewEncapsulation} from '@angular/core';\nimport {Store} from '@ngxs/store';\nimport {DriveState} from '../../state/drive-state';\nimport {Observable} from 'rxjs';\nimport {map} from 'rxjs/operators';\n\n@Component({\n selector: 'no-search-entries',\n templateUrl: './no-search-entries.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NoSearchEntriesComponent {\n noQueryOrFilters$: Observable<boolean>;\n\n constructor(private store: Store) {\n this.noQueryOrFilters$ = this.store\n .select(DriveState.meta)\n .pipe(map(m => !m.query && !m.filters));\n }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, ElementRef, AfterViewInit, Inject } from '@angular/core';\nimport { DRIVE_UPLOAD_INPUT_CONFIG } from '../../upload-input-config';\nimport { UploadInputConfig } from '@common/uploads/upload-input-config';\nimport { Store } from '@ngxs/store';\nimport { UploadFiles } from '../../state/actions/commands';\nimport { openUploadWindow } from '@common/uploads/utils/open-upload-window';\n\n@Component({\n selector: 'upload-dropzone',\n templateUrl: './upload-dropzone.component.html',\n styleUrls: ['./upload-dropzone.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UploadDropzoneComponent implements AfterViewInit {\n @ViewChild('clickTarget', { static: true }) clickTarget: ElementRef;\n\n constructor (\n private store: Store,\n @Inject(DRIVE_UPLOAD_INPUT_CONFIG) private uploadConfig: UploadInputConfig,\n ) {}\n\n ngAfterViewInit() {\n this.clickTarget.nativeElement.addEventListener('click', () => {\n openUploadWindow(this.uploadConfig).then(files => {\n this.store.dispatch(new UploadFiles(files));\n });\n });\n }\n}\n","<div class=\"animation-circle\"></div>\n<div class=\"content-circle\" #clickTarget>\n <mat-icon class=\"main-icon\" svgIcon=\"upload-custom\"></mat-icon>\n <div class=\"text initial-text\">\n <div class=\"primary\" trans>Drop files or folders here</div>\n <div class=\"secondary\" trans>or click to upload.</div>\n </div>\n</div>","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'no-folder-entries',\n templateUrl: './no-folder-entries.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoFolderEntriesComponent {\n}\n","<upload-dropzone></upload-dropzone>","<files-grid [entries]=\"entries$ | async\" *ngIf=\"(viewMode$ | async) === 'grid'; else filesList\"></files-grid>\n<ng-template #filesList>\n <files-list [entries]=\"entries$ | async\"></files-list>\n</ng-template>\n\n<ng-container [ngSwitch]=\"activePageName$ | async\" *ngIf=\"noEntries | async\">\n <no-recent-entries *ngSwitchCase=\"'recent'\"></no-recent-entries>\n <no-trashed-entries *ngSwitchCase=\"'trash'\"></no-trashed-entries>\n <no-starred-entries *ngSwitchCase=\"'starred'\"></no-starred-entries>\n <no-shared-entries *ngSwitchCase=\"'shares'\"></no-shared-entries>\n <no-search-entries *ngSwitchCase=\"'search'\"></no-search-entries>\n <no-folder-entries *ngSwitchDefault></no-folder-entries>\n</ng-container>","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n OnDestroy,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { Observable, Subscription } from 'rxjs';\nimport { DrivePageType } from '../../state/models/available-pages';\nimport { Keybinds } from '@common/core/keybinds/keybinds.service';\nimport {\n DeleteSelectedEntries,\n DeleteTrashedEntriesForever,\n OpenConfirmDialog,\n SelectAllEntries\n} from '../../state/actions/commands';\nimport { EntryDoubleTapped } from '../../state/actions/events';\nimport { DRIVE_PAGE_NAMES } from '../../state/models/drive-page';\n\n@Component({\n selector: 'entries-container',\n templateUrl: './entries-container.component.html',\n styleUrls: ['./entries-container.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [Keybinds],\n})\nexport class EntriesContainerComponent implements OnInit, OnDestroy {\n @HostBinding('attr.tabindex') tabindex = 0;\n @Select(DriveState.entries) entries$: Observable<DriveEntry[]>;\n @Select(DriveState.entriesEmpty) noEntries: Observable<boolean>;\n @Select(DriveState.viewMode) viewMode$: Observable<'list'|'grid'>;\n @Select(DriveState.activePageName) activePageName$: Observable<DrivePageType>;\n private keybindSub: Subscription;\n\n constructor(\n private store: Store,\n private el: ElementRef,\n private keybinds: Keybinds,\n ) {}\n\n ngOnInit() {\n this.keybindSub = this.keybinds.listenOn(this.el.nativeElement);\n this.keybinds.addWithPreventDefault('ctrl+a', () => {\n this.store.dispatch(new SelectAllEntries());\n });\n this.keybinds.addWithPreventDefault('delete', () => {\n if (this.store.selectSnapshot(DriveState.activePageName) === DRIVE_PAGE_NAMES.TRASH) {\n this.store.dispatch(new OpenConfirmDialog({\n title: 'Delete Forever',\n body: 'This will permanently delete selected items.',\n bodyBold: 'This action can not be undone.',\n ok: 'Delete Forever',\n }, new DeleteTrashedEntriesForever()));\n } else {\n this.store.dispatch(new DeleteSelectedEntries());\n }\n });\n this.keybinds.addWithPreventDefault('enter', () => {\n this.store.dispatch(new EntryDoubleTapped(this.store.selectSnapshot(DriveState.selectedEntry)));\n });\n }\n\n ngOnDestroy() {\n this.keybindSub.unsubscribe();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const CURRENT_PREVIEW_FILE = new InjectionToken<any>('CURRENT_PREVIEW_FILE');\n","import { InjectionToken } from '@angular/core';\nimport { FileEntry } from '@common/uploads/types/file-entry';\n\nexport type PreviewUrlTransformer = (entry: FileEntry) => string;\n\nexport const PREVIEW_URL_TRANSFORMER = new InjectionToken<PreviewUrlTransformer>('PREVIEW_URL_TRANSFORMER', {\n factory: () => {\n return entry => entry.url;\n },\n providedIn: 'root',\n});\n","import { EventEmitter, HostBinding, Inject, Directive } from '@angular/core';\nimport { CURRENT_PREVIEW_FILE } from './current-preview-file';\nimport { FileEntry } from '../uploads/types/file-entry';\nimport { PREVIEW_URL_TRANSFORMER, PreviewUrlTransformer } from './preview-url-transformer';\nimport { Settings } from '../core/config/settings.service';\nimport { Observable } from 'rxjs';\nimport { AppHttpClient } from '../core/http/app-http-client.service';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { CurrentUser } from '../auth/current-user';\n\n@Directive()\nexport abstract class BaseFilePreview {\n @HostBinding('class.file-preview-wrapper') filePreviewWrapper = true;\n public download = new EventEmitter();\n\n constructor(\n @Inject(CURRENT_PREVIEW_FILE) protected file: FileEntry,\n @Inject(PREVIEW_URL_TRANSFORMER) protected transformer: PreviewUrlTransformer,\n protected settings: Settings,\n protected http: AppHttpClient,\n protected sanitizer: DomSanitizer,\n protected currentUser: CurrentUser,\n ) {}\n\n public getSrc(): string {\n return this.transformer(this.file);\n }\n\n public getSafeSrc(): SafeResourceUrl {\n return this.sanitizer.bypassSecurityTrustResourceUrl(this.getSrc());\n }\n\n public getContents(): Observable<string> {\n return this.http.get(this.getSrc(), null, {responseType: 'text'});\n }\n}\n","<div class=\"panel preview-object\">\n <div class=\"message\">{{getMessage() | trans}}</div>\n <button mat-raised-button color=\"accent\" (click)=\"download.emit()\" *ngIf=\"download.observers.length\" trans>Download</button>\n</div>\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n selector: 'default-preview',\n templateUrl: './default-preview.component.html',\n styleUrls: ['./default-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DefaultPreviewComponent extends BaseFilePreview {\n @Input() message: string;\n\n public getMessage() {\n return this.message || 'No file preview available.';\n }\n}\n","<default-preview *ngIf=\"fileTooLarge$ | async; else textPreview\" message=\"This file is too large to preview.\"></default-preview>\n<ng-template #textPreview>\n <div class=\"text-wrapper preview-object\">\n <pre>{{ content$ | async }}</pre>\n </div>\n</ng-template>","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {BaseFilePreview} from '../base-file-preview';\n\nconst FIVE_MB = 5242880;\n\n@Component({\n selector: 'text-preview',\n templateUrl: './text-preview.component.html',\n styleUrls: ['./text-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextPreviewComponent extends BaseFilePreview implements OnInit {\n public content$ = new BehaviorSubject('');\n public fileTooLarge$ = new BehaviorSubject(false);\n\n ngOnInit() {\n if (this.file.file_size > FIVE_MB) {\n this.fileTooLarge$.next(true);\n } else {\n this.loadFileContents();\n }\n }\n\n private loadFileContents() {\n this.getContents()\n .subscribe(content => {\n this.content$.next(content);\n });\n }\n}\n","<audio #playerEl controls=\"controls\" class=\"preview-object\" [class.hidden]=\"invalidMedia\" controlsList=\"nodownload noremoteplayback\"></audio>\n\n<default-preview *ngIf=\"invalidMedia\"></default-preview>","import {ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n selector: 'audio-preview',\n templateUrl: './audio-preview.component.html',\n styleUrls: ['./audio-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AudioPreviewComponent extends BaseFilePreview implements OnInit {\n @ViewChild('playerEl', { static: true }) playerEl: ElementRef;\n public invalidMedia = false;\n\n ngOnInit() {\n this.invalidMedia = !this.canPlayVideo();\n\n if ( ! this.invalidMedia) {\n const source = document.createElement('source');\n source.src = this.getSrc();\n source.type = this.file.mime;\n this.player().appendChild(source);\n this.player().play();\n }\n }\n\n protected canPlayVideo(): boolean {\n return !!this.player().canPlayType(this.file.mime);\n }\n\n protected player() {\n return this.playerEl.nativeElement as HTMLVideoElement|HTMLAudioElement;\n }\n}\n","<video\n #playerEl\n controls=\"controls\"\n class=\"preview-object\"\n [class.hidden]=\"invalidMedia\"\n type=\"video/mp4\"\n controlsList=\"nodownload noremoteplayback\"\n playsinline\n></video>\n\n<default-preview *ngIf=\"invalidMedia\"></default-preview>\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {AudioPreviewComponent} from '../audio-preview/audio-preview.component';\n\n@Component({\n selector: 'video-preview',\n templateUrl: './video-preview.component.html',\n styleUrls: ['./video-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class VideoPreviewComponent extends AudioPreviewComponent {\n}\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n selector: 'image-preview',\n templateUrl: './image-preview.component.html',\n styleUrls: ['./image-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ImagePreviewComponent extends BaseFilePreview {}\n","<img [src]=\"getSafeSrc()\" class=\"preview-object\">","import {ChangeDetectionStrategy, Component, HostBinding,} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n selector: 'pdf-preview',\n templateUrl: './pdf-preview.component.html',\n styleUrls: ['./pdf-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PdfPreviewComponent extends BaseFilePreview {\n @HostBinding('class') className = 'preview-object';\n\n public getSrc() {\n return super.getSrc() + '#toolbar=0';\n }\n}\n","<iframe [src]=\"getSafeSrc()\"></iframe>","<ng-container *ngIf=\"!(showDefaultPreview$ | async); else defaultPreview\">\n <iframe class=\"preview-object\" #iframe></iframe>\n <div class=\"pop-out-block office-block\" (click)=\"openInNewWindow()\"></div>\n</ng-container>\n<ng-template #defaultPreview>\n <default-preview></default-preview>\n</ng-template>\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, ViewChild } from '@angular/core';\nimport { BaseFilePreview } from '../base-file-preview';\nimport { BehaviorSubject } from 'rxjs';\nimport { GenericBackendResponse } from '@common/core/types/backend-response';\nimport { isAbsoluteUrl } from '@common/core/utils/is-absolute-url';\n\n@Component({\n selector: 'google-docs-viewer',\n templateUrl: './google-docs-viewer.component.html',\n styleUrls: ['./google-docs-viewer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class GoogleDocsViewerComponent extends BaseFilePreview implements AfterViewInit {\n @ViewChild('iframe') iframe: ElementRef<HTMLIFrameElement>;\n public loading$ = new BehaviorSubject(true);\n public showDefaultPreview$ = new BehaviorSubject(false);\n private timeoutRef: any;\n\n ngAfterViewInit() {\n // google docs viewer only supports files up to 25MB\n if (this.file.file_size > 25000000) {\n return this.showDefaultPreview();\n }\n\n this.iframe.nativeElement.onload = () => {\n clearTimeout(this.timeoutRef);\n this.stopLoading();\n };\n\n this.getIframeSrc().then(url => {\n this.iframe.nativeElement.src = url;\n }).catch(() => {\n this.showDefaultPreview();\n });\n\n // if preview iframe is not loaded\n // after 5 seconds, bail and show default preview\n this.timeoutRef = setTimeout(() => {\n this.showDefaultPreview();\n }, 5000);\n }\n\n public stopLoading() {\n this.loading$.next(false);\n }\n\n public showDefaultPreview() {\n this.stopLoading();\n this.showDefaultPreview$.next(true);\n }\n\n public openInNewWindow() {\n window.open(window.location.href, '_blank');\n }\n\n private getIframeSrc(): Promise<string> {\n return new Promise((resolve, reject) => {\n let previewUrl = this.getSrc();\n\n // if we're not trying to preview shareable link we will need to generate\n // preview token, otherwise google won't be able to access this file\n if (previewUrl.indexOf('shareable_link') === -1) {\n this.http.post<GenericBackendResponse<{preview_token: string}>>(`uploads/${this.file.id}/add-preview-token`).subscribe(response => {\n previewUrl += `?preview_token=${response.preview_token}`;\n resolve(this.getFullPreviewUrl(previewUrl));\n }, () => reject);\n } else {\n resolve(this.getFullPreviewUrl(previewUrl));\n }\n });\n }\n\n private getFullPreviewUrl(previewUrl: string) {\n // https://docs.google.com/gview?embedded=true&url=\n previewUrl = isAbsoluteUrl(previewUrl) ? previewUrl : this.settings.getBaseUrl() + '/' + previewUrl;\n return 'https://view.officeapps.live.com/op/embed.aspx?src=' + encodeURIComponent(previewUrl);\n }\n}\n","import { InjectionToken, Injectable } from '@angular/core';\nimport { TextPreviewComponent } from './text-preview/text-preview.component';\nimport { VideoPreviewComponent } from './video-preview/video-preview.component';\nimport { ImagePreviewComponent } from './image-preview/image-preview.component';\nimport { PdfPreviewComponent } from './pdf-preview/pdf-preview.component';\nimport { AudioPreviewComponent } from './audio-preview/audio-preview.component';\nimport { GoogleDocsViewerComponent } from './google-docs-viewer/google-docs-viewer.component';\nimport {DefaultPreviewComponent} from './default-preview/default-preview.component';\n\nexport const AVAILABLE_PREVIEWS = new InjectionToken<any>('AVAILABLE_PREVIEWS');\n\n@Injectable()\nexport class DefaultPreviews {\n text = TextPreviewComponent;\n video = VideoPreviewComponent;\n audio = AudioPreviewComponent;\n image = ImagePreviewComponent;\n pdf = PdfPreviewComponent;\n spreadsheet = GoogleDocsViewerComponent;\n powerPoint = GoogleDocsViewerComponent;\n word = GoogleDocsViewerComponent;\n 'text/rtf' = DefaultPreviewComponent;\n}\n\n","import {Inject, Injectable, Injector} from '@angular/core';\nimport {FileEntry} from '../uploads/types/file-entry';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport {AVAILABLE_PREVIEWS, DefaultPreviews} from './available-previews';\nimport {ComponentPortal, PortalInjector} from '@angular/cdk/portal';\nimport {CURRENT_PREVIEW_FILE} from './current-preview-file';\nimport {DefaultPreviewComponent} from './default-preview/default-preview.component';\nimport {filter} from 'rxjs/operators';\nimport {PREVIEW_URL_TRANSFORMER, PreviewUrlTransformer} from './preview-url-transformer';\n\ninterface PreviewFilesMeta {\n entry?: FileEntry;\n pointer?: number;\n total?: number;\n haveNext?: boolean;\n havePrevious?: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PreviewFilesService {\n private files: FileEntry[] = [];\n private portal = new BehaviorSubject(null);\n private meta: BehaviorSubject<PreviewFilesMeta> = new BehaviorSubject({});\n private previewUriTransformer: PreviewUrlTransformer | null = null;\n public download = new Subject();\n\n constructor(\n @Inject(AVAILABLE_PREVIEWS) private availablePreviews: DefaultPreviews,\n private injector: Injector\n ) {}\n\n public pagination(): Observable<PreviewFilesMeta> {\n return this.meta.pipe(filter(data => data && !!data.entry));\n }\n\n public getCurrent(): FileEntry {\n return this.meta.value.entry;\n }\n\n public getAllEntries() {\n return this.files;\n }\n\n public getPortal(): Observable<ComponentPortal<any>> {\n return this.portal.asObservable();\n }\n\n public showNext() {\n if (!this.meta.value.haveNext) return;\n this.updateMeta('next');\n this.updatePortal();\n }\n\n public showPrevious() {\n if (!this.meta.value.havePrevious) return;\n this.updateMeta('previous');\n this.updatePortal();\n }\n\n private updateMeta(dir?: 'next' | 'previous' | number) {\n let newPointer = 0;\n\n if (typeof dir === 'string') {\n const oldPointer = this.meta.value.pointer;\n newPointer = dir === 'next' ? oldPointer + 1 : oldPointer - 1;\n } else if (typeof dir === 'number') {\n newPointer = dir;\n }\n\n this.meta.next({\n pointer: newPointer,\n entry: this.files[newPointer],\n total: this.files.length,\n haveNext: newPointer + 1 < this.files.length,\n havePrevious: newPointer - 1 > -1,\n });\n }\n\n private updatePortal() {\n const file = this.getCurrent();\n const comp =\n this.availablePreviews[file?.mime] ||\n this.availablePreviews[file?.type] ||\n DefaultPreviewComponent;\n this.portal.next(new ComponentPortal(comp, null, this.createInjector()));\n }\n\n public set(files: FileEntry[], activeFile?: number) {\n if (!files || files.length === 0) return;\n this.files = files.filter(entry => entry.type !== 'folder');\n this.updateMeta(activeFile);\n this.updatePortal();\n }\n\n private createInjector(): PortalInjector {\n const injectionTokens = new WeakMap();\n\n // set currently active preview file\n injectionTokens.set(CURRENT_PREVIEW_FILE, this.getCurrent());\n\n // override preview backend uri, if specified\n if (this.previewUriTransformer) {\n injectionTokens.set(PREVIEW_URL_TRANSFORMER, this.previewUriTransformer);\n }\n\n return new PortalInjector(this.injector, injectionTokens);\n }\n\n public destroy() {\n this.meta.next({});\n this.files = null;\n this.portal.next(null);\n }\n\n /**\n * Provide transformer function for preview file backend url.\n * (for changing base uri, adding url params etc)\n */\n public setPreviewUriTransformer(transformer: PreviewUrlTransformer) {\n this.previewUriTransformer = transformer;\n }\n}\n","<mat-icon svgIcon=\"password-custom\"></mat-icon>\n<form class=\"content\" (ngSubmit)=\"submitPassword()\" ngNativeValidate>\n <div class=\"message\" trans>The link you are trying to access is password protected.</div>\n <div class=\"input-container\">\n <label for=\"password\" class=\"hidden\" trans>Password</label>\n <input type=\"password\" id=\"password\" placeholder=\"Password\" [formControl]=\"passwordControl\" trans-placeholder required>\n </div>\n <div class=\"button-container\">\n <div class=\"error\" *ngIf=\"passwordError$ | async\" trans>Password does not match.</div>\n <button type=\"submit\" mat-raised-button color=\"accent\" trans>Enter</button>\n </div>\n</form>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\nimport { ShareableLinksApiService } from '../../../sharing/links/shareable-links-api.service';\nimport { ShareableLink } from '../../../sharing/links/models/shareable-link';\n\n@Component({\n selector: 'link-preview-password-panel',\n templateUrl: './link-preview-password-panel.component.html',\n styleUrls: ['./link-preview-password-panel.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LinkPreviewPasswordPanelComponent {\n public passwordControl = new FormControl();\n public passwordError$ = new BehaviorSubject(false);\n\n @Input() link: ShareableLink;\n @Output() passwordValid = new EventEmitter(null);\n\n constructor(private links: ShareableLinksApiService) {}\n\n public submitPassword() {\n this.links.checkPassword(this.link.id, this.passwordControl.value)\n .subscribe(response => {\n this.handlePasswordCheck(response.matches);\n }, () => {});\n }\n\n private handlePasswordCheck(matches: boolean) {\n this.passwordError$.next(!matches);\n\n if (matches) {\n this.passwordValid.emit(this.passwordControl.value);\n }\n }\n}\n","<button mat-icon-button class=\"back-button\" (click)=\"closed.emit(true)\" *ngIf=\"showCloseButton\">\n <mat-icon svgIcon=\"arrow-back\"></mat-icon>\n</button>\n<ng-container *ngIf=\"previewFiles.pagination() | async as pagination\">\n <div class=\"entry-name\">\n <file-icon [type]=\"pagination.entry.type\"></file-icon>\n {{pagination.entry.name}}\n </div>\n\n <ng-container *ngIf=\"previewFiles.pagination() | async as pagination\">\n <div class=\"navigation\">\n <button mat-icon-button class=\"previous\" [disabled]=\"!pagination.havePrevious\" (click)=\"previewFiles.showPrevious()\">\n <mat-icon svgIcon=\"keyboard-arrow-left\"></mat-icon>\n </button>\n\n <span class=\"meta\">{{pagination.pointer + 1}} {{'of' | trans}} {{pagination.total}}</span>\n\n <button mat-icon-button class=\"next\" [disabled]=\"!pagination.haveNext\" (click)=\"previewFiles.showNext()\">\n <mat-icon svgIcon=\"keyboard-arrow-right\"></mat-icon>\n </button>\n </div>\n </ng-container>\n\n <div class=\"actions\">\n <button mat-icon-button (click)=\"downloadFiles()\" [disabled]=\"disableDownload\">\n <mat-icon svgIcon=\"file-download\"></mat-icon>\n </button>\n <ng-content></ng-content>\n </div>\n</ng-container>\n<a routerLink=\"/drive\" class=\"logo\" *ngIf=\"showLogo && settings.has('branding.logo_light')\">\n <img *ngIf=\"showLogo && settings.get('branding.logo_light')\" [src]=\"settings.get('branding.logo_light')\">\n</a>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\nimport { PreviewFilesService } from '@common/file-preview/preview-files.service';\nimport { Settings } from '@common/core/config/settings.service';\n\n@Component({\n selector: 'file-preview-toolbar',\n templateUrl: './file-preview-toolbar.component.html',\n styleUrls: ['./file-preview-toolbar.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilePreviewToolbarComponent {\n @Input() showLogo = false;\n @Input() disableDownload = false;\n @Input() showCloseButton = false;\n\n @Output() closed = new EventEmitter();\n\n constructor(\n public previewFiles: PreviewFilesService,\n public settings: Settings,\n ) {}\n\n public downloadFiles() {\n this.previewFiles.download.next();\n }\n}\n","<ng-container *ngIf=\"previewFiles.getPortal() | async as portal\">\n <ng-template [cdkPortalOutlet]=\"portal\" (attached)=\"listenForDownloadClick($event)\"></ng-template>\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Input,\n OnChanges,\n OnDestroy,\n} from '@angular/core';\nimport {FileEntry} from '../../uploads/types/file-entry';\nimport {PreviewFilesService} from '../preview-files.service';\nimport {BaseFilePreview} from '../base-file-preview';\nimport {Subscription} from 'rxjs';\n\n@Component({\n selector: 'preview-container',\n templateUrl: './preview-container.component.html',\n styleUrls: ['./preview-container.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PreviewContainerComponent implements OnChanges, OnDestroy {\n @Input() files: FileEntry[];\n @Input() activeFile: number;\n @Input() disableDownload = false;\n private downloadSub: Subscription;\n\n constructor(public previewFiles: PreviewFilesService) {}\n\n ngOnChanges(changes) {\n this.previewFiles.set(this.files, this.activeFile);\n }\n\n ngOnDestroy() {\n this.previewFiles.destroy();\n if (this.downloadSub) this.downloadSub.unsubscribe();\n }\n\n public listenForDownloadClick(comp: ComponentRef<BaseFilePreview>) {\n if (this.downloadSub) this.downloadSub.unsubscribe();\n if (!this.disableDownload) {\n this.downloadSub = comp.instance.download.subscribe(() => {\n this.previewFiles.download.next();\n });\n }\n }\n}\n","<file-preview-toolbar [showCloseButton]=\"true\" (closed)=\"closeOverlay()\" [disableDownload]=\"!canDownload()\">\n <button mat-icon-button (click)=\"openContextMenu()\" #moreOptionsButton *ngIf=\"!data.hideMoreOptionsBtn\">\n <mat-icon svgIcon=\"more-vert\"></mat-icon>\n </button>\n</file-preview-toolbar>\n<preview-container [files]=\"data.entries\" [activeFile]=\"data.activeEntry\" [disableDownload]=\"!canDownload()\" #previewContainer></preview-container>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Inject, OnDestroy, ViewChild, } from '@angular/core';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { OverlayPanelRef } from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport { OVERLAY_PANEL_DATA } from '@common/core/ui/overlay-panel/overlay-panel-data';\nimport { DriveContextMenuComponent } from '../../context-actions/components/drive-context-menu/drive-context-menu.component';\nimport { ContextMenu } from '@common/core/ui/context-menu/context-menu.service';\nimport { PreviewFilesService } from '@common/file-preview/preview-files.service';\nimport { DownloadEntries } from '../../state/actions/commands';\nimport { Store } from '@ngxs/store';\nimport { Subscription } from 'rxjs';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { ShareableLink } from '../../sharing/links/models/shareable-link';\n\nexport interface FilePreviewOverlayData {\n entries: DriveEntry[];\n activeEntry?: number;\n shareableLink?: ShareableLink;\n password?: string;\n hideMoreOptionsBtn?: boolean;\n}\n\n@Component({\n selector: 'file-preview-overlay',\n templateUrl: './file-preview-overlay.component.html',\n styleUrls: ['./file-preview-overlay.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilePreviewOverlayComponent implements AfterViewInit, OnDestroy {\n @ViewChild('previewContainer', { read: ElementRef, static: true }) previewContainer: ElementRef;\n @ViewChild('moreOptionsButton', { read: ElementRef }) optionsButton: ElementRef;\n private downloadSub: Subscription;\n\n constructor(\n private store: Store,\n private el: ElementRef,\n private contextMenu: ContextMenu,\n private overlayRef: OverlayPanelRef,\n private previewFiles: PreviewFilesService,\n private currentUser: CurrentUser,\n @Inject(OVERLAY_PANEL_DATA) public data: FilePreviewOverlayData\n ) {}\n\n ngAfterViewInit() {\n this.bindToDownload();\n // prevent ghost click from closing preview overlay\n // when on mobile and single tap opens preview\n setTimeout(() => {\n this.previewContainer.nativeElement.addEventListener('click', e => {\n if ( ! e.target.closest('.preview-object')) {\n this.overlayRef.close();\n }\n });\n });\n }\n\n ngOnDestroy() {\n this.downloadSub.unsubscribe();\n }\n\n public openContextMenu() {\n const origin = this.optionsButton.nativeElement;\n this.contextMenu.open(DriveContextMenuComponent, origin, {data: {entry: this.previewFiles.getCurrent()}});\n }\n\n public closeOverlay() {\n this.overlayRef.close();\n }\n\n public canDownload() {\n return this.data.entries.every(entry => {\n if ( ! entry.users) entry.users = [];\n const user = entry.users && entry.users.find(u => u.id === this.currentUser.get('id'));\n const userHasDownloadPermission = user && (user.owns_entry || user.entry_permissions.download);\n return this.data.shareableLink?.allow_download || userHasDownloadPermission;\n });\n }\n\n private bindToDownload() {\n this.downloadSub = this.previewFiles.download.subscribe(() => {\n const entries = this.previewFiles.getCurrent();\n this.store.dispatch(new DownloadEntries([entries], this.data.shareableLink, this.data.password));\n });\n }\n}\n","<material-navbar></material-navbar>\n\n<div class=\"toolbar\">\n <div class=\"breadcrumb\">\n <button mat-icon-button *ngIf=\"isSubFolder()\" (click)=\"openFolder()\" class=\"home-button\">\n <mat-icon svgIcon=\"home\" class=\"action-icon\"></mat-icon>\n </button>\n <ng-container *ngFor=\"let folder of breadcrumb$ | async; last as last;\">\n <div class=\"breadcrumb-item\" (click)=\"openFolder(folder)\">{{folder.name}}</div>\n <mat-icon class=\"separator\" svgIcon=\"keyboard-arrow-right\" *ngIf=\"!last\"></mat-icon>\n </ng-container>\n </div>\n\n <div class=\"actions\">\n <entries-sort-button [formControl]=\"sortFormControl\"></entries-sort-button>\n\n <span class=\"action-separator\"></span>\n\n <ng-container *ngIf=\"viewMode$ | async as viewMode\">\n <button mat-icon-button (click)=\"toggleViewMode()\" class=\"view-toggle-button\" [matTooltip]=\"(viewMode === 'list' ? 'Grid view' : 'List view') | trans\">\n <mat-icon [svgIcon]=\"viewMode === 'list' ? 'view-list' : 'view-module'\" class=\"action-icon\"></mat-icon>\n </button>\n </ng-container>\n\n <button mat-icon-button (click)=\"download()\" *ngIf=\"data.link.allow_download\" [matTooltip]=\"'Download all' | trans\">\n <mat-icon svgIcon=\"file-download\" class=\"action-icon\"></mat-icon>\n </button>\n\n <ng-content></ng-content>\n </div>\n</div>\n\n<ad-host slot=\"ads.file-preview\" class=\"folder-preview-vert-host\"></ad-host>\n\n<div class=\"files-container\" #filesContainer (click)=\"onClick($event)\">\n <ng-container *ngIf=\"pagination$ | async as pagination\">\n <files-grid [entries]=\"pagination.data\" [disableInteractions]=\"true\" *ngIf=\"(viewMode$ | async) === 'grid'; else filesList\"></files-grid>\n <ng-template #filesList>\n <files-list [entries]=\"pagination.data\" [disableInteractions]=\"true\"></files-list>\n </ng-template>\n <no-results-message *ngIf=\"!pagination.data.length\">\n <span primary-text trans>Folder Is Empty</span>\n <span secondary-text trans>No files have been uploaded to this folder yet.</span>\n </no-results-message>\n </ng-container>\n</div>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n","import {\n Component, ViewEncapsulation, ChangeDetectionStrategy, Input, ViewChild, ElementRef, OnInit, OnChanges, NgZone,\n} from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DownloadEntries, SetViewMode } from '../../state/actions/commands';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { FilePreviewOverlayComponent } from '../file-preview-overlay/file-preview-overlay.component';\nimport { Router } from '@angular/router';\nimport { FormControl } from '@angular/forms';\nimport { GetLinkData, ShareableLinksApiService } from '../../sharing/links/shareable-links-api.service';\nimport { finalize } from 'rxjs/operators';\nimport { SortValue } from '../../entries/available-sorts';\nimport { InfiniteScroll } from '@common/core/ui/infinite-scroll/infinite.scroll';\nimport { PaginationResponse } from '@common/core/types/pagination/pagination-response';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { OverlayPanel } from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport { DriveState } from '../../state/drive-state';\n\n@Component({\n selector: 'folder-preview',\n templateUrl: './folder-preview.component.html',\n styleUrls: ['./folder-preview.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FolderPreviewComponent extends InfiniteScroll implements OnChanges, OnInit {\n @Input() data: GetLinkData;\n @Input() password: string;\n @ViewChild('filesContainer', { static: true }) filesContainer: ElementRef<HTMLDivElement>;\n @Select(DriveState.viewMode) viewMode$: Observable<'list'|'grid'>;\n\n get folder() {\n return this.data.link.entry;\n }\n\n get children() {\n return this.pagination$.value.data;\n }\n\n public loading$ = new BehaviorSubject(false);\n public breadcrumb$: BehaviorSubject<FileEntry[]> = new BehaviorSubject([]);\n public pagination$: BehaviorSubject<PaginationResponse<FileEntry>> = new BehaviorSubject(null);\n private allFolders = {};\n public sortFormControl = new FormControl({\n column: 'updated_at',\n direction: 'desc',\n });\n\n constructor(\n private store: Store,\n private overlay: OverlayPanel,\n private router: Router,\n private linkApi: ShareableLinksApiService,\n protected zone: NgZone,\n protected el: ElementRef,\n ) {\n super();\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.sortFormControl.valueChanges.subscribe((value: SortValue) => {\n if (value) {\n this.loadChildren({}, true);\n }\n });\n }\n\n ngOnChanges() {\n this.allFolders[this.folder.id] = this.folder;\n this.generateBreadcrumb(this.folder);\n this.setPagination(this.data.folderChildren);\n this.loading$.next(false);\n }\n\n public download() {\n this.store.dispatch(new DownloadEntries([this.folder], this.data.link, this.password));\n }\n\n public toggleViewMode() {\n const current = this.store.selectSnapshot(DriveState.viewMode);\n this.store.dispatch(new SetViewMode(current === 'list' ? 'grid' : 'list'));\n }\n\n private openPreviewOverlay(entry: FileEntry) {\n const entries = this.children.filter(ent => ent.type !== 'folder'),\n activeEntry = entries.findIndex(e => e.id === entry.id);\n\n this.overlay.open(FilePreviewOverlayComponent, {\n position: 'center',\n origin: 'global',\n panelClass: 'file-preview-overlay-container',\n data: {\n entries: entries.slice(),\n activeEntry,\n shareableLink: this.data.link,\n password: this.password,\n hideMoreOptionsBtn: true,\n }\n });\n }\n\n private getEntry(e: MouseEvent): FileEntry {\n const node = (e.target as HTMLElement).closest('.drive-entry') as HTMLElement;\n if (node) {\n return this.children.find(entry => entry.id === +node.dataset.id);\n }\n }\n\n public onClick(e: MouseEvent) {\n const entry = this.getEntry(e);\n if ( ! entry) return;\n\n if (entry.type === 'folder') {\n this.openFolder(entry);\n } else {\n this.openPreviewOverlay(entry);\n }\n }\n\n public isSubFolder() {\n return this.router.url.indexOf(':') > -1;\n }\n\n public openFolder(folder?: FileEntry) {\n if (folder && this.folder.id === folder.id) return;\n this.loading$.next(true);\n this.router.navigate(['/drive/s', this.makeLinkHash(folder)]).then(() => {\n // reset sort to default, as there's no good way to\n // pass current sort to parent link preview component\n this.sortFormControl.reset();\n });\n }\n\n private generateBreadcrumb(folder: FileEntry) {\n this.breadcrumb$.next(folder.path.split('/').map(folderId => {\n return this.allFolders[+folderId];\n }).filter(subFolder => !!subFolder));\n }\n\n private loadChildren(params: {page?: number}, replaceChildren = false) {\n this.loading$.next(true);\n const sortCol = this.sortFormControl.value?.column || 'updated_at';\n const sortDir = this.sortFormControl.value?.direction || 'desc';\n const order = `${sortCol}:${sortDir}`;\n const page = params.page || this.pagination$.value.current_page;\n this.linkApi.findByHash(this.makeLinkHash(this.folder), {page, order, withEntries: true})\n .pipe(finalize(() => this.loading$.next(false)))\n .subscribe(response => {\n const oldChildren = this.children;\n const pagination = response.folderChildren;\n if ( ! replaceChildren) {\n pagination.data = [...oldChildren, ...pagination.data];\n }\n this.setPagination(pagination);\n });\n }\n\n private makeLinkHash(folder?: FileEntry) {\n let hash = this.data.link.hash;\n if (folder) hash += ':' + folder.hash;\n return hash;\n }\n\n private setPagination(pagination: PaginationResponse<FileEntry>) {\n // add shareable link hash to all entries url to avoid permission errors\n pagination.data = pagination.data.map(entry => {\n entry.url += `?shareable_link=${this.data.link.id}`;\n if (this.password) {\n entry.url += `&password=${this.password}`;\n }\n return entry;\n });\n this.pagination$.next(pagination);\n }\n\n protected loadMoreItems() {\n const page = this.pagination$.value.current_page + 1;\n this.loadChildren({page}, false);\n }\n\n protected canLoadMore() {\n return this.pagination$.value.current_page < this.pagination$.value.last_page;\n }\n\n protected isLoading() {\n return this.loading$.value;\n }\n}\n","<ng-container *ngIf=\"data$ | async as data\">\n <link-preview-password-panel\n *ngIf=\"passwordPanelVisible$ | async; else filePreview\"\n [link]=\"data.link\"\n (passwordValid)=\"setValidPassword($event)\"\n ></link-preview-password-panel>\n\n <ng-template #filePreview>\n <ng-container *ngIf=\"data.link.entry.type === 'folder'\">\n <folder-preview [data]=\"data\" [password]=\"this.password\">\n <ng-container *ngIf=\"!(entryAlreadyImported$ | async) && currentUser.isLoggedIn()\">\n <span class=\"action-separator\"></span>\n <button mat-flat-button color=\"accent\" (click)=\"import()\" trans>Import</button>\n </ng-container>\n </folder-preview>\n </ng-container>\n\n <ng-container *ngIf=\"data.link.entry.type !== 'folder'\">\n <file-preview-toolbar [showLogo]=\"true\" [disableDownload]=\"!data.link.allow_download\">\n <a\n mat-flat-button\n color=\"accent\"\n routerLink=\"/login\"\n *ngIf=\"!currentUser.isLoggedIn()\"\n trans\n >Sign In</a\n >\n <button\n mat-flat-button\n color=\"accent\"\n (click)=\"import()\"\n *ngIf=\"!(entryAlreadyImported$ | async) && currentUser.isLoggedIn()\"\n trans\n >\n Import\n </button>\n </file-preview-toolbar>\n <ad-host slot=\"ads.file-preview\" class=\"file-preview-vert-host\"></ad-host>\n <preview-container\n [files]=\"[data.link.entry]\"\n [class.has-rek]=\"settings.has('ads.file-preview') && !currentUser.isSubscribed()\"\n ></preview-container>\n </ng-container>\n </ng-template>\n</ng-container>\n","import { Component, OnInit, ViewEncapsulation, ChangeDetectionStrategy, OnDestroy, ElementRef } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { GetLinkData, ShareableLinksApiService } from '../../sharing/links/shareable-links-api.service';\nimport { BehaviorSubject, fromEvent, Observable, Subscription } from 'rxjs';\nimport { PreviewFilesService } from '@common/file-preview/preview-files.service';\nimport { Settings } from '@common/core/config/settings.service';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { filter, map } from 'rxjs/operators';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { Store } from '@ngxs/store';\nimport { DownloadEntries, SetViewMode } from '../../state/actions/commands';\nimport { ShareableLink } from '../../sharing/links/models/shareable-link';\nimport { VIEW_MODE_KEY } from '../../state/models/drive-state-model';\nimport { LocalStorage } from '@common/core/services/local-storage.service';\n\n@Component({\n selector: 'link-preview-container',\n templateUrl: './link-preview-container.component.html',\n styleUrls: ['./link-preview-container.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n PreviewFilesService,\n ]\n})\nexport class LinkPreviewContainerComponent implements OnInit, OnDestroy {\n public data$: BehaviorSubject<GetLinkData> = new BehaviorSubject(null);\n public passwordPanelVisible$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n public password: string;\n private downloadSub: Subscription;\n\n /**\n * Check if current user owns this entry or\n * already has it imported into their drive.\n */\n public get entryAlreadyImported$(): Observable<boolean> {\n const userId = this.currentUser.get('id');\n return this.data$.pipe(\n map(data => data.link),\n filter(link => !!link && !!link.entry && !!link.entry.users),\n map(link => link.entry),\n map(entry => !!entry.users.find(user => user.id === userId))\n );\n }\n\n constructor(\n private store: Store,\n private route: ActivatedRoute,\n private links: ShareableLinksApiService,\n public previewFiles: PreviewFilesService,\n public settings: Settings,\n public currentUser: CurrentUser,\n private router: Router,\n private toast: Toast,\n private el: ElementRef<HTMLElement>,\n private localStorage: LocalStorage,\n ) {}\n\n ngOnInit() {\n this.bindToDownload();\n this.disableContextMenu();\n this.setViewMode();\n this.route.params.subscribe(params => {\n this.links.findByHash(params.hash, {withEntries: true}).subscribe(response => {\n const linkChanged = response.link.id !== (this.data$.value && this.data$.value.link.id);\n this.data$.next(response);\n this.setBackgroundClass(response.link);\n\n // prevent asking password for nested folders, if user already entered password\n if (response.link.password && (linkChanged || !this.password)) {\n this.togglePasswordPanel(true);\n } else {\n this.togglePasswordPanel(false);\n this.showPreview();\n }\n }, () => {\n this.router.navigate(['/404']);\n });\n });\n }\n\n ngOnDestroy() {\n this.downloadSub.unsubscribe();\n }\n\n public import() {\n this.links.importEntry(this.data$.value.link.id, this.password)\n .subscribe(response => {\n const link = this.data$.value.link;\n link.entry.users = response.users;\n this.data$.next({...this.data$.value, link});\n this.toast.open({\n message: `\":name\" imported into your drive.`,\n replacements: {name: link.entry.name},\n });\n });\n }\n\n public togglePasswordPanel(value: boolean) {\n this.passwordPanelVisible$.next(value);\n }\n\n private bindToDownload() {\n this.downloadSub = this.previewFiles.download.subscribe(() => {\n const link = this.data$.value.link;\n this.store.dispatch(new DownloadEntries([link.entry], link, this.password));\n });\n }\n\n /**\n * Show preview for shareable link files.\n */\n private showPreview() {\n const data = this.data$.value;\n data.link.entry.url += `?shareable_link=${data.link.id}`;\n if (this.password) {\n data.link.entry.url += `&password=${this.password}`;\n }\n this.data$.next({...data});\n }\n\n public setValidPassword(password: string) {\n this.password = password;\n this.showPreview();\n this.togglePasswordPanel(false);\n }\n\n private setBackgroundClass(link: ShareableLink) {\n const className = link.entry.type === 'folder' ? 'folder-link' : 'file-link';\n this.el.nativeElement.classList.add(className);\n }\n\n private disableContextMenu() {\n fromEvent(this.el.nativeElement, 'contextmenu')\n .subscribe(e => {\n e.preventDefault();\n });\n }\n\n private setViewMode() {\n this.store.dispatch(new SetViewMode(\n this.localStorage.get(VIEW_MODE_KEY, this.settings.get('drive.default_view', 'grid')))\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\nimport { DriveComponent } from './drive.component';\nimport { EntriesContainerComponent } from './entries/entries-container/entries-container.component';\nimport { LinkPreviewContainerComponent } from './preview/link-preview-container/link-preview-container.component';\nimport { AuthGuard } from '@common/guards/auth-guard.service';\nimport { CheckPermissionsGuard } from '../../common/guards/check-permissions-guard.service';\n\nconst dashboardRoutes: Routes = [\n // shareable links can be accessed by guests\n {\n path: 's/:hash',\n component: LinkPreviewContainerComponent,\n },\n\n // main drive routes can only be accessed by logged in users\n {\n path: '',\n component: DriveComponent,\n canActivate: [AuthGuard, CheckPermissionsGuard],\n children: [\n { path: '', component: EntriesContainerComponent},\n { path: 'shares', component: EntriesContainerComponent},\n { path: 'search', component: EntriesContainerComponent},\n { path: 'recent', component: EntriesContainerComponent},\n { path: 'starred', component: EntriesContainerComponent},\n { path: 'trash', component: EntriesContainerComponent},\n { path: 'folders/:hash', component: EntriesContainerComponent},\n {\n path: 'workspaces',\n loadChildren: () => import('src/app/drive/workspace-wrapper.module').then(m => m.WorkspaceWrapperModule)\n },\n ]\n },\n];\n\n@NgModule({\n imports: [\n CommonModule,\n RouterModule.forChild(dashboardRoutes)\n ],\n exports: [\n RouterModule\n ],\n})\nexport class DriveRoutingModule {}\n","import { InjectionToken, Component, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, Optional, Inject, Input, NgModule } from '@angular/core';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport { mixinColor, MatCommonModule } from '@angular/material/core';\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { _getShadowRoot, Platform } from '@angular/cdk/platform';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Base reference size of the spinner.\n * @docs-private\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/platform';\nimport * as ɵngcc2 from '@angular/common';\n\nfunction MatProgressSpinner__svg_circle_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵnamespaceSVG();\n ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n const ctx_r0 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"animation-name\", \"mat-progress-spinner-stroke-rotate-\" + ctx_r0._spinnerAnimationLabel)(\"stroke-dashoffset\", ctx_r0._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r0._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r0._getCircleStrokeWidth(), \"%\");\n ɵngcc0.ɵɵattribute(\"r\", ctx_r0._getCircleRadius());\n} }\nfunction MatProgressSpinner__svg_circle_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵnamespaceSVG();\n ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n const ctx_r1 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"stroke-dashoffset\", ctx_r1._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r1._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r1._getCircleStrokeWidth(), \"%\");\n ɵngcc0.ɵɵattribute(\"r\", ctx_r1._getCircleRadius());\n} }\nfunction MatSpinner__svg_circle_1_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵnamespaceSVG();\n ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n const ctx_r0 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"animation-name\", \"mat-progress-spinner-stroke-rotate-\" + ctx_r0._spinnerAnimationLabel)(\"stroke-dashoffset\", ctx_r0._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r0._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r0._getCircleStrokeWidth(), \"%\");\n ɵngcc0.ɵɵattribute(\"r\", ctx_r0._getCircleRadius());\n} }\nfunction MatSpinner__svg_circle_2_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵnamespaceSVG();\n ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n const ctx_r1 = ɵngcc0.ɵɵnextContext();\n ɵngcc0.ɵɵstyleProp(\"stroke-dashoffset\", ctx_r1._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r1._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r1._getCircleStrokeWidth(), \"%\");\n ɵngcc0.ɵɵattribute(\"r\", ctx_r1._getCircleRadius());\n} }\nconst _c0 = \".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\\n\";\nconst BASE_SIZE = 100;\n/**\n * Base reference stroke width of the spinner.\n * @docs-private\n */\nconst BASE_STROKE_WIDTH = 10;\n// Boilerplate for applying mixins to MatProgressSpinner.\n/** @docs-private */\nclass MatProgressSpinnerBase {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}\nconst _MatProgressSpinnerMixinBase = mixinColor(MatProgressSpinnerBase, 'primary');\n/** Injection token to be used to override the default options for `mat-progress-spinner`. */\nconst MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS = new InjectionToken('mat-progress-spinner-default-options', {\n providedIn: 'root',\n factory: MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY,\n});\n/** @docs-private */\nfunction MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY() {\n return { diameter: BASE_SIZE };\n}\n// .0001 percentage difference is necessary in order to avoid unwanted animation frames\n// for example because the animation duration is 4 seconds, .1% accounts to 4ms\n// which are enough to see the flicker described in\n// https://github.com/angular/components/issues/8984\nconst INDETERMINATE_ANIMATION_TEMPLATE = `\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n`;\n/**\n * `<mat-progress-spinner>` component.\n */\nclass MatProgressSpinner extends _MatProgressSpinnerMixinBase {\n constructor(_elementRef, platform, _document, animationMode, defaults) {\n super(_elementRef);\n this._elementRef = _elementRef;\n this._document = _document;\n this._diameter = BASE_SIZE;\n this._value = 0;\n this._fallbackAnimation = false;\n /** Mode of the progress circle */\n this.mode = 'determinate';\n const trackedDiameters = MatProgressSpinner._diameters;\n this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();\n // The base size is already inserted via the component's structural styles. We still\n // need to track it so we don't end up adding the same styles again.\n if (!trackedDiameters.has(_document.head)) {\n trackedDiameters.set(_document.head, new Set([BASE_SIZE]));\n }\n this._fallbackAnimation = platform.EDGE || platform.TRIDENT;\n this._noopAnimations = animationMode === 'NoopAnimations' &&\n (!!defaults && !defaults._forceAnimations);\n if (defaults) {\n if (defaults.diameter) {\n this.diameter = defaults.diameter;\n }\n if (defaults.strokeWidth) {\n this.strokeWidth = defaults.strokeWidth;\n }\n }\n }\n /** The diameter of the progress spinner (will set width and height of svg). */\n get diameter() { return this._diameter; }\n set diameter(size) {\n this._diameter = coerceNumberProperty(size);\n this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();\n // If this is set before `ngOnInit`, the style root may not have been resolved yet.\n if (!this._fallbackAnimation && this._styleRoot) {\n this._attachStyleNode();\n }\n }\n /** Stroke width of the progress spinner. */\n get strokeWidth() {\n return this._strokeWidth || this.diameter / 10;\n }\n set strokeWidth(value) {\n this._strokeWidth = coerceNumberProperty(value);\n }\n /** Value of the progress circle. */\n get value() {\n return this.mode === 'determinate' ? this._value : 0;\n }\n set value(newValue) {\n this._value = Math.max(0, Math.min(100, coerceNumberProperty(newValue)));\n }\n ngOnInit() {\n const element = this._elementRef.nativeElement;\n // Note that we need to look up the root node in ngOnInit, rather than the constructor, because\n // Angular seems to create the element outside the shadow root and then moves it inside, if the\n // node is inside an `ngIf` and a ShadowDom-encapsulated component.\n this._styleRoot = _getShadowRoot(element) || this._document.head;\n this._attachStyleNode();\n // On IE and Edge, we can't animate the `stroke-dashoffset`\n // reliably so we fall back to a non-spec animation.\n const animationClass = `mat-progress-spinner-indeterminate${this._fallbackAnimation ? '-fallback' : ''}-animation`;\n element.classList.add(animationClass);\n }\n /** The radius of the spinner, adjusted for stroke width. */\n _getCircleRadius() {\n return (this.diameter - BASE_STROKE_WIDTH) / 2;\n }\n /** The view box of the spinner's svg element. */\n _getViewBox() {\n const viewBox = this._getCircleRadius() * 2 + this.strokeWidth;\n return `0 0 ${viewBox} ${viewBox}`;\n }\n /** The stroke circumference of the svg circle. */\n _getStrokeCircumference() {\n return 2 * Math.PI * this._getCircleRadius();\n }\n /** The dash offset of the svg circle. */\n _getStrokeDashOffset() {\n if (this.mode === 'determinate') {\n return this._getStrokeCircumference() * (100 - this._value) / 100;\n }\n // In fallback mode set the circle to 80% and rotate it with CSS.\n if (this._fallbackAnimation && this.mode === 'indeterminate') {\n return this._getStrokeCircumference() * 0.2;\n }\n return null;\n }\n /** Stroke width of the circle in percent. */\n _getCircleStrokeWidth() {\n return this.strokeWidth / this.diameter * 100;\n }\n /** Dynamically generates a style tag containing the correct animation for this diameter. */\n _attachStyleNode() {\n const styleRoot = this._styleRoot;\n const currentDiameter = this._diameter;\n const diameters = MatProgressSpinner._diameters;\n let diametersForElement = diameters.get(styleRoot);\n if (!diametersForElement || !diametersForElement.has(currentDiameter)) {\n const styleTag = this._document.createElement('style');\n styleTag.setAttribute('mat-spinner-animation', this._spinnerAnimationLabel);\n styleTag.textContent = this._getAnimationText();\n styleRoot.appendChild(styleTag);\n if (!diametersForElement) {\n diametersForElement = new Set();\n diameters.set(styleRoot, diametersForElement);\n }\n diametersForElement.add(currentDiameter);\n }\n }\n /** Generates animation styles adjusted for the spinner's diameter. */\n _getAnimationText() {\n const strokeCircumference = this._getStrokeCircumference();\n return INDETERMINATE_ANIMATION_TEMPLATE\n // Animation should begin at 5% and end at 80%\n .replace(/START_VALUE/g, `${0.95 * strokeCircumference}`)\n .replace(/END_VALUE/g, `${0.2 * strokeCircumference}`)\n .replace(/DIAMETER/g, `${this._spinnerAnimationLabel}`);\n }\n /** Returns the circle diameter formatted for use with the animation-name CSS property. */\n _getSpinnerAnimationLabel() {\n // The string of a float point number will include a period ‘.’ character,\n // which is not valid for a CSS animation-name.\n return this.diameter.toString().replace('.', '_');\n }\n}\nMatProgressSpinner.ɵfac = function MatProgressSpinner_Factory(t) { return new (t || MatProgressSpinner)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵdirectiveInject(MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS)); };\nMatProgressSpinner.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatProgressSpinner, selectors: [[\"mat-progress-spinner\"]], hostAttrs: [\"role\", \"progressbar\", \"tabindex\", \"-1\", 1, \"mat-progress-spinner\"], hostVars: 10, hostBindings: function MatProgressSpinner_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"aria-valuemin\", ctx.mode === \"determinate\" ? 0 : null)(\"aria-valuemax\", ctx.mode === \"determinate\" ? 100 : null)(\"aria-valuenow\", ctx.mode === \"determinate\" ? ctx.value : null)(\"mode\", ctx.mode);\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n ɵngcc0.ɵɵclassProp(\"_mat-animation-noopable\", ctx._noopAnimations);\n } }, inputs: { color: \"color\", mode: \"mode\", diameter: \"diameter\", strokeWidth: \"strokeWidth\", value: \"value\" }, exportAs: [\"matProgressSpinner\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 8, consts: [[\"preserveAspectRatio\", \"xMidYMid meet\", \"focusable\", \"false\", \"aria-hidden\", \"true\", 3, \"ngSwitch\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"animation-name\", \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\"]], template: function MatProgressSpinner_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵnamespaceSVG();\n ɵngcc0.ɵɵelementStart(0, \"svg\", 0);\n ɵngcc0.ɵɵtemplate(1, MatProgressSpinner__svg_circle_1_Template, 1, 9, \"circle\", 1);\n ɵngcc0.ɵɵtemplate(2, MatProgressSpinner__svg_circle_2_Template, 1, 7, \"circle\", 2);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx.mode === \"indeterminate\");\n ɵngcc0.ɵɵattribute(\"viewBox\", ctx._getViewBox());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n } }, directives: [ɵngcc2.NgSwitch, ɵngcc2.NgSwitchCase], styles: [_c0], encapsulation: 2, changeDetection: 0 });\n/**\n * Tracks diameters of existing instances to de-dupe generated styles (default d = 100).\n * We need to keep track of which elements the diameters were attached to, because for\n * elements in the Shadow DOM the style tags are attached to the shadow root, rather\n * than the document head.\n */\nMatProgressSpinner._diameters = new WeakMap();\nMatProgressSpinner.ctorParameters = () => [\n { type: ElementRef },\n { type: Platform },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n { type: undefined, decorators: [{ type: Inject, args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS,] }] }\n];\nMatProgressSpinner.propDecorators = {\n diameter: [{ type: Input }],\n strokeWidth: [{ type: Input }],\n mode: [{ type: Input }],\n value: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatProgressSpinner, [{\n type: Component,\n args: [{\n selector: 'mat-progress-spinner',\n exportAs: 'matProgressSpinner',\n host: {\n 'role': 'progressbar',\n 'class': 'mat-progress-spinner',\n // set tab index to -1 so screen readers will read the aria-label\n // Note: there is a known issue with JAWS that does not read progressbar aria labels on FireFox\n 'tabindex': '-1',\n '[class._mat-animation-noopable]': `_noopAnimations`,\n '[style.width.px]': 'diameter',\n '[style.height.px]': 'diameter',\n '[attr.aria-valuemin]': 'mode === \"determinate\" ? 0 : null',\n '[attr.aria-valuemax]': 'mode === \"determinate\" ? 100 : null',\n '[attr.aria-valuenow]': 'mode === \"determinate\" ? value : null',\n '[attr.mode]': 'mode'\n },\n inputs: ['color'],\n template: \"<!--\\n preserveAspectRatio of xMidYMid meet as the center of the viewport is the circle's\\n center. The center of the circle will remain at the center of the mat-progress-spinner\\n element containing the SVG. `focusable=\\\"false\\\"` prevents IE from allowing the user to\\n tab into the SVG element.\\n-->\\n<!--\\n All children need to be hidden for screen readers in order to support ChromeVox.\\n More context in the issue: https://github.com/angular/components/issues/22165.\\n-->\\n<svg\\n [style.width.px]=\\\"diameter\\\"\\n [style.height.px]=\\\"diameter\\\"\\n [attr.viewBox]=\\\"_getViewBox()\\\"\\n preserveAspectRatio=\\\"xMidYMid meet\\\"\\n focusable=\\\"false\\\"\\n [ngSwitch]=\\\"mode === 'indeterminate'\\\"\\n aria-hidden=\\\"true\\\">\\n\\n <!--\\n Technically we can reuse the same `circle` element, however Safari has an issue that breaks\\n the SVG rendering in determinate mode, after switching between indeterminate and determinate.\\n Using a different element avoids the issue. An alternative to this is adding `display: none`\\n for a split second and then removing it when switching between modes, but it's hard to know\\n for how long to hide the element and it can cause the UI to blink.\\n -->\\n <circle\\n *ngSwitchCase=\\\"true\\\"\\n cx=\\\"50%\\\"\\n cy=\\\"50%\\\"\\n [attr.r]=\\\"_getCircleRadius()\\\"\\n [style.animation-name]=\\\"'mat-progress-spinner-stroke-rotate-' + _spinnerAnimationLabel\\\"\\n [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n\\n <circle\\n *ngSwitchCase=\\\"false\\\"\\n cx=\\\"50%\\\"\\n cy=\\\"50%\\\"\\n [attr.r]=\\\"_getCircleRadius()\\\"\\n [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n</svg>\\n\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: [\".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\\n\"]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS]\n }] }]; }, { mode: [{\n type: Input\n }], diameter: [{\n type: Input\n }], strokeWidth: [{\n type: Input\n }], value: [{\n type: Input\n }] }); })();\n/**\n * `<mat-spinner>` component.\n *\n * This is a component definition to be used as a convenience reference to create an\n * indeterminate `<mat-progress-spinner>` instance.\n */\nclass MatSpinner extends MatProgressSpinner {\n constructor(elementRef, platform, document, animationMode, defaults) {\n super(elementRef, platform, document, animationMode, defaults);\n this.mode = 'indeterminate';\n }\n}\nMatSpinner.ɵfac = function MatSpinner_Factory(t) { return new (t || MatSpinner)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵdirectiveInject(MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS)); };\nMatSpinner.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSpinner, selectors: [[\"mat-spinner\"]], hostAttrs: [\"role\", \"progressbar\", \"mode\", \"indeterminate\", 1, \"mat-spinner\", \"mat-progress-spinner\"], hostVars: 6, hostBindings: function MatSpinner_HostBindings(rf, ctx) { if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n ɵngcc0.ɵɵclassProp(\"_mat-animation-noopable\", ctx._noopAnimations);\n } }, inputs: { color: \"color\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 8, consts: [[\"preserveAspectRatio\", \"xMidYMid meet\", \"focusable\", \"false\", \"aria-hidden\", \"true\", 3, \"ngSwitch\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"animation-name\", \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\"]], template: function MatSpinner_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵnamespaceSVG();\n ɵngcc0.ɵɵelementStart(0, \"svg\", 0);\n ɵngcc0.ɵɵtemplate(1, MatSpinner__svg_circle_1_Template, 1, 9, \"circle\", 1);\n ɵngcc0.ɵɵtemplate(2, MatSpinner__svg_circle_2_Template, 1, 7, \"circle\", 2);\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx.mode === \"indeterminate\");\n ɵngcc0.ɵɵattribute(\"viewBox\", ctx._getViewBox());\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n ɵngcc0.ɵɵadvance(1);\n ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n } }, directives: [ɵngcc2.NgSwitch, ɵngcc2.NgSwitchCase], styles: [_c0], encapsulation: 2, changeDetection: 0 });\nMatSpinner.ctorParameters = () => [\n { type: ElementRef },\n { type: Platform },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n { type: undefined, decorators: [{ type: Inject, args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS,] }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSpinner, [{\n type: Component,\n args: [{\n selector: 'mat-spinner',\n host: {\n 'role': 'progressbar',\n 'mode': 'indeterminate',\n 'class': 'mat-spinner mat-progress-spinner',\n '[class._mat-animation-noopable]': `_noopAnimations`,\n '[style.width.px]': 'diameter',\n '[style.height.px]': 'diameter'\n },\n inputs: ['color'],\n template: \"<!--\\n preserveAspectRatio of xMidYMid meet as the center of the viewport is the circle's\\n center. The center of the circle will remain at the center of the mat-progress-spinner\\n element containing the SVG. `focusable=\\\"false\\\"` prevents IE from allowing the user to\\n tab into the SVG element.\\n-->\\n<!--\\n All children need to be hidden for screen readers in order to support ChromeVox.\\n More context in the issue: https://github.com/angular/components/issues/22165.\\n-->\\n<svg\\n [style.width.px]=\\\"diameter\\\"\\n [style.height.px]=\\\"diameter\\\"\\n [attr.viewBox]=\\\"_getViewBox()\\\"\\n preserveAspectRatio=\\\"xMidYMid meet\\\"\\n focusable=\\\"false\\\"\\n [ngSwitch]=\\\"mode === 'indeterminate'\\\"\\n aria-hidden=\\\"true\\\">\\n\\n <!--\\n Technically we can reuse the same `circle` element, however Safari has an issue that breaks\\n the SVG rendering in determinate mode, after switching between indeterminate and determinate.\\n Using a different element avoids the issue. An alternative to this is adding `display: none`\\n for a split second and then removing it when switching between modes, but it's hard to know\\n for how long to hide the element and it can cause the UI to blink.\\n -->\\n <circle\\n *ngSwitchCase=\\\"true\\\"\\n cx=\\\"50%\\\"\\n cy=\\\"50%\\\"\\n [attr.r]=\\\"_getCircleRadius()\\\"\\n [style.animation-name]=\\\"'mat-progress-spinner-stroke-rotate-' + _spinnerAnimationLabel\\\"\\n [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n\\n <circle\\n *ngSwitchCase=\\\"false\\\"\\n cx=\\\"50%\\\"\\n cy=\\\"50%\\\"\\n [attr.r]=\\\"_getCircleRadius()\\\"\\n [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n</svg>\\n\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styles: [\".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\\n\"]\n }]\n }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.Platform }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS]\n }] }]; }, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatProgressSpinnerModule {\n}\nMatProgressSpinnerModule.ɵfac = function MatProgressSpinnerModule_Factory(t) { return new (t || MatProgressSpinnerModule)(); };\nMatProgressSpinnerModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatProgressSpinnerModule });\nMatProgressSpinnerModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[MatCommonModule, CommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatProgressSpinnerModule, [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule, CommonModule],\n exports: [\n MatProgressSpinner,\n MatSpinner,\n MatCommonModule\n ],\n declarations: [\n MatProgressSpinner,\n MatSpinner\n ]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatProgressSpinnerModule, { declarations: function () { return [MatProgressSpinner, MatSpinner]; }, imports: function () { return [MatCommonModule, CommonModule]; }, exports: function () { return [MatProgressSpinner, MatSpinner, MatCommonModule]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS, MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, MatProgressSpinner, MatProgressSpinnerModule, MatSpinner };\n\n//# sourceMappingURL=progress-spinner.js.map","import { DriveContextMenuComponent } from './components/drive-context-menu/drive-context-menu.component';\n\nexport const DRIVE_CONTEXT_MENUS = {\n entry: DriveContextMenuComponent,\n};\n","import {Actions, ofActionSuccessful, Store} from '@ngxs/store';\nimport {OpenFilePreview} from '../actions/commands';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {FilePreviewOverlayComponent} from '../../preview/file-preview-overlay/file-preview-overlay.component';\nimport {DriveState} from '../drive-state';\nimport {Injectable} from '@angular/core';\nimport {OverlayPanelRef} from '../../../../common/core/ui/overlay-panel/overlay-panel-ref';\n\n@Injectable()\nexport class OverlayHandler {\n private overlayRef: OverlayPanelRef<FilePreviewOverlayComponent>;\n constructor(\n private store: Store,\n private actions$: Actions,\n private overlay: OverlayPanel\n ) {\n this.actions$\n .pipe(ofActionSuccessful(OpenFilePreview))\n .subscribe((action: OpenFilePreview) => {\n if (this.overlayRef) {\n this.overlayRef.close();\n this.overlayRef = null;\n }\n const entries = this.store\n .selectSnapshot(DriveState.entries)\n .filter(e => e.type !== 'folder');\n const selectedEntry = this.store.selectSnapshot(DriveState.selectedEntry);\n const activeEntry = entries.findIndex(e => e.id === selectedEntry?.id);\n this.overlayRef = this.overlay.open(FilePreviewOverlayComponent, {\n position: 'center',\n origin: 'global',\n panelClass: 'file-preview-overlay-container',\n data: {\n entries: entries.slice(),\n activeEntry: activeEntry === -1 ? 0 : activeEntry,\n },\n });\n });\n }\n}\n","import { Actions, ofActionSuccessful, Store } from '@ngxs/store';\nimport { DownloadEntries } from '../actions/commands';\nimport { DriveState } from '../drive-state';\nimport { downloadFileFromUrl } from '@common/uploads/utils/download-file-from-url';\nimport { Settings } from '@common/core/config/settings.service';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class DownloadHandler {\n constructor(\n private actions$: Actions,\n private store: Store,\n private settings: Settings,\n ) {\n this.actions$.pipe(ofActionSuccessful(DownloadEntries))\n .subscribe((action: DownloadEntries) => {\n downloadFileFromUrl(this.getDownloadUrl(action));\n });\n }\n\n private getDownloadUrl(action: DownloadEntries): string {\n const hashes = this.getEntryHashes(action.entries);\n let base = `${this.settings.getBaseUrl()}/secure/uploads/download?hashes=${hashes}`;\n if (action.link) base += `&shareable_link=${action.link.id}`;\n if (action.password) base += `&password=${action.password}`;\n return base;\n }\n\n /**\n * Get hashes string for specified entries or for currently selected entries.\n */\n private getEntryHashes(entries?: FileEntry[]): string {\n if ( ! entries) {\n entries = this.store.selectSnapshot(DriveState.selectedEntries);\n }\n\n return entries.map(entry => entry.hash).join(',');\n }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'loading-toast',\n templateUrl: './loading-toast.component.html',\n styleUrls: ['./loading-toast.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LoadingToastComponent {\n constructor(@Inject(MAT_SNACK_BAR_DATA) public data: {message: string}) {}\n}\n","<mat-spinner [diameter]=\"30\"></mat-spinner>\n<span trans>{{ data.message }}</span>","import { Actions, ofAction, ofActionSuccessful, Store } from '@ngxs/store';\nimport { AddStar, HideLoadingToast, RemoveStar, RestoreTrashedEntries, ShowLoadingToast } from '../actions/commands';\nimport {\n EntryRenamed,\n FileDeleteSuccess,\n MoveEntriesFailed,\n MoveEntriesSuccess,\n NewFolderCreated, NotEnoughSpaceError,\n TrashedEntriesDeleteSuccess,\n TrashedEntriesRestoreSuccess\n} from '../actions/events';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { LinkCopySuccess } from '../../sharing/links/share-link.state';\nimport { Router } from '@angular/router';\nimport { LoadingToastComponent } from '../../messages/loading-toast/loading-toast.component';\nimport { MatSnackBarRef } from '@angular/material/snack-bar';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class ToastHandler {\n constructor(\n private actions$: Actions,\n private toast: Toast,\n private store: Store,\n private router: Router,\n ) {\n this.entriesDeleted();\n this.entriesStarred();\n this.entriesUnstarred();\n this.entriesMoveFailed();\n this.folderCreated();\n this.entriesMoved();\n this.entriesDeletedForever();\n this.entriesRestoredFromTrash();\n this.entryRenamed();\n this.linkCopiedToClipboard();\n this.notEnoughSpace();\n this.loadingToast();\n }\n\n private entriesDeleted() {\n this.actions$\n .pipe(ofAction(FileDeleteSuccess))\n .subscribe((action: FileDeleteSuccess) => {\n const msg = {message: `Deleted :count items.`, replacements: {count: action.deletedFiles.length}};\n this.toast.open(msg, {action: 'UNDO'})\n .onAction().subscribe(() => {\n this.store.dispatch(new RestoreTrashedEntries(action.deletedFiles));\n });\n });\n }\n\n private entriesStarred() {\n this.actions$\n .pipe(ofActionSuccessful(AddStar))\n .subscribe((action: AddStar) => {\n this.toast.open(`Star added.`, {action: 'UNDO'}).onAction()\n .subscribe(() => {\n this.store.dispatch(new RemoveStar(action.entries));\n });\n });\n }\n\n private entriesUnstarred() {\n this.actions$\n .pipe(ofActionSuccessful(RemoveStar))\n .subscribe((action: RemoveStar) => {\n this.toast.open(`Star Removed.`, {action: 'UNDO'}).onAction()\n .subscribe(() => {\n this.store.dispatch(new AddStar(action.entries));\n });\n });\n }\n\n private entriesMoved() {\n this.actions$.pipe(ofAction(MoveEntriesSuccess))\n .subscribe((action: MoveEntriesSuccess) => {\n this.toast.open(\n {message: 'Moved :count items.', replacements: {count: action.entries.length}}\n );\n });\n }\n\n private entriesMoveFailed() {\n this.actions$.pipe(ofAction(MoveEntriesFailed))\n .subscribe(() => {\n this.toast.open('There was an issue with moving selected items.');\n });\n }\n\n private folderCreated() {\n this.actions$.pipe(ofAction(NewFolderCreated))\n .subscribe(() => {\n this.toast.open('Folder created.');\n });\n }\n\n private entriesDeletedForever() {\n this.actions$.pipe(ofActionSuccessful(TrashedEntriesDeleteSuccess))\n .subscribe((action: TrashedEntriesDeleteSuccess) => {\n this.toast.open({\n message: `Permanently deleted :count items.`,\n replacements: {count: action.entries.length}\n });\n });\n }\n\n private entriesRestoredFromTrash() {\n this.actions$.pipe(ofActionSuccessful(TrashedEntriesRestoreSuccess))\n .subscribe((action: TrashedEntriesRestoreSuccess) => {\n this.toast.open({\n message: `Restored :count items.`,\n replacements: {count: action.entries.length}\n });\n });\n }\n\n private entryRenamed() {\n this.actions$.pipe(ofActionSuccessful(EntryRenamed))\n .subscribe((action: EntryRenamed) => {\n this.toast.open({\n message: `:oldName renamed to :newName`,\n replacements: {oldName: action.entry.name, newName: action.newName}\n });\n });\n\n }\n\n private linkCopiedToClipboard() {\n this.actions$.pipe(ofActionSuccessful(LinkCopySuccess))\n .subscribe(() => {\n this.toast.open(`Link copied to clipboard.`);\n });\n }\n\n private notEnoughSpace() {\n this.actions$.pipe(ofActionSuccessful(NotEnoughSpaceError))\n .subscribe(() => {\n this.toast.open(`You are out of space. Try to delete some files.`, {action: 'Upgrade'})\n .onAction().subscribe(() => {\n this.router.navigate(['/billing/upgrade']);\n });\n });\n }\n\n private loadingToast() {\n let toastRef: MatSnackBarRef<any>;\n\n this.actions$.pipe(ofActionSuccessful(ShowLoadingToast))\n .subscribe((action: ShowLoadingToast) => {\n toastRef = this.toast.openComponent(LoadingToastComponent, {duration: 0, data: {message: action.message}});\n });\n\n this.actions$.pipe(ofActionSuccessful(HideLoadingToast))\n .subscribe(() => {\n if (toastRef) {\n toastRef.dismiss();\n toastRef = null;\n }\n });\n }\n}\n","<file-icon [mime]=\"upload.uploadedFile.mime\"></file-icon>\n<div class=\"content\">\n <div class=\"meta\">\n <div class=\"name\" [matTooltip]=\"upload.uploadedFile.name\">{{upload.uploadedFile.name}}</div>\n <div class=\"time-left\" *ngIf=\"progress.percentage && progress.percentage < 100 && !upload.error$.value\">\n {{progress.eta}}\n <span trans>left</span>\n </div>\n <div class=\"actions\">\n <mat-icon\n svgIcon=\"error\"\n *ngIf=\"upload.error$ | async as error; else noError\"\n class=\"error-icon\"\n [matTooltip]=\"error | trans\"\n matTooltipPosition=\"left\"\n ></mat-icon>\n <ng-template #noError>\n <mat-icon svgIcon=\"check-circle\" *ngIf=\"upload.completed\" class=\"completed-icon\"></mat-icon>\n <span class=\"cancel-button\" *ngIf=\"!upload.completed\" (click)=\"cancelUpload(upload)\" trans>Cancel</span>\n </ng-template>\n </div>\n </div>\n <mat-progress-bar mode=\"determinate\" [value]=\"progress.percentage\" color=\"accent\"></mat-progress-bar>\n</div>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { UploadQueueItem, UploadQueueItemProgress } from '@common/uploads/upload-queue/upload-queue-item';\nimport { UploadQueueService } from '@common/uploads/upload-queue/upload-queue.service';\nimport { Store } from '@ngxs/store';\nimport { CloseUploadsPanel } from '../../../state/actions/commands';\nimport { throttleTime } from 'rxjs/operators';\nimport { animationFrameScheduler, Subscription } from 'rxjs';\n\n@Component({\n selector: 'uploads-panel-item',\n templateUrl: './uploads-panel-item.component.html',\n styleUrls: ['./uploads-panel-item.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UploadsPanelItemComponent implements OnInit, OnDestroy {\n @Input() upload: UploadQueueItem;\n public progress: UploadQueueItemProgress = {};\n private subscription: Subscription;\n\n constructor(\n private uploadQueue: UploadQueueService,\n private store: Store,\n private cd: ChangeDetectorRef,\n ) {}\n\n ngOnInit() {\n this.subscription = this.upload.progress$.pipe(\n // material progress bar animation lasts 250ms\n throttleTime(260, animationFrameScheduler, {leading: true, trailing: true}),\n ).subscribe(progress => {\n this.progress = progress;\n this.cd.detectChanges();\n });\n }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n\n public cancelUpload(upload: UploadQueueItem) {\n this.uploadQueue.remove(upload.id);\n if (this.uploadQueue.isEmpty()) {\n this.store.dispatch(new CloseUploadsPanel());\n }\n }\n}\n","<div class=\"header\">\n <div class=\"info\">\n <ng-container *ngIf=\"activeUploads.count$ | async as count\">\n <ng-container *ngIf=\"count.pending > 0\">\n {{ 'Uploading' | trans }} {{count.pending}} {{(count.pending > 1 ? 'Items' : 'Item') | trans}}\n </ng-container>\n <ng-container *ngIf=\"count.pending === 0\">\n {{count.completed}} {{'items uploaded' | trans}}\n </ng-container>\n </ng-container>\n </div>\n <div class=\"actions\">\n <button mat-icon-button (click)=\"toggleMinimized()\">\n <mat-icon svgIcon=\"keyboard-arrow-up\" *ngIf=\"minimized$ | async; else notMinimized\" class=\"minimize-icon\"></mat-icon>\n <ng-template #notMinimized>\n <mat-icon svgIcon=\"keyboard-arrow-down\" class=\"minimize-icon\"></mat-icon>\n </ng-template>\n </button>\n <button mat-icon-button (click)=\"close()\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n </div>\n</div>\n\n<div class=\"uploads-list\" [class.hidden]=\"minimized$ | async\">\n <uploads-panel-item *ngFor=\"let upload of activeUploads.uploads$ | async; trackBy: trackById\" [upload]=\"upload\"></uploads-panel-item>\n</div>\n","import { ChangeDetectionStrategy, Component, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport { UploadQueueService } from '@common/uploads/upload-queue/upload-queue.service';\nimport { UploadQueueItem } from '@common/uploads/upload-queue/upload-queue-item';\nimport { Store } from '@ngxs/store';\nimport { CloseUploadsPanel } from '../../state/actions/commands';\nimport { BehaviorSubject } from 'rxjs';\n\n@Component({\n selector: 'uploads-panel',\n templateUrl: './uploads-panel.component.html',\n styleUrls: ['./uploads-panel.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UploadsPanelComponent implements OnDestroy {\n public minimized$ = new BehaviorSubject(false);\n\n constructor(\n private store: Store,\n public activeUploads: UploadQueueService,\n ) {\n }\n\n ngOnDestroy() {\n this.activeUploads.reset();\n }\n\n public toggleMinimized() {\n this.minimized$.next(!this.minimized$.value);\n }\n\n public close() {\n this.store.dispatch(new CloseUploadsPanel());\n }\n\n public trackById(index: number, upload: UploadQueueItem) {\n return upload.id;\n }\n}\n","import { Actions, ofActionSuccessful } from '@ngxs/store';\nimport { CloseUploadsPanel, OpenUploadsPanel } from '../actions/commands';\nimport { OverlayPanel } from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport { UploadsPanelComponent } from '../../uploads/uploads-panel/uploads-panel.component';\nimport { OverlayPanelRef } from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { OverlayPanelConfig } from '@common/core/ui/overlay-panel/overlay-panel-config';\nimport { Injectable } from '@angular/core';\n\nconst overlayConfig: OverlayPanelConfig = {\n origin: 'global',\n hasBackdrop: false,\n position: {right: '10px', bottom: '10px'},\n mobilePosition: {left: 0, bottom: 0}\n};\n\n@Injectable()\nexport class UploadPanelHandler {\n private uploadPanelRef: OverlayPanelRef<UploadsPanelComponent>;\n\n constructor(\n private actions$: Actions,\n private currentUser: CurrentUser,\n private overlayPanel: OverlayPanel,\n ) {\n this.actions$\n .pipe(ofActionSuccessful(OpenUploadsPanel))\n .subscribe(() => {\n this.openUploadsPanel();\n });\n\n this.actions$\n .pipe(ofActionSuccessful(CloseUploadsPanel))\n .subscribe(() => {\n this.closeUploadsPanel();\n });\n\n this.currentUser.model$.subscribe(() => {\n this.closeUploadsPanel();\n });\n }\n\n public openUploadsPanel() {\n if (this.uploadPanelRef) return;\n this.uploadPanelRef = this.overlayPanel\n .open(UploadsPanelComponent, overlayConfig);\n }\n\n private closeUploadsPanel() {\n if ( ! this.uploadPanelRef) return;\n this.uploadPanelRef.close();\n this.uploadPanelRef = null;\n }\n}\n","import { Actions, ofActionDispatched, Store } from '@ngxs/store';\nimport { OpenConfirmDialog, OpenDialog } from '../actions/commands';\nimport { Injectable } from '@angular/core';\nimport { Modal } from '@common/core/ui/dialogs/modal.service';\nimport { ConfirmModalComponent } from '@common/core/ui/confirm-modal/confirm-modal.component';\n\n@Injectable()\nexport class DialogHandler {\n constructor(\n private actions$: Actions,\n private dialog: Modal,\n private store: Store,\n ) {\n this.actions$.pipe(ofActionDispatched(OpenDialog))\n .subscribe((action: OpenDialog) => {\n this.dialog.open(action.dialog, action.data, action.config);\n });\n\n this.actions$.pipe(ofActionDispatched(OpenConfirmDialog))\n .subscribe((action: OpenConfirmDialog) => {\n this.openConfirmDialog(action);\n });\n }\n\n private openConfirmDialog(action: OpenConfirmDialog) {\n this.dialog.open(ConfirmModalComponent, action.data)\n .beforeClosed()\n .subscribe(confirmed => {\n if ( ! confirmed) return;\n return this.store.dispatch(action.confirmAction);\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SharingPermissionsButtonComponent } from './sharing-permissions-button/sharing-permissions-button.component';\nimport { ShareDialogComponent } from './share-dialog/share-dialog.component';\nimport { EntriesAccessTableComponent } from './entries-access-table/entries-access-table.component';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { LinkOptionsComponent } from './links/link-options/link-options.component';\nimport { ShareLinkDialogComponent } from './share-link-dialog/share-link-dialog.component';\nimport { NoSharedEntriesComponent } from './no-shared-entries/no-shared-entries.component';\nimport { TranslationsModule } from '@common/core/translations/translations.module';\nimport { LoadingIndicatorModule } from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport { Modal } from '@common/core/ui/dialogs/modal.service';\nimport { ChipsModule } from '@common/core/ui/chips/chips.module';\nimport {SvgImageModule} from '../../../common/core/ui/svg-image/svg-image.module';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TranslationsModule,\n LoadingIndicatorModule,\n\n // material\n MatSlideToggleModule,\n MatTabsModule,\n MatDialogModule,\n ChipsModule,\n MatIconModule,\n MatMenuModule,\n MatButtonModule,\n MatTooltipModule,\n MatCheckboxModule,\n SvgImageModule,\n ],\n declarations: [\n ShareDialogComponent,\n EntriesAccessTableComponent,\n SharingPermissionsButtonComponent,\n LinkOptionsComponent,\n ShareLinkDialogComponent,\n NoSharedEntriesComponent,\n ],\n exports: [NoSharedEntriesComponent],\n providers: [Modal],\n})\nexport class SharingModule {}\n","import { Actions, ofActionSuccessful } from '@ngxs/store';\nimport { ReloadPageEntries } from '../actions/commands';\nimport { DriveDomCacheService } from '../../interactions/drive-dom-cache.service';\nimport { Injectable } from \"@angular/core\";\n\n@Injectable()\nexport class ResetScrollHandler {\n constructor(\n private actions$: Actions,\n private domCache: DriveDomCacheService\n ) {\n this.actions$.pipe(ofActionSuccessful(ReloadPageEntries))\n .subscribe(() => {\n this.domCache.scrollCont.scrollTo({top: 0});\n });\n }\n}\n","import { Store } from '@ngxs/store';\nimport { DeselectAllEntries } from '../actions/commands';\nimport { DriveState } from '../drive-state';\nimport { filter } from 'rxjs/operators';\nimport { Injectable } from \"@angular/core\";\n\n@Injectable()\nexport class PageChangeHandler {\n constructor(\n private store: Store\n ) {\n this.store.select(DriveState.activePage)\n .pipe(filter(page => !!page))\n .subscribe(() => {\n this.store.dispatch(new DeselectAllEntries());\n });\n }\n}\n","import { Actions, ofActionSuccessful, Store } from '@ngxs/store';\nimport { RouterNavigation, RouterState } from '@ngxs/router-plugin';\nimport {\n FolderPageOpened,\n RecentEntriesPageOpened,\n SearchPageOpened,\n SharesFolderOpened,\n StarredPageOpened,\n TrashPageOpened, WorkspacesIndexPageOpened,\n} from '../actions/events';\nimport { DRIVE_PAGE_NAMES } from '../models/drive-page';\nimport { filter } from 'rxjs/operators';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { Injectable } from '@angular/core';\n\nconst LINK_PREVIEW_PAGE = 's';\n\n@Injectable()\nexport class PageLoadHandler {\n constructor(\n private store: Store,\n private actions$: Actions,\n private currentUser: CurrentUser,\n ) {\n this.actions$\n .pipe(\n ofActionSuccessful(RouterNavigation),\n filter((action: RouterNavigation) => action.event.urlAfterRedirects.indexOf('drive') > -1),\n filter(() => this.currentUser.isLoggedIn()),\n )\n .subscribe(() => {\n const action = this.getPageLoadAction();\n if (action) this.store.dispatch(action);\n });\n }\n\n private getPageLoadAction() {\n const params = this.getPageUriParams();\n switch (params.pageName) {\n case DRIVE_PAGE_NAMES.RECENT:\n return new RecentEntriesPageOpened();\n case DRIVE_PAGE_NAMES.TRASH:\n return new TrashPageOpened();\n case DRIVE_PAGE_NAMES.SHARES:\n return new SharesFolderOpened();\n case DRIVE_PAGE_NAMES.STARRED:\n return new StarredPageOpened();\n case DRIVE_PAGE_NAMES.SEARCH:\n const state = this.store.selectSnapshot(RouterState.state);\n const search = state.root.firstChild.queryParams;\n return new SearchPageOpened({filters: search.filters, query: search.query});\n case DRIVE_PAGE_NAMES.WORKSPACES:\n return new WorkspacesIndexPageOpened();\n case LINK_PREVIEW_PAGE:\n return null;\n default:\n return new FolderPageOpened(params.folderHash);\n }\n }\n\n private getPageUriParams() {\n // remove query params\n const uri = this.store.selectSnapshot(RouterState.url).split('?')[0];\n const [, pageName, folderHash] = uri.split('/').filter(x => !!x);\n return {pageName, folderHash};\n }\n}\n","import { Actions, ofActionSuccessful, Store } from '@ngxs/store';\nimport { RemoveEntries, RemoveStar } from '../actions/commands';\nimport { filter } from 'rxjs/operators';\nimport { DriveState } from '../drive-state';\nimport { DRIVE_PAGE_NAMES } from '../models/drive-page';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class RemoveStarHandler {\n constructor(\n private actions$: Actions,\n private store: Store\n ) {\n this.actions$.pipe(ofActionSuccessful(RemoveStar))\n .pipe(filter(() => {\n const name = this.store.selectSnapshot(DriveState.activePage).name;\n return name === DRIVE_PAGE_NAMES.STARRED;\n }))\n .subscribe((action: RemoveStar) => {\n this.store.dispatch(new RemoveEntries(action.entries));\n });\n }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ContextMenuDirective} from '@common/core/ui/context-menu/context-menu.directive';\n\n\n@NgModule({\n declarations: [\n ContextMenuDirective,\n ],\n imports: [\n CommonModule\n ],\n exports: [\n ContextMenuDirective,\n ]\n})\nexport class ContextMenuModule {\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TextPreviewComponent} from './text-preview/text-preview.component';\nimport {AVAILABLE_PREVIEWS, DefaultPreviews} from './available-previews';\nimport {PreviewContainerComponent} from './preview-container/preview-container.component';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {VideoPreviewComponent} from './video-preview/video-preview.component';\nimport {ImagePreviewComponent} from './image-preview/image-preview.component';\nimport {PdfPreviewComponent} from './pdf-preview/pdf-preview.component';\nimport {DefaultPreviewComponent} from './default-preview/default-preview.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {AudioPreviewComponent} from './audio-preview/audio-preview.component';\nimport {GoogleDocsViewerComponent} from './google-docs-viewer/google-docs-viewer.component';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {PreviewFilesService} from '@common/file-preview/preview-files.service';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\n\n@NgModule({\n imports: [\n CommonModule,\n TranslationsModule,\n\n // material\n PortalModule,\n MatButtonModule,\n LoadingIndicatorModule,\n ],\n exports: [\n PreviewContainerComponent,\n ],\n declarations: [\n PreviewContainerComponent,\n TextPreviewComponent,\n VideoPreviewComponent,\n ImagePreviewComponent,\n PdfPreviewComponent,\n DefaultPreviewComponent,\n AudioPreviewComponent,\n GoogleDocsViewerComponent\n ],\n providers: [\n OverlayPanel,\n PreviewFilesService,\n {provide: AVAILABLE_PREVIEWS, useClass: DefaultPreviews},\n ]\n})\nexport class FilePreviewModule {\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkspaceSelectorComponent } from './workspace-selector.component';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslationsModule } from '../../core/translations/translations.module';\nimport { MatButtonModule } from '@angular/material/button';\n\n\n\n@NgModule({\n declarations: [\n WorkspaceSelectorComponent,\n ],\n imports: [\n CommonModule,\n TranslationsModule,\n\n // material\n MatMenuModule,\n MatButtonModule,\n MatIconModule,\n ],\n exports: [\n WorkspaceSelectorComponent,\n ]\n})\nexport class WorkspaceSelectorModule { }\n","import {Injector, NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {DriveRoutingModule} from './drive-routing.module';\nimport {DriveComponent} from './drive.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {MatProgressSpinnerModule} from '@angular/material/progress-spinner';\nimport {MatSidenavModule} from '@angular/material/sidenav';\nimport {MatTabsModule} from '@angular/material/tabs';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {MatTreeModule} from '@angular/material/tree';\nimport {SidebarComponent} from './sidebar/sidebar.component';\nimport {FoldersTreeComponent} from './sidebar/folders-tree/folders-tree.component';\nimport {FilesGridComponent} from './files/components/files-grid/files-grid.component';\nimport {FileThumbnailComponent} from './files/components/file-thumbnail/file-thumbnail.component';\nimport {FilesGridItemComponent} from './files/components/files-grid/files-grid-item/files-grid-item.component';\nimport {DriveHammerInteractionsDirective} from './interactions/drive-hammer-interactions.directive';\nimport {FileIconComponent} from './files/components/file-icon/file-icon.component';\nimport {DRIVE_CONTEXT_MENUS} from './context-actions/drive-context-menus';\nimport {DriveContextMenuComponent} from './context-actions/components/drive-context-menu/drive-context-menu.component';\nimport {SidebarActionButtonsComponent} from './sidebar/sidebar-action-buttons/sidebar-action-buttons.component';\nimport {CrupdateFolderDialogComponent} from './folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\nimport {RenameEntryDialogComponent} from './entries/rename-entry-dialog/rename-entry-dialog.component';\nimport {EntryDragPreviewComponent} from './interactions/entry-drag-preview/entry-drag-preview.component';\nimport {EntryBreadcrumbsComponent} from './drive-toolbar/entry-breadcrumbs/entry-breadcrumbs.component';\nimport {UploadsPanelComponent} from './uploads/uploads-panel/uploads-panel.component';\nimport {MoveEntriesDialogComponent} from './entries/move-entries-dialog/move-entries-dialog.component';\nimport {FolderDropTargetDirective} from './interactions/drop-targets/folder-drop-target.directive';\nimport {DriveToolbarComponent} from './drive-toolbar/drive-toolbar.component';\nimport {ToolbarActionsComponent} from './drive-toolbar/toolbar-actions/toolbar-actions.component';\nimport {MainSearchbarComponent} from './search/main-searchbar.component';\nimport {UploadDropzoneComponent} from './uploads/upload-dropzone/upload-dropzone.component';\nimport {EntriesContainerComponent} from './entries/entries-container/entries-container.component';\nimport {DetailsPanelComponent} from './details-sidebar/details-panel/details-panel.component';\nimport {FilePreviewOverlayComponent} from './preview/file-preview-overlay/file-preview-overlay.component';\nimport {FilePreviewToolbarComponent} from './preview/file-preview-overlay/file-preview-toolbar/file-preview-toolbar.component';\nimport {OverlayHandler} from './state/handlers/overlay-handler';\nimport {DownloadHandler} from './state/handlers/donwlod-handler';\nimport {ToastHandler} from './state/handlers/toast-handler';\nimport {UploadPanelHandler} from './state/handlers/upload-panel-handler';\nimport {DialogHandler} from './state/handlers/dialog-handler';\nimport {SharingModule} from './sharing/sharing.module';\nimport {DetailsSidebarComponent} from './details-sidebar/details-sidebar.component';\nimport {FileListHeaderComponent} from './header/file-list-header/file-list-header.component';\nimport {DriveInfiniteScrollDirective} from './interactions/drive-infinite-scroll.directive';\nimport {ResetScrollHandler} from './state/handlers/reset-scroll-handler';\nimport {FilesListComponent} from './files/components/files-list/files-list.component';\nimport {ToggleSelectedClassDirective} from './interactions/toggle-selected-class.directive';\nimport {PageChangeHandler} from './state/handlers/page-change-handler';\nimport {PageLoadHandler} from './state/handlers/page-load-handler';\nimport {RemoveStarHandler} from './state/handlers/remove-star-handler';\nimport {NoFolderEntriesComponent} from './messages/no-folder-entries/no-folder-entries.component';\nimport {NoTrashedEntriesComponent} from './messages/no-trashed-entries/no-trashed-entries.component';\nimport {NoStarredEntriesComponent} from './messages/no-starred-entries/no-starred-entries.component';\nimport {NoRecentEntriesComponent} from './messages/no-recent-entries/no-recent-entries.component';\nimport {UploadsPanelItemComponent} from './uploads/uploads-panel/uploads-panel-item/uploads-panel-item.component';\nimport {NgxsModule} from '@ngxs/store';\nimport {ShareDialogState} from './sharing/state/share-dialog.state';\nimport {ShareLinkState} from './sharing/links/share-link.state';\nimport {DriveState} from './state/drive-state';\nimport {AvailableSpaceIndicatorComponent} from './sidebar/available-space-indicator/available-space-indicator.component';\nimport {LoadingToastComponent} from './messages/loading-toast/loading-toast.component';\nimport {LinkPreviewContainerComponent} from './preview/link-preview-container/link-preview-container.component';\nimport {LinkPreviewPasswordPanelComponent} from './preview/link-preview-container/link-preview-password-panel/link-preview-password-panel.component';\nimport {ContextActionsContainerComponent} from './context-actions/components/context-actions-container/context-actions-container.component';\nimport {DRIVE_UPLOAD_INPUT_CONFIG} from './upload-input-config';\nimport {NoSearchEntriesComponent} from './messages/no-search-entries/no-search-entries.component';\nimport {EntryDescriptionPanelComponent} from './details-sidebar/details-panel/entry-description-panel/entry-description-panel.component';\nimport {FolderPreviewComponent} from './preview/folder-preview/folder-preview.component';\nimport {EntriesSortButtonComponent} from './header/entries-sort-button/entries-sort-button.component';\nimport {MaterialNavbarModule} from '@common/core/ui/material-navbar/material-navbar.module';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {NoResultsMessageModule} from '@common/core/ui/no-results-message/no-results-message.module';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {ContextMenuModule} from '@common/core/ui/context-menu/context-menu.module';\nimport {AdHostModule} from '@common/core/ui/ad-host/ad-host.module';\nimport {FilePreviewModule} from '@common/file-preview/file-preview.module';\nimport {AVAILABLE_CONTEXT_MENUS} from '@common/core/ui/context-menu/available-context-menus';\nimport {UploadsModule} from '@common/uploads/uploads.module';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {PreviewFilesService} from '@common/file-preview/preview-files.service';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {UploadInputConfig} from '@common/uploads/upload-input-config';\nimport {Settings} from '../../common/core/config/settings.service';\nimport {WorkspaceSelectorModule} from '../../common/workspaces/workspace-selector/workspace-selector.module';\nimport {SkeletonModule} from '../../common/core/ui/skeleton/skeleton.module';\nimport {\n WORKSPACE_CONFIG,\n WorkspaceConfig,\n} from '../../common/workspaces/workspace-config';\nimport {DatatableModule} from '../../common/datatable/datatable.module';\nimport {SearchInputWithFiltersModule} from '../../common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.module';\nimport {SvgImageModule} from '../../common/core/ui/svg-image/svg-image.module';\n\nexport const STATE_HANDLERS = [\n OverlayHandler,\n DownloadHandler,\n ToastHandler,\n UploadPanelHandler,\n DialogHandler,\n ResetScrollHandler,\n PageChangeHandler,\n PageLoadHandler,\n RemoveStarHandler,\n];\n\n@NgModule({\n imports: [\n CommonModule,\n UploadsModule,\n DriveRoutingModule,\n FilePreviewModule,\n FormsModule,\n SharingModule,\n MaterialNavbarModule,\n TranslationsModule,\n FormatPipesModule,\n ReactiveFormsModule,\n NoResultsMessageModule,\n LoadingIndicatorModule,\n ContextMenuModule,\n AdHostModule,\n WorkspaceSelectorModule,\n SkeletonModule,\n DatatableModule,\n SearchInputWithFiltersModule,\n SvgImageModule,\n\n // material\n MatSidenavModule,\n MatTreeModule,\n MatButtonModule,\n MatDialogModule,\n MatProgressBarModule,\n MatIconModule,\n MatTooltipModule,\n MatTabsModule,\n MatProgressSpinnerModule,\n MatMenuModule,\n\n // state\n NgxsModule.forFeature([\n DriveState,\n ShareDialogState,\n ShareLinkState,\n ]),\n ],\n declarations: [\n DriveComponent,\n SidebarComponent,\n FoldersTreeComponent,\n FilesGridComponent,\n FileThumbnailComponent,\n DriveHammerInteractionsDirective,\n FilesGridItemComponent,\n FileIconComponent,\n DriveContextMenuComponent,\n SidebarActionButtonsComponent,\n CrupdateFolderDialogComponent,\n RenameEntryDialogComponent,\n EntryDragPreviewComponent,\n DriveToolbarComponent,\n EntryBreadcrumbsComponent,\n UploadsPanelComponent,\n MoveEntriesDialogComponent,\n FolderDropTargetDirective,\n ToolbarActionsComponent,\n MainSearchbarComponent,\n UploadDropzoneComponent,\n NoFolderEntriesComponent,\n NoTrashedEntriesComponent,\n NoStarredEntriesComponent,\n NoRecentEntriesComponent,\n NoSearchEntriesComponent,\n EntriesContainerComponent,\n DetailsSidebarComponent,\n DetailsPanelComponent,\n FilePreviewOverlayComponent,\n FilePreviewToolbarComponent,\n FileListHeaderComponent,\n DriveInfiniteScrollDirective,\n FilesListComponent,\n ToggleSelectedClassDirective,\n UploadsPanelItemComponent,\n AvailableSpaceIndicatorComponent,\n LoadingToastComponent,\n LinkPreviewContainerComponent,\n LinkPreviewPasswordPanelComponent,\n ContextActionsContainerComponent,\n EntryDescriptionPanelComponent,\n FolderPreviewComponent,\n EntriesSortButtonComponent,\n ],\n providers: [\n // fix angular lazy loaded entry components issue\n OverlayPanel,\n PreviewFilesService,\n Toast,\n\n // handlers\n ...STATE_HANDLERS,\n {\n provide: AVAILABLE_CONTEXT_MENUS,\n useValue: DRIVE_CONTEXT_MENUS,\n multi: true,\n },\n {\n provide: DRIVE_UPLOAD_INPUT_CONFIG,\n deps: [Settings],\n useFactory: (settings) => {\n const uploadInputConfig: UploadInputConfig = {multiple: true};\n\n const extensions = settings.getJson('drive.validation.allowed_extensions');\n if (extensions) {\n uploadInputConfig.extensions = extensions.map(ext => '.' + ext);\n }\n\n return uploadInputConfig;\n },\n },\n {\n provide: WORKSPACE_CONFIG,\n useValue: {\n description: 'Workspaces are shared spaces where teams can store, share and collaborate on files and folders.',\n } as WorkspaceConfig\n }\n ]\n})\nexport class DriveModule {\n constructor(private injector: Injector) {\n STATE_HANDLERS.forEach(handler => this.injector.get(handler));\n }\n}\n","import {\n DatatableFilter,\n FilterControlType,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport { CreatedAtFilter, UpdatedAtFilter } from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\nimport { FindUserModalComponent } from '@common/auth/find-user-modal/find-user-modal.component';\n\nexport const FILE_ENTRY_TYPE_FILTER = new DatatableFilter({\n type: FilterControlType.Select,\n key: 'type',\n description: 'Type of the file',\n defaultValue: 'text',\n options: [\n {key: 'Text', value: 'text'},\n {key: 'Audio', value: 'audio'},\n {key: 'Video', value: 'video'},\n {key: 'Image', value: 'image'},\n {key: 'PDF', value: 'pdf'},\n {key: 'Spreadsheet', value: 'spreadsheet'},\n {key: 'Word Document', value: 'word'},\n {key: 'Photoshop', value: 'photoshop'},\n {key: 'Archive', value: 'archive'},\n {key: 'Folder', value: 'folder'},\n ],\n});\n\nexport const FILE_ENTRY_INDEX_FILTERS: DatatableFilter[] = [\n FILE_ENTRY_TYPE_FILTER,\n new DatatableFilter({\n type: FilterControlType.Select,\n key: 'public',\n label: 'status',\n defaultValue: false,\n description: 'Whether file is publicly accessible',\n options: [\n {key: 'Private', value: false},\n {key: 'Public', value: true},\n ],\n }),\n new CreatedAtFilter({\n description: 'Date file was uploaded',\n }),\n new UpdatedAtFilter({\n description: 'Date file was last changed',\n }),\n new DatatableFilter({\n type: FilterControlType.SelectModel,\n key: 'owner_id',\n label: 'Uploader',\n description: 'User that this file was uploaded by',\n component: FindUserModalComponent,\n }),\n];\n","<div class=\"modal-header\">\n <h2 mat-dialog-title trans>Find User</h2>\n <button type=\"button\" (click)=\"close()\" class=\"no-style close-button\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <div class=\"input-container search-input-container\">\n <input\n type=\"text\"\n placeholder=\"Search for user by name or email...\"\n [formControl]=\"searchFormControl\"\n />\n <loading-indicator [isVisible]=\"loading$ | async\" class=\"small\"></loading-indicator>\n </div>\n\n <div class=\"users\">\n <div class=\"user\" *ngFor=\"let user of users$ | async\" (click)=\"close(user)\">\n <img [src]=\"user.avatar\" />\n <div class=\"meta overflow-hidden\">\n <div class=\"name overflow-hidden\">{{ user.display_name }}</div>\n <div class=\"email overflow-hidden\">{{ user.email }}</div>\n </div>\n </div>\n </div>\n</mat-dialog-content>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\nimport {FormControl} from '@angular/forms';\nimport {catchError, debounceTime, distinctUntilChanged, switchMap} from 'rxjs/operators';\nimport {BehaviorSubject, Observable, of} from 'rxjs';\nimport {Users} from '../users.service';\nimport {User} from '../../core/types/models/User';\nimport {NormalizedModel} from '@common/core/types/models/normalized-model';\n\n@Component({\n selector: 'find-user-modal',\n templateUrl: './find-user-modal.component.html',\n styleUrls: ['./find-user-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FindUserModalComponent implements OnInit {\n searchFormControl = new FormControl();\n loading$ = new BehaviorSubject(false);\n users$ = new BehaviorSubject<User[]>([]);\n\n constructor(\n private dialogRef: MatDialogRef<FindUserModalComponent>,\n private users: Users\n ) {}\n\n ngOnInit() {\n this.searchFormControl.valueChanges\n .pipe(\n debounceTime(250),\n distinctUntilChanged(),\n switchMap(query => this.searchUsers(query)),\n catchError(() => of([]))\n )\n .subscribe(users => {\n this.users$.next(users);\n this.loading$.next(false);\n });\n }\n\n close(user?: User) {\n this.dialogRef.close(this.normalizeUser(user));\n }\n\n private searchUsers(query: string): Observable<User[]> {\n this.loading$.next(true);\n if (!query) {\n return of([]);\n }\n return this.users.getAll({query});\n }\n\n private normalizeUser(user?: User): NormalizedModel {\n if (user) {\n return {\n id: user.id,\n name: user.display_name,\n image: user.avatar,\n model_type: user.model_type,\n };\n }\n return null;\n }\n}\n","export enum Keycodes {\n ENTER = 13,\n SPACE = 32,\n ESCAPE = 27,\n DELETE = 46,\n ARROW_UP = 38,\n ARROW_RIGHT = 39,\n ARROW_DOWN = 40,\n ARROW_LEFT = 37,\n BACKSPACE = 8,\n TAB = 9,\n S = 83,\n N = 78,\n A = 65,\n T = 84,\n B = 66,\n C = 67,\n O = 79,\n P = 80,\n R = 82,\n F = 70,\n Y = 89,\n Z = 90,\n}\n","import {Injectable} from '@angular/core';\nimport {Keycodes} from './keycodes.enum';\nimport {fromEvent, Subscription} from 'rxjs';\n\ninterface ParsedKeybind {\n ctrl: boolean;\n shift: boolean;\n key: string;\n}\n\n// TODO: refactor so keybinds are stored for a specific \"listenOn\" element instead of globally\n\n@Injectable({\n providedIn: 'root',\n})\nexport class Keybinds {\n private bindings = [];\n\n public add(keybinds: string|string[], callback: (e: KeyboardEvent) => void) {\n if ( ! Array.isArray(keybinds)) {\n keybinds = [keybinds];\n }\n keybinds.forEach(keybind => {\n this.bindings.push({keybind: this.parseKeybindString(keybind), keybindString: keybind, callback});\n });\n }\n\n public addWithPreventDefault(keybind: string, callback: Function) {\n this.bindings.push({keybind: this.parseKeybindString(keybind), keybindString: keybind, callback, preventDefault: true});\n }\n\n public listenOn(el: HTMLElement|Document, options: {fireIfInputFocused?: boolean} = {}): Subscription {\n return fromEvent(el, 'keydown').subscribe((e: KeyboardEvent) => {\n if (options.fireIfInputFocused || !['input', 'select'].includes(document.activeElement.nodeName.toLowerCase())) {\n this.executeBindings(e);\n }\n });\n }\n\n private executeBindings(e: KeyboardEvent) {\n this.bindings.forEach(binding => {\n if ( ! this.bindingMatches(binding.keybind, e)) return;\n if (binding.preventDefault && e.preventDefault) e.preventDefault();\n binding.callback(e);\n });\n }\n\n private bindingMatches(keybind: ParsedKeybind, e: KeyboardEvent) {\n return Keycodes[keybind.key.toUpperCase()] === e.keyCode &&\n (e.ctrlKey === keybind.ctrl || e.metaKey === keybind.ctrl) &&\n e.shiftKey === keybind.shift;\n }\n\n /**\n * Parse keybind string into object.\n */\n private parseKeybindString(keybind: string): ParsedKeybind {\n const parts = keybind.trim().split('+');\n const parsed = {ctrl: false, shift: false, key: ''};\n\n parts.forEach(part => {\n part = part.trim().toLowerCase();\n\n if (part === 'ctrl') {\n parsed.ctrl = true;\n } else if (part === 'shift') {\n parsed.shift = true;\n } else {\n parsed.key = part;\n }\n });\n\n return parsed;\n }\n}\n","<mat-chip-list #chipList [selectable]=\"false\">\n <mat-chip\n *ngFor=\"let item of items$ | async; index as i\"\n [selectable]=\"false\"\n [removable]=\"!selectMode\"\n (removed)=\"remove(i)\"\n >\n {{displayChipValue(item)}}\n <mat-icon matChipRemove svgIcon=\"cancel\"></mat-icon>\n </mat-chip>\n <input [placeholder]=\"placeholder | trans\"\n *ngIf=\"!selectMode\"\n #inputEl\n [type]=\"type\"\n class=\"mat-chip-input mat-input-element\"\n [matChipInputFor]=\"chipList\"\n [matChipInputAddOnBlur]=\"true\"\n [matAutocomplete]=\"auto\"\n [matAutocompleteConnectedTo]=\"{elementRef: el}\"\n [formControl]=\"formControl\"\n (matChipInputTokenEnd)=\"addFromChipInput($event.value)\" />\n</mat-chip-list>\n\n<mat-autocomplete class=\"chip-input-autocomplete-panel\" #auto=\"matAutocomplete\" (optionSelected)=\"addFromAutocomplete($event.option.value)\" [autoActiveFirstOption]=\"true\">\n <mat-option *ngFor=\"let value of suggestedValues$ | async\" [value]=\"value\">{{displayChipValue(value)}}</mat-option>\n</mat-autocomplete>\n\n<ng-template #selectModeTemplate let-suggestions=\"suggestions\">\n <mat-option *ngFor=\"let value of suggestions\" [value]=\"value\">{{displayChipValue(value)}}</mat-option>\n</ng-template>\n","import {\n AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, OnInit, TemplateRef, ViewChild, ViewEncapsulation\n} from '@angular/core';\nimport {ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject, Observable, of} from 'rxjs';\nimport {MatAutocomplete} from '@angular/material/autocomplete';\nimport {catchError, debounceTime, distinctUntilChanged, switchMap} from 'rxjs/operators';\nimport {Model} from '../../../types/models/model';\n\ntype ChipValue = 'string' | Model;\n\n@Component({\n selector: 'chip-input',\n templateUrl: './chip-input.component.html',\n styleUrls: ['./chip-input.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: ChipInputComponent,\n multi: true,\n }]\n})\nexport class ChipInputComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n @Input() placeholder: string;\n @Input() type = 'text';\n @Input() emailsInput = false;\n @Input() suggestFn: (query: string) => Observable<ChipValue[]>;\n @Input() @HostBinding('class.select-mode') selectMode = false;\n @ViewChild('auto') matAutocomplete: MatAutocomplete;\n @ViewChild('inputEl') inputEl: ElementRef<HTMLInputElement>;\n @ViewChild('selectModeTemplate') selectModeTemplate: TemplateRef<any>;\n\n public formControl = new FormControl();\n\n public propagateChange: (items: ChipValue[]) => void;\n public items$ = new BehaviorSubject<ChipValue[]>([]);\n public suggestedValues$ = new BehaviorSubject<ChipValue[]>([]);\n @Input() set suggestedValues(values: ChipValue[]) {\n this.suggestedValues$.next(values);\n }\n\n constructor(\n public el: ElementRef<HTMLElement>,\n ) {}\n\n ngOnInit() {\n if (this.suggestFn) {\n this.bindToSearchControl();\n }\n if (this.selectMode) {\n // TODO: implement\n }\n }\n\n ngAfterViewInit() {\n if (this.emailsInput) {\n this.parseEmailsOnPaste();\n }\n }\n\n public remove(index: number) {\n const items = [...this.items$.value];\n items.splice(index, 1);\n this.items$.next(items);\n this.propagateChange(this.items$.value);\n }\n\n public addFromChipInput(value: ChipValue, propagate = true) {\n if (value && !this.matAutocomplete.isOpen && !this.selectMode) {\n this.add(value, propagate);\n }\n }\n\n public addFromAutocomplete(value: ChipValue, propagate = true) {\n this.add(value, propagate);\n }\n\n private add(value: ChipValue, propagate = true) {\n value = (typeof value === 'string' ? value.trim() : value) as ChipValue;\n const duplicate = this.findValueIndex(value) > -1;\n if (value && !duplicate) {\n this.items$.next([...this.items$.value, value]);\n if (propagate) {\n this.propagateChange(this.items$.value);\n }\n }\n if (this.inputEl) {\n this.inputEl.nativeElement.value = '';\n }\n this.formControl.setValue(null);\n this.suggestedValues$.next([]);\n }\n\n private findValueIndex(value: ChipValue) {\n if (typeof value === 'string') {\n return this.items$.value.indexOf(value);\n } else {\n return this.items$.value.findIndex(v => (v as Model).id === value.id);\n }\n }\n\n public writeValue(value: ChipValue[] = []) {\n this.items$.next(value || []);\n // if (value && value.length) {\n // value.forEach(item => this.add(item, false));\n // } else if (this.items$.value.length) {\n // while (this.items$.value.length !== 0) {\n // this.remove(0);\n // }\n // }\n }\n\n public registerOnChange(fn: (items: ChipValue[]) => void) {\n this.propagateChange = fn;\n }\n\n public registerOnTouched() {}\n\n private bindToSearchControl() {\n this.formControl.valueChanges.pipe(\n debounceTime(150),\n distinctUntilChanged(),\n switchMap(query => query ? this.suggestFn(query) : of([])),\n catchError(() => of([])),\n ).subscribe(values => {\n const filtered = values.filter(v => this.findValueIndex(v) === -1);\n this.suggestedValues$.next(filtered);\n });\n }\n\n public displayChipValue(value: ChipValue): string {\n return typeof value === 'object' ? value.name : value;\n }\n\n private parseEmailsOnPaste() {\n this.inputEl.nativeElement.addEventListener('paste', e => {\n const paste = (e.clipboardData || window['clipboardData']).getData('text');\n const emails = paste.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)/gi);\n if (emails) {\n e.preventDefault();\n const selection = window.getSelection();\n if (selection.rangeCount) {\n selection.deleteFromDocument();\n emails.forEach(email => this.add(email));\n }\n }\n });\n }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ChipInputComponent} from './chip-input/chip-input.component';\nimport {MatChipsModule} from '@angular/material/chips';\nimport {MatIconModule} from '@angular/material/icon';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatRippleModule} from '@angular/material/core';\n\n@NgModule({\n imports: [\n CommonModule,\n MatChipsModule,\n MatAutocompleteModule,\n ReactiveFormsModule,\n TranslationsModule,\n\n MatButtonModule,\n MatIconModule,\n MatRippleModule,\n ],\n declarations: [\n ChipInputComponent,\n ],\n exports: [\n ChipInputComponent,\n ]\n})\nexport class ChipsModule {\n}\n","import {animate, style, transition, trigger} from '@angular/animations';\n\nexport const SKELETON_ANIMATIONS = [\n trigger('fadeIn', [\n transition(':enter', [\n style({opacity: 0}),\n animate('325ms ease-in', style({\n opacity: 1,\n }))\n ])\n ]),\n trigger('fadeOut', [\n transition(':leave', [\n style({opacity: 1, position: 'absolute', left: '0', right: '0'}),\n animate('325ms ease-out', style({\n opacity: 0\n }))\n ])\n ])\n];\n","import {ChangeDetectionStrategy, Component, HostBinding, Input} from '@angular/core';\nimport {ThemeService} from '../../theme.service';\n\n@Component({\n selector: 'skeleton',\n templateUrl: './skeleton.component.html',\n styleUrls: ['./skeleton.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'aria-busy': 'true',\n 'aria-valuemin': '0',\n 'aria-valuemax': '100',\n 'aria-valuetext': 'Loading...',\n 'role': 'progressbar',\n }\n})\nexport class SkeletonComponent {\n @Input() animation: 'pulsate' | 'wave' = 'wave';\n @Input() variant: 'avatar' | 'text' | 'rect' | 'icon' = 'text';\n @HostBinding('class.dark') dark = this.theme.isDarkMode();\n\n @HostBinding('class.pulsate') get pulsate() {\n return this.animation === 'pulsate';\n }\n\n @HostBinding('class.wave') get wave() {\n return this.animation === 'wave';\n }\n\n @HostBinding('class.avatar') get avatar() {\n return this.variant === 'avatar';\n }\n\n @HostBinding('class.text') get text() {\n return this.variant === 'text';\n }\n\n @HostBinding('class.rect') get rect() {\n return this.variant === 'rect';\n }\n\n @HostBinding('class.icon') get icon() {\n return this.variant === 'icon';\n }\n\n constructor(private theme: ThemeService) {}\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SkeletonComponent} from './skeleton.component';\n\n@NgModule({\n declarations: [\n SkeletonComponent,\n ],\n imports: [\n CommonModule\n ],\n exports: [\n SkeletonComponent,\n ]\n})\nexport class SkeletonModule {\n}\n","export function hasKey<K extends string>(key: K, val: any): val is {[P in K]: any} {\n return key in val;\n}\n","export function removeNullFromObject<T>(obj: T): T {\n const copy = {...obj};\n Object.keys(copy).forEach(key => {\n if (copy[key] == null || copy[key] === '') {\n delete copy[key];\n }\n });\n return copy;\n}\n","import {ComponentType} from '@angular/cdk/portal';\nimport {NormalizedModel} from '@common/core/types/models/normalized-model';\n\nexport class DatatableFilter {\n defaultValue: FilterValue | '';\n defaultOperator: FilterOperator;\n key: string;\n label: string;\n description: string;\n required: boolean;\n order: number;\n type: FilterControlType;\n inputType: 'string' | 'number';\n options: {key?: string; value: string | boolean | object | number}[];\n operators: FilterOperator[] | undefined;\n component?: ComponentType<any>;\n componentData?: any;\n\n constructor(options: DatatableFilterOptions) {\n this.defaultValue =\n options.defaultValue !== undefined ? options.defaultValue : '';\n this.key = options.key || '';\n this.label = options.label || options.key || '';\n this.description = options.description || '';\n this.defaultOperator = options.defaultOperator || FilterOperator.eq;\n this.required = !!options.required;\n this.order = options.order === undefined ? 1 : options.order;\n this.type = options.type || FilterControlType.Select;\n this.inputType = options.inputType;\n this.options = options.options || [];\n this.operators = options.operators;\n this.component = options.component;\n this.componentData = options.componentData;\n }\n}\n\nexport interface DatatableFilterOptions {\n defaultValue?: FilterValue | '';\n key?: string;\n label?: string;\n description: string;\n component?: ComponentType<any>;\n componentData?: any;\n defaultOperator?: FilterOperator;\n required?: boolean;\n order?: number;\n type?: FilterControlType;\n inputType?: 'string' | 'number';\n options?: {key?: string; value: string | boolean | object | number}[];\n operators?: FilterOperator[];\n}\n\nexport enum FilterControlType {\n Select = 'select',\n DatePicker = 'datePicker',\n SelectModel = 'selectModel',\n Input = 'input',\n StaticValue = 'staticValue',\n}\n\nexport enum FilterOperator {\n eq = '=',\n ne = '!=',\n gt = '>',\n gte = '>=',\n lt = '<',\n lte = '<=',\n has = 'has',\n doesntHave = 'doesntHave',\n}\n\nexport type FilterValueWithOperator = {\n value: FilterValue;\n operator: FilterOperator;\n};\nexport const ALL_PRIMITIVE_OPERATORS = [\n FilterOperator.eq,\n FilterOperator.ne,\n FilterOperator.gt,\n FilterOperator.gte,\n FilterOperator.lt,\n FilterOperator.lte,\n];\n\nexport type FilterValue =\n | string\n | number\n | boolean\n | NormalizedModel\n | FilterValueWithOperator\n | null;\n","import {\n ALL_PRIMITIVE_OPERATORS,\n DatatableFilter,\n FilterControlType,\n FilterOperator,\n} from './datatable-filter';\n\nexport class TimestampFilter extends DatatableFilter {\n type = FilterControlType.DatePicker;\n operators = ALL_PRIMITIVE_OPERATORS;\n defaultOperator = FilterOperator.lte;\n defaultValue = new Date().toISOString().split('T')[0];\n}\n\nexport class CreatedAtFilter extends TimestampFilter {\n key = 'created_at';\n label = 'Created At';\n}\n\nexport class UpdatedAtFilter extends TimestampFilter {\n key = 'updated_at';\n label = 'Updated At';\n}\n\n\n","<div class=\"table\">\n <div class=\"filter-suggestion-header row\">\n <div class=\"column\" trans>Field</div>\n <div class=\"column\" trans>Description</div>\n </div>\n <div class=\"body\" role=\"list\">\n <div\n role=\"listitem\"\n class=\"row filter-suggestion-item\"\n *ngFor=\"let filter of filters | keyvalue: originalOrder; index as index\"\n tabindex=\"0\"\n #filterSuggestion\n [attr.data-filter-key]=\"filter.key\"\n [attr.data-index]=\"index\"\n (click)=\"filterSelected.emit(filter.value)\"\n >\n <div class=\"column label-column\" trans>{{ filter.value.label }}</div>\n <div class=\"column\" trans>{{ filter.value.description }}</div>\n </div>\n </div>\n</div>\n\n<div class=\"help-container\">\n <mat-icon svgIcon=\"info\"></mat-icon>\n <div trans>\n Use arrows, tab or mouse to navigate added filters. Backspace or delete key to remove them.\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n QueryList,\n ViewChildren,\n} from '@angular/core';\nimport {DatatableFilter} from '../filter-config/datatable-filter';\n\nconst ITEM_CLASS = 'filter-suggestion-item';\n\n@Component({\n selector: 'filter-suggestions',\n templateUrl: './filter-suggestions.component.html',\n styleUrls: ['./filter-suggestions.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSuggestionsComponent {\n @Input() filters: {[key: string]: DatatableFilter};\n @Output() filterSelected = new EventEmitter<DatatableFilter>();\n @ViewChildren('filterSuggestion') items: QueryList<ElementRef<HTMLElement>>;\n\n anyFocused(): boolean {\n return document.activeElement.classList.contains(ITEM_CLASS);\n }\n\n focusItemAt(index: number) {\n this.items.get(index).nativeElement.focus();\n }\n\n getFocusedFilter(): DatatableFilter {\n if (this.anyFocused()) {\n const k = (document.activeElement as HTMLElement).dataset.filterKey;\n return this.filters[k];\n }\n }\n\n getFocusedIndex(): number {\n if (this.anyFocused()) {\n const el = document.activeElement as HTMLElement;\n return parseInt(el.dataset.index);\n }\n }\n\n originalOrder = (): number => {\n return 0;\n };\n}\n","<ng-container *ngIf=\"value$ | async as value; else defaultHint\">\n <img class=\"image\" [src]=\"value.image\" />\n <div class=\"name\">{{ value.name }}</div>\n</ng-container>\n<ng-template #defaultHint>\n <div trans>Click to select</div>\n</ng-template>\n","import {ChangeDetectionStrategy, Component, HostListener, Input} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {NormalizedModel} from '@common/core/types/models/normalized-model';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {DatatableFilter} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\n\ntype propagateFn = (value: NormalizedModel) => void;\n\n@Component({\n selector: 'select-model-control',\n templateUrl: './select-model-control.component.html',\n styleUrls: ['./select-model-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: SelectModelControlComponent,\n multi: true,\n },\n ],\n})\nexport class SelectModelControlComponent implements ControlValueAccessor {\n @Input() filter: DatatableFilter;\n private propagateChange: propagateFn;\n value$ = new BehaviorSubject<NormalizedModel>(null);\n\n constructor(private dialog: Modal) {}\n\n registerOnChange(fn: propagateFn): void {\n this.propagateChange = fn;\n }\n\n registerOnTouched(fn: any): void {}\n\n writeValue(value: NormalizedModel) {\n this.value$.next(value);\n }\n\n @HostListener('click')\n onClick() {\n this.openSelectModelDialog();\n }\n\n openSelectModelDialog() {\n this.dialog\n .open(this.filter.component, this.filter.componentData)\n .afterClosed()\n .subscribe((model: NormalizedModel) => {\n if (model) {\n this.value$.next(model);\n this.propagateChange(model);\n }\n });\n }\n}\n","import { FilterOperator } from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\n\nexport const FILTER_OPERATOR_NAMES: {[op in FilterOperator]: string} = {\n '=': 'is',\n '!=': 'is not',\n '>': 'is greater than',\n '>=': 'is greater than or equal to',\n '<': 'is less than',\n '<=': 'is less than or equal to',\n has: 'Include',\n doesntHave: 'Do not include',\n};\n\n","import {Pipe, PipeTransform} from '@angular/core';\nimport {FilterOperator} from '../../filter-config/datatable-filter';\nimport {FILTER_OPERATOR_NAMES} from '../../../filter-operator-names';\nimport {BreakpointsService} from '../../../../../core/ui/breakpoints.service';\n\n@Pipe({\n name: 'operatorDisplayName',\n})\nexport class OperatorDisplayNamePipe implements PipeTransform {\n constructor(private breakpoints: BreakpointsService) {}\n transform(value: FilterOperator, compact: boolean): string {\n return compact || this.breakpoints.isMobile$.value\n ? value\n : FILTER_OPERATOR_NAMES[value];\n }\n}\n","<ng-container [formGroup]=\"formGroup\">\n <select\n class=\"operator-select\"\n formControlName=\"operator\"\n #select\n (ngModelChange)=\"resizeSelect()\"\n >\n <option [value]=\"operator\" *ngFor=\"let operator of operators\">\n {{ operator | operatorDisplayName:compact }}\n </option>\n </select>\n</ng-container>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n ViewChild,\n} from '@angular/core';\nimport {FormGroup} from '@angular/forms';\nimport {FilterOperator} from '../../filter-config/datatable-filter';\n\n@Component({\n selector: 'operator-select',\n templateUrl: './operator-select.component.html',\n styleUrls: ['./operator-select.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OperatorSelectComponent implements AfterViewInit {\n @Input() compact: boolean;\n @Input() formGroup: FormGroup;\n @Input() operators: FilterOperator[];\n @ViewChild('select') select: ElementRef<HTMLSelectElement>;\n\n ngAfterViewInit() {\n this.resizeSelect();\n }\n\n resizeSelect() {\n const select = this.select?.nativeElement;\n if (select && select.selectedIndex > -1) {\n const valueLength =\n select.options[select.selectedIndex].label.length;\n select.style.width = `${valueLength + 5}ch`;\n }\n }\n}\n","<ng-container [formGroup]=\"formGroup\" *ngIf=\"form.controls[key] as formGroup\">\n <div class=\"filter-label\" (click)=\"el.nativeElement.focus()\" trans>{{ filter.label }}</div>\n <operator-select\n *ngIf=\"filter.operators\"\n [compact]=\"compact\"\n [formGroup]=\"formGroup\"\n [operators]=\"filter.operators\"\n ></operator-select>\n <ng-container [ngSwitch]=\"filter.type\">\n <div class=\"filter-input-container\" *ngSwitchCase=\"'select'\">\n <select\n [id]=\"key\"\n #valueInput\n class=\"filter-input filter-value\"\n formControlName=\"value\"\n (ngModelChange)=\"resizeInput()\"\n [compareWith]=\"compareFilterValueFn\"\n >\n <option *ngFor=\"let option of filter.options\" [ngValue]=\"option.value\" trans>\n {{ option.key || option.value }}\n </option>\n </select>\n <svg viewBox=\"0 0 24 24\" class=\"caret-svg\">\n <path d=\"M7 10l5 5 5-5z\"></path>\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n </svg>\n </div>\n <div class=\"date-picker-container\" *ngSwitchCase=\"'datePicker'\">\n <input\n type=\"date\"\n class=\"date-input filter-value\"\n #valueInput\n [id]=\"key\"\n formControlName=\"value\"\n />\n </div>\n <select-model-control\n [filter]=\"filter\"\n *ngSwitchCase=\"'selectModel'\"\n #valueInput\n [id]=\"key\"\n formControlName=\"value\"\n class=\"filter-value select-model-input\"\n ></select-model-control>\n <div class=\"filter-input-container\" *ngSwitchCase=\"'input'\">\n <input\n #valueInput\n [id]=\"key\"\n formControlName=\"value\"\n (ngModelChange)=\"resizeInput()\"\n [type]=\"filter.inputType || 'text'\"\n class=\"filter-input filter-value\"\n min=\"1\"\n required\n />\n </div>\n </ng-container>\n</ng-container>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n ViewChild,\n} from '@angular/core';\nimport {FormGroup} from '@angular/forms';\nimport {\n DatatableFilter,\n FilterValue,\n} from '../../filter-config/datatable-filter';\nimport * as deepequal from 'fast-deep-equal';\nimport {SelectModelControlComponent} from '../select-model-control/select-model-control.component';\n\n@Component({\n selector: 'active-filter',\n templateUrl: './active-filter.component.html',\n styleUrls: ['./active-filter.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n tabIndex: '0',\n role: 'button',\n },\n})\nexport class ActiveFilterComponent implements AfterViewInit {\n @HostBinding('attr.data-control-key') @Input() key: string;\n @Input() compact: boolean;\n @Input() form: FormGroup;\n @Input() filter: DatatableFilter;\n @ViewChild('valueInput') valueInput:\n | SelectModelControlComponent\n | ElementRef<HTMLSelectElement | HTMLInputElement>;\n\n constructor(public el: ElementRef<HTMLElement>) {}\n\n ngAfterViewInit() {\n this.resizeInput();\n }\n\n focus() {\n this.el.nativeElement.focus();\n }\n\n focusValueInput() {\n if (this.valueInput instanceof SelectModelControlComponent) {\n this.valueInput.openSelectModelDialog();\n } else if (this.valueInput?.nativeElement) {\n this.valueInput.nativeElement.focus();\n }\n }\n\n resizeInput() {\n const el = (this.valueInput as ElementRef)?.nativeElement;\n if (el?.nodeName === 'SELECT') {\n const select = el as HTMLSelectElement;\n if (select.selectedIndex > -1) {\n const valueLength =\n select.options[select.selectedIndex].label.length;\n select.style.width = `${valueLength + 5}ch`;\n }\n } else if (el?.nodeName === 'INPUT' && el.type !== 'date') {\n const input = el as HTMLInputElement;\n input.style.width = `${input.value.length + 7}ch`;\n }\n }\n\n compareFilterValueFn = (val1: FilterValue, val2: FilterValue) => {\n return deepequal(val1, val2);\n };\n}\n","<ng-container *ngFor=\"let control of form.controls | keyvalue; index as index\">\n <active-filter\n [compact]=\"compact\"\n [key]=\"control.key\"\n [form]=\"form\"\n [filter]=\"filter\"\n *ngIf=\"config[control.value.value.key] as filter\"\n [attr.data-index]=\"index\"\n ></active-filter>\n</ng-container>\n<ng-content></ng-content>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n QueryList,\n ViewChildren,\n} from '@angular/core';\nimport {FormBuilder, FormGroup} from '@angular/forms';\nimport {DatatableFilter} from '../filter-config/datatable-filter';\nimport {randomString} from '@common/core/utils/random-string';\nimport {ActiveFilterComponent} from './active-filter/active-filter.component';\n\ninterface AddFilterOptions {\n value?: any;\n operator?: string;\n focus?: boolean;\n}\n\n@Component({\n selector: 'active-filters',\n templateUrl: './active-filters.component.html',\n styleUrls: ['./active-filters.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActiveFiltersComponent {\n @Input() compact: boolean;\n @Input() form: FormGroup;\n @Input() config: DatatableFilter;\n @ViewChildren(ActiveFilterComponent)\n filters: QueryList<ActiveFilterComponent>;\n\n constructor(\n private fb: FormBuilder,\n private cd: ChangeDetectorRef,\n public el: ElementRef<HTMLElement>\n ) {}\n\n add(config: DatatableFilter, opts: AddFilterOptions = {}) {\n const value =\n opts.value !== undefined ? opts.value : config.defaultValue;\n const control = this.fb.group({\n key: config.key,\n value,\n operator: opts.operator || config.defaultOperator,\n });\n const key = Object.keys(this.form.controls).length + randomString(8);\n // don't reload the table if filter does not have any default value (select model/user filter for example)\n this.form.addControl(key, control, {emitEvent: value !== ''});\n this.cd.detectChanges();\n if (opts.focus) {\n this.filters.last.focusValueInput();\n }\n }\n\n removeByKey(key: string) {\n this.form.removeControl(key);\n this.cd.markForCheck();\n }\n\n removeCurrentlyFocused() {\n const activeEl = document.activeElement as HTMLElement;\n this.removeByKey(activeEl.dataset.controlKey);\n }\n\n anyFocused(): boolean {\n return document.activeElement.nodeName === 'ACTIVE-FILTER';\n }\n\n focusLast() {\n if (this.filters.last) {\n this.filters.last.focus();\n }\n }\n\n focusPrevious() {\n const i = this.getFocusedIndex();\n const previous = this.filters.get(i - 1);\n if (previous) {\n previous.focus();\n }\n }\n\n getByIndex(index: number) {\n return this.filters.get(index);\n }\n\n lastIsFocused() {\n const i = this.getFocusedIndex();\n return i === this.filters.length - 1;\n }\n\n getFocusedIndex(): number {\n const i = (document.activeElement as HTMLElement).dataset.index;\n return i ? parseInt(i) : null;\n }\n}\n","<active-filters [form]=\"form\" [config]=\"keyedFilters\" [compact]=\"compact\">\n <div class=\"input-container search-input-container\">\n <mat-icon class=\"search-icon\" svgIcon=\"search\"></mat-icon>\n <input\n type=\"text\"\n class=\"search-input\"\n #searchInput\n [placeholder]=\"('Type to search for ' + pluralName) | trans\"\n [formControl]=\"searchControl\"\n (focus)=\"inputFocus.emit()\"\n />\n </div>\n</active-filters>\n\n<button type=\"button\" class=\"clear-button\" (click)=\"clearSearch()\" *ngIf=\"haveFiltersOrQuery$ | async\" mat-icon-button>\n <mat-icon svgIcon=\"close\"></mat-icon>\n</button>\n\n<button\n type=\"button\"\n mat-button\n class=\"filter-button\"\n (click)=\"toggleFilterDropdown()\"\n *ngIf=\"keyedFilters\"\n>\n <mat-icon class=\"filter-button-icon\" svgIcon=\"filter-list\"></mat-icon>\n <span class=\"filter-button-text\" *ngIf=\"!compact\" trans>Filter</span>\n</button>\n\n<filter-suggestions\n [filters]=\"keyedFilters\"\n (filterSelected)=\"addFilterFromDropdownClick($event)\"\n [style.top]=\"filterBarHeight + 5 + 'px'\"\n [class.visible]=\"filterDropdownVisible$ | async\"\n></filter-suggestions>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport {FormBuilder, FormControl} from '@angular/forms';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {distinctUntilChanged, filter, map, startWith} from 'rxjs/operators';\nimport {\n BehaviorSubject,\n combineLatest,\n fromEvent,\n merge,\n Observable,\n Subscription,\n} from 'rxjs';\nimport {\n DatatableFilter,\n FilterValue,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {Keybinds} from '@common/core/keybinds/keybinds.service';\nimport {FilterSuggestionsComponent} from './filter-suggestions/filter-suggestions.component';\nimport {ActiveFiltersComponent} from './active-filters/active-filters.component';\n\ninterface FormData {\n [key: string]: {\n key: string;\n value: {value: FilterValue; operator: string} | FilterValue;\n operator: string;\n };\n}\n\n@Component({\n selector: 'search-input-with-filters',\n templateUrl: './search-input-with-filters.component.html',\n styleUrls: ['./search-input-with-filters.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchInputWithFiltersComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input() compact: boolean;\n @Input() searchControl: FormControl;\n @Input() pluralName: string;\n @Input() set filters(filters: DatatableFilter[]) {\n if (filters) {\n this.keyedFilters = {};\n (filters || []).forEach(filter => {\n this.keyedFilters[filter.key] = filter;\n });\n } else {\n this.keyedFilters = null;\n }\n }\n\n @Output() filterChange = new EventEmitter<string>();\n @Output() inputFocus = new EventEmitter();\n\n @ViewChild('searchInput') searchInput: ElementRef<HTMLInputElement>;\n @ViewChild(FilterSuggestionsComponent) suggestions: FilterSuggestionsComponent;\n @ViewChild(ActiveFiltersComponent) activeFilters: ActiveFiltersComponent;\n @ViewChildren('filterSuggestion') filterContainers: QueryList<\n ElementRef<HTMLElement>\n >;\n\n keyedFilters: {[key: string]: DatatableFilter};\n\n form = this.fb.group({});\n\n filterBarHeight = 0;\n filterDropdownVisible$ = new BehaviorSubject<boolean>(false);\n private closeActionsStream$: Subscription;\n\n haveFiltersOrQuery$: Observable<boolean>;\n\n constructor(\n private fb: FormBuilder,\n private route: ActivatedRoute,\n private el: ElementRef<HTMLElement>,\n private keybinds: Keybinds,\n private cd: ChangeDetectorRef,\n private router: Router\n ) {}\n\n ngOnInit() {\n this.haveFiltersOrQuery$ = combineLatest([\n this.searchControl.valueChanges.pipe(startWith(null)),\n this.form.valueChanges.pipe(startWith(null)),\n ]).pipe(map(([s, f]) => s || (f && Object.keys(f).length !== 0)));\n }\n\n ngAfterViewInit() {\n this.watchForSizeChanges();\n this.setFiltersFromQuery();\n this.setupKeybinds();\n this.subscribeToCloseActions();\n this.bindToFormValueChange();\n }\n\n @HostListener('click', ['$event'])\n onClick(e: MouseEvent) {\n if (\n e.target === this.el.nativeElement ||\n e.target === this.activeFilters.el.nativeElement\n ) {\n this.searchInput.nativeElement.focus();\n }\n }\n\n ngOnDestroy() {\n this.closeActionsStream$?.unsubscribe();\n }\n\n clearSearch() {\n Object.keys(this.form.controls).forEach(key => {\n this.activeFilters.removeByKey(key);\n });\n // prevent double datatable reload\n this.searchControl.reset(null, {emitEvent: false});\n this.form.reset();\n }\n\n toggleFilterDropdown() {\n if (this.filterDropdownVisible$.value) {\n this.filterDropdownVisible$.next(false);\n } else {\n this.filterDropdownVisible$.next(true);\n }\n }\n\n addFilterFromDropdownClick(config: DatatableFilter) {\n this.activeFilters.add(config, {focus: true});\n this.filterDropdownVisible$.next(false);\n }\n\n private searchInputIsFocused(): boolean {\n return document.activeElement === this.searchInput.nativeElement;\n }\n\n private cursorAtStartOfSearchInput(): boolean {\n return (\n this.searchInputIsFocused() &&\n this.searchInput.nativeElement.selectionStart === 0\n );\n }\n\n private cursorAtEndOfSearchInput(): boolean {\n return (\n this.searchInputIsFocused() &&\n this.searchInput.nativeElement.selectionStart ===\n this.searchInput.nativeElement.value.length\n );\n }\n\n private bindToFormValueChange() {\n this.form.valueChanges\n .pipe(\n map(v => (Object.keys(v).length ? v : null)),\n distinctUntilChanged()\n )\n .subscribe((formData: FormData) => {\n this.filterChange.emit(formData ? encodeFilterFormData(formData) : null);\n });\n }\n\n private watchForSizeChanges() {\n const resizeObserver = new ResizeObserver(entries => {\n this.filterBarHeight = entries[0].contentRect.height;\n });\n resizeObserver.observe(this.el.nativeElement, {box: 'border-box'});\n }\n\n private setFiltersFromQuery() {\n const qp = this.router.routerState.root.snapshot.queryParams;\n if (qp.filters) {\n const filterValues = decodeFilterString(qp.filters);\n filterValues.forEach(filterValue => {\n this.activeFilters.add(this.keyedFilters[filterValue.key], filterValue);\n });\n }\n if (qp.query) {\n this.searchControl.setValue(qp.query);\n }\n }\n\n private setupKeybinds() {\n this.keybinds.add(['backspace', 'delete'], () => {\n if (this.cursorAtStartOfSearchInput()) {\n return this.activeFilters.focusLast();\n }\n if (this.activeFilters.anyFocused()) {\n this.activeFilters.removeCurrentlyFocused();\n return this.searchInput.nativeElement.focus();\n }\n });\n\n this.keybinds.add('arrow_left', e => {\n if (this.cursorAtStartOfSearchInput()) {\n this.activeFilters.focusLast();\n e.preventDefault();\n } else if (this.activeFilters.anyFocused()) {\n this.activeFilters.focusPrevious();\n e.preventDefault();\n }\n });\n\n this.keybinds.add('arrow_right', e => {\n if (this.activeFilters.anyFocused()) {\n e.preventDefault();\n const i = this.activeFilters.getFocusedIndex();\n const next = this.activeFilters.getByIndex(i + 1);\n if (next) {\n next.focus();\n } else if (this.activeFilters.lastIsFocused()) {\n this.searchInput.nativeElement.focus();\n }\n }\n });\n\n this.keybinds.add(['arrow_down', 'tab'], e => {\n if (this.cursorAtEndOfSearchInput() || this.suggestions.anyFocused()) {\n e.preventDefault();\n if (!this.filterDropdownVisible$.value) {\n this.toggleFilterDropdown();\n }\n const currentIndex = this.suggestions.getFocusedIndex();\n let newIndex = currentIndex > -1 ? currentIndex : 0;\n if (this.suggestions.anyFocused()) {\n newIndex += 1;\n }\n if (newIndex >= this.suggestions.items.length) {\n newIndex = 0;\n }\n this.suggestions.focusItemAt(newIndex);\n }\n });\n\n this.keybinds.add(['arrow_up', 'shift+tab'], e => {\n if (this.suggestions.anyFocused()) {\n e.preventDefault();\n const currentIndex = this.activeFilters.getFocusedIndex();\n let newIndex = currentIndex > -1 ? currentIndex : 0;\n newIndex -= 1;\n if (newIndex === -1) {\n this.searchInput.nativeElement.focus();\n } else {\n this.suggestions.focusItemAt(newIndex);\n }\n }\n });\n\n this.keybinds.add('enter', e => {\n const focused = this.suggestions.getFocusedFilter();\n if (focused) {\n e.preventDefault();\n this.activeFilters.add(focused, {focus: true});\n this.filterDropdownVisible$.next(false);\n }\n });\n\n this.keybinds.add('esc', e => {\n if (this.filterDropdownVisible$.value) {\n e.preventDefault();\n this.filterDropdownVisible$.next(false);\n }\n });\n\n this.keybinds.listenOn(document, {\n fireIfInputFocused: true,\n });\n }\n\n private subscribeToCloseActions() {\n this.closeActionsStream$ = merge(\n fromEvent(document, 'click') as Observable<MouseEvent>,\n fromEvent(document, 'auxclick') as Observable<MouseEvent>,\n fromEvent(document, 'touchend') as Observable<TouchEvent>\n )\n .pipe(\n filter(event => {\n const clickTarget = event.target as HTMLElement;\n return (\n clickTarget !== this.el.nativeElement &&\n !this.el.nativeElement.contains(clickTarget)\n );\n })\n )\n .subscribe(() => {\n this.filterDropdownVisible$.next(false);\n });\n }\n}\n\nconst encodeFilterFormData = (formData: FormData): string => {\n const filters = [];\n Object.values(formData).forEach(filter => {\n if (filter.value !== '') {\n filters.push(filter);\n }\n });\n if (!filters.length) {\n return '';\n }\n return encodeURIComponent(btoa(JSON.stringify(filters)));\n};\n\nconst decodeFilterString = (filterString: string): DecodedValue[] => {\n let filtersFromQuery = [];\n try {\n filtersFromQuery = JSON.parse(atob(decodeURIComponent(filterString)));\n } catch (e) {\n //\n }\n return filtersFromQuery;\n};\n\ninterface DecodedValue {\n key: string;\n value: {value: FilterValue; operator: string};\n operator: string;\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SearchInputWithFiltersComponent} from './search-input-with-filters.component';\nimport {ActiveFiltersComponent} from './active-filters/active-filters.component';\nimport {ActiveFilterComponent} from './active-filters/active-filter/active-filter.component';\nimport {OperatorSelectComponent} from './active-filters/operator-select/operator-select.component';\nimport {FilterSuggestionsComponent} from './filter-suggestions/filter-suggestions.component';\nimport {OperatorDisplayNamePipe} from './active-filters/operator-select/operator-display-name.pipe';\nimport {SelectModelControlComponent} from './active-filters/select-model-control/select-model-control.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {SelectModelDialogComponent} from '@common/datatable/datatable-filters/select-model-dialog/select-model-dialog.component';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\n\n@NgModule({\n declarations: [\n SearchInputWithFiltersComponent,\n ActiveFiltersComponent,\n ActiveFilterComponent,\n OperatorSelectComponent,\n FilterSuggestionsComponent,\n OperatorDisplayNamePipe,\n SelectModelControlComponent,\n SelectModelDialogComponent,\n ],\n imports: [\n CommonModule,\n TranslationsModule,\n ReactiveFormsModule,\n MatIconModule,\n MatButtonModule,\n MatDialogModule,\n LoadingIndicatorModule,\n ],\n exports: [SearchInputWithFiltersComponent],\n})\nexport class SearchInputWithFiltersModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TableSortHeaderComponent} from './table-sort-header/table-sort-header.component';\nimport {MatIconModule} from '@angular/material/icon';\nimport {TranslationsModule} from '../core/translations/translations.module';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {UserColumnComponent} from './columns/user-column/user-column.component';\nimport {TableBodyCheckboxComponent} from './selection/table-body-checkbox.component';\nimport {TableHeaderCheckboxComponent} from './selection/table-header-checkbox.component';\nimport {DatatableFooterComponent} from './datatable-footer/datatable-footer.component';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule} from '@angular/material/button';\nimport {DatatableHeaderComponent} from './datatable-header/datatable-header.component';\nimport {MatChipsModule} from '@angular/material/chips';\nimport {DatatableFiltersPanelComponent} from './datatable-filters-panel/datatable-filters-panel.component';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {ChipsModule} from '../core/ui/chips/chips.module';\nimport {DatatableHeaderSearchInputComponent} from './datatable-header/datatable-header-search-input/datatable-header-search-input.component';\nimport {NoResultsMessageModule} from '../core/ui/no-results-message/no-results-message.module';\nimport {NoResultsMessageComponent} from '../core/ui/no-results-message/no-results-message.component';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {DatatableFiltersComponent} from '@common/datatable/datatable-filters/datatable-filters.component';\nimport {DatatablePageHeaderComponent} from '@common/datatable/datatable-page-header/datatable-page-header.component';\nimport {SearchInputWithFiltersModule} from './datatable-filters/search-input-with-filters/search-input-with-filters.module';\nimport {RouterModule} from '@angular/router';\n\n@NgModule({\n declarations: [\n TableSortHeaderComponent,\n UserColumnComponent,\n TableBodyCheckboxComponent,\n TableHeaderCheckboxComponent,\n DatatableFooterComponent,\n DatatableHeaderComponent,\n DatatableHeaderSearchInputComponent,\n DatatableFiltersPanelComponent,\n DatatableHeaderSearchInputComponent,\n DatatableFiltersComponent,\n DatatablePageHeaderComponent,\n ],\n imports: [\n CommonModule,\n TranslationsModule,\n ReactiveFormsModule,\n FormsModule,\n ChipsModule,\n NoResultsMessageModule,\n FormatPipesModule,\n SearchInputWithFiltersModule,\n RouterModule,\n\n // material\n MatButtonModule,\n MatIconModule,\n MatCheckboxModule,\n MatChipsModule,\n MatProgressBarModule,\n ],\n exports: [\n TableSortHeaderComponent,\n MatCheckboxModule,\n UserColumnComponent,\n TableBodyCheckboxComponent,\n TableHeaderCheckboxComponent,\n DatatableFooterComponent,\n DatatableHeaderComponent,\n DatatableFiltersPanelComponent,\n DatatableHeaderSearchInputComponent,\n NoResultsMessageComponent,\n DatatableFiltersComponent,\n DatatablePageHeaderComponent,\n ],\n})\nexport class DatatableModule {}\n","import {Params, Router} from '@angular/router';\nimport {BehaviorSubject, of, Subscription} from 'rxjs';\nimport {map, switchMap, tap} from 'rxjs/operators';\nimport {PaginationResponse} from '@common/core/types/pagination/pagination-response';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\nimport {PaginationParams} from '@common/core/types/pagination/pagination-params';\nimport {Injectable} from '@angular/core';\nimport {LocalStorage} from '@common/core/services/local-storage.service';\n\n@Injectable()\nexport class Paginator<T> {\n private subscription: Subscription;\n private params$ = new BehaviorSubject<PaginationParams>({});\n public paginatedOnce$ = new BehaviorSubject<boolean>(false);\n public loading$ = new BehaviorSubject(false);\n public response$ = new BehaviorSubject<{pagination: PaginationResponse<T>, [key: string]: any}>(null);\n public dontUpdateQueryParams = false;\n public perPageCacheKey: string = null;\n /** only true if data was already loaded from backend and it was empty */\n public noResults$ = this.response$.pipe(map(r => this.paginatedOnce$.value && r.pagination.data.length === 0));\n\n get params(): PaginationParams {\n return this.params$.value;\n }\n\n get currentPage(): number {\n return this.response$.value?.pagination?.current_page;\n }\n\n constructor(\n private router: Router,\n private http: AppHttpClient,\n private localStorage?: LocalStorage,\n ) {}\n\n public paginate(userParams: object = {}, url?: string, initialData?: PaginationResponse<T>) {\n // only use query params on first pagination, so query params can be removed via user params\n const queryParams = !this.subscription ? this.currentQueryParams() : {};\n const paginationParams = this.response$.value ? {\n perPage: this.response$.value.pagination.per_page,\n page: this.response$.value.pagination.current_page\n } : {};\n this.params$.next({...paginationParams, ...queryParams, ...userParams});\n\n if ( ! this.subscription) {\n this.init(url, initialData);\n }\n }\n\n public nextPage() {\n const current = this.response$.value.pagination.current_page || 0;\n this.paginate({\n ...this.params$.value,\n page: current + 1,\n cursor: this.response$.value.pagination.next_cursor,\n });\n }\n\n public previousPage() {\n const current = this.response$.value.pagination.current_page;\n this.paginate({\n ...this.params$.value,\n page: (current - 1) || 1,\n cursor: this.response$.value.pagination.prev_cursor,\n });\n }\n\n public changePerPage(newPerPage: number) {\n if (newPerPage !== this.params$.value?.perPage) {\n if (this.perPageCacheKey) {\n this.localStorage.set(this.perPageCacheKey, newPerPage);\n }\n this.paginate({\n ...this.params$.value,\n perPage: newPerPage\n });\n }\n }\n\n public currentQueryParams(): Params {\n return this.router.routerState.root.snapshot.queryParams;\n }\n\n private init(uri: string, initialData?: PaginationResponse<T>) {\n this.subscription = this.params$.pipe(\n switchMap(params => {\n this.loading$.next(true);\n const firstPagination = !this.paginatedOnce$.value;\n if (firstPagination && this.perPageCacheKey && this.localStorage.get(this.perPageCacheKey)) {\n params = {perPage: this.localStorage.get(this.perPageCacheKey), ...params};\n }\n\n // if we got initial pagination response (of 1st page)\n // return that instead of making 1st page http request\n const request = firstPagination && initialData ?\n of({pagination: initialData}) :\n this.http.get(uri, params);\n\n return (request as PaginatedBackendResponse<T>).pipe(\n // can't use \"finalize\" here as it will complete after loading$.next(true)\n // call above, which will prevent loading bar from showing\n // if pagination request is cancelled and new one is queued\n tap(() => {\n this.updateQueryParams(params);\n this.loading$.next(false);\n this.paginatedOnce$.next(true);\n }, () => {\n this.loading$.next(false);\n this.paginatedOnce$.next(true);\n })\n ) as PaginatedBackendResponse<T>;\n })\n ).subscribe(response => {\n this.response$.next(response);\n });\n }\n\n private updateQueryParams(params = {}) {\n if (this.dontUpdateQueryParams) return;\n for (const key in params) {\n if (Array.isArray(params[key])) {\n params[key] = params[key].join(',');\n }\n }\n this.router.navigate([], {queryParams: params, replaceUrl: true});\n }\n\n public canLoadNextPage(): boolean {\n const data = this.response$.value?.pagination;\n if (data) {\n return !!data.next_cursor || (this.currentPage < data.last_page);\n }\n return false;\n }\n\n public canLoadPrevPage(): boolean {\n const data = this.response$.value?.pagination;\n if (data) {\n return !!data.prev_cursor || (this.currentPage > 1);\n }\n return false;\n }\n}\n","import * as Dot from \"dot-object\";\nimport {_isNumberValue} from '@angular/cdk/coercion';\nimport {Model} from '@common/core/types/models/model';\n\nconst MAX_SAFE_INTEGER = 9007199254740991;\n\nexport function sortDatatableData<T extends Model>(data: T[], orderBy: string, orderDir: string): T[] {\n return data.sort((a, b) => {\n let valueA = sortingDataAccessor(a, orderBy);\n let valueB = sortingDataAccessor(b, orderBy);\n\n // If there are data in the column that can be converted to a number,\n // it must be ensured that the rest of the data\n // is of the same type so as not to order incorrectly.\n const valueAType = typeof valueA;\n const valueBType = typeof valueB;\n\n if (valueAType !== valueBType) {\n if (valueAType === 'number') {\n valueA += '';\n }\n if (valueBType === 'number') {\n valueB += '';\n }\n }\n\n // If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if\n // one value exists while the other doesn't. In this case, existing value should come last.\n // This avoids inconsistent results when comparing values to undefined/null.\n // If neither value exists, return 0 (equal).\n let comparatorResult = 0;\n if (valueA != null && valueB != null) {\n // Check if one value is greater than the other; if equal, comparatorResult should remain 0.\n if (valueA > valueB) {\n comparatorResult = 1;\n } else if (valueA < valueB) {\n comparatorResult = -1;\n }\n } else if (valueA != null) {\n comparatorResult = 1;\n } else if (valueB != null) {\n comparatorResult = -1;\n }\n\n return comparatorResult * (orderDir === 'asc' ? 1 : -1);\n });\n}\n\n/**\n * Data accessor function that is used for accessing data properties for sorting through\n * the default sortData function.\n * This default function assumes that the sort header IDs (which defaults to the column name)\n * matches the data's properties (e.g. column Xyz represents data['Xyz']).\n * May be set to a custom function for different behavior.\n */\nfunction sortingDataAccessor(data: object, sortHeaderId: string): string {\n const value = Dot.pick(sortHeaderId, data);\n\n if (_isNumberValue(value)) {\n const numberValue = Number(value);\n\n // Numbers beyond `MAX_SAFE_INTEGER` can't be compared reliably so we\n // leave them as strings. For more info: https://goo.gl/y5vbSg\n return numberValue < MAX_SAFE_INTEGER ? numberValue : value;\n }\n\n // if (Array.isArray(value)) {\n // return value.reduce((prev, curr) => prev += objectToStr(curr));\n // }\n\n return value;\n}\n","export function filterDatatableData<T = object>(data: T[], filter: string): T[] {\n return data.filter(obj => filterPredicate(obj as any, filter));\n}\n/**\n * Checks if a data object matches the data source's filter string. By default, each data object\n * is converted to a string of its properties and returns true if the filter has\n * at least one occurrence in that string. By default, the filter string has its whitespace\n * trimmed and the match is case-insensitive. May be overridden for a custom implementation of\n * filter matching.\n * @param data Data object used to check against the filter.\n * @param filter Filter string that has been set on the data source.\n * @returns Whether the filter matches against the data\n */\nfunction filterPredicate(data: object|string, filter: string): boolean {\n // Transform the data into a lowercase string of all property values.\n const dataStr = typeof data === 'string' ? data : objectToStr(data);\n\n // Transform the filter by converting it to lowercase and removing whitespace.\n const transformedFilter = filter.trim().toLowerCase();\n\n return dataStr.indexOf(transformedFilter) !== -1;\n}\n\nexport function objectToStr(obj: object) {\n return Object.keys(obj).reduce((currentTerm: string, key: string) => {\n // Use an obscure Unicode character to delimit the words in the concatenated string.\n // This avoids matches where the values of two columns combined will match the user's query\n // (e.g. `Flute` and `Stop` will match `Test`). The character is intended to be something\n // that has a very low chance of being typed in by somebody in a text field. This one in\n // particular is \"White up-pointing triangle with dot\" from\n // https://en.wikipedia.org/wiki/List_of_Unicode_characters\n const term = (obj[key] && typeof obj[key] === 'object') ?\n objectToStr(obj[key]) :\n obj[key];\n return currentTerm + term + '◬';\n }, '').toLowerCase();\n}\n","import {Injectable} from '@angular/core';\nimport {\n animationFrameScheduler,\n BehaviorSubject,\n combineLatest,\n Subscription,\n} from 'rxjs';\nimport {Paginator} from '../shared/paginator.service';\nimport {debounceTime, filter, map, pairwise, tap} from 'rxjs/operators';\nimport {DatatableFilters, DatatableFilterValue} from './types/datatable-filters';\nimport {DatatableSort} from './types/datatable-sort';\nimport {PaginationParams} from '../core/types/pagination/pagination-params';\nimport {removeNullFromObject} from '../core/utils/remove-null-from-object';\nimport {ComponentType} from '@angular/cdk/portal';\nimport {MatDialogConfig} from '@angular/material/dialog';\nimport {Modal} from '../core/ui/dialogs/modal.service';\nimport {ConfirmModalComponent} from '../core/ui/confirm-modal/confirm-modal.component';\nimport {DELETE_RESOURCE_MESSAGE} from './delete-resource-message';\nimport {PaginationResponse} from '../core/types/pagination/pagination-response';\nimport {sortDatatableData} from '@common/datatable/utils/sort-datatable-data';\nimport {Model} from '@common/core/types/models/model';\nimport {filterDatatableData} from '@common/datatable/utils/filter-datatable-data';\nimport {Router} from '@angular/router';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {LocalStorage} from '../core/services/local-storage.service';\nimport {FormControl} from '@angular/forms';\n\nexport type DatatableStaticParams = Record<string, string | number | boolean | string[]>;\n\ninterface DatatableConfig<T> {\n uri?: string;\n staticParams?: DatatableStaticParams;\n initialData?: PaginationResponse<T> | T[];\n disableSort?: boolean;\n infiniteScroll?: boolean;\n}\n\n@Injectable()\nexport class DatatableService<T extends Model> {\n public sort$ = new BehaviorSubject<DatatableSort>({});\n public filters$ = new BehaviorSubject<DatatableFilters>({});\n public searchControl = new FormControl();\n public searchTerm$ = new BehaviorSubject<string>(null);\n public staticParams$ = new BehaviorSubject<DatatableStaticParams>({});\n public paginator = new Paginator<T>(this.router, this.http, this.localStorage);\n private paginatorSub: Subscription;\n private mainSub: Subscription;\n private searchControlSub: Subscription;\n private ignoreNextParamChange = false;\n private originalData$ = new BehaviorSubject<T[]>([]);\n public data$ = new BehaviorSubject<T[]>([]);\n public selectedRows$ = new BehaviorSubject<number[]>([]);\n public config: DatatableConfig<T>;\n\n constructor(\n protected modal: Modal,\n protected router: Router,\n protected http: AppHttpClient,\n protected localStorage: LocalStorage\n ) {}\n\n get data() {\n return this.data$.value;\n }\n\n set data(data: T[]) {\n const tableData = [...data];\n this.originalData$.next(tableData);\n this.data$.next(tableData);\n\n // Reset filters and sort without trigger data reload via pagination\n this.ignoreNextParamChange = true;\n this.reset();\n }\n\n public init(config: DatatableConfig<T> = {}) {\n // TODO: don't add static params to current url query params\n\n this.config = config;\n this.staticParams$.next({\n ...this.staticParams$.value,\n ...config.staticParams,\n });\n if (config.uri) {\n this.connectToPaginator();\n } else if (config.initialData) {\n this.data = config.initialData as T[];\n }\n\n // set search term from queryParams\n if (config.uri) {\n const qp = this.router.routerState.root.snapshot.queryParams;\n const initialSearchTerm = qp.query as string;\n this.searchControl.setValue(initialSearchTerm);\n this.searchTerm$.next(initialSearchTerm);\n this.sort$.next({\n orderBy: qp.orderBy,\n orderDir: qp.orderDir,\n });\n }\n this.searchControlSub = this.searchControl.valueChanges\n .pipe(debounceTime(300))\n .subscribe(value => {\n this.searchTerm$.next(value);\n });\n\n this.mainSub = combineLatest([\n this.sort$,\n this.filters$,\n this.searchTerm$.pipe(\n map(query => {\n return {query};\n })\n ),\n // static params needs to be last, so it can override all the other params\n this.staticParams$,\n ])\n .pipe(\n debounceTime(0, animationFrameScheduler),\n map(params => Object.assign({}, ...params))\n )\n .subscribe((params: PaginationParams) => {\n if (this.ignoreNextParamChange) {\n return (this.ignoreNextParamChange = false);\n }\n params = removeNullFromObject(params);\n Object.entries(params).forEach(([key, value]) => {\n if (typeof value === 'object' && value.id) {\n params[`${key}Id`] = value.id;\n delete params[key];\n }\n });\n if (this.config.uri) {\n this.paginator.paginate(\n params,\n this.config.uri,\n this.config.initialData as PaginationResponse<T>\n );\n } else if (Object.keys(params).length && this.data.length) {\n this.applyLocalTransforms(params);\n }\n });\n\n return this;\n }\n\n private connectToPaginator() {\n this.paginatorSub = this.paginator.response$\n .pipe(pairwise())\n .subscribe(([prev, current]) => {\n // append data instead of overriding with next page data (infinite scroll).\n // if page did not change, we can assume that it was filter or sort\n // change and we should use only new data, even on infinite scroll\n const data =\n this.config.infiniteScroll &&\n prev?.pagination?.current_page !== current.pagination.current_page\n ? [...this.data$.value, ...current.pagination.data]\n : current.pagination.data;\n this.data$.next(data);\n });\n }\n\n private applyLocalTransforms(params: PaginationParams) {\n let data = [...this.originalData$.value];\n if (params.query) {\n data = filterDatatableData<T>(data, params.query);\n }\n if (params.orderBy && params.orderDir) {\n data = sortDatatableData<T>(data, params.orderBy, params.orderDir);\n }\n this.data$.next(data);\n }\n\n public addFilter(key: keyof DatatableFilters, value: DatatableFilterValue) {\n this.filters$.next({\n ...this.filters$.value,\n [key]: value,\n });\n }\n\n public removeFilter(key: keyof DatatableFilters) {\n const filters = {...this.filters$.value};\n delete filters[key];\n this.filters$.next(filters);\n }\n\n public reset(staticParams: DatatableStaticParams = null) {\n this.filters$.next({});\n this.sort$.next({});\n this.selectedRows$.next([]);\n if (staticParams) {\n this.staticParams$.next(staticParams);\n }\n }\n\n public openCrupdateResourceModal(\n cmp: ComponentType<any>,\n data?: object,\n config?: MatDialogConfig\n ) {\n return this.modal\n .open(cmp, data, config)\n .beforeClosed()\n .pipe(\n filter(modifiedResource => !!modifiedResource),\n tap(() => this.reset())\n );\n }\n\n public confirmResourceDeletion(resource: string) {\n const data = {...DELETE_RESOURCE_MESSAGE, replacements: {resource}};\n return this.modal\n .open(ConfirmModalComponent, data)\n .afterClosed()\n .pipe(filter(confirmed => confirmed));\n }\n\n public getCurrentParams() {\n return {\n ...this.sort$.value,\n ...this.filters$.value,\n ...this.staticParams$.value,\n ...this.paginator.params,\n };\n }\n\n public destroy() {\n this.paginatorSub?.unsubscribe();\n this.mainSub?.unsubscribe();\n this.searchControlSub?.unsubscribe();\n }\n}\n","import {ConfirmModalData} from '../core/ui/confirm-modal/confirm-modal.component';\n\nexport const DELETE_RESOURCE_MESSAGE: ConfirmModalData = {\n title: `Delete :resource`,\n body: `Are you sure you want to delete selected :resource?`,\n ok: 'Delete'\n};\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport {DatatableService} from '../datatable.service';\nimport {Subscription} from 'rxjs';\nimport {Model} from '../../core/types/models/model';\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {filter} from 'rxjs/operators';\nimport {ENTER, SPACE} from '@angular/cdk/keycodes';\nimport {slugifyString} from '../../core/utils/slugify-string';\n\n@Component({\n selector: '[table-sort-header]',\n templateUrl: './table-sort-header.component.html',\n styleUrls: ['./table-sort-header.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'tabindex': '0',\n '(click)': 'handleClick()',\n '(keydown)': 'handleKeydown($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n }\n})\nexport class TableSortHeaderComponent implements OnInit, AfterViewInit, OnDestroy {\n @ViewChild('columnName', {static: true}) columnName: ElementRef<HTMLElement>;\n @Input('table-sort-header') public orderBy: string;\n\n @HostBinding('class.active')\n public orderDir: 'desc'|'asc'|null = null;\n\n @HostBinding('class.sort-disabled') get sortDisabled() {\n return this.datable.config?.disableSort;\n }\n\n private sortSub: Subscription;\n public arrowVisible = false;\n public arrowDirection: 'down'|'up' = 'down';\n\n constructor(\n public datable: DatatableService<Model>,\n private cd: ChangeDetectorRef,\n private focusMonitor: FocusMonitor,\n private el: ElementRef<HTMLElement>,\n ) {}\n\n ngOnInit() {\n // get column name from <ng-content> if none is explicitly provided\n if ( ! this.orderBy) {\n this.orderBy = slugifyString(this.columnName.nativeElement.textContent, '_');\n }\n\n // hide arrow when sort column is changed to different column\n this.sortSub = this.datable.sort$\n .pipe(filter(sort => (sort.orderBy !== this.orderBy)))\n .subscribe(() => {\n this.orderDir = null;\n this.onMouseLeave();\n this.cd.markForCheck();\n });\n }\n\n ngAfterViewInit() {\n // add '.cdk-keyboard-focused' when tabbing to other sort headers\n this.focusMonitor.monitor(this.el).subscribe();\n }\n\n ngOnDestroy() {\n this.sortSub.unsubscribe();\n this.focusMonitor.stopMonitoring(this.el);\n }\n\n public changeSort() {\n this.datable.sort$.next({\n orderBy: this.orderBy,\n orderDir: this.getDirection(this.orderDir),\n });\n }\n\n private getDirection(current: string) {\n switch (current) {\n case 'asc':\n this.arrowVisible = false;\n return this.orderDir = null;\n case 'desc':\n this.arrowVisible = true;\n this.arrowDirection = 'up';\n return this.orderDir = 'asc';\n default:\n this.arrowVisible = true;\n this.arrowDirection = 'down';\n return this.orderDir = 'desc';\n }\n }\n\n public onMouseEnter() {\n if ( ! this.datable.config?.disableSort) {\n this.arrowVisible = true;\n }\n }\n\n public onMouseLeave() {\n this.arrowVisible = false;\n if ( ! this.orderDir) {\n this.arrowDirection = 'down';\n }\n }\n\n public handleClick() {\n if ( ! this.datable.config?.disableSort) {\n this.changeSort();\n }\n }\n\n public handleKeydown(e: KeyboardEvent) {\n if ( !this.datable.config?.disableSort && (e.keyCode === SPACE || e.keyCode === ENTER)) {\n e.preventDefault();\n this.changeSort();\n }\n }\n}\n","<span class=\"text\" #columnName>\n <ng-content></ng-content>\n</span>\n<span class=\"icon-wrapper\" [ngClass]=\"arrowDirection\">\n <mat-icon svgIcon=\"arrow-downward\" class=\"sort-icon\" [class.hint-visible]=\"arrowVisible\"></mat-icon>\n</span>\n","import { Directive, ElementRef, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { openUploadWindow } from '../utils/open-upload-window';\nimport { UploadInputConfig } from '../upload-input-config';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\n@Directive({\n selector: '[uploadButton]'\n})\nexport class UploadButtonDirective implements OnInit {\n @Input('uploadButton') config: UploadInputConfig = {};\n @Output() filesSelected = new EventEmitter<UploadedFile[]>();\n\n constructor(private el: ElementRef) {}\n\n ngOnInit() {\n this.el.nativeElement.addEventListener('click', e => {\n e.preventDefault();\n e.stopPropagation();\n\n openUploadWindow(this.config).then(files => {\n if (files && files.length) {\n this.filesSelected.emit(files);\n }\n });\n });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { prettyBytes } from '../core/utils/pretty-bytes';\n\n@Pipe({\n name: 'formattedFileSize',\n pure: true,\n})\nexport class FormattedFileSizePipe implements PipeTransform {\n transform(bytes: number = 0, precision?: number|string): string {\n if (isNaN(parseFloat(String(bytes))) || ! isFinite(bytes)) return '-';\n return prettyBytes(bytes, precision);\n }\n}\n","import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\nimport { randomString } from '../../core/utils/random-string';\nimport { UploadedFile } from '../uploaded-file';\nimport { FileEntry } from '../types/file-entry';\nimport { UploadFileResponse } from '@common/uploads/uploads-api.service';\n\nexport interface UploadQueueItemProgress {\n percentage?: number;\n speed?: string;\n eta?: string;\n totalBytes?: number;\n completedBytes?: number;\n}\n\nexport class UploadQueueItem {\n id: string;\n canceled$: Subject<boolean> = new Subject();\n processing$ = new BehaviorSubject<boolean>(false);\n\n // file info (static)\n uploadedFile: UploadedFile;\n\n // backend response once file is uploaded\n uploadedResponse$ = new ReplaySubject<UploadFileResponse>(1);\n\n // uploaded file entry (only available on completed uploads)\n fileEntry: FileEntry;\n\n // upload progress information (will change)\n progress$ = new BehaviorSubject<UploadQueueItemProgress>({percentage: 0});\n\n error$ = new BehaviorSubject<string>(null);\n\n // custom data that can be attached to queue item\n public customData: object = {};\n\n get completed(): boolean {\n return !this.processing$.value && this.progress$.value.percentage === 100;\n }\n\n get inProgress(): boolean {\n return !this.error$.value && !this.completed;\n }\n\n constructor(file: UploadedFile, queueId?: string) {\n this.uploadedFile = file;\n this.id = queueId || randomString();\n }\n\n public cancel() {\n // cancelling before finalizing might cause infinite loop\n this.canceled$.next(true);\n this.finalize();\n }\n\n public complete() {\n this.setProgress({percentage: 100, eta: null});\n this.finalize();\n }\n\n public finalize() {\n this.uploadedResponse$.complete();\n this.canceled$.complete();\n this.progress$.complete();\n }\n\n public finishProcessing() {\n this.processing$.next(false);\n this.processing$.complete();\n }\n\n public addError(message: string) {\n this.error$.next(message);\n }\n\n public setProgress(data: Partial<UploadQueueItemProgress>) {\n this.progress$.next({\n ...this.progress$.value,\n ...data,\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport {UploadValidator} from './upload-validator';\nimport {FileSizeValidation} from './validations/file-size-validation';\nimport {AllowedExtensionsValidation} from './validations/allowed-extensions-validation';\nimport {BlockedExtensionsValidation} from './validations/blocked-extensions-validation';\nimport {convertToBytes} from '../../core/utils/convertToBytes';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DefaultUploadValidator extends UploadValidator {\n protected readonly DEFAULT_MAX_FILE_SIZE_MB = 8;\n public showToast = true;\n\n protected initValidations() {\n this.validations.push(\n new FileSizeValidation(\n {maxSize: this.getMaxFileSize()},\n this.i18n\n )\n );\n\n const allowedExtensions = this.getAllowedExtensions(),\n blockedExtensions = this.getBlockedExtensions();\n\n if (allowedExtensions && allowedExtensions.length) {\n this.validations.push(new AllowedExtensionsValidation(\n {extensions: allowedExtensions}, this.i18n\n ));\n }\n\n if (blockedExtensions && blockedExtensions.length) {\n this.validations.push(new BlockedExtensionsValidation(\n {extensions: blockedExtensions}, this.i18n\n ));\n }\n }\n\n protected getMaxFileSize(): number {\n return this.settings.get(\n 'uploads.max_size',\n convertToBytes(this.DEFAULT_MAX_FILE_SIZE_MB, 'MB')\n );\n }\n\n protected getAllowedExtensions() {\n return this.settings.getJson('uploads.allowed_extensions');\n }\n\n protected getBlockedExtensions() {\n return this.settings.getJson('uploads.blocked_extensions');\n }\n}\n","import {Injectable} from '@angular/core';\nimport {UploadQueueItem} from './upload-queue-item';\nimport {BehaviorSubject, EMPTY, from, ReplaySubject, Subject, throwError} from 'rxjs';\nimport {catchError, filter, map, mergeMap, takeUntil} from 'rxjs/operators';\nimport {UploadedFile} from '../uploaded-file';\nimport {UploadCompletedEvent, UploadEvent, UploadEventTypes, UploadProgressEvent} from '../utils/upload-progress-event';\nimport {UploadFileResponse, UploadsApiService} from '../uploads-api.service';\nimport {FileEntry} from '../types/file-entry';\nimport {UploadValidator} from '../validation/upload-validator';\nimport {BackendErrorResponse} from '../../core/types/backend-error-response';\nimport {DefaultUploadValidator} from '../validation/default-upload-validator';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {HttpErrors, UPLOAD_FAIL_LEARN_MORE_LINK} from '@common/core/http/errors/http-errors.enum';\nimport {UploadApiConfig} from '@common/uploads/types/upload-api-config';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Settings} from '@common/core/config/settings.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UploadQueueService {\n public uploads$ = new BehaviorSubject<UploadQueueItem[]>([]);\n public totalProgress$ = new ReplaySubject<number>(1);\n public uploadsAdded$ = new Subject<UploadQueueItem[]>();\n public count$ = new BehaviorSubject<{pending: number, completed: number}>({pending: 0, completed: 0});\n\n constructor(\n private api: UploadsApiService,\n private defaultValidator: DefaultUploadValidator,\n private toast: Toast,\n private currentUser: CurrentUser,\n private settings: Settings,\n ) {}\n\n public isEmpty(): boolean {\n return !this.uploads$.value.length;\n }\n\n public getAllCompleted(): FileEntry[] {\n return this.uploads$.value\n .filter(queueItem => queueItem.completed)\n .map(queueItem => queueItem.fileEntry);\n }\n\n public updateTotalProgress() {\n const progress = this.uploads$.value.map(upload => upload.progress$.value.percentage || 0);\n this.totalProgress$.next(progress.reduce((p, c) => p + c, 0) / progress.length);\n }\n\n public totalProgress() {\n return this.totalProgress$.asObservable();\n }\n\n public start(files: UploadedFile[]|{[key: string]: UploadedFile}, config: UploadApiConfig = {}): BackendResponse<UploadFileResponse> {\n const validator = config.validator || this.defaultValidator;\n let uploadQueueItems = [] as UploadQueueItem[];\n\n // push new uploads onto existing queue\n if (Array.isArray(files)) {\n uploadQueueItems = this.transformUploads(files, validator);\n this.uploads$.next(this.uploads$.value.concat(uploadQueueItems));\n this.uploadsAdded$.next(uploadQueueItems);\n\n // replace existing uploads in the queue with new upload by specified upload ID\n } else {\n const replacements = this.uploads$.value.map(queueItem => {\n if (files[queueItem.id]) {\n const transformed = this.transformUploads([files[queueItem.id]], validator, queueItem.id)[0];\n uploadQueueItems.push(transformed);\n return transformed;\n } else {\n return queueItem;\n }\n });\n this.uploads$.next(replacements);\n }\n\n this.updateCount();\n\n return from(uploadQueueItems.filter(u => !u.error$.value))\n .pipe(\n mergeMap(uploadQueueItem => {\n return this.api.upload(uploadQueueItem.uploadedFile, config).pipe(\n catchError((errResponse: BackendErrorResponse) => {\n this.handleUploadFailure(errResponse, uploadQueueItem, validator);\n // if one item in the queue fails, either continue uploading other items\n // or immediately stop uploading and bubble up error to subscribers\n return config.bubbleError ? throwError(errResponse) : EMPTY;\n }),\n takeUntil(uploadQueueItem.canceled$),\n map(response => {\n this.handleUploadEvent(response, uploadQueueItem, config.willProcessFiles);\n // assign queue item ID to upload completed response so\n // file entry can be matched to specific upload queue item\n if (response.name === UploadEventTypes.COMPLETED) {\n response.body.queueItemId = uploadQueueItem.id;\n }\n return response;\n }),\n );\n }, 1),\n filter(e => e.name === UploadEventTypes.COMPLETED),\n map((e: UploadCompletedEvent) => e.body)\n );\n }\n\n public updateProgress(id: string, e: UploadProgressEvent) {\n const queueItem = this.find(id);\n if ( ! queueItem) return;\n\n queueItem.setProgress({\n eta: e.eta,\n speed: e.speed,\n percentage: e.progress,\n totalBytes: e.totalBytes,\n completedBytes: e.completedBytes,\n });\n\n this.updateTotalProgress();\n }\n\n public completeUpload(id: string, response: UploadFileResponse) {\n const queueItem = this.find(id);\n if ( ! queueItem) return;\n\n queueItem.uploadedResponse$.next(response);\n queueItem.fileEntry = response.fileEntry;\n queueItem.complete();\n this.updateTotalProgress();\n }\n\n public errorUpload(id: string, message?: string) {\n this.find(id).addError(message);\n }\n\n public reset() {\n this.uploads$.value.forEach(u => u.cancel());\n this.uploads$.next([]);\n }\n\n public remove(id: string) {\n const i = this.uploads$.value.findIndex(u => u.id === id),\n upload = this.uploads$.value[i];\n upload.completed ? upload.finalize() : upload.cancel();\n this.uploads$.value.splice(i, 1);\n this.uploads$.next(this.uploads$.value);\n }\n\n public find(id: string): UploadQueueItem {\n return this.uploads$.value.find(u => u.id === id);\n }\n\n /**\n * Transform specified files into upload queue items.\n */\n protected transformUploads(files: UploadedFile[], validator: UploadValidator, queueId?: string) {\n return files.map(file => {\n const activeUpload = new UploadQueueItem(file, queueId);\n\n // validate upload\n if (validator) {\n const result = validator.validate(file);\n if (result.failed) activeUpload.addError(result.errorMessage);\n }\n\n return activeUpload;\n });\n }\n\n protected handleUploadEvent(event: UploadEvent, upload: UploadQueueItem, willProcessFiles = false) {\n if (event.name === UploadEventTypes.PROGRESS) {\n // upload is considered complete when progress equals 100\n // but file processing for large files might take some time\n // after file is fully uploaded so we should only set\n // progress as 100 on final completed response\n if (event.progress === 100) {\n // TODO: implement processing functionality for chunked upploading\n event = {...event, progress: 99};\n if (willProcessFiles) {\n upload.processing$.next(true);\n }\n }\n this.updateProgress(upload.id, event);\n } else if (event.name === UploadEventTypes.COMPLETED) {\n this.completeUpload(upload.id, event.body);\n this.updateCount();\n }\n }\n\n protected handleUploadFailure(response: BackendErrorResponse, upload: UploadQueueItem, validator: UploadValidator) {\n let msg = response?.errors?.file,\n showLearnMoreButton = null;\n if ( ! msg) {\n msg = HttpErrors.DefaultUpload;\n showLearnMoreButton = this.currentUser.isAdmin() && !this.settings.get('site.hide_docs_buttons');\n }\n\n this.errorUpload(upload.id, msg);\n this.updateCount();\n this.updateTotalProgress();\n\n if (validator.showToast) {\n this.toast.open(msg, {action: showLearnMoreButton ? 'Learn More' : null})\n .onAction()\n .subscribe(() => {\n window.open(UPLOAD_FAIL_LEARN_MORE_LINK);\n });\n }\n }\n\n private updateCount() {\n const pending = this.uploads$.value.filter(u => u.inProgress).length;\n this.count$.next({pending, completed: this.uploads$.value.length - pending});\n }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {UploadButtonDirective} from './directives/upload-button.directive';\nimport {UploadDropzoneDirective} from './directives/upload-dropzone.directive';\nimport {UploadProgressBarComponent} from './upload-progress-bar/upload-progress-bar.component';\n\n@NgModule({\n imports: [\n CommonModule,\n\n // material\n MatButtonModule,\n MatProgressBarModule,\n MatIconModule,\n ],\n declarations: [\n UploadDropzoneDirective,\n UploadButtonDirective,\n UploadProgressBarComponent,\n ],\n exports: [\n UploadDropzoneDirective,\n UploadButtonDirective,\n UploadProgressBarComponent,\n ],\n})\nexport class UploadsModule {\n}\n","/**\n * Download file from specified url.\n */\nexport function downloadFileFromUrl(url: string, name?: string) {\n const link = document.createElement('a');\n link.href = url;\n if (name) link.download = name;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","import { UploadedFile } from '../../uploaded-file';\nimport { UploadValidation } from './upload-validation';\nimport { Translations } from '../../../core/translations/translations.service';\n\nexport class AllowedExtensionsValidation extends UploadValidation {\n constructor(\n protected params: {extensions: string[]},\n protected i18n: Translations\n ) {\n super();\n\n this.errorMessage = this.i18n.t(\n 'Only these file types are allowed: :extensions',\n {extensions: this.params.extensions.join(', ')}\n );\n }\n\n public fails(file: UploadedFile) {\n return ! this.params.extensions.some(extension => {\n return extension.toLowerCase() === file.extension.toLowerCase();\n });\n }\n}\n","import { UploadedFile } from '../../uploaded-file';\nimport { UploadValidation } from './upload-validation';\nimport {Translations} from '@common/core/translations/translations.service';\n\nexport class BlockedExtensionsValidation extends UploadValidation {\n constructor(\n protected params: {extensions: string[]},\n protected i18n: Translations\n ) {\n super();\n\n this.errorMessage = this.i18n.t(\n 'These file types are not allowed: :extensions',\n {extensions: this.params.extensions.join(', ')}\n );\n }\n\n public fails(file: UploadedFile) {\n return this.params.extensions.some(extension => {\n return extension === file.extension;\n });\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface WorkspaceConfig {\n description: string;\n}\n\nexport const WORKSPACE_CONFIG = new InjectionToken<WorkspaceConfig>('WORKSPACE_CONFIG');\n","import {Injectable} from '@angular/core';\nimport {Workspace} from './types/workspace';\nimport {PaginationParams} from '@common/core/types/pagination/pagination-params';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {WorkspaceMember} from './types/workspace-member';\nimport {WorkspaceInvite} from './types/workspace-invite';\nimport {filter, tap} from 'rxjs/operators';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {BehaviorSubject, Subscription} from 'rxjs';\nimport {PaginationResponse} from '@common/core/types/pagination/pagination-response';\nimport {hasKey} from '@common/core/utils/has-key';\nimport {CookieService} from '../core/services/cookie.service';\nimport {NotificationService} from '../notifications/notification-list/notification.service';\nimport {\n WORKSPACE_INVITE_NOTIF_TYPE,\n WorkspaceInviteNotif,\n} from './types/workspace-invite-notif';\nimport {Toast} from '../core/ui/toast.service';\nimport {BackendErrorResponse} from '../core/types/backend-error-response';\nimport {DatabaseNotification} from '../notifications/database-notification';\nimport {HttpErrors} from '../core/http/errors/http-errors.enum';\n\nconst PERSONAL_WORKSPACE = {name: 'Default', default: true, id: null};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WorkspacesService {\n static BASE_URI = 'workspace';\n available$ = new BehaviorSubject<Workspace[]>([PERSONAL_WORKSPACE]);\n activeId$ = new BehaviorSubject<number>(this.getIdFromCookie());\n activeWorkspace$ = new BehaviorSubject<Workspace>(this.getIdFromCookie() ? null : PERSONAL_WORKSPACE);\n\n constructor(\n private http: AppHttpClient,\n private currentUser: CurrentUser,\n private cookie: CookieService,\n private notifications: NotificationService,\n private toast: Toast,\n ) {}\n\n currentUserCan(permission: string): boolean {\n const member = this.activeWorkspace$.value?.currentUser;\n return member && (member.is_owner || member.permissions.findIndex(p => p.name === permission) > -1);\n }\n\n select(workspaceId: number) {\n if (workspaceId !== this.activeId$.value) {\n this.cookie.set(this.cookieName(), workspaceId);\n this.activeId$.next(workspaceId);\n }\n const workspace = this.available$.value.find(w => w.id === this.activeId$.value);\n this.activeWorkspace$.next(workspace || this.available$.value[0]);\n }\n\n pushAndSelect(workspace: Workspace) {\n this.available$.next([...this.available$.value, workspace]);\n this.select(workspace.id);\n }\n\n replace(workspace: Workspace) {\n const workspaces = [...this.available$.value];\n const i = workspaces.findIndex(w => w.id === workspace.id);\n if (i) {\n workspaces[i] = workspace;\n }\n this.available$.next(workspaces);\n }\n\n remove(ids: number[]) {\n const workspaces = [...this.available$.value];\n ids.forEach(id => {\n const i = workspaces.findIndex(w => w.id === id);\n if (i) {\n workspaces.splice(i, 1);\n }\n });\n this.available$.next(workspaces);\n if (ids.includes(this.activeId$.value)) {\n this.select(null);\n }\n }\n\n indexUserWorkspaces(): BackendResponse<{workspaces: Workspace[]}> {\n return this.http.get<{workspaces: Workspace[]}>(`me/${WorkspacesService.BASE_URI}s`)\n .pipe(tap(response => {\n this.available$.next([...this.available$.value, ...response.workspaces]);\n this.select(this.activeId$.value);\n }));\n }\n\n get(workspaceId: number): BackendResponse<{workspace: Workspace}> {\n return this.http.get(`${WorkspacesService.BASE_URI}/${workspaceId}`);\n }\n\n delete(ids: number[]): BackendResponse<unknown> {\n return this.http.delete(`${WorkspacesService.BASE_URI}/${ids}`)\n .pipe(tap(() => {\n this.remove(ids);\n }));\n }\n\n create(payload: Partial<Workspace>): BackendResponse<{workspace: Workspace}> {\n return this.http.post<{workspace: Workspace}>(`${WorkspacesService.BASE_URI}`, payload)\n .pipe(tap(response => this.pushAndSelect(response.workspace)));\n }\n\n update(id: number, payload: Partial<Workspace>): BackendResponse<{workspace: Workspace}> {\n return this.http.put<{workspace: Workspace}>(`${WorkspacesService.BASE_URI}/${id}`, payload)\n .pipe(tap(response => this.replace(response.workspace)));\n }\n\n invitePeople(workspaceId: number, params: {emails: string[], roleId: number}): BackendResponse<{invites: WorkspaceInvite[]}> {\n return this.http.post(`${WorkspacesService.BASE_URI}/${workspaceId}/invite`, params);\n }\n\n resendInvite(workspaceId: number, inviteId: string): BackendResponse<{invite: WorkspaceInvite}> {\n return this.http.post(`${WorkspacesService.BASE_URI}/${workspaceId}/${inviteId}/resend`);\n }\n\n deleteMember(workspaceId: number, userId: number): BackendResponse<unknown> {\n return this.http.delete(`${WorkspacesService.BASE_URI}/${workspaceId}/member/${userId}`)\n .pipe(tap(() => {\n if (userId === this.currentUser.get('id')) {\n this.remove([workspaceId]);\n }\n }));\n }\n\n deleteInvite(inviteId: string): BackendResponse<void> {\n return this.http.delete(`${WorkspacesService.BASE_URI}/invite/${inviteId}`);\n }\n\n changeRole(workspaceId: number, member: WorkspaceMember|WorkspaceInvite, roleId: number): BackendResponse<void> {\n const memberId = hasKey('member_id', member) ? member.member_id : member.id;\n return this.http.post(`${WorkspacesService.BASE_URI}/${workspaceId}/${member.model_type}/${memberId}/change-role`, {roleId});\n }\n\n join(inviteId: string): BackendResponse<{workspace: Workspace}> {\n return this.http.get(`workspace/join/${inviteId}`);\n }\n\n bindToNotificationClick(): Subscription {\n return this.notifications.clickedOnNotification$\n .pipe(filter(data => data.notification.type === WORKSPACE_INVITE_NOTIF_TYPE))\n .subscribe(data => {\n const inviteId = (data.notification as WorkspaceInviteNotif).data.inviteId;\n if (data.action.action === 'join') {\n this.join(inviteId).subscribe(response => {\n this.notifications.delete([data.notification]).subscribe();\n this.pushAndSelect(response.workspace);\n this.toast.open('Joined workspace.');\n }, (err: BackendErrorResponse) => {\n this.handleWorkspaceInviteClickError(err, data.notification);\n });\n } else if (data.action.action === 'decline') {\n this.deleteInvite(inviteId).subscribe(() => {\n this.notifications.delete([data.notification]).subscribe();\n this.toast.open('Declined workspace invite.');\n }, (err: BackendErrorResponse) => {\n this.handleWorkspaceInviteClickError(err, data.notification);\n });\n }\n });\n }\n\n private handleWorkspaceInviteClickError(err: BackendErrorResponse, notif: DatabaseNotification) {\n if (err.status === 404) {\n this.notifications.delete([notif]).subscribe();\n this.toast.open('That invite is no longer valid.');\n } else {\n this.toast.open(HttpErrors.Default);\n }\n }\n\n getIdFromCookie() {\n let workspaceId = this.cookie.get(this.cookieName());\n workspaceId = typeof workspaceId === 'string' ? parseInt(workspaceId) : workspaceId;\n return isNaN(workspaceId) ? null : workspaceId;\n }\n\n private cookieName() {\n return `${this.currentUser.get('id')}_activeWorkspace`;\n }\n}\n","import { DatabaseNotification, DatabaseNotificationData } from '../../notifications/database-notification';\n\nexport const WORKSPACE_INVITE_NOTIF_TYPE = 'Common\\\\Workspaces\\\\Notifications\\\\WorkspaceInvitation';\n\nexport interface WorkspaceInviteNotif extends DatabaseNotification {\n data: DatabaseNotificationData & {inviteId: string};\n}\n"]}