@yuuvis/app-drive 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/esm2022/extensions/index.mjs +2 -0
- package/esm2022/extensions/lib/extensions.module.mjs +35 -0
- package/esm2022/extensions/lib/extensions.service.mjs +44 -0
- package/esm2022/extensions/lib/object-config.defaults.mjs +19 -0
- package/esm2022/extensions/yuuvis-app-drive-extensions.mjs +5 -0
- package/esm2022/index.mjs +5 -0
- package/esm2022/lib/actions/copy-link/copy-link.action.mjs +40 -0
- package/esm2022/lib/actions/index.mjs +7 -0
- package/esm2022/lib/actions/manage-versions/manage-versions.action.mjs +33 -0
- package/esm2022/lib/actions/manage-versions/manage-versions.component.mjs +105 -0
- package/esm2022/lib/actions/paste/paste.action.mjs +41 -0
- package/esm2022/lib/actions/rename/rename.action.mjs +31 -0
- package/esm2022/lib/actions/rename/rename.component.mjs +42 -0
- package/esm2022/lib/actions/rename/rename.validator.mjs +23 -0
- package/esm2022/lib/actions/updateContent/update.content.action.mjs +52 -0
- package/esm2022/lib/components/add-button/add-button-overlay/add-button-overlay.component.mjs +109 -0
- package/esm2022/lib/components/add-button/add-button.component.mjs +39 -0
- package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +74 -0
- package/esm2022/lib/components/folder-tree/folder-tree.component.mjs +89 -0
- package/esm2022/lib/components/index.mjs +10 -0
- package/esm2022/lib/components/object-name/object-name.component.mjs +60 -0
- package/esm2022/lib/components/overlay/create-folder/create-folder.component.mjs +48 -0
- package/esm2022/lib/components/paste-from-clipboard/paste-from-clipboard.component.mjs +28 -0
- package/esm2022/lib/components/ribbon/ribbon.component.mjs +102 -0
- package/esm2022/lib/components/search-filter/date-range-picker/date-range-picker.component.mjs +38 -0
- package/esm2022/lib/components/search-filter/search-filter.component.mjs +429 -0
- package/esm2022/lib/components/sort/sort.component.mjs +156 -0
- package/esm2022/lib/components/versions-list/tile/tile.component.mjs +60 -0
- package/esm2022/lib/components/versions-list/versions-list.component.mjs +94 -0
- package/esm2022/lib/container/drive/drive.component.mjs +116 -0
- package/esm2022/lib/drive.icons.mjs +16 -0
- package/esm2022/lib/drive.schema.mjs +49 -0
- package/esm2022/lib/lib.routes.mjs +17 -0
- package/esm2022/lib/pages/files/files.component.mjs +377 -0
- package/esm2022/lib/pages/object/object.component.mjs +200 -0
- package/esm2022/lib/services/drive/drive.interface.mjs +14 -0
- package/esm2022/lib/services/drive/drive.service.mjs +437 -0
- package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.mjs +158 -0
- package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.mjs +2 -0
- package/esm2022/lib/services/drive/versions/versions.mapping.mjs +42 -0
- package/esm2022/lib/services/index.mjs +5 -0
- package/esm2022/lib/services/providers/drive.providers.mjs +10 -0
- package/esm2022/lib/services/resolver/files.resolver.mjs +12 -0
- package/esm2022/lib/services/resolver/index.mjs +3 -0
- package/esm2022/lib/services/resolver/versions.route.resolver.mjs +10 -0
- package/esm2022/lib/services/stored-query/stored-query.data.mjs +25 -0
- package/esm2022/lib/services/stored-query/stored-query.interface.mjs +2 -0
- package/esm2022/lib/services/stored-query/stored-query.service.mjs +41 -0
- package/esm2022/lib/services/tokens/breadcrumb-max-depth.token.mjs +3 -0
- package/esm2022/lib/services/tokens/index.mjs +2 -0
- package/esm2022/yuuvis-app-drive.mjs +5 -0
- package/extensions/README.md +3 -0
- package/extensions/index.d.ts +1 -0
- package/extensions/lib/extensions.module.d.ts +6 -0
- package/extensions/lib/extensions.service.d.ts +7 -0
- package/extensions/lib/object-config.defaults.d.ts +2 -0
- package/fesm2022/yuuvis-app-drive-extensions.mjs +99 -0
- package/fesm2022/yuuvis-app-drive-extensions.mjs.map +1 -0
- package/fesm2022/yuuvis-app-drive.mjs +2945 -0
- package/fesm2022/yuuvis-app-drive.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/lib/actions/copy-link/copy-link.action.d.ts +18 -0
- package/lib/actions/index.d.ts +6 -0
- package/lib/actions/manage-versions/manage-versions.action.d.ts +17 -0
- package/lib/actions/manage-versions/manage-versions.component.d.ts +32 -0
- package/lib/actions/paste/paste.action.d.ts +17 -0
- package/lib/actions/rename/rename.action.d.ts +17 -0
- package/lib/actions/rename/rename.component.d.ts +12 -0
- package/lib/actions/rename/rename.validator.d.ts +5 -0
- package/lib/actions/updateContent/update.content.action.d.ts +18 -0
- package/lib/components/add-button/add-button-overlay/add-button-overlay.component.d.ts +26 -0
- package/lib/components/add-button/add-button.component.d.ts +12 -0
- package/lib/components/breadcrumb/breadcrumb.component.d.ts +25 -0
- package/lib/components/folder-tree/folder-tree.component.d.ts +13 -0
- package/lib/components/index.d.ts +8 -0
- package/lib/components/object-name/object-name.component.d.ts +21 -0
- package/lib/components/overlay/create-folder/create-folder.component.d.ts +12 -0
- package/lib/components/paste-from-clipboard/paste-from-clipboard.component.d.ts +13 -0
- package/lib/components/ribbon/ribbon.component.d.ts +24 -0
- package/lib/components/search-filter/date-range-picker/date-range-picker.component.d.ts +13 -0
- package/lib/components/search-filter/search-filter.component.d.ts +23 -0
- package/lib/components/sort/sort.component.d.ts +31 -0
- package/lib/components/versions-list/tile/tile.component.d.ts +14 -0
- package/lib/components/versions-list/versions-list.component.d.ts +17 -0
- package/lib/container/drive/drive.component.d.ts +36 -0
- package/lib/drive.icons.d.ts +15 -0
- package/lib/drive.schema.d.ts +23 -0
- package/lib/lib.routes.d.ts +2 -0
- package/lib/pages/files/files.component.d.ts +101 -0
- package/lib/pages/object/object.component.d.ts +35 -0
- package/lib/services/drive/drive.interface.d.ts +62 -0
- package/lib/services/drive/drive.service.d.ts +64 -0
- package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.d.ts +31 -0
- package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.d.ts +8 -0
- package/lib/services/drive/versions/versions.mapping.d.ts +2 -0
- package/lib/services/index.d.ts +4 -0
- package/lib/services/providers/drive.providers.d.ts +7 -0
- package/lib/services/resolver/files.resolver.d.ts +2 -0
- package/lib/services/resolver/index.d.ts +2 -0
- package/lib/services/resolver/versions.route.resolver.d.ts +2 -0
- package/lib/services/stored-query/stored-query.data.d.ts +5 -0
- package/lib/services/stored-query/stored-query.interface.d.ts +5 -0
- package/lib/services/stored-query/stored-query.service.d.ts +10 -0
- package/lib/services/tokens/breadcrumb-max-depth.token.d.ts +2 -0
- package/lib/services/tokens/index.d.ts +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Mapping schema for this apps backend schema
|
|
2
|
+
import { SystemType } from '@yuuvis/client-core';
|
|
3
|
+
// eslint-disable-next-line @nx/enforce-module-boundaries
|
|
4
|
+
import { marker } from '@colsen1991/ngx-translate-extract-marker';
|
|
5
|
+
import { APP_DRIVE_ICONS } from './drive.icons';
|
|
6
|
+
// use marker to extract the labels for the app schema types
|
|
7
|
+
// make sure to provide a marker for each type/flavor ID
|
|
8
|
+
marker('io.yuuvis.app.drive.folder');
|
|
9
|
+
marker('io.yuuvis.app.drive.file');
|
|
10
|
+
export const FS_PROPERTIES = {
|
|
11
|
+
name: 'appOsdrive:fileName'
|
|
12
|
+
};
|
|
13
|
+
export const FS_SOTS = {
|
|
14
|
+
object: 'appOsdrive:file'
|
|
15
|
+
};
|
|
16
|
+
export const APP_PREFIX = 'appDrive:';
|
|
17
|
+
export const APP_ID = 'io.yuuvis.app.drive';
|
|
18
|
+
export const APP_SCHEMA = {
|
|
19
|
+
id: APP_ID,
|
|
20
|
+
name: 'OS Drive',
|
|
21
|
+
icon: '<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M340-320h300q50 0 85-35t35-85q0-50-35-85t-85-35q-8-58-53-99t-101-41q-51 0-92.5 26T332-600q-57 5-94.5 43.5T200-460q0 58 41 99t99 41Zm0-80q-25 0-42.5-17.5T280-460q0-25 17.5-42.5T340-520h60v-20q0-33 23.5-56.5T480-620q33 0 56.5 23.5T560-540v60h80q17 0 28.5 11.5T680-440q0 17-11.5 28.5T640-400H340ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>',
|
|
22
|
+
types: {
|
|
23
|
+
folder: {
|
|
24
|
+
id: `${APP_ID}.folder`,
|
|
25
|
+
icon: APP_DRIVE_ICONS.folder,
|
|
26
|
+
objectType: SystemType.FOLDER,
|
|
27
|
+
sots: [FS_SOTS.object]
|
|
28
|
+
},
|
|
29
|
+
file: {
|
|
30
|
+
id: `${APP_ID}.file`,
|
|
31
|
+
icon: APP_DRIVE_ICONS.file,
|
|
32
|
+
objectType: SystemType.DOCUMENT,
|
|
33
|
+
sots: [FS_SOTS.object]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
flavors: []
|
|
37
|
+
};
|
|
38
|
+
export const APP_ACTIONS = {
|
|
39
|
+
rename: 'app.drive.action.rename',
|
|
40
|
+
paste: 'app.drive.action.paste',
|
|
41
|
+
copyLink: 'app.drive.action.copy.link',
|
|
42
|
+
contentUpdate: 'app.drive.action.content.update',
|
|
43
|
+
manageVersions: 'app.drive.action.manage-versions'
|
|
44
|
+
};
|
|
45
|
+
export const ACTION_CONTEXT = {
|
|
46
|
+
subjectProperty: FS_PROPERTIES.name,
|
|
47
|
+
appId: APP_ID
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmUuc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcHBzL2RyaXZlL3NyYy9saWIvZHJpdmUuc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhDQUE4QztBQUU5QyxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHFCQUFxQixDQUFDO0FBRXBFLHlEQUF5RDtBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUdoRCw0REFBNEQ7QUFDNUQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixJQUFJLEVBQUUscUJBQXFCO0NBQzVCLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUc7SUFDckIsTUFBTSxFQUFFLGlCQUFpQjtDQUMxQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQztBQUN0QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFzRTtJQUMzRixFQUFFLEVBQUUsTUFBTTtJQUNWLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSw4cUJBQThxQjtJQUNwckIsS0FBSyxFQUFFO1FBQ0wsTUFBTSxFQUFFO1lBQ04sRUFBRSxFQUFFLEdBQUcsTUFBTSxTQUFTO1lBQ3RCLElBQUksRUFBRSxlQUFlLENBQUMsTUFBTTtZQUM1QixVQUFVLEVBQUUsVUFBVSxDQUFDLE1BQU07WUFDN0IsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUN2QjtRQUNELElBQUksRUFBRTtZQUNKLEVBQUUsRUFBRSxHQUFHLE1BQU0sT0FBTztZQUNwQixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7WUFDMUIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQy9CLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDdkI7S0FDRjtJQUNELE9BQU8sRUFBRSxFQUFFO0NBQ1osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRztJQUN6QixNQUFNLEVBQUUseUJBQXlCO0lBQ2pDLEtBQUssRUFBRSx3QkFBd0I7SUFDL0IsUUFBUSxFQUFFLDRCQUE0QjtJQUN0QyxhQUFhLEVBQUUsaUNBQWlDO0lBQ2hELGNBQWMsRUFBRSxrQ0FBa0M7Q0FDbkQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBa0I7SUFDM0MsZUFBZSxFQUFFLGFBQWEsQ0FBQyxJQUFJO0lBQ25DLEtBQUssRUFBRSxNQUFNO0NBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1hcHBpbmcgc2NoZW1hIGZvciB0aGlzIGFwcHMgYmFja2VuZCBzY2hlbWFcblxuaW1wb3J0IHsgU3lzdGVtVHlwZSwgVmlydHVhbE9iamVjdFR5cGUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IEFwcFNjaGVtYSB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBueC9lbmZvcmNlLW1vZHVsZS1ib3VuZGFyaWVzXG5pbXBvcnQgeyBtYXJrZXIgfSBmcm9tICdAY29sc2VuMTk5MS9uZ3gtdHJhbnNsYXRlLWV4dHJhY3QtbWFya2VyJztcbmltcG9ydCB7IEFQUF9EUklWRV9JQ09OUyB9IGZyb20gJy4vZHJpdmUuaWNvbnMnO1xuaW1wb3J0IHsgQWN0aW9uQ29udGV4dCB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9hY3Rpb25zJztcblxuLy8gdXNlIG1hcmtlciB0byBleHRyYWN0IHRoZSBsYWJlbHMgZm9yIHRoZSBhcHAgc2NoZW1hIHR5cGVzXG4vLyBtYWtlIHN1cmUgdG8gcHJvdmlkZSBhIG1hcmtlciBmb3IgZWFjaCB0eXBlL2ZsYXZvciBJRFxubWFya2VyKCdpby55dXV2aXMuYXBwLmRyaXZlLmZvbGRlcicpO1xubWFya2VyKCdpby55dXV2aXMuYXBwLmRyaXZlLmZpbGUnKTtcblxuZXhwb3J0IGNvbnN0IEZTX1BST1BFUlRJRVMgPSB7XG4gIG5hbWU6ICdhcHBPc2RyaXZlOmZpbGVOYW1lJ1xufTtcbmV4cG9ydCBjb25zdCBGU19TT1RTID0ge1xuICBvYmplY3Q6ICdhcHBPc2RyaXZlOmZpbGUnXG59O1xuXG5leHBvcnQgY29uc3QgQVBQX1BSRUZJWCA9ICdhcHBEcml2ZTonO1xuZXhwb3J0IGNvbnN0IEFQUF9JRCA9ICdpby55dXV2aXMuYXBwLmRyaXZlJztcblxuZXhwb3J0IGNvbnN0IEFQUF9TQ0hFTUE6IEFwcFNjaGVtYTx7IGZvbGRlcjogVmlydHVhbE9iamVjdFR5cGU7IGZpbGU6IFZpcnR1YWxPYmplY3RUeXBlIH0+ID0ge1xuICBpZDogQVBQX0lELFxuICBuYW1lOiAnT1MgRHJpdmUnLFxuICBpY29uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0XCI+PHBhdGggZD1cIk0zNDAtMzIwaDMwMHE1MCAwIDg1LTM1dDM1LTg1cTAtNTAtMzUtODV0LTg1LTM1cS04LTU4LTUzLTk5dC0xMDEtNDFxLTUxIDAtOTIuNSAyNlQzMzItNjAwcS01NyA1LTk0LjUgNDMuNVQyMDAtNDYwcTAgNTggNDEgOTl0OTkgNDFabTAtODBxLTI1IDAtNDIuNS0xNy41VDI4MC00NjBxMC0yNSAxNy41LTQyLjVUMzQwLTUyMGg2MHYtMjBxMC0zMyAyMy41LTU2LjVUNDgwLTYyMHEzMyAwIDU2LjUgMjMuNVQ1NjAtNTQwdjYwaDgwcTE3IDAgMjguNSAxMS41VDY4MC00NDBxMCAxNy0xMS41IDI4LjVUNjQwLTQwMEgzNDBaTTQ4MC04MHEtODMgMC0xNTYtMzEuNVQxOTctMTk3cS01NC01NC04NS41LTEyN1Q4MC00ODBxMC04MyAzMS41LTE1NlQxOTctNzYzcTU0LTU0IDEyNy04NS41VDQ4MC04ODBxODMgMCAxNTYgMzEuNVQ3NjMtNzYzcTU0IDU0IDg1LjUgMTI3VDg4MC00ODBxMCA4My0zMS41IDE1NlQ3NjMtMTk3cS01NCA1NC0xMjcgODUuNVQ0ODAtODBabTAtODBxMTM0IDAgMjI3LTkzdDkzLTIyN3EwLTEzNC05My0yMjd0LTIyNy05M3EtMTM0IDAtMjI3IDkzdC05MyAyMjdxMCAxMzQgOTMgMjI3dDIyNyA5M1ptMC0zMjBaXCIvPjwvc3ZnPicsXG4gIHR5cGVzOiB7XG4gICAgZm9sZGVyOiB7XG4gICAgICBpZDogYCR7QVBQX0lEfS5mb2xkZXJgLFxuICAgICAgaWNvbjogQVBQX0RSSVZFX0lDT05TLmZvbGRlcixcbiAgICAgIG9iamVjdFR5cGU6IFN5c3RlbVR5cGUuRk9MREVSLFxuICAgICAgc290czogW0ZTX1NPVFMub2JqZWN0XVxuICAgIH0sXG4gICAgZmlsZToge1xuICAgICAgaWQ6IGAke0FQUF9JRH0uZmlsZWAsXG4gICAgICBpY29uOiBBUFBfRFJJVkVfSUNPTlMuZmlsZSxcbiAgICAgIG9iamVjdFR5cGU6IFN5c3RlbVR5cGUuRE9DVU1FTlQsXG4gICAgICBzb3RzOiBbRlNfU09UUy5vYmplY3RdXG4gICAgfVxuICB9LFxuICBmbGF2b3JzOiBbXVxufTtcblxuZXhwb3J0IGNvbnN0IEFQUF9BQ1RJT05TID0ge1xuICByZW5hbWU6ICdhcHAuZHJpdmUuYWN0aW9uLnJlbmFtZScsXG4gIHBhc3RlOiAnYXBwLmRyaXZlLmFjdGlvbi5wYXN0ZScsXG4gIGNvcHlMaW5rOiAnYXBwLmRyaXZlLmFjdGlvbi5jb3B5LmxpbmsnLFxuICBjb250ZW50VXBkYXRlOiAnYXBwLmRyaXZlLmFjdGlvbi5jb250ZW50LnVwZGF0ZScsXG4gIG1hbmFnZVZlcnNpb25zOiAnYXBwLmRyaXZlLmFjdGlvbi5tYW5hZ2UtdmVyc2lvbnMnXG59O1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX0NPTlRFWFQ6IEFjdGlvbkNvbnRleHQgPSB7XG4gIHN1YmplY3RQcm9wZXJ0eTogRlNfUFJPUEVSVElFUy5uYW1lLFxuICBhcHBJZDogQVBQX0lEXG59O1xuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DriveFrameComponent } from './container/drive/drive.component';
|
|
2
|
+
import { FilesPageComponent } from './pages/files/files.component';
|
|
3
|
+
import { ObjectPageComponent } from './pages/object/object.component';
|
|
4
|
+
import { filesResolver } from './services/resolver';
|
|
5
|
+
export const YuuvisDriveRoutes = [
|
|
6
|
+
{
|
|
7
|
+
path: '',
|
|
8
|
+
component: DriveFrameComponent,
|
|
9
|
+
children: [
|
|
10
|
+
{ path: 'files', redirectTo: 'files/root' },
|
|
11
|
+
{ path: 'files/:id', component: FilesPageComponent, resolve: { filesResolver } },
|
|
12
|
+
{ path: 'object/:id', component: ObjectPageComponent },
|
|
13
|
+
{ path: '', redirectTo: 'files/root', pathMatch: 'full' }
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
];
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLnJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBwcy9kcml2ZS9zcmMvbGliL2xpYi5yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFZO0lBQ3hDO1FBQ0UsSUFBSSxFQUFFLEVBQUU7UUFDUixTQUFTLEVBQUUsbUJBQW1CO1FBQzlCLFFBQVEsRUFBRTtZQUNSLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFO1lBQzNDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUU7WUFDaEYsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRTtZQUN0RCxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1NBQzFEO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRHJpdmVGcmFtZUNvbXBvbmVudCB9IGZyb20gJy4vY29udGFpbmVyL2RyaXZlL2RyaXZlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlc1BhZ2VDb21wb25lbnQgfSBmcm9tICcuL3BhZ2VzL2ZpbGVzL2ZpbGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPYmplY3RQYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9wYWdlcy9vYmplY3Qvb2JqZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmaWxlc1Jlc29sdmVyIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXNvbHZlcic7XG5cbmV4cG9ydCBjb25zdCBZdXV2aXNEcml2ZVJvdXRlczogUm91dGVbXSA9IFtcbiAge1xuICAgIHBhdGg6ICcnLFxuICAgIGNvbXBvbmVudDogRHJpdmVGcmFtZUNvbXBvbmVudCxcbiAgICBjaGlsZHJlbjogW1xuICAgICAgeyBwYXRoOiAnZmlsZXMnLCByZWRpcmVjdFRvOiAnZmlsZXMvcm9vdCcgfSxcbiAgICAgIHsgcGF0aDogJ2ZpbGVzLzppZCcsIGNvbXBvbmVudDogRmlsZXNQYWdlQ29tcG9uZW50LCByZXNvbHZlOiB7IGZpbGVzUmVzb2x2ZXIgfSB9LFxuICAgICAgeyBwYXRoOiAnb2JqZWN0LzppZCcsIGNvbXBvbmVudDogT2JqZWN0UGFnZUNvbXBvbmVudCB9LFxuICAgICAgeyBwYXRoOiAnJywgcmVkaXJlY3RUbzogJ2ZpbGVzL3Jvb3QnLCBwYXRoTWF0Y2g6ICdmdWxsJyB9XG4gICAgXVxuICB9XG5dO1xuIl19
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { AsyncPipe, NgClass } from '@angular/common';
|
|
2
|
+
import { Component, computed, effect, HostBinding, inject, input, signal, untracked, viewChild } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
|
|
5
|
+
import { AppCacheService, BaseObjectTypeField, ClipboardService, DeviceService, DmsService, EventService, ObjectConfigService, Operator, SystemType, TranslateModule, TranslateService, YuvEventType } from '@yuuvis/client-core';
|
|
6
|
+
import { ActionsService, BASE_ACTION } from '@yuuvis/client-framework/actions';
|
|
7
|
+
import { FileDropZoneDirective } from '@yuuvis/client-framework/common';
|
|
8
|
+
import { YUV_ICONS } from '@yuuvis/client-framework/icons';
|
|
9
|
+
import { MultiObjectSummaryComponent, ObjectSummaryComponent } from '@yuuvis/client-framework/object-summary';
|
|
10
|
+
import { SimpleSearchComponent } from '@yuuvis/client-framework/simple-search';
|
|
11
|
+
import { TileConfigTriggerComponent, TileListComponent } from '@yuuvis/client-framework/tile-list';
|
|
12
|
+
import { ShellService } from '@yuuvis/client-shell-core';
|
|
13
|
+
import { ICONS, YvcIconModule } from '@yuuvis/components/icon';
|
|
14
|
+
import { SplitViewComponent, YvcSplitViewModule } from '@yuuvis/components/split-view';
|
|
15
|
+
import { finalize, map, tap } from 'rxjs';
|
|
16
|
+
import { BreadcrumbComponent, SortComponent } from '../../components';
|
|
17
|
+
import { AddButtonComponent } from '../../components/add-button/add-button.component';
|
|
18
|
+
import { FolderTreeComponent } from '../../components/folder-tree/folder-tree.component';
|
|
19
|
+
import { RibbonComponent } from '../../components/ribbon/ribbon.component';
|
|
20
|
+
import { APP_DRIVE_ICONS } from '../../drive.icons';
|
|
21
|
+
import { ACTION_CONTEXT, APP_ID, APP_SCHEMA } from '../../drive.schema';
|
|
22
|
+
import { DRIVE_EVENT, DRIVE_QUERY_FOLDER_ID, DRIVE_ROOT_FOLDER_ID } from '../../services/drive/drive.interface';
|
|
23
|
+
import { DriveService } from '../../services/drive/drive.service';
|
|
24
|
+
import { STORED_QUERY_ID_PREFIX } from '../../services/stored-query/stored-query.data';
|
|
25
|
+
import { StoredQueryService } from '../../services/stored-query/stored-query.service';
|
|
26
|
+
import { SearchFilterComponent } from '../../components/search-filter/search-filter.component';
|
|
27
|
+
import * as i0 from "@angular/core";
|
|
28
|
+
import * as i1 from "@yuuvis/components/icon";
|
|
29
|
+
import * as i2 from "@yuuvis/client-core";
|
|
30
|
+
import * as i3 from "@yuuvis/components/split-view";
|
|
31
|
+
const components = [
|
|
32
|
+
TileListComponent,
|
|
33
|
+
BreadcrumbComponent,
|
|
34
|
+
FolderTreeComponent,
|
|
35
|
+
ObjectSummaryComponent,
|
|
36
|
+
TileConfigTriggerComponent,
|
|
37
|
+
RibbonComponent,
|
|
38
|
+
AddButtonComponent,
|
|
39
|
+
SimpleSearchComponent,
|
|
40
|
+
MultiObjectSummaryComponent,
|
|
41
|
+
SortComponent,
|
|
42
|
+
SearchFilterComponent
|
|
43
|
+
];
|
|
44
|
+
const module = [YvcIconModule, TranslateModule, RouterModule, YvcSplitViewModule];
|
|
45
|
+
export class FilesPageComponent {
|
|
46
|
+
#LAYOUT_SETTINGS_STORAGE_KEY;
|
|
47
|
+
#objectConfigService;
|
|
48
|
+
#device;
|
|
49
|
+
#eventService;
|
|
50
|
+
#appCache;
|
|
51
|
+
#highlightStyles;
|
|
52
|
+
#routeIdEffect;
|
|
53
|
+
constructor() {
|
|
54
|
+
this.tileList = viewChild('tileList');
|
|
55
|
+
this.#LAYOUT_SETTINGS_STORAGE_KEY = 'yuv.app.drive.files.layout';
|
|
56
|
+
this.shellService = inject(ShellService);
|
|
57
|
+
this.dmsService = inject(DmsService);
|
|
58
|
+
this.drive = inject(DriveService);
|
|
59
|
+
this.route = inject(ActivatedRoute);
|
|
60
|
+
this.router = inject(Router);
|
|
61
|
+
this.translate = inject(TranslateService);
|
|
62
|
+
this.storedQueryService = inject(StoredQueryService);
|
|
63
|
+
this.clipboard = inject(ClipboardService);
|
|
64
|
+
this.actionsService = inject(ActionsService);
|
|
65
|
+
this.#objectConfigService = inject(ObjectConfigService);
|
|
66
|
+
this.#device = inject(DeviceService);
|
|
67
|
+
this.#eventService = inject(EventService);
|
|
68
|
+
this.ERROR_CODE = {
|
|
69
|
+
NOT_FOUND: '404',
|
|
70
|
+
// pattern: {HTTP_STATUS_CODE}-{SERVICE_ERROR_CODE}
|
|
71
|
+
INVALID_ID: '422-2912'
|
|
72
|
+
};
|
|
73
|
+
this.#appCache = inject(AppCacheService);
|
|
74
|
+
this.objectConfigBucket = APP_SCHEMA.id;
|
|
75
|
+
this.splitViewCmp = viewChild.required(SplitViewComponent);
|
|
76
|
+
this.selected = signal(undefined);
|
|
77
|
+
this.fileDropSummaryDisabled = computed(() => !this.selected()?.permissions?.writeContent);
|
|
78
|
+
this.disableCreate = false;
|
|
79
|
+
this.actions = this.drive.state$.actions;
|
|
80
|
+
this.selection = this.drive.state$.selection;
|
|
81
|
+
this.busy = this.drive.state$.busy;
|
|
82
|
+
this.flavorChips = this.shellService.getObjectFlavors();
|
|
83
|
+
this.selectionActions = computed(() => ({ selection: this.selection(), actions: this.actions() }));
|
|
84
|
+
this.emptyMode = signal(null);
|
|
85
|
+
// error code when loading the object failed. This will be used
|
|
86
|
+
// to determine a proper error message to display
|
|
87
|
+
this.error = signal(undefined);
|
|
88
|
+
this.configTypeOptions = {
|
|
89
|
+
folder: { bucket: APP_ID, type: APP_SCHEMA.types['folder'] },
|
|
90
|
+
file: { bucket: APP_ID, type: APP_SCHEMA.types['file'] }
|
|
91
|
+
};
|
|
92
|
+
this.searchFocused = false;
|
|
93
|
+
this.enableDetails = signal(true);
|
|
94
|
+
this.enableTree = signal(true);
|
|
95
|
+
this.tileConfigBucketLabel = this.translate.instant('yuv.app.drive.tile-config.bucket');
|
|
96
|
+
this.smallScreenLayout = signal(false);
|
|
97
|
+
this.sortOptionsAvailable = signal(true);
|
|
98
|
+
this.id = input(null);
|
|
99
|
+
this.highlightStyles$ = this.clipboard.clipboard$(APP_ID).pipe(takeUntilDestroyed(), map((c) => {
|
|
100
|
+
return c && c.mode && c.objects?.length
|
|
101
|
+
? [
|
|
102
|
+
{
|
|
103
|
+
cssStyles: this.#highlightStyles[c?.mode],
|
|
104
|
+
ids: c.objects.map((o) => o.id)
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
: [];
|
|
108
|
+
}));
|
|
109
|
+
this.#highlightStyles = {
|
|
110
|
+
cut: { opacity: 0.5 }
|
|
111
|
+
};
|
|
112
|
+
this.#routeIdEffect = effect(() => {
|
|
113
|
+
const param = this.id() || undefined;
|
|
114
|
+
untracked(async () => {
|
|
115
|
+
if (param === DRIVE_QUERY_FOLDER_ID) {
|
|
116
|
+
this.emptyMode.set(DRIVE_QUERY_FOLDER_ID);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.emptyMode.set(param === DRIVE_ROOT_FOLDER_ID ? DRIVE_ROOT_FOLDER_ID : null);
|
|
120
|
+
this.error.set(undefined);
|
|
121
|
+
this.disableCreate = false;
|
|
122
|
+
this.currentFolderID = param;
|
|
123
|
+
this.drive.updateCurrentFolder(this.currentFolderID);
|
|
124
|
+
this.selected.set(undefined);
|
|
125
|
+
this.currentFolder = undefined;
|
|
126
|
+
if (this.currentFolderID === DRIVE_ROOT_FOLDER_ID)
|
|
127
|
+
this.currentFolderID = undefined;
|
|
128
|
+
if (this.currentFolderID) {
|
|
129
|
+
this.dmsService.getDmsObject(this.currentFolderID).subscribe({
|
|
130
|
+
next: (o) => {
|
|
131
|
+
this.currentFolder = o;
|
|
132
|
+
this._setFolderQuery(this.#getTitle(o));
|
|
133
|
+
},
|
|
134
|
+
error: (e) => {
|
|
135
|
+
console.error('Error getting folder', e);
|
|
136
|
+
this.#processLoadError(e);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else
|
|
141
|
+
this._setFolderQuery(this.translate.instant('yuv.app.drive.folder-tree.mydrive'));
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
this.tileListOptions = {
|
|
145
|
+
actionContext: ACTION_CONTEXT,
|
|
146
|
+
configTypes: Object.values(APP_SCHEMA.types),
|
|
147
|
+
configFlavors: [...this.shellService.getObjectFlavors(), ...APP_SCHEMA.flavors.filter((f) => !f.applicableTo).map((f) => ({ ...f, app: APP_ID }))]
|
|
148
|
+
};
|
|
149
|
+
this.query = this.drive.state$.query;
|
|
150
|
+
this.queryTitle = this.drive.state$.queryTitle;
|
|
151
|
+
this.icons = {
|
|
152
|
+
...APP_DRIVE_ICONS,
|
|
153
|
+
sort: APP_DRIVE_ICONS.sort,
|
|
154
|
+
back: YUV_ICONS.back,
|
|
155
|
+
attention: YUV_ICONS.attention,
|
|
156
|
+
refresh: YUV_ICONS.refresh,
|
|
157
|
+
clear: ICONS.clear
|
|
158
|
+
};
|
|
159
|
+
this.drive.events$.pipe(takeUntilDestroyed()).subscribe({
|
|
160
|
+
next: (e) => {
|
|
161
|
+
if (e === DRIVE_EVENT.refresh) {
|
|
162
|
+
this.refresh();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
this.#device.screenChange$.pipe(takeUntilDestroyed()).subscribe({
|
|
167
|
+
next: (s) => {
|
|
168
|
+
this.smallScreenLayout.set(s.size === 's' && s.orientation === 'portrait');
|
|
169
|
+
this.enableDetails.set(!this.smallScreenLayout());
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
toObservable(this.drive.state$.selection)
|
|
173
|
+
.pipe(takeUntilDestroyed())
|
|
174
|
+
.subscribe({
|
|
175
|
+
next: (sel) => {
|
|
176
|
+
if (sel?.length === 0) {
|
|
177
|
+
this.tileList()?.clearSelection(true);
|
|
178
|
+
this.selected.set(undefined);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
this.route.queryParamMap.pipe(takeUntilDestroyed()).subscribe({
|
|
183
|
+
next: (p) => {
|
|
184
|
+
this.sortOptionsAvailable.set(true);
|
|
185
|
+
if (this.route.snapshot.params['id'] === DRIVE_QUERY_FOLDER_ID) {
|
|
186
|
+
const q = p.get('q');
|
|
187
|
+
this.disableCreate = true;
|
|
188
|
+
// check if the query is a stored query
|
|
189
|
+
if (q?.startsWith(STORED_QUERY_ID_PREFIX)) {
|
|
190
|
+
const sq = this.storedQueryService.getStoredQuery(q);
|
|
191
|
+
if (sq) {
|
|
192
|
+
this.drive.updateQuery(sq.query, sq.label);
|
|
193
|
+
this.sortOptionsAvailable.set(false);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else if (q) {
|
|
198
|
+
this.sortOptionsAvailable.set(true);
|
|
199
|
+
try {
|
|
200
|
+
const sq = JSON.parse(decodeURIComponent(q));
|
|
201
|
+
sq.filters = (sq.filters || []).filter((f) => f.f !== BaseObjectTypeField.PARENT_ID);
|
|
202
|
+
this.drive.updateQuery(sq, this.translate.instant('yuv.app.drive.files.search.result.title'));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
console.error('Error parsing query', e);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
this.#eventService
|
|
213
|
+
.on(YuvEventType.DMS_OBJECT_UPDATED)
|
|
214
|
+
.pipe(takeUntilDestroyed(), tap((e) => {
|
|
215
|
+
this.tileList()?.updateTileList([e.data]);
|
|
216
|
+
e.data.id === this.selected()?.id && this.selected.set(e.data);
|
|
217
|
+
}))
|
|
218
|
+
.subscribe();
|
|
219
|
+
}
|
|
220
|
+
onFilterQueryChange(q) {
|
|
221
|
+
this.drive.updateQuery(q, this.translate.instant('yuv.app.drive.files.search.result.title'));
|
|
222
|
+
this.drive.setSelection([]);
|
|
223
|
+
}
|
|
224
|
+
#processLoadError(e) {
|
|
225
|
+
if (`${e.status}` !== this.ERROR_CODE.NOT_FOUND) {
|
|
226
|
+
this.error.set(`${e.status}-${e.error?.serviceErrorCode || ''}`);
|
|
227
|
+
}
|
|
228
|
+
else
|
|
229
|
+
this.error.set(this.ERROR_CODE.NOT_FOUND);
|
|
230
|
+
}
|
|
231
|
+
#getTitle(o) {
|
|
232
|
+
const cfgType = o.isFolder ? this.configTypeOptions['folder'] : this.configTypeOptions['file'];
|
|
233
|
+
const oc = this.#objectConfigService.getResolvedObjectConfig(o.data, cfgType.type, cfgType.bucket, true);
|
|
234
|
+
return oc.title.value;
|
|
235
|
+
}
|
|
236
|
+
onDelete() {
|
|
237
|
+
const deleteAction = this.actions().find((a) => a.id === BASE_ACTION.delete);
|
|
238
|
+
if (deleteAction)
|
|
239
|
+
deleteAction.run(this.drive.state$.selection());
|
|
240
|
+
}
|
|
241
|
+
_setFolderQuery(queryTitle) {
|
|
242
|
+
this.drive.updateQuery({
|
|
243
|
+
filters: [{ f: BaseObjectTypeField.PARENT_ID, o: Operator.EQUAL, v1: this.currentFolderID || null }]
|
|
244
|
+
}, queryTitle);
|
|
245
|
+
}
|
|
246
|
+
onContextmenu({ event }) {
|
|
247
|
+
event.preventDefault();
|
|
248
|
+
this.actionsService.openContextMenu(this.actions, (a) => a.run(this.selection()), { x: event.x, y: event.y });
|
|
249
|
+
}
|
|
250
|
+
onFileDrop(files) {
|
|
251
|
+
this.drive.setBusy(true);
|
|
252
|
+
this.drive.checkNamesAndUpload(files).subscribe({ complete: () => this.drive.setBusy(false) });
|
|
253
|
+
}
|
|
254
|
+
onFileUpdateDrop(file) {
|
|
255
|
+
const dmsObject = this.selected();
|
|
256
|
+
if (dmsObject) {
|
|
257
|
+
this.drive.setBusy(true);
|
|
258
|
+
this.drive
|
|
259
|
+
.uploadContent(dmsObject.id, file[0])
|
|
260
|
+
.pipe(finalize(() => this.drive.setBusy(false)))
|
|
261
|
+
.subscribe();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
itemFocused(tile) {
|
|
265
|
+
// console.log(tile);
|
|
266
|
+
}
|
|
267
|
+
itemClicked(tile) {
|
|
268
|
+
if (this.smallScreenLayout())
|
|
269
|
+
this.itemDoubleClicked(tile);
|
|
270
|
+
}
|
|
271
|
+
onCopy(tiles) {
|
|
272
|
+
this.clipboard.addObjects(tiles.map((t) => t.dmsObject), 'copy', APP_ID);
|
|
273
|
+
}
|
|
274
|
+
onCut(tiles) {
|
|
275
|
+
this.clipboard.addObjects(tiles.map((t) => t.dmsObject), 'cut', APP_ID);
|
|
276
|
+
}
|
|
277
|
+
onQuerySubmit(q) {
|
|
278
|
+
// in order to keep the query in the url as short as
|
|
279
|
+
// possible we'll get rid of the fields because they could be
|
|
280
|
+
// re-applied later on
|
|
281
|
+
q.fields = undefined;
|
|
282
|
+
this.router.navigate(['..', 'query'], {
|
|
283
|
+
queryParams: { q: encodeURIComponent(JSON.stringify(q)) },
|
|
284
|
+
relativeTo: this.route
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
selectionChanged(tiles) {
|
|
288
|
+
if (tiles.length === 1)
|
|
289
|
+
this.loadDetails(tiles[0].id);
|
|
290
|
+
else {
|
|
291
|
+
this.selected.set(undefined);
|
|
292
|
+
if (tiles.length === 0) {
|
|
293
|
+
this.drive.setSelection([]);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.drive.setBusy(true);
|
|
297
|
+
this.dmsService.getDmsObjects(tiles.map((i) => i.id)).subscribe({
|
|
298
|
+
next: (o) => {
|
|
299
|
+
this.drive.setBusy(false);
|
|
300
|
+
this.drive.setSelection(o);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
itemDoubleClicked(tile) {
|
|
307
|
+
if (tile.instanceData) {
|
|
308
|
+
this.drive.setBusy(true);
|
|
309
|
+
const nav = tile.instanceData[BaseObjectTypeField.BASE_TYPE_ID] === SystemType.FOLDER ? ['..'] : ['../..', 'object'];
|
|
310
|
+
this.router.navigate([...nav, tile.instanceData[BaseObjectTypeField.OBJECT_ID]], { relativeTo: this.route }).then(() => this.drive.setBusy(false));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
loadDetails(id) {
|
|
314
|
+
this.shellService.addBusy();
|
|
315
|
+
// load the dms object
|
|
316
|
+
this.dmsService.getDmsObject(id).subscribe({
|
|
317
|
+
next: (o) => {
|
|
318
|
+
this.selected.set(o);
|
|
319
|
+
this.shellService.removeBusy();
|
|
320
|
+
this.drive.setSelection([o]);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
clearSelection() {
|
|
325
|
+
this.drive.setSelection([]);
|
|
326
|
+
}
|
|
327
|
+
openParent() {
|
|
328
|
+
if (this.currentFolder) {
|
|
329
|
+
this.drive.setBusy(true);
|
|
330
|
+
this.router
|
|
331
|
+
.navigate(['..', this.currentFolder.data[BaseObjectTypeField.PARENT_ID] || DRIVE_ROOT_FOLDER_ID], {
|
|
332
|
+
relativeTo: this.route,
|
|
333
|
+
replaceUrl: true
|
|
334
|
+
})
|
|
335
|
+
.then(() => this.drive.setBusy(false));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
setBusy(busy) {
|
|
339
|
+
this.drive.setBusy(busy);
|
|
340
|
+
}
|
|
341
|
+
refresh() {
|
|
342
|
+
this.tileList()?.refresh();
|
|
343
|
+
this.drive.setSelection([]);
|
|
344
|
+
}
|
|
345
|
+
onLayoutSettingsChange(e) {
|
|
346
|
+
this.#appCache.setItem(this.#LAYOUT_SETTINGS_STORAGE_KEY, e).subscribe();
|
|
347
|
+
}
|
|
348
|
+
#applyLayoutSettings(settings) {
|
|
349
|
+
this.splitViewCmp().applyLayoutSettings(settings);
|
|
350
|
+
}
|
|
351
|
+
ngAfterViewInit() {
|
|
352
|
+
this.#appCache.getItem(this.#LAYOUT_SETTINGS_STORAGE_KEY).subscribe({
|
|
353
|
+
next: (ls) => {
|
|
354
|
+
if (ls) {
|
|
355
|
+
this.enableDetails.set(ls.areas[2]?.visible);
|
|
356
|
+
this.enableTree.set(ls.areas[0]?.visible);
|
|
357
|
+
this.#applyLayoutSettings(ls);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
ngOnDestroy() {
|
|
363
|
+
this.clipboard.clear(APP_ID);
|
|
364
|
+
}
|
|
365
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
366
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FilesPageComponent, isStandalone: true, selector: "ymd-files", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.smallScreen": "smallScreenLayout()", "class.searchFocused": "this.searchFocused" } }, viewQueries: [{ propertyName: "tileList", first: true, predicate: ["tileList"], descendants: true, isSignal: true }, { propertyName: "splitViewCmp", first: true, predicate: SplitViewComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<header>\n <!-- navigation bar -->\n <nav [attr.aria-label]=\"'yuv.app.drive.files.naviagtion.aria.label' | translate\">\n <div class=\"nav\">\n <button class=\"back\" [disabled]=\"!currentFolder\" title=\"{{ 'yuv.app.drive.files.nav.back.tooltip' | translate }}\" (click)=\"openParent()\">\n <yvc-icon [svg]=\"icons.back\"></yvc-icon>\n </button>\n <button class=\"refresh\" title=\"{{ 'yuv.app.drive.files.nav.refresh.tooltip' | translate }}\" (click)=\"refresh()\">\n <yvc-icon [svg]=\"icons.refresh\"></yvc-icon>\n </button>\n </div>\n\n @if (!query()?.term) {\n <ymd-breadcrumb></ymd-breadcrumb>\n } @else {\n <div class=\"breadcrumb\"></div>\n }\n <div class=\"search\">\n <yuv-simple-search [query]=\"query()\" (querySubmit)=\"onQuerySubmit($event)\"></yuv-simple-search>\n <!-- TODO: enable again once drive search needs to be a little bit more sophisticated -->\n <!-- <ymd-drive-search (focused)=\"searchFocused = $event\"></ymd-drive-search> -->\n </div>\n </nav>\n\n <!-- ribbon with actions and options -->\n <ymd-ribbon [objects]=\"selection()\" [busy]=\"busy()\" [enableClipboard]=\"true\">\n <ng-template #primaryActions>\n <ymd-add-button [disabled]=\"disableCreate\"></ymd-add-button>\n </ng-template>\n\n <ng-template #secondaryActions>\n <div class=\"options\">\n @if (!smallScreenLayout()) {\n <button\n class=\"toggle-tree toggle\"\n [ngClass]=\"{ enabled: enableTree() }\"\n title=\"{{ 'yuv.app.drive.files.toggletree.tooltip' | translate }}\"\n (click)=\"enableTree.set(!enableTree())\"\n >\n <yvc-icon [svg]=\"icons.toggleLeft\"></yvc-icon>\n </button>\n <button\n class=\"toggle-details toggle\"\n [ngClass]=\"{ enabled: enableDetails() }\"\n title=\"{{ 'yuv.app.drive.files.toggledetails.tooltip' | translate }}\"\n (click)=\"enableDetails.set(!enableDetails())\"\n >\n <yvc-icon [svg]=\"icons.toggleRight\"></yvc-icon>\n </button>\n }\n <yuv-tile-config-trigger\n [icon]=\"icons.settings\"\n [bucket]=\"objectConfigBucket\"\n [bucketLabel]=\"tileConfigBucketLabel\"\n [options]=\"tileListOptions\"\n ></yuv-tile-config-trigger>\n </div>\n </ng-template>\n </ymd-ribbon>\n</header>\n\n<yvc-split-view [gutterSize]=\"1\" (layoutSettingsChange)=\"onLayoutSettingsChange($event)\">\n <!-- folder tree -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableTree() && !smallScreenLayout()\">\n <ymd-folder-tree yuvFocusable=\"Tree\"></ymd-folder-tree>\n </ng-template>\n\n <!-- files -->\n <ng-template yvcSplitArea [size]=\"60\">\n @let err = error();\n @if (err) {\n <div class=\"error\">\n <p>\n <yvc-icon [svg]=\"icons.attention\"></yvc-icon>\n @switch (err) {\n @case (ERROR_CODE.NOT_FOUND) {\n {{ 'yuv.app.drive.files.error.load.not-found' | translate }}\n }\n @case (ERROR_CODE.INVALID_ID) {\n {{ 'yuv.app.drive.files.error.load.invalid-id' | translate }}\n }\n @default {\n {{ 'yuv.app.drive.files.error.load' | translate }}\n }\n }\n </p>\n </div>\n } @else {\n <div class=\"files\" [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.label' | translate }\" (fileDrop)=\"onFileDrop($event)\">\n <header class=\"files-header\">\n <h1>{{ queryTitle() }}</h1>\n @if (query()?.term) {\n <ymd-search-filter [query]=\"query()\" (queryChange)=\"onFilterQueryChange($event)\"></ymd-search-filter>\n }\n @if (sortOptionsAvailable()) {\n <ymd-sort />\n }\n <div class=\"flavors\">\n <!-- TODO: enable again once flavors/aspects are supported -->\n <!-- @for (f of flavorChips; track f.id) {\n <yuv-flavor-chip [ngClass]=\"{ active: f.id === appliedFlavor?.id }\" [flavor]=\"f\" (click)=\"appliedFlavor = f\"></yuv-flavor-chip>\n }-->\n </div>\n </header>\n\n <yuv-tile-list\n #tileList\n class=\"staggered\"\n [attr.aria-label]=\"'yuv.app.drive.files.content.aria.label' | translate\"\n [attr.aria-busy]=\"busy()\"\n [attr.role]=\"'listbox'\"\n (keydown.delete)=\"onDelete()\"\n [bucket]=\"objectConfigBucket\"\n [multiselect]=\"true\"\n [query]=\"query()\"\n [flavor]=\"appliedFlavor\"\n [options]=\"tileListOptions\"\n (itemDblClick)=\"itemDoubleClicked($event)\"\n (itemSelect)=\"itemClicked($event)\"\n (selectionChange)=\"selectionChanged($event)\"\n (copy)=\"onCopy($event)\"\n (cut)=\"onCut($event)\"\n (busy)=\"setBusy($event)\"\n (ctxMenu)=\"onContextmenu($event)\"\n [highlights]=\"highlightStyles$ | async\"\n >\n <div #empty>\n @if (emptyMode() === 'root') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.root.list' | translate }}</p>\n } @else if (emptyMode() === 'query') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.query.list' | translate }}</p>\n } @else {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.list' | translate }}</p>\n }\n </div>\n </yuv-tile-list>\n </div>\n }\n </ng-template>\n\n <!-- details -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableDetails()\">\n @let selectedItem = selected();\n @if (enableDetails() && selectedItem) {\n @if (selectedItem?.isFolder) {\n <yuv-object-summary [configType]=\"configTypeOptions['folder']\" [dmsObject]=\"selectedItem\"></yuv-object-summary>\n } @else {\n <yuv-object-summary\n [configType]=\"configTypeOptions['file']\"\n [dmsObject]=\"selectedItem\"\n [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.content.replace.label' | translate }\"\n [fileDropDisabled]=\"fileDropSummaryDisabled()\"\n (fileDrop)=\"onFileUpdateDrop($event)\"\n ></yuv-object-summary>\n }\n } @else {\n @let sel = selection();\n @if (sel && sel.length > 0) {\n <yuv-multi-object-summary [headline]=\"'yuv.app.drive.multiselected.details' | translate: { count: selection().length }\"></yuv-multi-object-summary>\n } @else if (tileList()?.items?.length === 0) {\n <!-- TODO: CHOULD HAVE A DIFFERENT MESSAGE FOR EMPTY RESULTS EMPTY FOR NOW -->\n <div class=\"message\">{{ 'yuv.app.drive.empty.results.details.message' | translate }}</div>\n } @else {\n <div class=\"message\">{{ 'yuv.app.drive.unselected.details' | translate }}</div>\n }\n }\n </ng-template>\n</yvc-split-view>\n", styles: [":host{--files-button-padding: calc(var(--app-pane-padding) / 4);--files-button-border-radius: 2px;--files-button-gap: calc(var(--app-pane-padding) / 4);--files-icon-size: 20px;height:100%;overflow:hidden;display:flex;flex-flow:column}:host.searchFocused header>nav .search{grid-column:-1/-3}:host header{flex:0 0 auto}:host header>nav{background-color:var(--app-drive-header-background);border-block-end:1px solid var(--panel-divider-color);display:grid;grid-template-columns:auto 1fr 1fr auto;align-items:center;gap:calc(var(--app-pane-padding) / 2);padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2)}:host header>nav .nav{grid-column:1/2;grid-row:1;display:flex;align-items:center;gap:var(--files-button-gap)}:host header>nav .nav button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host header>nav .nav button yvc-icon{--icon-size: var(--files-icon-size)}:host header>nav .breadcrumb{grid-column:2/4;grid-row:1;align-self:stretch;display:flex;align-items:center;border-radius:var(--files-button-border-radius);padding:0 .5em;border:1px solid var(--panel-divider-color)}:host header>nav .search{grid-column:-1/-2;grid-row:1;z-index:1}:host yvc-split-view{flex:1;animation:fade-in .3s ease-in-out}:host ymd-ribbon{--ribbon-button-padding: var(--files-button-padding);--ribbon-button-border-radius: var(--files-button-border-radius);--ribbon-button-gap: var(--files-button-gap);--ribbon-icon-size: var(--files-icon-size)}:host ymd-ribbon .options{grid-area:options;display:flex;gap:var(--files-button-gap);align-items:center}:host ymd-ribbon .options yuv-tile-config-trigger{--icon-size: var(--files-icon-size);--button-padding: var(--files-button-padding)}:host ymd-ribbon .options button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host ymd-ribbon .options button yvc-icon{--icon-size: var(--files-icon-size)}:host ymd-ribbon .options button.toggle.enabled{background-color:var(--item-focus-background-color)}:host main{height:100%;overflow:hidden;display:flex;flex-flow:column}:host main yvc-master-details{flex:1;overflow:hidden;box-sizing:border-box}:host .error{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .error p{max-width:31ch;line-height:1.5em;display:grid;justify-items:center}:host .error p yvc-icon{--icon-size: 48px;display:block;margin-block-end:1rem}:host .files{display:flex;flex-flow:column;overflow:hidden;height:100%}:host .files header{flex:0 0 auto;padding:var(--app-pane-padding);display:grid;grid-template-columns:2fr max-content;grid-template-rows:auto auto 1fr;gap:0;grid-auto-flow:row;grid-template-areas:\"title sort\" \"searchfilter searchfilter\" \"flavours flavours\"}:host .files header h1{grid-area:title;margin:0;padding:0;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .files header .flavors{grid-area:flavors;display:flex;gap:2px;justify-content:flex-end;padding:calc(var(--app-pane-padding) / 4)}:host .files header .flavors yuv-flavor-chip{font-size:var(--font-hint);cursor:pointer;--flavor-background: var(--panel-background);--flavor-icon-size: 16px}:host .files header .flavors yuv-flavor-chip:hover{--flavor-border-color: var(--color-accent)}:host .files header ymd-sort{grid-area:sort}:host .files header ymd-search-filter{grid-area:searchfilter}:host .files yuv-tile-list{flex:1;overflow:hidden}:host .message{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .message p{max-width:31ch;line-height:1.5em}:host yvc-split-view{height:100%;box-sizing:border-box}:host ymd-folder-tree,:host yuv-object-summary{height:100%;overflow-y:auto;box-sizing:border-box}:host yuv-tile-list{--tile-border: 1px solid var(--panel-divider-color);--tile-border-width: 0 0 1px 0;--tile-padding: calc(var(--app-pane-padding) / 2);--tile-icon-size: 18px;--tile-action-icon-size: 18px;--paging-background: var(--panel-background-lightgrey)}:host p.empty{color:var(--text-color-caption)}:host .details{height:100%}:host .details yuv-object-details{height:100%}:host.smallScreen yuv-tile-list{--tile-padding: var(--app-pane-padding) !important}@keyframes fade-in{0%{opacity:0}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i1.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: YvcSplitViewModule }, { kind: "component", type: i3.SplitViewComponent, selector: "yvc-split-view", inputs: ["direction", "gutterSize", "restrictMove", "disabled", "gutterDblClickDuration", "layoutSettingsID"], outputs: ["layoutSettingsChange", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"] }, { kind: "directive", type: i3.SplitAreaDirective, selector: "[yvcSplitArea]", inputs: ["size", "order", "minSize", "maxSize", "panelClass", "visible"] }, { kind: "component", type: TileListComponent, selector: "yuv-tile-list", inputs: ["bucket", "multiselect", "options", "flavor", "query", "preselect", "highlights"], outputs: ["itemSelect", "copy", "cut", "busy", "queryResult", "selectionChange", "itemDblClick", "ctxMenu"] }, { kind: "component", type: BreadcrumbComponent, selector: "ymd-breadcrumb" }, { kind: "component", type: FolderTreeComponent, selector: "ymd-folder-tree" }, { kind: "component", type: ObjectSummaryComponent, selector: "yuv-object-summary", inputs: ["actions", "dmsObject", "objectId", "configType"] }, { kind: "component", type: TileConfigTriggerComponent, selector: "yuv-tile-config-trigger", inputs: ["icon", "bucket", "bucketLabel", "options"] }, { kind: "component", type: RibbonComponent, selector: "ymd-ribbon", inputs: ["busy", "enableClipboard", "objects", "excludeActions"] }, { kind: "component", type: AddButtonComponent, selector: "ymd-add-button", inputs: ["disabled"] }, { kind: "component", type: SimpleSearchComponent, selector: "yuv-simple-search", inputs: ["targets", "query"], outputs: ["querySubmit", "targetSelectionChanged", "queryChange", "typeAggregation"] }, { kind: "component", type: MultiObjectSummaryComponent, selector: "yuv-multi-object-summary", inputs: ["headline"] }, { kind: "component", type: SortComponent, selector: "ymd-sort", outputs: ["sortChanged"] }, { kind: "component", type: SearchFilterComponent, selector: "ymd-search-filter", inputs: ["query"], outputs: ["queryChange"] }, { kind: "directive", type: FileDropZoneDirective, selector: "[yuvFileDropZone]", inputs: ["yuvFileDropZone", "fileDropDisabled"], outputs: ["fileDrop", "fileDropOver"] }] }); }
|
|
367
|
+
}
|
|
368
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesPageComponent, decorators: [{
|
|
369
|
+
type: Component,
|
|
370
|
+
args: [{ selector: 'ymd-files', standalone: true, imports: [NgClass, AsyncPipe, ...module, ...components, FileDropZoneDirective], host: {
|
|
371
|
+
'[class.smallScreen]': 'smallScreenLayout()'
|
|
372
|
+
}, template: "<header>\n <!-- navigation bar -->\n <nav [attr.aria-label]=\"'yuv.app.drive.files.naviagtion.aria.label' | translate\">\n <div class=\"nav\">\n <button class=\"back\" [disabled]=\"!currentFolder\" title=\"{{ 'yuv.app.drive.files.nav.back.tooltip' | translate }}\" (click)=\"openParent()\">\n <yvc-icon [svg]=\"icons.back\"></yvc-icon>\n </button>\n <button class=\"refresh\" title=\"{{ 'yuv.app.drive.files.nav.refresh.tooltip' | translate }}\" (click)=\"refresh()\">\n <yvc-icon [svg]=\"icons.refresh\"></yvc-icon>\n </button>\n </div>\n\n @if (!query()?.term) {\n <ymd-breadcrumb></ymd-breadcrumb>\n } @else {\n <div class=\"breadcrumb\"></div>\n }\n <div class=\"search\">\n <yuv-simple-search [query]=\"query()\" (querySubmit)=\"onQuerySubmit($event)\"></yuv-simple-search>\n <!-- TODO: enable again once drive search needs to be a little bit more sophisticated -->\n <!-- <ymd-drive-search (focused)=\"searchFocused = $event\"></ymd-drive-search> -->\n </div>\n </nav>\n\n <!-- ribbon with actions and options -->\n <ymd-ribbon [objects]=\"selection()\" [busy]=\"busy()\" [enableClipboard]=\"true\">\n <ng-template #primaryActions>\n <ymd-add-button [disabled]=\"disableCreate\"></ymd-add-button>\n </ng-template>\n\n <ng-template #secondaryActions>\n <div class=\"options\">\n @if (!smallScreenLayout()) {\n <button\n class=\"toggle-tree toggle\"\n [ngClass]=\"{ enabled: enableTree() }\"\n title=\"{{ 'yuv.app.drive.files.toggletree.tooltip' | translate }}\"\n (click)=\"enableTree.set(!enableTree())\"\n >\n <yvc-icon [svg]=\"icons.toggleLeft\"></yvc-icon>\n </button>\n <button\n class=\"toggle-details toggle\"\n [ngClass]=\"{ enabled: enableDetails() }\"\n title=\"{{ 'yuv.app.drive.files.toggledetails.tooltip' | translate }}\"\n (click)=\"enableDetails.set(!enableDetails())\"\n >\n <yvc-icon [svg]=\"icons.toggleRight\"></yvc-icon>\n </button>\n }\n <yuv-tile-config-trigger\n [icon]=\"icons.settings\"\n [bucket]=\"objectConfigBucket\"\n [bucketLabel]=\"tileConfigBucketLabel\"\n [options]=\"tileListOptions\"\n ></yuv-tile-config-trigger>\n </div>\n </ng-template>\n </ymd-ribbon>\n</header>\n\n<yvc-split-view [gutterSize]=\"1\" (layoutSettingsChange)=\"onLayoutSettingsChange($event)\">\n <!-- folder tree -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableTree() && !smallScreenLayout()\">\n <ymd-folder-tree yuvFocusable=\"Tree\"></ymd-folder-tree>\n </ng-template>\n\n <!-- files -->\n <ng-template yvcSplitArea [size]=\"60\">\n @let err = error();\n @if (err) {\n <div class=\"error\">\n <p>\n <yvc-icon [svg]=\"icons.attention\"></yvc-icon>\n @switch (err) {\n @case (ERROR_CODE.NOT_FOUND) {\n {{ 'yuv.app.drive.files.error.load.not-found' | translate }}\n }\n @case (ERROR_CODE.INVALID_ID) {\n {{ 'yuv.app.drive.files.error.load.invalid-id' | translate }}\n }\n @default {\n {{ 'yuv.app.drive.files.error.load' | translate }}\n }\n }\n </p>\n </div>\n } @else {\n <div class=\"files\" [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.label' | translate }\" (fileDrop)=\"onFileDrop($event)\">\n <header class=\"files-header\">\n <h1>{{ queryTitle() }}</h1>\n @if (query()?.term) {\n <ymd-search-filter [query]=\"query()\" (queryChange)=\"onFilterQueryChange($event)\"></ymd-search-filter>\n }\n @if (sortOptionsAvailable()) {\n <ymd-sort />\n }\n <div class=\"flavors\">\n <!-- TODO: enable again once flavors/aspects are supported -->\n <!-- @for (f of flavorChips; track f.id) {\n <yuv-flavor-chip [ngClass]=\"{ active: f.id === appliedFlavor?.id }\" [flavor]=\"f\" (click)=\"appliedFlavor = f\"></yuv-flavor-chip>\n }-->\n </div>\n </header>\n\n <yuv-tile-list\n #tileList\n class=\"staggered\"\n [attr.aria-label]=\"'yuv.app.drive.files.content.aria.label' | translate\"\n [attr.aria-busy]=\"busy()\"\n [attr.role]=\"'listbox'\"\n (keydown.delete)=\"onDelete()\"\n [bucket]=\"objectConfigBucket\"\n [multiselect]=\"true\"\n [query]=\"query()\"\n [flavor]=\"appliedFlavor\"\n [options]=\"tileListOptions\"\n (itemDblClick)=\"itemDoubleClicked($event)\"\n (itemSelect)=\"itemClicked($event)\"\n (selectionChange)=\"selectionChanged($event)\"\n (copy)=\"onCopy($event)\"\n (cut)=\"onCut($event)\"\n (busy)=\"setBusy($event)\"\n (ctxMenu)=\"onContextmenu($event)\"\n [highlights]=\"highlightStyles$ | async\"\n >\n <div #empty>\n @if (emptyMode() === 'root') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.root.list' | translate }}</p>\n } @else if (emptyMode() === 'query') {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.query.list' | translate }}</p>\n } @else {\n <p class=\"empty\">{{ 'yuv.app.drive.files.content.empty.list' | translate }}</p>\n }\n </div>\n </yuv-tile-list>\n </div>\n }\n </ng-template>\n\n <!-- details -->\n <ng-template yvcSplitArea [size]=\"20\" [visible]=\"enableDetails()\">\n @let selectedItem = selected();\n @if (enableDetails() && selectedItem) {\n @if (selectedItem?.isFolder) {\n <yuv-object-summary [configType]=\"configTypeOptions['folder']\" [dmsObject]=\"selectedItem\"></yuv-object-summary>\n } @else {\n <yuv-object-summary\n [configType]=\"configTypeOptions['file']\"\n [dmsObject]=\"selectedItem\"\n [yuvFileDropZone]=\"{ label: 'yuv.app.drive.files.dropzone.content.replace.label' | translate }\"\n [fileDropDisabled]=\"fileDropSummaryDisabled()\"\n (fileDrop)=\"onFileUpdateDrop($event)\"\n ></yuv-object-summary>\n }\n } @else {\n @let sel = selection();\n @if (sel && sel.length > 0) {\n <yuv-multi-object-summary [headline]=\"'yuv.app.drive.multiselected.details' | translate: { count: selection().length }\"></yuv-multi-object-summary>\n } @else if (tileList()?.items?.length === 0) {\n <!-- TODO: CHOULD HAVE A DIFFERENT MESSAGE FOR EMPTY RESULTS EMPTY FOR NOW -->\n <div class=\"message\">{{ 'yuv.app.drive.empty.results.details.message' | translate }}</div>\n } @else {\n <div class=\"message\">{{ 'yuv.app.drive.unselected.details' | translate }}</div>\n }\n }\n </ng-template>\n</yvc-split-view>\n", styles: [":host{--files-button-padding: calc(var(--app-pane-padding) / 4);--files-button-border-radius: 2px;--files-button-gap: calc(var(--app-pane-padding) / 4);--files-icon-size: 20px;height:100%;overflow:hidden;display:flex;flex-flow:column}:host.searchFocused header>nav .search{grid-column:-1/-3}:host header{flex:0 0 auto}:host header>nav{background-color:var(--app-drive-header-background);border-block-end:1px solid var(--panel-divider-color);display:grid;grid-template-columns:auto 1fr 1fr auto;align-items:center;gap:calc(var(--app-pane-padding) / 2);padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2)}:host header>nav .nav{grid-column:1/2;grid-row:1;display:flex;align-items:center;gap:var(--files-button-gap)}:host header>nav .nav button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host header>nav .nav button yvc-icon{--icon-size: var(--files-icon-size)}:host header>nav .breadcrumb{grid-column:2/4;grid-row:1;align-self:stretch;display:flex;align-items:center;border-radius:var(--files-button-border-radius);padding:0 .5em;border:1px solid var(--panel-divider-color)}:host header>nav .search{grid-column:-1/-2;grid-row:1;z-index:1}:host yvc-split-view{flex:1;animation:fade-in .3s ease-in-out}:host ymd-ribbon{--ribbon-button-padding: var(--files-button-padding);--ribbon-button-border-radius: var(--files-button-border-radius);--ribbon-button-gap: var(--files-button-gap);--ribbon-icon-size: var(--files-icon-size)}:host ymd-ribbon .options{grid-area:options;display:flex;gap:var(--files-button-gap);align-items:center}:host ymd-ribbon .options yuv-tile-config-trigger{--icon-size: var(--files-icon-size);--button-padding: var(--files-button-padding)}:host ymd-ribbon .options button{padding:var(--files-button-padding);border-radius:var(--files-button-border-radius)}:host ymd-ribbon .options button yvc-icon{--icon-size: var(--files-icon-size)}:host ymd-ribbon .options button.toggle.enabled{background-color:var(--item-focus-background-color)}:host main{height:100%;overflow:hidden;display:flex;flex-flow:column}:host main yvc-master-details{flex:1;overflow:hidden;box-sizing:border-box}:host .error{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .error p{max-width:31ch;line-height:1.5em;display:grid;justify-items:center}:host .error p yvc-icon{--icon-size: 48px;display:block;margin-block-end:1rem}:host .files{display:flex;flex-flow:column;overflow:hidden;height:100%}:host .files header{flex:0 0 auto;padding:var(--app-pane-padding);display:grid;grid-template-columns:2fr max-content;grid-template-rows:auto auto 1fr;gap:0;grid-auto-flow:row;grid-template-areas:\"title sort\" \"searchfilter searchfilter\" \"flavours flavours\"}:host .files header h1{grid-area:title;margin:0;padding:0;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .files header .flavors{grid-area:flavors;display:flex;gap:2px;justify-content:flex-end;padding:calc(var(--app-pane-padding) / 4)}:host .files header .flavors yuv-flavor-chip{font-size:var(--font-hint);cursor:pointer;--flavor-background: var(--panel-background);--flavor-icon-size: 16px}:host .files header .flavors yuv-flavor-chip:hover{--flavor-border-color: var(--color-accent)}:host .files header ymd-sort{grid-area:sort}:host .files header ymd-search-filter{grid-area:searchfilter}:host .files yuv-tile-list{flex:1;overflow:hidden}:host .message{display:grid;justify-items:center;align-items:center;height:100%;padding:0 2rem;text-align:center;color:var(--text-color-caption)}:host .message p{max-width:31ch;line-height:1.5em}:host yvc-split-view{height:100%;box-sizing:border-box}:host ymd-folder-tree,:host yuv-object-summary{height:100%;overflow-y:auto;box-sizing:border-box}:host yuv-tile-list{--tile-border: 1px solid var(--panel-divider-color);--tile-border-width: 0 0 1px 0;--tile-padding: calc(var(--app-pane-padding) / 2);--tile-icon-size: 18px;--tile-action-icon-size: 18px;--paging-background: var(--panel-background-lightgrey)}:host p.empty{color:var(--text-color-caption)}:host .details{height:100%}:host .details yuv-object-details{height:100%}:host.smallScreen yuv-tile-list{--tile-padding: var(--app-pane-padding) !important}@keyframes fade-in{0%{opacity:0}}\n"] }]
|
|
373
|
+
}], ctorParameters: () => [], propDecorators: { searchFocused: [{
|
|
374
|
+
type: HostBinding,
|
|
375
|
+
args: ['class.searchFocused']
|
|
376
|
+
}] } });
|
|
377
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcHBzL2RyaXZlL3NyYy9saWIvcGFnZXMvZmlsZXMvZmlsZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcHBzL2RyaXZlL3NyYy9saWIvcGFnZXMvZmlsZXMvZmlsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVyRCxPQUFPLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUNMLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBR2hCLGFBQWEsRUFFYixVQUFVLEVBQ1YsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixRQUFRLEVBR1IsVUFBVSxFQUNWLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFVLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0s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LEVBQUUscUJBQXFCO3FCQUM3Qzt3REF1RG1DLGFBQWE7c0JBQWhELFdBQVc7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBIb3N0QmluZGluZywgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBTaWduYWwsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtTWFwLCBSb3V0ZXIsIFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBBcHBDYWNoZVNlcnZpY2UsXG4gIEJhc2VPYmplY3RUeXBlRmllbGQsXG4gIENsaXBib2FyZFNlcnZpY2UsXG4gIENvbmZpZ1R5cGVPcHRpb24sXG4gIERldmljZVNjcmVlbixcbiAgRGV2aWNlU2VydmljZSxcbiAgRG1zT2JqZWN0LFxuICBEbXNTZXJ2aWNlLFxuICBFdmVudFNlcnZpY2UsXG4gIE9iamVjdENvbmZpZ1NlcnZpY2UsXG4gIE9wZXJhdG9yLFxuICBSZXNvbHZlZE9iamVjdENvbmZpZyxcbiAgU2VhcmNoUXVlcnksXG4gIFN5c3RlbVR5cGUsXG4gIFRyYW5zbGF0ZU1vZHVsZSxcbiAgVHJhbnNsYXRlU2VydmljZSxcbiAgWXV2RXZlbnRUeXBlXG59IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgQWN0aW9uLCBBY3Rpb25zU2VydmljZSwgQkFTRV9BQ1RJT04gfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvYWN0aW9ucyc7XG5pbXBvcnQgeyBGaWxlRHJvcFpvbmVEaXJlY3RpdmUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvY29tbW9uJztcbmltcG9ydCB7IFlVVl9JQ09OUyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9pY29ucyc7XG5pbXBvcnQgeyBNdWx0aU9iamVjdFN1bW1hcnlDb21wb25lbnQsIE9iamVjdFN1bW1hcnlDb21wb25lbnQgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvb2JqZWN0LXN1bW1hcnknO1xuaW1wb3J0IHsgU2ltcGxlU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL3NpbXBsZS1zZWFyY2gnO1xuaW1wb3J0IHsgVGlsZUNvbmZpZ1RyaWdnZXJDb21wb25lbnQsIFRpbGVEYXRhLCBUaWxlTGlzdENvbXBvbmVudCwgVGlsZUxpc3RDb25maWdPcHRpb25zLCBUaWxlTGlzdEhpZ2hsaWdodCB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay90aWxlLWxpc3QnO1xuaW1wb3J0IHsgT2JqZWN0Rmxhdm9yLCBTaGVsbFNlcnZpY2UgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlJztcbmltcG9ydCB7IElDT05TLCBZdmNJY29uTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvb3ZlcmZsb3ctbWVudSc7XG5pbXBvcnQgeyBTcGxpdFZpZXdDb21wb25lbnQsIFNwbGl0Vmlld0xheW91dFNldHRpbmdzLCBZdmNTcGxpdFZpZXdNb2R1bGUgfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvc3BsaXQtdmlldyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwLCBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYkNvbXBvbmVudCwgU29ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgQWRkQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hZGQtYnV0dG9uL2FkZC1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEZvbGRlclRyZWVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2ZvbGRlci10cmVlL2ZvbGRlci10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSaWJib25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JpYmJvbi9yaWJib24uY29tcG9uZW50JztcbmltcG9ydCB7IEFQUF9EUklWRV9JQ09OUyB9IGZyb20gJy4uLy4uL2RyaXZlLmljb25zJztcbmltcG9ydCB7IEFDVElPTl9DT05URVhULCBBUFBfSUQsIEFQUF9TQ0hFTUEgfSBmcm9tICcuLi8uLi9kcml2ZS5zY2hlbWEnO1xuaW1wb3J0IHsgRFJJVkVfRVZFTlQsIERSSVZFX1FVRVJZX0ZPTERFUl9JRCwgRFJJVkVfUk9PVF9GT0xERVJfSUQsIERyaXZlRm9sZGVySWQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcml2ZS9kcml2ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJpdmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJpdmUvZHJpdmUuc2VydmljZSc7XG5pbXBvcnQgeyBTVE9SRURfUVVFUllfSURfUFJFRklYIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS5kYXRhJztcbmltcG9ydCB7IFN0b3JlZFF1ZXJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU3RvcmVkUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2VhcmNoLWZpbHRlci9zZWFyY2gtZmlsdGVyLmNvbXBvbmVudCc7XG5cbmNvbnN0IGNvbXBvbmVudHMgPSBbXG4gIFRpbGVMaXN0Q29tcG9uZW50LFxuICBCcmVhZGNydW1iQ29tcG9uZW50LFxuICBGb2xkZXJUcmVlQ29tcG9uZW50LFxuICBPYmplY3RTdW1tYXJ5Q29tcG9uZW50LFxuICBUaWxlQ29uZmlnVHJpZ2dlckNvbXBvbmVudCxcbiAgUmliYm9uQ29tcG9uZW50LFxuICBBZGRCdXR0b25Db21wb25lbnQsXG4gIFNpbXBsZVNlYXJjaENvbXBvbmVudCxcbiAgTXVsdGlPYmplY3RTdW1tYXJ5Q29tcG9uZW50LFxuICBTb3J0Q29tcG9uZW50LFxuICBTZWFyY2hGaWx0ZXJDb21wb25lbnRcbl07XG5cbmNvbnN0IG1vZHVsZSA9IFtZdmNJY29uTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIFJvdXRlck1vZHVsZSwgWXZjU3BsaXRWaWV3TW9kdWxlXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneW1kLWZpbGVzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nQ2xhc3MsIEFzeW5jUGlwZSwgLi4ubW9kdWxlLCAuLi5jb21wb25lbnRzLCBGaWxlRHJvcFpvbmVEaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZmlsZXMuY29tcG9uZW50LnNjc3MnLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5zbWFsbFNjcmVlbl0nOiAnc21hbGxTY3JlZW5MYXlvdXQoKSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlc1BhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICB0aWxlTGlzdCA9IHZpZXdDaGlsZDxUaWxlTGlzdENvbXBvbmVudD4oJ3RpbGVMaXN0Jyk7XG5cbiAgI0xBWU9VVF9TRVRUSU5HU19TVE9SQUdFX0tFWSA9ICd5dXYuYXBwLmRyaXZlLmZpbGVzLmxheW91dCc7XG5cbiAgcHJpdmF0ZSBzaGVsbFNlcnZpY2UgPSBpbmplY3QoU2hlbGxTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkbXNTZXJ2aWNlID0gaW5qZWN0KERtc1NlcnZpY2UpO1xuICBwcml2YXRlIGRyaXZlID0gaW5qZWN0KERyaXZlU2VydmljZSk7XG4gIHByaXZhdGUgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzdG9yZWRRdWVyeVNlcnZpY2UgPSBpbmplY3QoU3RvcmVkUXVlcnlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjbGlwYm9hcmQgPSBpbmplY3QoQ2xpcGJvYXJkU2VydmljZSk7XG4gIHByaXZhdGUgYWN0aW9uc1NlcnZpY2UgPSBpbmplY3QoQWN0aW9uc1NlcnZpY2UpO1xuICByZWFkb25seSAjb2JqZWN0Q29uZmlnU2VydmljZSA9IGluamVjdChPYmplY3RDb25maWdTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2RldmljZSA9IGluamVjdChEZXZpY2VTZXJ2aWNlKTtcblxuICByZWFkb25seSAjZXZlbnRTZXJ2aWNlID0gaW5qZWN0KEV2ZW50U2VydmljZSk7XG5cbiAgcmVhZG9ubHkgRVJST1JfQ09ERSA9IHtcbiAgICBOT1RfRk9VTkQ6ICc0MDQnLFxuICAgIC8vIHBhdHRlcm46IHtIVFRQX1NUQVRVU19DT0RFfS17U0VSVklDRV9FUlJPUl9DT0RFfVxuICAgIElOVkFMSURfSUQ6ICc0MjItMjkxMidcbiAgfTtcblxuICAjYXBwQ2FjaGUgPSBpbmplY3QoQXBwQ2FjaGVTZXJ2aWNlKTtcblxuICBvYmplY3RDb25maWdCdWNrZXQ6IHN0cmluZyA9IEFQUF9TQ0hFTUEuaWQ7XG5cbiAgc3BsaXRWaWV3Q21wID0gdmlld0NoaWxkLnJlcXVpcmVkKFNwbGl0Vmlld0NvbXBvbmVudCk7XG4gIHNlbGVjdGVkID0gc2lnbmFsPERtc09iamVjdCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgZmlsZURyb3BTdW1tYXJ5RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5zZWxlY3RlZCgpPy5wZXJtaXNzaW9ucz8ud3JpdGVDb250ZW50KTtcbiAgZGlzYWJsZUNyZWF0ZSA9IGZhbHNlO1xuXG4gIGFjdGlvbnMgPSB0aGlzLmRyaXZlLnN0YXRlJC5hY3Rpb25zO1xuICBzZWxlY3Rpb24gPSB0aGlzLmRyaXZlLnN0YXRlJC5zZWxlY3Rpb247XG5cbiAgYnVzeSA9IHRoaXMuZHJpdmUuc3RhdGUkLmJ1c3k7XG4gIGZsYXZvckNoaXBzOiBPYmplY3RGbGF2b3JbXSA9IHRoaXMuc2hlbGxTZXJ2aWNlLmdldE9iamVjdEZsYXZvcnMoKTtcbiAgYXBwbGllZEZsYXZvcj86IE9iamVjdEZsYXZvcjtcblxuICBzZWxlY3Rpb25BY3Rpb25zID0gY29tcHV0ZWQoKCkgPT4gKHsgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbigpLCBhY3Rpb25zOiB0aGlzLmFjdGlvbnMoKSB9KSk7XG5cbiAgZW1wdHlNb2RlID0gc2lnbmFsPERyaXZlRm9sZGVySWQgfCBudWxsPihudWxsKTtcbiAgLy8gZXJyb3IgY29kZSB3aGVuIGxvYWRpbmcgdGhlIG9iamVjdCBmYWlsZWQuIFRoaXMgd2lsbCBiZSB1c2VkXG4gIC8vIHRvIGRldGVybWluZSBhIHByb3BlciBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXlcbiAgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIGNvbmZpZ1R5cGVPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb25maWdUeXBlT3B0aW9uPiA9IHtcbiAgICBmb2xkZXI6IHsgYnVja2V0OiBBUFBfSUQsIHR5cGU6IEFQUF9TQ0hFTUEudHlwZXNbJ2ZvbGRlciddIH0sXG4gICAgZmlsZTogeyBidWNrZXQ6IEFQUF9JRCwgdHlwZTogQVBQX1NDSEVNQS50eXBlc1snZmlsZSddIH1cbiAgfTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlYXJjaEZvY3VzZWQnKSBzZWFyY2hGb2N1c2VkID0gZmFsc2U7XG5cbiAgY3VycmVudEZvbGRlcklEPzogc3RyaW5nO1xuICBjdXJyZW50Rm9sZGVyPzogRG1zT2JqZWN0O1xuICBlbmFibGVEZXRhaWxzID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICBlbmFibGVUcmVlID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICB0aWxlQ29uZmlnQnVja2V0TGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLnRpbGUtY29uZmlnLmJ1Y2tldCcpO1xuXG4gIHNtYWxsU2NyZWVuTGF5b3V0ID0gc2lnbmFsKGZhbHNlKTtcbiAgc29ydE9wdGlvbnNBdmFpbGFibGUgPSBzaWduYWwodHJ1ZSk7XG5cbiAgaWQgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBoaWdobGlnaHRTdHlsZXMkOiBPYnNlcnZhYmxlPFRpbGVMaXN0SGlnaGxpZ2h0W10+ID0gdGhpcy5jbGlwYm9hcmQuY2xpcGJvYXJkJChBUFBfSUQpLnBpcGUoXG4gICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgbWFwKChjKSA9PiB7XG4gICAgICByZXR1cm4gYyAmJiBjLm1vZGUgJiYgYy5vYmplY3RzPy5sZW5ndGhcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNzc1N0eWxlczogdGhpcy4jaGlnaGxpZ2h0U3R5bGVzW2M/Lm1vZGVdLFxuICAgICAgICAgICAgICBpZHM6IGMub2JqZWN0cy5tYXAoKG8pID0+IG8uaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICA6IFtdO1xuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgI2hpZ2hsaWdodFN0eWxlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICAgIGN1dDogeyBvcGFjaXR5OiAwLjUgfVxuICB9O1xuXG4gICNyb3V0ZUlkRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMuaWQoKSB8fCB1bmRlZmluZWQ7XG5cbiAgICB1bnRyYWNrZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHBhcmFtID09PSBEUklWRV9RVUVSWV9GT0xERVJfSUQpIHtcbiAgICAgICAgdGhpcy5lbXB0eU1vZGUuc2V0KERSSVZFX1FVRVJZX0ZPTERFUl9JRCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbXB0eU1vZGUuc2V0KHBhcmFtID09PSBEUklWRV9ST09UX0ZPTERFUl9JRCA/IERSSVZFX1JPT1RfRk9MREVSX0lEIDogbnVsbCk7XG4gICAgICB0aGlzLmVycm9yLnNldCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kaXNhYmxlQ3JlYXRlID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRGb2xkZXJJRCA9IHBhcmFtO1xuICAgICAgdGhpcy5kcml2ZS51cGRhdGVDdXJyZW50Rm9sZGVyKHRoaXMuY3VycmVudEZvbGRlcklEKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmN1cnJlbnRGb2xkZXIgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVySUQgPT09IERSSVZFX1JPT1RfRk9MREVSX0lEKSB0aGlzLmN1cnJlbnRGb2xkZXJJRCA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHRoaXMuY3VycmVudEZvbGRlcklEKSB7XG4gICAgICAgIHRoaXMuZG1zU2VydmljZS5nZXREbXNPYmplY3QodGhpcy5jdXJyZW50Rm9sZGVySUQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKG86IERtc09iamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9sZGVyID0gbztcbiAgICAgICAgICAgIHRoaXMuX3NldEZvbGRlclF1ZXJ5KHRoaXMuI2dldFRpdGxlKG8pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyBmb2xkZXInLCBlKTtcbiAgICAgICAgICAgIHRoaXMuI3Byb2Nlc3NMb2FkRXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB0aGlzLl9zZXRGb2xkZXJRdWVyeSh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuYXBwLmRyaXZlLmZvbGRlci10cmVlLm15ZHJpdmUnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRpbGVMaXN0T3B0aW9uczogVGlsZUxpc3RDb25maWdPcHRpb25zID0ge1xuICAgIGFjdGlvbkNvbnRleHQ6IEFDVElPTl9DT05URVhULFxuICAgIGNvbmZpZ1R5cGVzOiBPYmplY3QudmFsdWVzKEFQUF9TQ0hFTUEudHlwZXMpLFxuICAgIGNvbmZpZ0ZsYXZvcnM6IFsuLi50aGlzLnNoZWxsU2VydmljZS5nZXRPYmplY3RGbGF2b3JzKCksIC4uLkFQUF9TQ0hFTUEuZmxhdm9ycy5maWx0ZXIoKGYpID0+ICFmLmFwcGxpY2FibGVUbykubWFwKChmKSA9PiAoeyAuLi5mLCBhcHA6IEFQUF9JRCB9KSldXG4gIH07XG5cbiAgcXVlcnkgPSB0aGlzLmRyaXZlLnN0YXRlJC5xdWVyeTtcbiAgcXVlcnlUaXRsZSA9IHRoaXMuZHJpdmUuc3RhdGUkLnF1ZXJ5VGl0bGU7XG5cbiAgaWNvbnMgPSB7XG4gICAgLi4uQVBQX0RSSVZFX0lDT05TLFxuICAgIHNvcnQ6IEFQUF9EUklWRV9JQ09OUy5zb3J0LFxuICAgIGJhY2s6IFlVVl9JQ09OUy5iYWNrLFxuICAgIGF0dGVudGlvbjogWVVWX0lDT05TLmF0dGVudGlvbixcbiAgICByZWZyZXNoOiBZVVZfSUNPTlMucmVmcmVzaCxcbiAgICBjbGVhcjogSUNPTlMuY2xlYXJcbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRyaXZlLmV2ZW50cyQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIGlmIChlID09PSBEUklWRV9FVkVOVC5yZWZyZXNoKSB7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuI2RldmljZS5zY3JlZW5DaGFuZ2UkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoczogRGV2aWNlU2NyZWVuKSA9PiB7XG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW5MYXlvdXQuc2V0KHMuc2l6ZSA9PT0gJ3MnICYmIHMub3JpZW50YXRpb24gPT09ICdwb3J0cmFpdCcpO1xuICAgICAgICB0aGlzLmVuYWJsZURldGFpbHMuc2V0KCF0aGlzLnNtYWxsU2NyZWVuTGF5b3V0KCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMuZHJpdmUuc3RhdGUkLnNlbGVjdGlvbilcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChzZWw6IERtc09iamVjdFtdKSA9PiB7XG4gICAgICAgICAgaWYgKHNlbD8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVMaXN0KCk/LmNsZWFyU2VsZWN0aW9uKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocDogUGFyYW1NYXApID0+IHtcbiAgICAgICAgdGhpcy5zb3J0T3B0aW9uc0F2YWlsYWJsZS5zZXQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snaWQnXSA9PT0gRFJJVkVfUVVFUllfRk9MREVSX0lEKSB7XG4gICAgICAgICAgY29uc3QgcSA9IHAuZ2V0KCdxJyk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlQ3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcXVlcnkgaXMgYSBzdG9yZWQgcXVlcnlcbiAgICAgICAgICBpZiAocT8uc3RhcnRzV2l0aChTVE9SRURfUVVFUllfSURfUFJFRklYKSkge1xuICAgICAgICAgICAgY29uc3Qgc3E6IFN0b3JlZFF1ZXJ5IHwgdW5kZWZpbmVkID0gdGhpcy5zdG9yZWRRdWVyeVNlcnZpY2UuZ2V0U3RvcmVkUXVlcnkocSk7XG4gICAgICAgICAgICBpZiAoc3EpIHtcbiAgICAgICAgICAgICAgdGhpcy5kcml2ZS51cGRhdGVRdWVyeShzcS5xdWVyeSwgc3EubGFiZWwpO1xuICAgICAgICAgICAgICB0aGlzLnNvcnRPcHRpb25zQXZhaWxhYmxlLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHEpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydE9wdGlvbnNBdmFpbGFibGUuc2V0KHRydWUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3E6IFNlYXJjaFF1ZXJ5ID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQocSkpO1xuICAgICAgICAgICAgICBzcS5maWx0ZXJzID0gKHNxLmZpbHRlcnMgfHwgW10pLmZpbHRlcigoZikgPT4gZi5mICE9PSBCYXNlT2JqZWN0VHlwZUZpZWxkLlBBUkVOVF9JRCk7XG4gICAgICAgICAgICAgIHRoaXMuZHJpdmUudXBkYXRlUXVlcnkoc3EsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuZmlsZXMuc2VhcmNoLnJlc3VsdC50aXRsZScpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHF1ZXJ5JywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLiNldmVudFNlcnZpY2VcbiAgICAgIC5vbihZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVEKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICB0YXAoKGUpID0+IHtcbiAgICAgICAgICB0aGlzLnRpbGVMaXN0KCk/LnVwZGF0ZVRpbGVMaXN0KFtlLmRhdGFdKTtcbiAgICAgICAgICBlLmRhdGEuaWQgPT09IHRoaXMuc2VsZWN0ZWQoKT8uaWQgJiYgdGhpcy5zZWxlY3RlZC5zZXQoZS5kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9uRmlsdGVyUXVlcnlDaGFuZ2UocTogU2VhcmNoUXVlcnkpIHtcbiAgICB0aGlzLmRyaXZlLnVwZGF0ZVF1ZXJ5KHEsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5hcHAuZHJpdmUuZmlsZXMuc2VhcmNoLnJlc3VsdC50aXRsZScpKTtcbiAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbXSk7XG4gIH1cblxuICAjcHJvY2Vzc0xvYWRFcnJvcihlOiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgIGlmIChgJHtlLnN0YXR1c31gICE9PSB0aGlzLkVSUk9SX0NPREUuTk9UX0ZPVU5EKSB7XG4gICAgICB0aGlzLmVycm9yLnNldChgJHtlLnN0YXR1c30tJHtlLmVycm9yPy5zZXJ2aWNlRXJyb3JDb2RlIHx8ICcnfWApO1xuICAgIH0gZWxzZSB0aGlzLmVycm9yLnNldCh0aGlzLkVSUk9SX0NPREUuTk9UX0ZPVU5EKTtcbiAgfVxuXG4gICNnZXRUaXRsZShvOiBEbXNPYmplY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNmZ1R5cGU6IENvbmZpZ1R5cGVPcHRpb24gPSBvLmlzRm9sZGVyID8gdGhpcy5jb25maWdUeXBlT3B0aW9uc1snZm9sZGVyJ10gOiB0aGlzLmNvbmZpZ1R5cGVPcHRpb25zWydmaWxlJ107XG4gICAgY29uc3Qgb2M6IFJlc29sdmVkT2JqZWN0Q29uZmlnID0gdGhpcy4jb2JqZWN0Q29uZmlnU2VydmljZS5nZXRSZXNvbHZlZE9iamVjdENvbmZpZyhvLmRhdGEsIGNmZ1R5cGUudHlwZSwgY2ZnVHlwZS5idWNrZXQsIHRydWUpO1xuICAgIHJldHVybiBvYy50aXRsZS52YWx1ZTtcbiAgfVxuXG4gIG9uRGVsZXRlKCkge1xuICAgIGNvbnN0IGRlbGV0ZUFjdGlvbiA9IHRoaXMuYWN0aW9ucygpLmZpbmQoKGEpID0+IGEuaWQgPT09IEJBU0VfQUNUSU9OLmRlbGV0ZSk7XG4gICAgaWYgKGRlbGV0ZUFjdGlvbikgZGVsZXRlQWN0aW9uLnJ1bih0aGlzLmRyaXZlLnN0YXRlJC5zZWxlY3Rpb24oKSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRGb2xkZXJRdWVyeShxdWVyeVRpdGxlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kcml2ZS51cGRhdGVRdWVyeShcbiAgICAgIHtcbiAgICAgICAgZmlsdGVyczogW3sgZjogQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfSUQsIG86IE9wZXJhdG9yLkVRVUFMLCB2MTogdGhpcy5jdXJyZW50Rm9sZGVySUQgfHwgbnVsbCB9XVxuICAgICAgfSxcbiAgICAgIHF1ZXJ5VGl0bGVcbiAgICApO1xuICB9XG5cbiAgb25Db250ZXh0bWVudSh7IGV2ZW50IH06IHsgZXZlbnQ6IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQgfSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5hY3Rpb25zU2VydmljZS5vcGVuQ29udGV4dE1lbnUodGhpcy5hY3Rpb25zLCAoYTogQWN0aW9uKSA9PiBhLnJ1bih0aGlzLnNlbGVjdGlvbigpKSwgeyB4OiBldmVudC54LCB5OiBldmVudC55IH0pO1xuICB9XG5cbiAgb25GaWxlRHJvcChmaWxlczogRmlsZVtdKSB7XG4gICAgdGhpcy5kcml2ZS5zZXRCdXN5KHRydWUpO1xuICAgIHRoaXMuZHJpdmUuY2hlY2tOYW1lc0FuZFVwbG9hZChmaWxlcykuc3Vic2NyaWJlKHsgY29tcGxldGU6ICgpID0+IHRoaXMuZHJpdmUuc2V0QnVzeShmYWxzZSkgfSk7XG4gIH1cblxuICBvbkZpbGVVcGRhdGVEcm9wKGZpbGU6IEZpbGVbXSkge1xuICAgIGNvbnN0IGRtc09iamVjdCA9IHRoaXMuc2VsZWN0ZWQoKTtcbiAgICBpZiAoZG1zT2JqZWN0KSB7XG4gICAgICB0aGlzLmRyaXZlLnNldEJ1c3kodHJ1ZSk7XG4gICAgICB0aGlzLmRyaXZlXG4gICAgICAgIC51cGxvYWRDb250ZW50KGRtc09iamVjdC5pZCwgZmlsZVswXSlcbiAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5kcml2ZS5zZXRCdXN5KGZhbHNlKSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBpdGVtRm9jdXNlZCh0aWxlOiBUaWxlRGF0YSkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRpbGUpO1xuICB9XG5cbiAgaXRlbUNsaWNrZWQodGlsZTogVGlsZURhdGEpIHtcbiAgICBpZiAodGhpcy5zbWFsbFNjcmVlbkxheW91dCgpKSB0aGlzLml0ZW1Eb3VibGVDbGlja2VkKHRpbGUpO1xuICB9XG5cbiAgb25Db3B5KHRpbGVzOiBUaWxlRGF0YVtdKSB7XG4gICAgdGhpcy5jbGlwYm9hcmQuYWRkT2JqZWN0cyhcbiAgICAgIHRpbGVzLm1hcCgodCkgPT4gdC5kbXNPYmplY3QpLFxuICAgICAgJ2NvcHknLFxuICAgICAgQVBQX0lEXG4gICAgKTtcbiAgfVxuXG4gIG9uQ3V0KHRpbGVzOiBUaWxlRGF0YVtdKSB7XG4gICAgdGhpcy5jbGlwYm9hcmQuYWRkT2JqZWN0cyhcbiAgICAgIHRpbGVzLm1hcCgodCkgPT4gdC5kbXNPYmplY3QpLFxuICAgICAgJ2N1dCcsXG4gICAgICBBUFBfSURcbiAgICApO1xuICB9XG5cbiAgb25RdWVyeVN1Ym1pdChxOiBTZWFyY2hRdWVyeSkge1xuICAgIC8vIGluIG9yZGVyIHRvIGtlZXAgdGhlIHF1ZXJ5IGluIHRoZSB1cmwgYXMgc2hvcnQgYXNcbiAgICAvLyBwb3NzaWJsZSB3ZSdsbCBnZXQgcmlkIG9mIHRoZSBmaWVsZHMgYmVjYXVzZSB0aGV5IGNvdWxkIGJlXG4gICAgLy8gcmUtYXBwbGllZCBsYXRlciBvblxuICAgIHEuZmllbGRzID0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLicsICdxdWVyeSddLCB7XG4gICAgICBxdWVyeVBhcmFtczogeyBxOiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocSkpIH0sXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlXG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3Rpb25DaGFuZ2VkKHRpbGVzOiBUaWxlRGF0YVtdKSB7XG4gICAgaWYgKHRpbGVzLmxlbmd0aCA9PT0gMSkgdGhpcy5sb2FkRGV0YWlscyh0aWxlc1swXS5pZCk7XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgICAgaWYgKHRpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRyaXZlLnNldEJ1c3kodHJ1ZSk7XG4gICAgICAgIHRoaXMuZG1zU2VydmljZS5nZXREbXNPYmplY3RzKHRpbGVzLm1hcCgoaSkgPT4gaS5pZCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKG86IERtc09iamVjdFtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyaXZlLnNldEJ1c3koZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kcml2ZS5zZXRTZWxlY3Rpb24obyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpdGVtRG91YmxlQ2xpY2tlZCh0aWxlOiBUaWxlRGF0YSkge1xuICAgIGlmICh0aWxlLmluc3RhbmNlRGF0YSkge1xuICAgICAgdGhpcy5kcml2ZS5zZXRCdXN5KHRydWUpO1xuICAgICAgY29uc3QgbmF2ID0gKHRpbGUuaW5zdGFuY2VEYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuQkFTRV9UWVBFX0lEXSBhcyBzdHJpbmcpID09PSBTeXN0ZW1UeXBlLkZPTERFUiA/IFsnLi4nXSA6IFsnLi4vLi4nLCAnb2JqZWN0J107XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbLi4ubmF2LCB0aWxlLmluc3RhbmNlRGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9JRF1dLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSkudGhlbigoKSA9PiB0aGlzLmRyaXZlLnNldEJ1c3koZmFsc2UpKTtcbiAgICB9XG4gIH1cblxuICBsb2FkRGV0YWlscyhpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zaGVsbFNlcnZpY2UuYWRkQnVzeSgpO1xuICAgIC8vIGxvYWQgdGhlIGRtcyBvYmplY3RcbiAgICB0aGlzLmRtc1NlcnZpY2UuZ2V0RG1zT2JqZWN0KGlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKG86IERtc09iamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNldChvKTtcbiAgICAgICAgdGhpcy5zaGVsbFNlcnZpY2UucmVtb3ZlQnVzeSgpO1xuICAgICAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbb10pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5kcml2ZS5zZXRTZWxlY3Rpb24oW10pO1xuICB9XG5cbiAgb3BlblBhcmVudCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50Rm9sZGVyKSB7XG4gICAgICB0aGlzLmRyaXZlLnNldEJ1c3kodHJ1ZSk7XG4gICAgICB0aGlzLnJvdXRlclxuICAgICAgICAubmF2aWdhdGUoWycuLicsIHRoaXMuY3VycmVudEZvbGRlci5kYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuUEFSRU5UX0lEXSB8fCBEUklWRV9ST09UX0ZPTERFUl9JRF0sIHtcbiAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kcml2ZS5zZXRCdXN5KGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0QnVzeShidXN5OiBib29sZWFuKSB7XG4gICAgdGhpcy5kcml2ZS5zZXRCdXN5KGJ1c3kpO1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLnRpbGVMaXN0KCk/LnJlZnJlc2goKTtcbiAgICB0aGlzLmRyaXZlLnNldFNlbGVjdGlvbihbXSk7XG4gIH1cblxuICBvbkxheW91dFNldHRpbmdzQ2hhbmdlKGU6IGFueSkge1xuICAgIHRoaXMuI2FwcENhY2hlLnNldEl0ZW0odGhpcy4jTEFZT1VUX1NFVFRJTkdTX1NUT1JBR0VfS0VZLCBlKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gICNhcHBseUxheW91dFNldHRpbmdzKHNldHRpbmdzOiBTcGxpdFZpZXdMYXlvdXRTZXR0aW5ncykge1xuICAgIHRoaXMuc3BsaXRWaWV3Q21wKCkuYXBwbHlMYXlvdXRTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jYXBwQ2FjaGUuZ2V0SXRlbSh0aGlzLiNMQVlPVVRfU0VUVElOR1NfU1RPUkFHRV9LRVkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobHM6IFNwbGl0Vmlld0xheW91dFNldHRpbmdzKSA9PiB7XG4gICAgICAgIGlmIChscykge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRGV0YWlscy5zZXQobHMuYXJlYXNbMl0/LnZpc2libGUpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlVHJlZS5zZXQobHMuYXJlYXNbMF0/LnZpc2libGUpO1xuICAgICAgICAgIHRoaXMuI2FwcGx5TGF5b3V0U2V0dGluZ3MobHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsaXBib2FyZC5jbGVhcihBUFBfSUQpO1xuICB9XG59XG4iLCI8aGVhZGVyPlxuICA8IS0tIG5hdmlnYXRpb24gYmFyIC0tPlxuICA8bmF2IFthdHRyLmFyaWEtbGFiZWxdPVwiJ3l1di5hcHAuZHJpdmUuZmlsZXMubmF2aWFndGlvbi5hcmlhLmxhYmVsJyB8IHRyYW5zbGF0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJuYXZcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJiYWNrXCIgW2Rpc2FibGVkXT1cIiFjdXJyZW50Rm9sZGVyXCIgdGl0bGU9XCJ7eyAneXV2LmFwcC5kcml2ZS5maWxlcy5uYXYuYmFjay50b29sdGlwJyB8IHRyYW5zbGF0ZSB9fVwiIChjbGljayk9XCJvcGVuUGFyZW50KClcIj5cbiAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwiaWNvbnMuYmFja1wiPjwveXZjLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJyZWZyZXNoXCIgdGl0bGU9XCJ7eyAneXV2LmFwcC5kcml2ZS5maWxlcy5uYXYucmVmcmVzaC50b29sdGlwJyB8IHRyYW5zbGF0ZSB9fVwiIChjbGljayk9XCJyZWZyZXNoKClcIj5cbiAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwiaWNvbnMucmVmcmVzaFwiPjwveXZjLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoIXF1ZXJ5KCk/LnRlcm0pIHtcbiAgICAgIDx5bWQtYnJlYWRjcnVtYj48L3ltZC1icmVhZGNydW1iPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImJyZWFkY3J1bWJcIj48L2Rpdj5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxuICAgICAgPHl1di1zaW1wbGUtc2VhcmNoIFtxdWVyeV09XCJxdWVyeSgpXCIgKHF1ZXJ5U3VibWl0KT1cIm9uUXVlcnlTdWJtaXQoJGV2ZW50KVwiPjwveXV2LXNpbXBsZS1zZWFyY2g+XG4gICAgICA8IS0tIFRPRE86IGVuYWJsZSBhZ2FpbiBvbmNlIGRyaXZlIHNlYXJjaCBuZWVkcyB0byBiZSBhIGxpdHRsZSBiaXQgbW9yZSBzb3BoaXN0aWNhdGVkIC0tPlxuICAgICAgPCEtLSA8eW1kLWRyaXZlLXNlYXJjaCAoZm9jdXNlZCk9XCJzZWFyY2hGb2N1c2VkID0gJGV2ZW50XCI+PC95bWQtZHJpdmUtc2VhcmNoPiAtLT5cbiAgICA8L2Rpdj5cbiAgPC9uYXY+XG5cbiAgPCEtLSByaWJib24gd2l0aCBhY3Rpb25zIGFuZCBvcHRpb25zIC0tPlxuICA8eW1kLXJpYmJvbiBbb2JqZWN0c109XCJzZWxlY3Rpb24oKVwiIFtidXN5XT1cImJ1c3koKVwiIFtlbmFibGVDbGlwYm9hcmRdPVwidHJ1ZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSAjcHJpbWFyeUFjdGlvbnM+XG4gICAgICA8eW1kLWFkZC1idXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVDcmVhdGVcIj48L3ltZC1hZGQtYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3NlY29uZGFyeUFjdGlvbnM+XG4gICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiPlxuICAgICAgICBAaWYgKCFzbWFsbFNjcmVlbkxheW91dCgpKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtdHJlZSB0b2dnbGVcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBlbmFibGVkOiBlbmFibGVUcmVlKCkgfVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICd5dXYuYXBwLmRyaXZlLmZpbGVzLnRvZ2dsZXRyZWUudG9vbHRpcCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImVuYWJsZVRyZWUuc2V0KCFlbmFibGVUcmVlKCkpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy50b2dnbGVMZWZ0XCI+PC95dmMtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1kZXRhaWxzIHRvZ2dsZVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGVuYWJsZWQ6IGVuYWJsZURldGFpbHMoKSB9XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMudG9nZ2xlZGV0YWlscy50b29sdGlwJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZW5hYmxlRGV0YWlscy5zZXQoIWVuYWJsZURldGFpbHMoKSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx5dmMtaWNvbiBbc3ZnXT1cImljb25zLnRvZ2dsZVJpZ2h0XCI+PC95dmMtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICA8eXV2LXRpbGUtY29uZmlnLXRyaWdnZXJcbiAgICAgICAgICBbaWNvbl09XCJpY29ucy5zZXR0aW5nc1wiXG4gICAgICAgICAgW2J1Y2tldF09XCJvYmplY3RDb25maWdCdWNrZXRcIlxuICAgICAgICAgIFtidWNrZXRMYWJlbF09XCJ0aWxlQ29uZmlnQnVja2V0TGFiZWxcIlxuICAgICAgICAgIFtvcHRpb25zXT1cInRpbGVMaXN0T3B0aW9uc1wiXG4gICAgICAgID48L3l1di10aWxlLWNvbmZpZy10cmlnZ2VyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC95bWQtcmliYm9uPlxuPC9oZWFkZXI+XG5cbjx5dmMtc3BsaXQtdmlldyBbZ3V0dGVyU2l6ZV09XCIxXCIgKGxheW91dFNldHRpbmdzQ2hhbmdlKT1cIm9uTGF5b3V0U2V0dGluZ3NDaGFuZ2UoJGV2ZW50KVwiPlxuICA8IS0tIGZvbGRlciB0cmVlIC0tPlxuICA8bmctdGVtcGxhdGUgeXZjU3BsaXRBcmVhIFtzaXplXT1cIjIwXCIgW3Zpc2libGVdPVwiZW5hYmxlVHJlZSgpICYmICFzbWFsbFNjcmVlbkxheW91dCgpXCI+XG4gICAgPHltZC1mb2xkZXItdHJlZSB5dXZGb2N1c2FibGU9XCJUcmVlXCI+PC95bWQtZm9sZGVyLXRyZWU+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSBmaWxlcyAtLT5cbiAgPG5nLXRlbXBsYXRlIHl2Y1NwbGl0QXJlYSBbc2l6ZV09XCI2MFwiPlxuICAgIEBsZXQgZXJyID0gZXJyb3IoKTtcbiAgICBAaWYgKGVycikge1xuICAgICAgPGRpdiBjbGFzcz1cImVycm9yXCI+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDx5dmMtaWNvbiBbc3ZnXT1cImljb25zLmF0dGVudGlvblwiPjwveXZjLWljb24+XG4gICAgICAgICAgQHN3aXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBAY2FzZSAoRVJST1JfQ09ERS5OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgICAge3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuZXJyb3IubG9hZC5ub3QtZm91bmQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoRVJST1JfQ09ERS5JTlZBTElEX0lEKSB7XG4gICAgICAgICAgICAgIHt7ICd5dXYuYXBwLmRyaXZlLmZpbGVzLmVycm9yLmxvYWQuaW52YWxpZC1pZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAge3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuZXJyb3IubG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImZpbGVzXCIgW3l1dkZpbGVEcm9wWm9uZV09XCJ7IGxhYmVsOiAneXV2LmFwcC5kcml2ZS5maWxlcy5kcm9wem9uZS5sYWJlbCcgfCB0cmFuc2xhdGUgfVwiIChmaWxlRHJvcCk9XCJvbkZpbGVEcm9wKCRldmVudClcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImZpbGVzLWhlYWRlclwiPlxuICAgICAgICAgIDxoMT57eyBxdWVyeVRpdGxlKCkgfX08L2gxPlxuICAgICAgICAgIEBpZiAocXVlcnkoKT8udGVybSkge1xuICAgICAgICAgICAgPHltZC1zZWFyY2gtZmlsdGVyIFtxdWVyeV09XCJxdWVyeSgpXCIgKHF1ZXJ5Q2hhbmdlKT1cIm9uRmlsdGVyUXVlcnlDaGFuZ2UoJGV2ZW50KVwiPjwveW1kLXNlYXJjaC1maWx0ZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoc29ydE9wdGlvbnNBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgPHltZC1zb3J0IC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGF2b3JzXCI+XG4gICAgICAgICAgICA8IS0tIFRPRE86IGVuYWJsZSBhZ2FpbiBvbmNlIGZsYXZvcnMvYXNwZWN0cyBhcmUgc3VwcG9ydGVkIC0tPlxuICAgICAgICAgICAgPCEtLSAgQGZvciAoZiBvZiBmbGF2b3JDaGlwczsgdHJhY2sgZi5pZCkge1xuICAgICAgICAgICAgPHl1di1mbGF2b3ItY2hpcCBbbmdDbGFzc109XCJ7IGFjdGl2ZTogZi5pZCA9PT0gYXBwbGllZEZsYXZvcj8uaWQgfVwiIFtmbGF2b3JdPVwiZlwiIChjbGljayk9XCJhcHBsaWVkRmxhdm9yID0gZlwiPjwveXV2LWZsYXZvci1jaGlwPlxuICAgICAgICAgIH0tLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgPHl1di10aWxlLWxpc3RcbiAgICAgICAgICAjdGlsZUxpc3RcbiAgICAgICAgICBjbGFzcz1cInN0YWdnZXJlZFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIneXV2LmFwcC5kcml2ZS5maWxlcy5jb250ZW50LmFyaWEubGFiZWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiYnVzeSgpXCJcbiAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgKGtleWRvd24uZGVsZXRlKT1cIm9uRGVsZXRlKClcIlxuICAgICAgICAgIFtidWNrZXRdPVwib2JqZWN0Q29uZmlnQnVja2V0XCJcbiAgICAgICAgICBbbXVsdGlzZWxlY3RdPVwidHJ1ZVwiXG4gICAgICAgICAgW3F1ZXJ5XT1cInF1ZXJ5KClcIlxuICAgICAgICAgIFtmbGF2b3JdPVwiYXBwbGllZEZsYXZvclwiXG4gICAgICAgICAgW29wdGlvbnNdPVwidGlsZUxpc3RPcHRpb25zXCJcbiAgICAgICAgICAoaXRlbURibENsaWNrKT1cIml0ZW1Eb3VibGVDbGlja2VkKCRldmVudClcIlxuICAgICAgICAgIChpdGVtU2VsZWN0KT1cIml0ZW1DbGlja2VkKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoY29weSk9XCJvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgKGN1dCk9XCJvbkN1dCgkZXZlbnQpXCJcbiAgICAgICAgICAoYnVzeSk9XCJzZXRCdXN5KCRldmVudClcIlxuICAgICAgICAgIChjdHhNZW51KT1cIm9uQ29udGV4dG1lbnUoJGV2ZW50KVwiXG4gICAgICAgICAgW2hpZ2hsaWdodHNdPVwiaGlnaGxpZ2h0U3R5bGVzJCB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgI2VtcHR5PlxuICAgICAgICAgICAgQGlmIChlbXB0eU1vZGUoKSA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiZW1wdHlcIj57eyAneXV2LmFwcC5kcml2ZS5maWxlcy5jb250ZW50LmVtcHR5LnJvb3QubGlzdCcgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChlbXB0eU1vZGUoKSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5XCI+e3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuY29udGVudC5lbXB0eS5xdWVyeS5saXN0JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5XCI+e3sgJ3l1di5hcHAuZHJpdmUuZmlsZXMuY29udGVudC5lbXB0eS5saXN0JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC95dXYtdGlsZS1saXN0PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDwhLS0gZGV0YWlscyAtLT5cbiAgPG5nLXRlbXBsYXRlIHl2Y1NwbGl0QXJlYSBbc2l6ZV09XCIyMFwiIFt2aXNpYmxlXT1cImVuYWJsZURldGFpbHMoKVwiPlxuICAgIEBsZXQgc2VsZWN0ZWRJdGVtID0gc2VsZWN0ZWQoKTtcbiAgICBAaWYgKGVuYWJsZURldGFpbHMoKSAmJiBzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtPy5pc0ZvbGRlcikge1xuICAgICAgICA8eXV2LW9iamVjdC1zdW1tYXJ5IFtjb25maWdUeXBlXT1cImNvbmZpZ1R5cGVPcHRpb25zWydmb2xkZXInXVwiIFtkbXNPYmplY3RdPVwic2VsZWN0ZWRJdGVtXCI+PC95dXYtb2JqZWN0LXN1bW1hcnk+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHl1di1vYmplY3Qtc3VtbWFyeVxuICAgICAgICAgIFtjb25maWdUeXBlXT1cImNvbmZpZ1R5cGVPcHRpb25zWydmaWxlJ11cIlxuICAgICAgICAgIFtkbXNPYmplY3RdPVwic2VsZWN0ZWRJdGVtXCJcbiAgICAgICAgICBbeXV2RmlsZURyb3Bab25lXT1cInsgbGFiZWw6ICd5dXYuYXBwLmRyaXZlLmZpbGVzLmRyb3B6b25lLmNvbnRlbnQucmVwbGFjZS5sYWJlbCcgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgICAgW2ZpbGVEcm9wRGlzYWJsZWRdPVwiZmlsZURyb3BTdW1tYXJ5RGlzYWJsZWQoKVwiXG4gICAgICAgICAgKGZpbGVEcm9wKT1cIm9uRmlsZVVwZGF0ZURyb3AoJGV2ZW50KVwiXG4gICAgICAgID48L3l1di1vYmplY3Qtc3VtbWFyeT5cbiAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBsZXQgc2VsID0gc2VsZWN0aW9uKCk7XG4gICAgICBAaWYgKHNlbCAmJiBzZWwubGVuZ3RoID4gMCkge1xuICAgICAgICA8eXV2LW11bHRpLW9iamVjdC1zdW1tYXJ5IFtoZWFkbGluZV09XCIneXV2LmFwcC5kcml2ZS5tdWx0aXNlbGVjdGVkLmRldGFpbHMnIHwgdHJhbnNsYXRlOiB7IGNvdW50OiBzZWxlY3Rpb24oKS5sZW5ndGggfVwiPjwveXV2LW11bHRpLW9iamVjdC1zdW1tYXJ5PlxuICAgICAgfSBAZWxzZSBpZiAodGlsZUxpc3QoKT8uaXRlbXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICA8IS0tIFRPRE86IENIT1VMRCBIQVZFIEEgRElGRkVSRU5UIE1FU1NBR0UgRk9SIEVNUFRZIFJFU1VMVFMgRU1QVFkgRk9SIE5PVyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj57eyAneXV2LmFwcC5kcml2ZS5lbXB0eS5yZXN1bHRzLmRldGFpbHMubWVzc2FnZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPnt7ICd5dXYuYXBwLmRyaXZlLnVuc2VsZWN0ZWQuZGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvbmctdGVtcGxhdGU+XG48L3l2Yy1zcGxpdC12aWV3PlxuIl19
|