@clickview/reports 0.85.0-rc.0 → 0.85.0-rc.2

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.
Files changed (69) hide show
  1. package/dist/.vite/manifest.json +255 -255
  2. package/dist/bundles.json +1 -1
  3. package/dist/css/B6REaZgP.chunk.css +8 -0
  4. package/dist/en.json +1 -1
  5. package/dist/scripts/{adNSdUOa2.chunk.js → BCcIdtcy2.chunk.js} +2 -2
  6. package/dist/scripts/{adNSdUOa2.chunk.js.map → BCcIdtcy2.chunk.js.map} +1 -1
  7. package/dist/scripts/{CEteFkmm.chunk.js → BIlepbnA.chunk.js} +2 -2
  8. package/dist/scripts/{CEteFkmm.chunk.js.map → BIlepbnA.chunk.js.map} +1 -1
  9. package/dist/scripts/{BPMB_v0s2.chunk.js → BX5YDJVD2.chunk.js} +2 -2
  10. package/dist/scripts/{BPMB_v0s2.chunk.js.map → BX5YDJVD2.chunk.js.map} +1 -1
  11. package/dist/scripts/{CHNBnXs-2.chunk.js → BY9ZIRoW2.chunk.js} +2 -2
  12. package/dist/scripts/{CHNBnXs-2.chunk.js.map → BY9ZIRoW2.chunk.js.map} +1 -1
  13. package/dist/scripts/{P2dNpLmC2.chunk.js → BkkPVinl2.chunk.js} +2 -2
  14. package/dist/scripts/{P2dNpLmC2.chunk.js.map → BkkPVinl2.chunk.js.map} +1 -1
  15. package/dist/scripts/{CLXgS35R.chunk.js → BsAss53i.chunk.js} +2 -2
  16. package/dist/scripts/{CLXgS35R.chunk.js.map → BsAss53i.chunk.js.map} +1 -1
  17. package/dist/scripts/{Do88yXba.chunk.js → BsTmrvS_.chunk.js} +2 -2
  18. package/dist/scripts/{Do88yXba.chunk.js.map → BsTmrvS_.chunk.js.map} +1 -1
  19. package/dist/scripts/{B8cDqk3r.chunk.js → BzSZm3J1.chunk.js} +2 -2
  20. package/dist/scripts/{B8cDqk3r.chunk.js.map → BzSZm3J1.chunk.js.map} +1 -1
  21. package/dist/scripts/{BA2M0rUU.chunk.js → C5k6lVOP.chunk.js} +2 -2
  22. package/dist/scripts/{BA2M0rUU.chunk.js.map → C5k6lVOP.chunk.js.map} +1 -1
  23. package/dist/scripts/{CGjQxvvn2.chunk.js → CPp4jaPB2.chunk.js} +2 -2
  24. package/dist/scripts/{CGjQxvvn2.chunk.js.map → CPp4jaPB2.chunk.js.map} +1 -1
  25. package/dist/scripts/{BtwiC__j2.chunk.js → Cdlk0Qkj2.chunk.js} +2 -2
  26. package/dist/scripts/{BtwiC__j2.chunk.js.map → Cdlk0Qkj2.chunk.js.map} +1 -1
  27. package/dist/scripts/ClX2mOw_.chunk.js +1 -0
  28. package/dist/scripts/{BXoBk1VP2.chunk.js → D0fFZDhm2.chunk.js} +2 -2
  29. package/dist/scripts/{BXoBk1VP2.chunk.js.map → D0fFZDhm2.chunk.js.map} +1 -1
  30. package/dist/scripts/{Bqyk3nb6.chunk.js → DMuXCE-z.chunk.js} +2 -2
  31. package/dist/scripts/{Bqyk3nb6.chunk.js.map → DMuXCE-z.chunk.js.map} +1 -1
  32. package/dist/scripts/{Kl4bbkgr2.chunk.js → DNZvrGV22.chunk.js} +2 -2
  33. package/dist/scripts/{Kl4bbkgr2.chunk.js.map → DNZvrGV22.chunk.js.map} +1 -1
  34. package/dist/scripts/{DK3tHqQv.chunk.js → DUzAx5n_.chunk.js} +2 -2
  35. package/dist/scripts/{DK3tHqQv.chunk.js.map → DUzAx5n_.chunk.js.map} +1 -1
  36. package/dist/scripts/DaBzvZF9.chunk.js +1 -0
  37. package/dist/scripts/{BfahlE_H.chunk.js → DkhktXkG.chunk.js} +2 -2
  38. package/dist/scripts/{BfahlE_H.chunk.js.map → DkhktXkG.chunk.js.map} +1 -1
  39. package/dist/scripts/{Cn2w0OHm.chunk.js → DtSAu9Xt.chunk.js} +3 -3
  40. package/dist/scripts/{Cn2w0OHm.chunk.js.map → DtSAu9Xt.chunk.js.map} +1 -1
  41. package/dist/scripts/{Cu7qiGbY2.chunk.js → DvxtrAxT2.chunk.js} +2 -2
  42. package/dist/scripts/{Cu7qiGbY2.chunk.js.map → DvxtrAxT2.chunk.js.map} +1 -1
  43. package/dist/scripts/{Cf1whmy32.chunk.js → DxD2uVzf2.chunk.js} +2 -2
  44. package/dist/scripts/{Cf1whmy32.chunk.js.map → DxD2uVzf2.chunk.js.map} +1 -1
  45. package/dist/scripts/{B-Cpv5JW2.chunk.js → I9MVVxo82.chunk.js} +2 -2
  46. package/dist/scripts/{B-Cpv5JW2.chunk.js.map → I9MVVxo82.chunk.js.map} +1 -1
  47. package/dist/scripts/{BxLSGp7E.chunk.js → IH7D3jLI.chunk.js} +2 -2
  48. package/dist/scripts/{BxLSGp7E.chunk.js.map → IH7D3jLI.chunk.js.map} +1 -1
  49. package/dist/scripts/{ByFS52xu.chunk.js → OU_kRJz_.chunk.js} +2 -2
  50. package/dist/scripts/{ByFS52xu.chunk.js.map → OU_kRJz_.chunk.js.map} +1 -1
  51. package/dist/scripts/{BVgv-v1c.chunk.js → P4zTQoDZ.chunk.js} +2 -2
  52. package/dist/scripts/{BVgv-v1c.chunk.js.map → P4zTQoDZ.chunk.js.map} +1 -1
  53. package/dist/scripts/{C7odFv7G.chunk.js → PZOjj17O.chunk.js} +2 -2
  54. package/dist/scripts/{C7odFv7G.chunk.js.map → PZOjj17O.chunk.js.map} +1 -1
  55. package/dist/scripts/{DirX37xL2.chunk.js → XgwoBT6z2.chunk.js} +2 -2
  56. package/dist/scripts/{DirX37xL2.chunk.js.map → XgwoBT6z2.chunk.js.map} +1 -1
  57. package/dist/scripts/{app-eLOi12JS.js → app-m6P7KXE1.js} +3 -3
  58. package/dist/scripts/{app-eLOi12JS.js.map → app-m6P7KXE1.js.map} +1 -1
  59. package/dist/scripts/{DcpG_Euo.chunk.js → bNV2NeSi.chunk.js} +2 -2
  60. package/dist/scripts/{DcpG_Euo.chunk.js.map → bNV2NeSi.chunk.js.map} +1 -1
  61. package/dist/scripts/{nCttr7GT.chunk.js → fIFpt-kC.chunk.js} +2 -2
  62. package/dist/scripts/{nCttr7GT.chunk.js.map → fIFpt-kC.chunk.js.map} +1 -1
  63. package/dist/scripts/{Dh8AAJA8.chunk.js → fOHWXn7-.chunk.js} +2 -2
  64. package/dist/scripts/{Dh8AAJA8.chunk.js.map → fOHWXn7-.chunk.js.map} +1 -1
  65. package/dist/scripts/{09UoyYDa2.chunk.js → jXHCFC1j2.chunk.js} +2 -2
  66. package/dist/scripts/{09UoyYDa2.chunk.js.map → jXHCFC1j2.chunk.js.map} +1 -1
  67. package/package.json +1 -1
  68. package/dist/scripts/DcQNbWG1.chunk.js +0 -1
  69. package/dist/scripts/DxPCyajz.chunk.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Cf1whmy32.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/share/flight-requests/ShareRequests.ts","../../../../libs/shared/src/utils/RecentItemHelper.ts","../../../../libs/shared/src/apps/share/utils/RecentShareHelper.ts","../../../../libs/shared/src/apps/share/components/embed-size/EmbedSize.tsx","../../../../libs/common/src/backbone/interfaces/BaseCollectionIdentifier.ts","../../../../libs/shared/src/apps/playlists/interfaces/identifiers/PlaylistVideoCollectionIdentifier.ts","../../../../libs/shared/src/apps/playlists/utils/PlaylistStateUpdateHelper.ts","../../../../libs/shared/src/utils/ReorderHelper.ts","../../../../libs/shared/src/flight-requests/PlaylistRequests.ts","../../../../libs/shared/src/flight-requests/SeriesRequests.ts","../../../../libs/shared/src/apps/share/views/share/ShareViewHelper.ts","../../../../../node_modules/toggle-selection/index.js","../../../../../node_modules/copy-to-clipboard/index.js","../../../../../node_modules/react-copy-to-clipboard/lib/Component.js","../../../../../node_modules/react-copy-to-clipboard/lib/index.js","../../../../libs/shared/src/components/copy-input/copy-input.module.scss","../../../../libs/shared/src/components/copy-input/CopyInput.tsx","../../../../libs/shared/src/utils/EmbedHelper.ts","../../../../libs/shared/src/apps/share/components/copy-embed-html/copy-embed-html.module.scss","../../../../libs/shared/src/apps/share/components/copy-embed-html/CopyEmbedHtml.tsx","../../../../libs/shared/src/apps/share/views/share/components/copy-embed/CopyEmbed.tsx","../../../../libs/shared/src/images/svg/objects/CodeSvg.tsx","../../../../libs/shared/src/apps/share/components/get-embed-code/GetEmbedCode.tsx","../../../../libs/shared/src/enums/ShareLinkStatus.ts","../../../../libs/shared/src/apps/share/utils/ShareLinkHelper.ts","../../../../libs/shared/src/apps/share/components/share-link-info/ShareLinkInfo.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/avatars/GoogleClassroomAvatar.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/avatars/MicrosoftTeamsAvatar.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/share-integrations.module.scss","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrationsStack.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-as-link/ShareAsLink.tsx","../../../../libs/shared/src/hooks/useScript.ts","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/useGoogleClassrooms.ts","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/useMicrosoftTeamsShare.ts","../../../../libs/shared/src/components/looking-for-integration/LookingForIntegration.tsx","../../../../libs/shared/src/enums/IntegrationId.ts","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrations.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/RestrictionBadge.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-message/ShareMessage.tsx","../../../../libs/shared/src/apps/share/views/share/components/main-share/MainShare.tsx","../../../../libs/shared/src/apps/share/utils/LinkExpiryHelper.ts","../../../../libs/shared/src/apps/share/components/link-expiry/LinkExpiry.tsx","../../../../libs/shared/src/apps/share/components/set-password-input/set-password-input.module.scss","../../../../libs/shared/src/apps/share/components/set-password-input/SetPasswordInput.tsx","../../../../libs/shared/src/apps/share/components/link-password/LinkPassword.tsx","../../../../libs/shared/src/apps/share/validation/ShareLinkSettingsValidationSchema.ts","../../../../libs/shared/src/apps/share/views/share/components/share-settings/ShareSettings.tsx","../../../../libs/shared/src/utils/IntegrationHelper.ts","../../../../libs/shared/src/apps/share/views/share/ShareView.tsx"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { CreateDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/CreateDirectShareRequest';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/CreateShareLinkRequest';\nimport { EditDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/EditDirectShareRequest';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { GetSentItemsParams } from 'libs/shared/apps/share/interfaces/requests/GetSentItemsParams';\nimport { CheckShareLinkPasswordResponse } from 'libs/shared/apps/share/interfaces/responses/CheckShareLinkPasswordResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { DirectShare, ShareLink, ShareRecipient, UnionShareObject, UserCollection } from 'libs/shared/interfaces';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share'\n};\n\nconst SharedObjectQueries: {[index: string]: string } = {\n video: 'thumbnail,series,_canBeConsumed,_restrictions',\n clip: '_parentVideo[_rating],_canBeConsumed,_thumbnail,_restrictions',\n interactive: '_canBeConsumed,_parentVideo[_rating],_parentClip,_thumbnail,_restrictions',\n series: 'tallPoster,videos[thumbnail,count()]{limit:1}',\n playlist: 'cover,videos[thumbnail,count()]{limit:1},clips[_thumbnail,count()]{limit:1},interactives[_thumbnail,count()]{limit:1}'\n};\n\nfunction getShareRecipientQuery(ids: string[], customerId: string): HashObject {\n return {\n 'id': ids,\n 'query.user': `yearGroups,avatar,userprofiles{customer.id:${customerId}}`,\n 'query.classroom': `enrolments[count()]{role:student,limit:0},customer{id:${customerId}}`,\n 'query.classroom_group': 'classroom,users[count()]{limit:0}'\n };\n}\n\nexport const ShareRequests = {\n getShareObject(\n shareId: string,\n success?: (obj: UnionShareObject) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n /**\n * This is a custom endpoint written into Lite that will use\n * client credentials no matter if the user is signed in or not\n */\n url: `/api/share/find/${shareId}`,\n key: `share:${shareId}`,\n bootstrapName: `share:${shareId}`,\n success,\n error\n };\n },\n\n getShareRecipients(shareId: string): Flight.Request {\n return {\n url: `/api/share/find/${shareId}/recipients`,\n key: `share:${shareId}:recipients`,\n normalize: false\n };\n },\n\n sharedObjectsById(ids: string[]): Flight.Request {\n ids.sort();\n \n const idsQueries = ids.map(id => `id=${id}`);\n const assocQueries = Object.keys(SharedObjectQueries).map(key => `query.${key}=${SharedObjectQueries[key]}`);\n\n return {\n url: `{gateway}/v1/objects?${[ ...idsQueries, ...assocQueries, `permissionFilterOption=${PermissionFilterOption.StripMetadata}` ].join('&')}`,\n key: `objects:${ids.join(',')}`,\n normalize: false\n };\n },\n\n sentShare(params: GetSentItemsParams = {}): Flight.Request {\n const key = Object.values(params).join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/users/me/share/sent-items', params),\n key: `sent:shares:${key}`,\n normalize: false\n };\n },\n\n /**\n * Direct share requests\n */\n getSentDirectShareByObjectId(objectId: string): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/share/direct/sent-items?objectId=${objectId}`,\n key: `direct:share:sent:object:${objectId}`,\n normalizeOptions\n };\n },\n\n createDirectShare(\n data: CreateDirectShareRequest,\n success?: (data: DirectShare) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/share',\n key: 'create:direct:share',\n data,\n type: HttpVerbs.POST,\n normalizeOptions,\n invalidationKeys: [ `direct:share:sent:object:${data.objectId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n updateDirectShareRecipients(\n shareId: string,\n data: EditDirectShareRequest,\n success?: (data: DirectShare) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n const updateStateKey = `direct:share:recipients:${shareId}`;\n\n return {\n url: `{gateway}/v1/share/${shareId}/recipients`,\n key: 'edit:direct:share',\n data,\n type: HttpVerbs.POST,\n normalizeOptions,\n invalidationKeys: 'sent:shares',\n updateState: {\n keys: updateStateKey,\n updateData: (state: HashObject) => {\n /**\n * As getDirectShareRecipientsById caches by shareId\n * and not the objectIds being fetched, if we're removing\n * the last recipient we need to manually set the recipients\n * to an empty array as a re-fetch won't be triggered.\n */\n if (!state[updateStateKey] || data.recipients.length)\n return state;\n\n return {\n ...state,\n [updateStateKey]: []\n };\n }\n },\n success,\n error,\n always\n };\n },\n\n removeDirectShareRecipient(\n shareId: string,\n recipientId: string,\n success?: (data: DirectShare) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n const updateStateKey = `direct:share:recipients:${shareId}`;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/share/${shareId}/recipients`, {\n recipientId\n }),\n key: 'remove:direct:share:recipient',\n type: HttpVerbs.DELETE,\n normalizeOptions,\n invalidationKeys: 'sent:shares',\n updateState: {\n keys: updateStateKey,\n updateData: (state: HashObject) => {\n /**\n * As getDirectShareRecipientsById caches by shareId\n * and not the objectIds being fetched, if we're removing\n * the last recipient we need to manually set the recipients\n * to an empty array as a re-fetch won't be triggered.\n */\n if (!state[updateStateKey])\n return state;\n\n return {\n ...state,\n [updateStateKey]: []\n };\n }\n },\n success,\n error,\n always\n };\n },\n\n /**\n * This request differs from getRecipientsById in that the key doesn't contain\n * the ids being fetched. This is useful because it means that if we need to\n * re-fetch the data because `ids` changes, the data prop will always be set\n * because the key won't change.\n * When using getRecipientsById, the would be a period of time where `data`\n * is `undefined` because it is technically a new request.\n */\n getDirectShareRecipientsById(shareId: string, recipients: ShareRecipient[], customerId: string): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/objects', getShareRecipientQuery(recipients.map(r => r.id), customerId)),\n key: `direct:share:recipients:${shareId}`\n };\n },\n\n getRecipientsById(ids: string[], customerId: string): Flight.Request {\n ids.sort();\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/objects', getShareRecipientQuery(ids, customerId)),\n key: `share:recipients:${ids.join(',')}`\n };\n },\n\n /**\n * Fetch a classroom or classroom group with users\n */\n getRecipientUsers(id: string, success?: (users: UserCollection) => void): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/users?query={limit:100}`,\n key: `share:recipients:${id}:users`,\n success\n };\n },\n\n getObjectsSharedWithUser(cursor?: string): Flight.Request {\n const params: HashObject = { permissionFilterOption: PermissionFilterOption.StripMetadata };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/users/me/share/received-items', params),\n key: `shared:with:me:${cursor}`\n };\n },\n\n /**\n * Share link requests\n */\n getShareLinkByObjectId(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/share/links?objectId=${id}`,\n key: `share:link:object:${id}`,\n normalizeOptions,\n formatData: (resp: HashObject) => {\n /**\n * When removing the linkExpireDate, the cache is invalidated\n * but the normalised state still has the linkExpireDate, so we need\n * to set it to null if it's not present\n */\n return {\n ...resp,\n linkExpireDate: resp.linkExpireDate || null\n };\n }\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest,\n success?: (shareLink: ShareLink) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/share/links',\n key: 'create:share:link',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ `share:link:object:${data.resourceId}`, `privacy:${data.resourceId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n editShareLink(\n shareLink: ShareLink,\n data: EditShareLinkRequest,\n success?: (shareLink: ShareLink) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/share/links/${shareLink.id}`,\n key: 'edit:share:link',\n data,\n type: HttpVerbs.PUT,\n normalizeOptions,\n invalidationKeys: [ `share:${shareLink.id}`, `share:link:object:${shareLink.objectId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n deleteShareLink(\n shareLink: ShareLink,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/share/links/${shareLink.id}`,\n key: 'delete:share:link',\n type: HttpVerbs.DELETE,\n normalizeOptions,\n invalidationKeys: [ `share:${shareLink.id}`, `share:link:object:${shareLink.objectId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n checkPassword(\n id: string,\n password: string,\n success?: (res: CheckShareLinkPasswordResponse) => void,\n error?: (xhr: Xhr) => void\n ): Flight.PublicRequest {\n return {\n url: `{gateway}/v1/share/links/${id}/password/verify`,\n publicUrl: `{gateway}/v1/share/links/${id}/password/verify/public`,\n key: `checkpassword:${id}`,\n type: HttpVerbs.POST,\n data: { password },\n success,\n error\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n\n updatePrivacy(\n id: string,\n privacy: SharePrivacy,\n overrideRestrictions: boolean,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/share/links/${id}/privacy`,\n key: 'update:privacy',\n type: HttpVerbs.PUT,\n data: {\n privacy,\n overrideRestrictions\n },\n invalidationKeys: [ 'privacy', 'sent:shares' ],\n normalize: false,\n success,\n error\n };\n },\n\n createAnonSession(\n shareId: string,\n sessionId: string,\n sessionName: string\n ): Flight.Request {\n return {\n url: `{gateway}/v1/shares/${shareId}/anon-sessions`,\n key: 'create:anon:session',\n type: HttpVerbs.POST,\n data: {\n sessionId,\n sessionName\n },\n normalize: false\n };\n },\n\n getAnonSessions(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v1/shares/${shareId}/anon-sessions`,\n key: `anon:session:${shareId}`,\n normalize: false\n };\n }\n};\n","import { StorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nconst DEFAULT_STORAGE_LIMIT = 5;\n\ninterface AddRecentItemOptions {\n id: string;\n limit?: number;\n expire?: boolean;\n}\n\nexport const RecentItemHelper = {\n getRecentItem(cacheKey: string, dataSource: StorageHelper, expire: boolean = true): string[] {\n let recentItems = expire ? dataSource.cacheGet(cacheKey) : dataSource.get(cacheKey);\n\n if (!Array.isArray(recentItems))\n recentItems = [];\n\n return recentItems;\n },\n\n setRecentItem(cacheKey: string, ids: string[], dataSource: StorageHelper, expire?: boolean): void {\n if (!Array.isArray(ids))\n return;\n\n if (expire) {\n dataSource.cacheSet(cacheKey, ids);\n return;\n }\n\n dataSource.set(cacheKey, ids);\n },\n\n addRecentItem(cacheKey: string, dataSource: StorageHelper, options: AddRecentItemOptions): string[] {\n const { id, limit = DEFAULT_STORAGE_LIMIT, expire = true } = options;\n\n let recentItems = RecentItemHelper.getRecentItem(cacheKey, dataSource, expire);\n\n const idIndex = recentItems.indexOf(id);\n\n /**\n * If the item is already in the stored list, \n * remove it so that it will be inserted at the first position.\n */\n if (idIndex > -1)\n recentItems.splice(idIndex, 1);\n\n recentItems.unshift(id);\n\n if (recentItems.length > limit)\n recentItems = recentItems.slice(0, limit);\n\n RecentItemHelper.setRecentItem(cacheKey, recentItems, dataSource, expire);\n\n return recentItems;\n },\n\n removeRecentItem(cacheKey: string, id: string, dataSource: StorageHelper): void {\n const items = RecentItemHelper.getRecentItem(cacheKey, dataSource);\n const omitted = items.filter(i => i !== id.toString());\n RecentItemHelper.setRecentItem(cacheKey, omitted, dataSource);\n }\n};\n","import { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { RecentItemHelper } from 'libs/shared/utils/RecentItemHelper';\n\nconst getCacheKey = (userId: string) => `recently:shared:to:${userId}`;\n\ninterface AddRecentShareOptions {\n id: string;\n limit?: number;\n}\n\nexport const RecentShareHelper = {\n /**\n * Get a list of ids of recipients recently shared to.\n */\n getRecentlySharedTo(userId: string): string[] {\n return RecentItemHelper.getRecentItem(getCacheKey(userId), LocalStorageHelper);\n },\n \n addRecentlySharedTo(userId: string, options: AddRecentShareOptions): string[] {\n return RecentItemHelper.addRecentItem(getCacheKey(userId), LocalStorageHelper, options);\n }\n};\n","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nconst namespace = 'share.embedSize';\n\ninterface EmbedSizeProps {\n autoplay: boolean;\n setAutoplay: (autoplay: boolean) => void;\n videoSize: EmbedResolution;\n setVideoSize: (videoSize: EmbedResolution) => void;\n videoSizes: EmbedResolution[];\n}\n\nexport function EmbedSize(props: EmbedSizeProps): React.ReactElement {\n const {\n autoplay,\n setAutoplay,\n videoSize,\n setVideoSize,\n videoSizes\n } = props;\n\n return (\n <div className='d-flex align-items-center'>\n {!!videoSizes.length &&\n <>\n <div className='me-1'>\n <Text namespace={namespace} phrase='videoSize' />\n </div>\n <div className='pe-3'>\n <Dropdown>\n <Dropdown.Toggle id='embed-resolution' variant='outline-dark'>\n {videoSize.label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n {videoSizes.map(size => (\n <Dropdown.Item\n key={`${size.width}x${size.height}`}\n onClick={() => setVideoSize(size)}\n >\n {size.label}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </>\n }\n <div className='me-2'>\n <Text namespace={namespace} phrase='autoplay' />\n </div>\n <Checkbox id='autoplay-checkbox' checked={autoplay} onChange={() => setAutoplay(!autoplay)} />\n </div>\n );\n}\n","import { ObjectHash } from 'backbone';\n\nimport { ErrorHelper } from 'libs/common/backbone/core/BaseError';\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport interface BaseCollectionIdentifierOptions<T> {\n collectionPrefix?: string;\n id?: string;\n sort?: T;\n cursor?: string;\n}\n\nexport class BaseCollectionIdentifier<T = HashObject> {\n public id: string;\n public sort: T;\n public cursor: string;\n public collectionPrefix: string;\n\n constructor(options: BaseCollectionIdentifierOptions<T>) {\n this.setData(options);\n }\n\n protected setData(options: BaseCollectionIdentifierOptions<T>): void {\n const { collectionPrefix, id, sort, cursor } = options;\n\n if (id)\n this.id = id;\n\n if (sort)\n this.sort = sort;\n\n if (cursor)\n this.cursor = cursor;\n\n if (collectionPrefix)\n this.collectionPrefix = collectionPrefix;\n }\n\n public toString(): string {\n const params = [\n this.collectionPrefix,\n this.id,\n this.sort,\n this.cursor\n ];\n\n return params.filter(Boolean).join(':');\n }\n\n public toParams(): ObjectHash {\n const params: ObjectHash = {};\n\n if (this.sort)\n params.sort = this.getSortTypeParam().toLowerCase();\n\n if (this.cursor)\n params.cursor = this.cursor;\n\n return params;\n }\n\n protected getSortTypeParam(): string {\n ErrorHelper.throw(new DevError('getSortTypeParam must be implemented when extending BaseCollectionIdentifier'));\n\n return '';\n }\n}\n","import { BaseCollectionIdentifier } from 'libs/common/backbone/interfaces';\n\nexport class PlaylistVideoCollectionIdentifier extends BaseCollectionIdentifier {\n constructor(id: string, cursor: string = '') {\n super({ collectionPrefix: 'playlist:videos', id, cursor });\n }\n}\n","import { HashObject } from 'libs/common/react/interfaces/HashObject';\n\ntype StateMap = {[key: string]: HashObject };\n\nexport const PlaylistStateUpdateHelper = {\n deletePlaylist(key: string): (state: StateMap) => StateMap {\n return (state: StateMap) => {\n const updatedState = { ...state };\n\n if (updatedState.hasOwnProperty(key))\n delete updatedState[key];\n\n return updatedState;\n };\n },\n\n incrementVideoCount(key: string, count: number): (state: StateMap) => StateMap {\n return (state: StateMap) => {\n const updatedState = { ...state };\n\n if (!updatedState.hasOwnProperty(key))\n return state;\n\n if (!updatedState[key].videos)\n updatedState[key].videos = {};\n\n updatedState[key].videos.count = updatedState[key].videos.count ?\n updatedState[key].videos.count + count :\n count;\n\n return updatedState;\n };\n }\n};\n","import { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { BaseObject, ReorderRequest } from 'libs/shared/interfaces';\n\ninterface ReorderResult<T extends BaseObject> {\n reorderRequest: ReorderRequest;\n reorderedItems: T[];\n}\n\nexport const ReorderHelper = {\n reorder<T extends BaseObject>(items: T[], oldIdx: number, newIdx: number): ReorderResult<T> {\n if (oldIdx === newIdx)\n return { reorderedItems: items, reorderRequest: null };\n\n const reorderedItems: T[] = ArrayHelper.moveItem(items, oldIdx, newIdx);\n\n /**\n * If newIdx is the last idx then we set\n * destinationMemberId to null.\n */\n const destinationMemberId = newIdx < items.length - 1 ?\n reorderedItems[newIdx + 1].id :\n null;\n\n const reorderRequest: ReorderRequest = {\n sourceMemberId: reorderedItems[newIdx].id,\n destinationMemberId\n };\n\n return { reorderedItems, reorderRequest };\n },\n\n updateState(\n dataPrefix: string,\n reorderRequest: ReorderRequest,\n data: {[key: string]: HashObject }\n ): {[key: string]: HashObject } {\n const items: BaseObject[] = [];\n const updatedData = ObjectHelper.deepClone(data);\n\n const keys = [dataPrefix]; // Maintain an ordered list of keys.\n let page = data[dataPrefix];\n const pageSize = !!page && !!page.data && page.data.length;\n\n /**\n * Flatten items\n */\n while (page) {\n if (!Array.isArray(page.data))\n break;\n\n items.push(...page.data as BaseObject[]);\n\n const nextCursor = page.pagination\n && page.pagination.cursors\n && page.pagination.cursors.next;\n\n const nextKey = !!nextCursor && `${dataPrefix}:${nextCursor}`;\n\n page = nextCursor && data[nextKey];\n\n if (page)\n keys.push(nextKey);\n }\n\n if (!items.length)\n return data;\n\n /**\n * Reorder items\n */\n const removeIdx = ArrayHelper.findIndex(items, i => i.id === reorderRequest.sourceMemberId);\n\n let reorderedItems = [...items];\n\n const itemToMove = reorderedItems.splice(removeIdx, 1);\n\n const insertIdx = reorderRequest.destinationMemberId ?\n ArrayHelper.findIndex(reorderedItems, r => r.id === reorderRequest.destinationMemberId) :\n reorderedItems.length;\n\n reorderedItems.splice(insertIdx, 0, itemToMove[0]);\n\n reorderedItems = reorderedItems.map(v => ({ id: v.id }));\n\n /**\n * Paginate reordered items\n */\n keys.forEach(key => {\n const itemsToInsert = reorderedItems.splice(0, pageSize);\n updatedData[key].data = itemsToInsert;\n });\n\n return updatedData;\n }\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { CreateOrUpdatePlaylistRequest, PlaylistCollectionIdentifier, PlaylistVideoCollectionIdentifier } from 'libs/shared/apps/playlists/interfaces';\nimport { PlaylistStateUpdateHelper } from 'libs/shared/apps/playlists/utils/PlaylistStateUpdateHelper';\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { Following, ReorderRequest, UserCollection, VideoTypes } from 'libs/shared/interfaces';\nimport { ObjectApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\nimport { ReorderHelper } from 'libs/shared/utils/ReorderHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport const PlaylistRequests = {\n // TODO: Get working with objects api (playlist count needs to include clips and ints too)\n getUserPlaylists(collectionIdentifier: PlaylistCollectionIdentifier): Flight.Request {\n const { sort, type } = collectionIdentifier;\n\n const params: HashObject = {\n sort: sort,\n PermissionFilterOption: 'stripMetadata',\n query: `{limit:100}${SharedWithStatements.PLAYLIST_COLLECTION},_isClickViewCurated,_liteOwner`\n };\n\n if (collectionIdentifier.cursor)\n params.cursor = collectionIdentifier.cursor;\n\n return {\n url: UrlHelper.urlBuilder(`/api/domain/v2/me/playlists/${type}`, params),\n key: collectionIdentifier.toString()\n };\n },\n\n getPlaylist(id: string, success?: (data: any) => void, error?: (data: any) => void): Flight.PublicRequest {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated,_liteOwner`\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated`\n }),\n key: `playlist:${id}`,\n success,\n error\n };\n },\n\n getSharedPlaylist(\n id: string,\n shareId: string,\n success?: (data: any) => void,\n error?: (data: any) => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated,_liteOwner`,\n shareId\n }),\n key: `shared:playlist:${id}:${shareId}`,\n success,\n error\n };\n },\n\n playlistWithThumbnailAndCount(id: string): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated,_liteOwner,videos[count()]{limit:1},interactives[count()]{limit:1},clips[count()]{limit:1}`\n }),\n key: `playlist:${id}:thumbnail:count`\n };\n },\n\n getPlaylistVideos(id: string, cursor?: string): Flight.PublicRequest {\n const { VIDEO_COLLECTION, CLIP_COLLECTION, INTERACTIVE } = SharedWithStatements;\n\n const params: HashObject = {\n query: `(videos[${VIDEO_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|clips[${CLIP_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|interactives[${INTERACTIVE}]){orderBy:orderindex,limit:100}`,\n permissionFilterOption: PermissionFilterOption.StripMetadata\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}/members`, params),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}/members`, params),\n key: `playlist:${id}:videos${cursor ? `:${cursor}` : ''}`\n };\n },\n\n getSharedPlaylistVideos(id: string, shareId: string, cursor?: string): Flight.Request {\n const { VIDEO_COLLECTION, CLIP_COLLECTION, INTERACTIVE } = SharedWithStatements;\n\n const params: HashObject = {\n query: `(videos[${VIDEO_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|clips[${CLIP_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|interactives[${INTERACTIVE}]){orderBy:orderindex,limit:100}`,\n permissionFilterOption: PermissionFilterOption.StripMetadata,\n shareId\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}/members`, params),\n key: `shared:playlist:${id}:${shareId}:videos:${cursor}`\n };\n },\n\n getPlaylistVideosCount(id: string): Flight.PublicRequest {\n const filter = `{limit:0,status:[${CurationStatus.Published},${CurationStatus.Archived}]}`;\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `videos[count()]${filter},clips[count()]${filter},interactives[count()]${filter}`\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `videos[count()]${filter},clips[count()]${filter},interactives[count()]${filter}`\n }),\n key: `playlist:count:${id}`,\n normalize: false\n };\n },\n\n getSharedPlaylistVideosCount(\n id: string,\n shareId: string\n ): Flight.Request {\n const filter = `{limit:0,status:[${CurationStatus.Published},${CurationStatus.Archived}]}`;\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `videos[count()]${filter},clips[count()]${filter},interactives[count()]${filter}`,\n shareId\n }),\n key: `shared:playlist:count:${id}:${shareId}`,\n normalize: false\n };\n },\n\n getVideoPlaylists(videoId: string, userId: string, cursor?: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${videoId}/playlists?query={limit:100,owner.id:[${userId}]}`,\n key: `video:playlists:${videoId}${cursor ? ':cursor' : ''}`\n };\n },\n\n createPlaylist(\n userId: string,\n data: CreateOrUpdatePlaylistRequest,\n success?: (data: any) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'create:playlist',\n url: `{gateway}/v1/objects/${userId}/playlists`,\n data,\n type: HttpVerbs.POST,\n success,\n error,\n always,\n invalidationKeys: 'user:playlists'\n };\n },\n\n updatePlaylist(\n id: string,\n data: CreateOrUpdatePlaylistRequest,\n success?: (data: any) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'update:playlist',\n url: `{gateway}/v1/objects/${id}`,\n data,\n type: HttpVerbs.PUT,\n success,\n error,\n always\n };\n },\n\n deletePlaylist(\n id: string,\n success?: (data: any) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'delete:playlist',\n url: `{gateway}/v1/objects/${id}`,\n type: HttpVerbs.DELETE,\n success,\n error,\n always,\n invalidationKeys: 'user:playlists',\n updateState: {\n keys: `playlist:${id}`,\n updateData: PlaylistStateUpdateHelper.deletePlaylist(`playlist:${id}`)\n }\n };\n },\n\n copyPlaylist(\n id: string,\n success?: (data: any) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/playlists/copy',\n key: 'copy:playlist',\n data: { playlistId: id },\n type: HttpVerbs.POST,\n invalidationKeys: 'user:playlists',\n success,\n error,\n always\n };\n },\n\n addToPlaylist(\n playlistId: string,\n videos: VideoTypes[],\n success?: (data: any) => void,\n error?: (data: ObjectApiXhr) => void\n ): Flight.Request {\n /**\n * Invalidate:\n * - Playlists as they are fetched with first video.\n * - Playlist video collection.\n * - Playlists for each video.\n */\n const invalidationKeys = [\n 'user:playlists',\n (new PlaylistVideoCollectionIdentifier(playlistId)).toString(),\n `playlist:${playlistId}:videos`\n ];\n\n videos.forEach(video => {\n invalidationKeys.push(`video:playlists:${video.id}`);\n });\n\n const body = videos.reduce((acc: HashObject, video: VideoTypes) => {\n if (VideoHelper.isClip(video)) {\n if (Array.isArray(acc.clips))\n acc.clips.push({ id: video.id });\n else\n acc.clips = [{ id: video.id }];\n }\n\n if (VideoHelper.isInteractive(video)) {\n if (Array.isArray(acc.interactives))\n acc.interactives.push({ id: video.id });\n else\n acc.interactives = [{ id: video.id }];\n }\n\n if (VideoHelper.isVideo(video)) {\n if (Array.isArray(acc.videos))\n acc.videos.push({ id: video.id });\n else\n acc.videos = [{ id: video.id }];\n }\n\n return acc;\n }, {});\n\n return {\n key: `add:to:playlist:${playlistId}:${videos.map(v => v.id).join(':')}`,\n url: `{gateway}/v1/objects/${playlistId}`,\n data: body,\n type: HttpVerbs.PUT,\n success,\n error,\n invalidationKeys,\n updateState: {\n keys: `playlist:${playlistId}`,\n updateData: PlaylistStateUpdateHelper.incrementVideoCount(`playlist:${playlistId}`, videos.length)\n },\n normalize: false\n };\n },\n\n removePlaylistVideo(\n playlistId: string,\n videoId: string,\n typeId: MasterType,\n success?: (data: any) => void,\n error?: (data: any) => void\n ): Flight.Request {\n let baseUrl = `{gateway}/v1/objects/${playlistId}`;\n\n if (typeId === MasterType.Clip)\n baseUrl += '/clips';\n else if (typeId === MasterType.Interactive)\n baseUrl += '/interactives';\n else\n baseUrl += '/videos';\n\n return {\n key: 'remove:playlist:video',\n url: UrlHelper.urlBuilder(baseUrl, { memberId: videoId }),\n type: HttpVerbs.DELETE,\n success,\n error,\n // Invalidate playlists as they are fetched with the first video.\n invalidationKeys: [\n 'user:playlists',\n `playlist:${playlistId}:videos`,\n `video:playlists:${videoId}`,\n `playlist:${playlistId}`\n ]\n };\n },\n\n getIsFollowingPlaylist(playlistId: string, userId: string): Flight.Request {\n const formatData: ((data: UserCollection) => Following) = (data: UserCollection) => (\n { objectId: playlistId, isFollowing: !!data?.data?.length }\n );\n\n return {\n url: `{gateway}/v1/objects/${userId}/followedPlaylists?query={id:${playlistId}}`,\n key: `playlist:${playlistId}:following:${userId}`,\n formatData,\n normalize: false\n };\n },\n\n followPlaylist(\n playlistId: string,\n userId: string,\n success?: (data: any) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${userId}`,\n key: `follow:playlist:${playlistId}`,\n data: { followedPlaylists: playlistId },\n type: HttpVerbs.PUT,\n invalidationKeys: [ 'user:playlists', `playlist:${playlistId}`, 'shared:playlist' ],\n success,\n error,\n always\n };\n },\n\n unfollowPlaylist(\n playlistId: string,\n userId: string,\n success?: (data: any) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${userId}/followedPlaylists?memberId=${playlistId}`,\n key: `unfollow:playlist:${playlistId}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [ 'user:playlists', `playlist:${playlistId}`, 'shared:playlist' ],\n success,\n error,\n always\n };\n },\n\n // TODO: Use objects api and get working with clips + ints\n reorderVideos(\n id: string,\n reorderRequest: ReorderRequest,\n success?: (data: any) => void,\n error?: (data: any) => void\n ): Flight.Request {\n return {\n key: `reorder:playlist`,\n url: `{gateway}/v1/playlists/${id}/reorder`,\n data: reorderRequest,\n type: HttpVerbs.PUT,\n success,\n error,\n // Invalidate playlists as they are fetched with the first video.\n invalidationKeys: 'user:playlists',\n updateState: {\n keys: `playlist:${id}:videos`,\n updateData: (data: {[key: string]: HashObject }) =>\n ReorderHelper.updateState(`playlist:${id}:videos`, reorderRequest, data)\n }\n };\n },\n\n getVideoCandidate(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}?query=_restrictions`,\n key: `add:to:playlist:candidate:${id}`\n };\n }\n};\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { PublicWithStatement, SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { VideoSortType } from 'libs/shared/enums/VideoSortType';\nimport { VideoSortHelper } from 'libs/shared/utils/VideoSortHelper';\n\nconst endpoints = {\n sharedSeries: (id: string, shareId: string) => UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: SharedWithStatements.SERIES,\n shareId\n }),\n seriesWithVideos: (id: string, videoCount: number = 3) => {\n return `{gateway}/v1/objects/${id}?query=banner,videos[season,thumbnail,_canBeConsumed]{limit:${videoCount}}`;\n }\n};\n\nexport const SeriesRequests = {\n series(id: string): Flight.PublicRequest {\n const queryStringObj = { query: SharedWithStatements.SERIES };\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, queryStringObj),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}`, queryStringObj),\n key: `series:${id}`\n };\n },\n sharedSeries(id: string, shareId: string): Flight.Request {\n return {\n url: endpoints.sharedSeries(id, shareId),\n key: `shared:series:${id}:${shareId}`\n };\n },\n seriesWithVideos(id: string, videoCount: number = 3): Flight.Request {\n return {\n url: endpoints.seriesWithVideos(id, videoCount),\n key: `series:${id}:with:videos:${videoCount}`\n };\n },\n seriesWithThumbnailAndCount(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}?query=videos[season,thumbnail,_canBeConsumed,count()]{limit:1}`,\n key: `series:${id}:thumbnail:count`\n };\n },\n seriesVideos(id: string, userId?: string, sort?: VideoSortType, cursor?: string): Flight.PublicRequest {\n const sortFilter = VideoSortHelper.getVideoSortParam(sort);\n\n const key = [ 'series', id, 'videos', cursor, sort ].filter(k => !!k).join(':');\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/collections/${id}/videos`, {\n query: `{${sortFilter}}${SharedWithStatements.VIDEO_COLLECTION}`,\n cursor\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/collections/${id}/videos`, {\n query: `{${sortFilter}}${PublicWithStatement.VIDEO_COLLECTION}`,\n cursor\n }),\n key\n };\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport {\n AnalyticsOptions, EntityType, EventVersion, LocationContext, ShareDescriptors, UserAction, WorkflowPhase\n} from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { CreateDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/CreateDirectShareRequest';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/CreateShareLinkRequest';\nimport { EditDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/EditDirectShareRequest';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { RecentShareHelper } from 'libs/shared/apps/share/utils/RecentShareHelper';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { SeriesRequests } from 'libs/shared/flight-requests/SeriesRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Alerts } from 'libs/shared/hooks/UseAlerts';\nimport { BaseObject, Classification, Classroom, ClassroomGroup, Clip, CurrentUser, DirectShare, InteractiveMetadata, Playlist, Series, ShareLink, ShareRecipient, Subject, User, Video } from 'libs/shared/interfaces';\n\nexport type SharableEntityType = 'video' | 'playlist' | 'subject' | 'series' | 'interactive' | 'clip';\nexport type SharableEntity = Video | Playlist | Subject | Series | InteractiveMetadata | Clip;\nexport type SharableRecipient = User | Classroom | ClassroomGroup;\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const ShareViewHelper = {\n getObjectTypeId(type: SharableEntityType): MasterType {\n switch (type) {\n case 'video':\n return MasterType.Video;\n\n case 'playlist':\n return MasterType.Playlist;\n\n case 'subject':\n return MasterType.Subject;\n\n case 'series':\n return MasterType.Series;\n\n case 'interactive':\n return MasterType.Interactive;\n\n case 'clip':\n return MasterType.Clip;\n }\n },\n\n createLink(options: {\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n alerts: Alerts,\n password?: string,\n linkExpireDate?: string,\n success?: (shareLink: ShareLink) => void\n }): void {\n const success = (newShareLink: ShareLink) => {\n AnalyticsHelper.logUserAction(\n { ...newShareLink, objectName: options.entity.name },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(options.entityType), {\n actionType: UserAction.Create,\n entity: EntityType.ShareLink,\n eventVersion: EventVersion.V3\n })\n );\n\n if (options.success)\n options.success(newShareLink);\n };\n\n const error = () => {\n options.alerts.error(getPhrase('createLinkError', { name: options.entity.name }));\n };\n\n const data: CreateShareLinkRequest = {\n resourceId: options.entity.id,\n overrideRestrictions: false\n };\n\n if (options.password)\n data.password = options.password;\n\n if (options.linkExpireDate)\n data.linkExpireDate = options.linkExpireDate;\n\n Flight.fetch(options.dispatch, ShareRequests.createShareLink(data, success, error));\n },\n\n updateLink(\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n shareLink: ShareLink,\n data: EditShareLinkRequest,\n alerts: Alerts,\n onSuccess?: (data?: ShareLink) => void,\n onError?: () => void\n ): void {\n const success = (updatedShareLink: ShareLink) => {\n AnalyticsHelper.logUserAction(\n { ...updatedShareLink, objectName: entity.name },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Edit,\n entity: EntityType.ShareLink,\n eventVersion: EventVersion.V3\n })\n );\n\n if (onSuccess)\n onSuccess(updatedShareLink);\n\n alerts.success(getPhrase('editSuccess', { name: entity.name, escapeText: true }));\n };\n\n const error = () => {\n if (onError)\n onError();\n\n alerts.error(getPhrase('editError', { name: entity.name, escapeText: true }));\n };\n\n Flight.fetch(dispatch, ShareRequests.editShareLink(shareLink, data, success, error));\n },\n\n deleteLink(\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n shareLink: ShareLink,\n alerts: Alerts,\n onSuccess?: () => void,\n onDone?: () => void\n ): void {\n const success = () => {\n AnalyticsHelper.logUserAction(\n { ...shareLink, objectName: entity.name },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Delete,\n entity: EntityType.ShareLink\n })\n );\n\n if (onSuccess)\n onSuccess();\n\n alerts.success(getPhrase('deleteSuccess', { name: entity.name, escapeText: true }));\n };\n\n const error = () => {\n alerts.error(getPhrase('deleteError', { name: entity.name, escapeText: true }));\n };\n\n const always = () => {\n if (onDone)\n onDone();\n };\n\n Flight.fetch(dispatch, ShareRequests.deleteShareLink(shareLink, success, error, always));\n },\n\n createOrUpdateDirectShare(options: {\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n currentUser: CurrentUser,\n recipients: ShareRecipient[],\n sentDirectShare?: DirectShare,\n message: string,\n onSuccess?: (updatedDirectShare: DirectShare) => void,\n onError?: () => void,\n onDone?: () => void\n }): void {\n const {\n dispatch, entity, entityType, currentUser, recipients, sentDirectShare, message,\n onSuccess, onError, onDone\n } = options;\n\n const success = (updatedDirectShare: DirectShare) => {\n if (onSuccess)\n onSuccess(updatedDirectShare);\n\n AnalyticsHelper.logUserAction(\n {\n id: entity.id,\n name: entity.name,\n shareCount: recipients.length\n },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.DirectShare,\n eventVersion: EventVersion.V3\n })\n );\n\n recipients.map(recipient => {\n RecentShareHelper.addRecentlySharedTo(currentUser.id, { id: recipient.id });\n });\n };\n\n const createData: CreateDirectShareRequest = {\n objectId: entity.id,\n objectTypeId: ShareViewHelper.getObjectTypeId(entityType),\n recipients,\n message\n };\n\n const updateData: EditDirectShareRequest = {\n recipients,\n message\n };\n\n const request = sentDirectShare ?\n ShareRequests.updateDirectShareRecipients(sentDirectShare.id, updateData, success, onError, onDone) :\n ShareRequests.createDirectShare(createData, success, onError, onDone);\n\n Flight.fetch(dispatch, request);\n },\n\n removeDirectShareRecipient(\n dispatch: Flight.Dispatch,\n recipientId: string,\n entityType: SharableEntityType,\n sentDirectShare?: DirectShare,\n onSuccess?: (updatedDirectShare: DirectShare) => void,\n onError?: () => void\n ): void {\n const success = (updatedDirectShare: DirectShare) => {\n if (onSuccess)\n onSuccess(updatedDirectShare);\n\n AnalyticsHelper.logUserAction(\n { shareCount: 1 },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Unshare\n })\n );\n };\n\n Flight.fetch(\n dispatch,\n ShareRequests.removeDirectShareRecipient(\n sentDirectShare.id,\n recipientId,\n success,\n onError\n )\n );\n },\n\n getDirectShareRecipientsRequest(customerId: string, directShare?: DirectShare): Flight.Request {\n const hasRecipients = !!directShare?.recipients?.length;\n\n return hasRecipients &&\n ShareRequests.getDirectShareRecipientsById(directShare.id, directShare.recipients, customerId);\n },\n\n getAnalyticsEntity(entityType: string): EntityType {\n switch (entityType) {\n case 'playlist':\n return EntityType.Playlist;\n case 'subject':\n return EntityType.Classification;\n case 'video':\n return EntityType.Video;\n case 'series':\n return EntityType.Series;\n case 'interactive':\n return EntityType.Interactive;\n case 'clip':\n return EntityType.Clip;\n }\n },\n\n getAnalyticsOptions(entityType: SharableEntityType): AnalyticsOptions {\n return {\n entity: ShareViewHelper.getAnalyticsEntity(entityType),\n location: LocationContext.Popup,\n workflowPhase: WorkflowPhase.Complete\n };\n },\n\n getFetchFunctionByType: (type: SharableEntityType) => {\n switch (type) {\n case 'video': {\n return (id: string) => Flight.useBasicFetch<Video>(VideoRequests.video(id));\n }\n\n case 'playlist': {\n return (id: string) => Flight.useBasicFetch<Playlist>(PlaylistRequests.getPlaylist(id));\n }\n\n case 'subject': {\n return (id: string, userId: string) => {\n return Flight.useBasicFetch<Classification>(ClassificationRequests.classification(id, userId));\n };\n }\n\n case 'series': {\n return (id: string) => Flight.useBasicFetch<Series>(SeriesRequests.series(id));\n }\n\n case 'interactive': {\n return (id: string) =>\n Flight.useBasicFetch<InteractiveMetadata>(InteractiveRequests.interactiveMetadata(id));\n }\n\n case 'clip': {\n return (id: string) =>\n Flight.useBasicFetch<Clip>(ClipRequests.clip(id));\n }\n }\n },\n\n getImageUrl(sharedResource: SharableEntity): string {\n // Videos and potentially interactives + clips\n if ('thumbnail' in sharedResource && !!sharedResource.thumbnail)\n return sharedResource.thumbnail?.url;\n\n if ('_thumbnail' in sharedResource && !!sharedResource._thumbnail)\n return sharedResource._thumbnail?.url;\n\n // Topics and playlists\n if ('cover' in sharedResource)\n return sharedResource.cover?.url;\n\n // Series\n if ('tallPoster' in sharedResource)\n return sharedResource.tallPoster?.url;\n\n return '';\n },\n\n getShareRecipientsPhrase(selections: BaseObject[]) {\n if (!selections.length)\n return;\n\n let recipients: {[type: string]: BaseObject[] } = {};\n\n if (selections.length === 1) {\n return ArrayHelper.first(selections).name;\n }\n \n selections.forEach(s => {\n let paramKey;\n \n switch (s.typeId) {\n case MasterType.User:\n paramKey = 'users';\n break;\n \n case MasterType.Classroom:\n paramKey = 'classrooms';\n break;\n \n case MasterType.ClassroomGroup:\n paramKey = 'classroomGroups';\n break;\n }\n\n const recipientType = recipients[paramKey] ?? [];\n\n recipientType.push(s);\n\n recipients = {\n ...recipients,\n [paramKey]: ArrayHelper.uniq(recipientType)\n };\n });\n\n const onlyClassroomsSelected = recipients.classrooms &&\n !recipients.classroomGroups &&\n !recipients.users;\n const onlyGroupsSelected = recipients.classroomGroups &&\n !recipients.classrooms &&\n !recipients.users;\n const onlyUsersSelected = recipients.users &&\n !recipients.classrooms &&\n !recipients.classroomGroups;\n \n if (onlyClassroomsSelected)\n return getPhrase('classrooms', { smartCount: recipients.classrooms.length });\n \n if (onlyGroupsSelected)\n return getPhrase('groups', { smartCount: recipients.classroomGroups.length });\n \n if (onlyUsersSelected)\n return getPhrase('users', { smartCount: recipients.users.length });\n \n const mixedSelections = [];\n \n if (recipients.classrooms?.length)\n mixedSelections.push(getPhrase('classrooms', { smartCount: recipients.classrooms.length }));\n \n if (recipients.classroomGroups?.length)\n mixedSelections.push(getPhrase('groups', { smartCount: recipients.classroomGroups.length }));\n \n if (recipients.users?.length)\n mixedSelections.push(getPhrase('users', { smartCount: recipients.users.length }));\n \n const lastSelection = mixedSelections.pop();\n \n return `${mixedSelections.join(', ')} ${getPhrase('and')} ${lastSelection}`;\n }\n};\n","\nmodule.exports = function () {\n var selection = document.getSelection();\n if (!selection.rangeCount) {\n return function () {};\n }\n var active = document.activeElement;\n\n var ranges = [];\n for (var i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return function () {\n selection.type === 'Caret' &&\n selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(function(range) {\n selection.addRange(range);\n });\n }\n\n active &&\n active.focus();\n };\n};\n","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n \"text/plain\": \"Text\",\n \"text/html\": \"Url\",\n \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n var debug,\n message,\n reselectPrevious,\n range,\n selection,\n mark,\n success = false;\n if (!options) {\n options = {};\n }\n debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement(\"span\");\n mark.textContent = text;\n // avoid screen readers from reading out loud the text\n mark.ariaHidden = \"true\"\n // reset user styles for span element\n mark.style.all = \"unset\";\n // prevents scrolling to the end of the page\n mark.style.position = \"fixed\";\n mark.style.top = 0;\n mark.style.clip = \"rect(0, 0, 0, 0)\";\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = \"pre\";\n // do not inherit user-select (it may be `none`)\n mark.style.webkitUserSelect = \"text\";\n mark.style.MozUserSelect = \"text\";\n mark.style.msUserSelect = \"text\";\n mark.style.userSelect = \"text\";\n mark.addEventListener(\"copy\", function(e) {\n e.stopPropagation();\n if (options.format) {\n e.preventDefault();\n if (typeof e.clipboardData === \"undefined\") { // IE 11\n debug && console.warn(\"unable to use e.clipboardData\");\n debug && console.warn(\"trying IE specific stuff\");\n window.clipboardData.clearData();\n var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n window.clipboardData.setData(format, text);\n } else { // all other browsers\n e.clipboardData.clearData();\n e.clipboardData.setData(options.format, text);\n }\n }\n if (options.onCopy) {\n e.preventDefault();\n options.onCopy(e.clipboardData);\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection.addRange(range);\n\n var successful = document.execCommand(\"copy\");\n if (!successful) {\n throw new Error(\"copy command was unsuccessful\");\n }\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using execCommand: \", err);\n debug && console.warn(\"trying IE specific stuff\");\n try {\n window.clipboardData.setData(options.format || \"text\", text);\n options.onCopy && options.onCopy(window.clipboardData);\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using clipboardData: \", err);\n debug && console.error(\"falling back to prompt\");\n message = format(\"message\" in options ? options.message : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (typeof selection.removeRange == \"function\") {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious();\n }\n\n return success;\n}\n\nmodule.exports = copy;\n","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CopyToClipboard = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _copyToClipboard = _interopRequireDefault(require(\"copy-to-clipboard\"));\n\nvar _excluded = [\"text\", \"onCopy\", \"options\", \"children\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar CopyToClipboard = /*#__PURE__*/function (_React$PureComponent) {\n _inherits(CopyToClipboard, _React$PureComponent);\n\n var _super = _createSuper(CopyToClipboard);\n\n function CopyToClipboard() {\n var _this;\n\n _classCallCheck(this, CopyToClipboard);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n _defineProperty(_assertThisInitialized(_this), \"onClick\", function (event) {\n var _this$props = _this.props,\n text = _this$props.text,\n onCopy = _this$props.onCopy,\n children = _this$props.children,\n options = _this$props.options;\n\n var elem = _react[\"default\"].Children.only(children);\n\n var result = (0, _copyToClipboard[\"default\"])(text, options);\n\n if (onCopy) {\n onCopy(text, result);\n } // Bypass onClick if it was present\n\n\n if (elem && elem.props && typeof elem.props.onClick === 'function') {\n elem.props.onClick(event);\n }\n });\n\n return _this;\n }\n\n _createClass(CopyToClipboard, [{\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n _text = _this$props2.text,\n _onCopy = _this$props2.onCopy,\n _options = _this$props2.options,\n children = _this$props2.children,\n props = _objectWithoutProperties(_this$props2, _excluded);\n\n var elem = _react[\"default\"].Children.only(children);\n\n return /*#__PURE__*/_react[\"default\"].cloneElement(elem, _objectSpread(_objectSpread({}, props), {}, {\n onClick: this.onClick\n }));\n }\n }]);\n\n return CopyToClipboard;\n}(_react[\"default\"].PureComponent);\n\nexports.CopyToClipboard = CopyToClipboard;\n\n_defineProperty(CopyToClipboard, \"defaultProps\", {\n onCopy: undefined,\n options: undefined\n});","\"use strict\";\n\nvar _require = require('./Component'),\n CopyToClipboard = _require.CopyToClipboard;\n\nCopyToClipboard.CopyToClipboard = CopyToClipboard;\nmodule.exports = CopyToClipboard;",":local {\n .normal[readonly] {\n background-color: unset;\n }\n\n .copyBtn {\n transition: all 0.3s;\n }\n\n .embedHtmlInput[readonly] {\n background-color: unset;\n }\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { CopySvg } from 'libs/shared/images/svg/actions/CopySvg';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\n\nimport { IconButton } from '../icon-button/IconButton';\n\nimport styles from './copy-input.module.scss';\n\nconst namespace = 'shared.copyInput';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CopyInputProps {\n value: string;\n label?: string;\n // Greyed means the input will be greyed out. Normal means it will appear like a normal input\n styling?: 'greyed' | 'normal' | 'normal-v2';\n onCopy?: () => void;\n copyText?: string;\n copiedText?: string;\n showCopiedText?: boolean;\n extraButtonClassNames?: string;\n textarea?: boolean;\n hasInputBg?: boolean;\n rows?: number;\n textAreaClassName?: string;\n}\n\nCopyInput.defaultProps = {\n styling: 'normal'\n};\n\nexport function CopyInput(props: CopyInputProps): JSX.Element {\n const [ localShowCopiedText, setLocalShowCopiedText ] = React.useState(props.showCopiedText || false);\n\n function revertLocalShowCopiedText() {\n setTimeout(() => setLocalShowCopiedText(false), 2000);\n }\n\n function onCopy(): void {\n if (props.onCopy)\n props.onCopy();\n\n if (localShowCopiedText)\n return;\n\n setLocalShowCopiedText(true);\n revertLocalShowCopiedText();\n }\n\n React.useEffect(() => {\n if (!props.showCopiedText)\n return;\n \n revertLocalShowCopiedText();\n }, [props.showCopiedText]);\n\n function Button() {\n if (props.styling === 'normal-v2') {\n return (\n <CopyToClipboard text={props.value} onCopy={onCopy}>\n <IconButton\n role={localShowCopiedText ? 'status' : ''}\n svg={localShowCopiedText ? CheckSvg : CopySvg}\n className={classNames(\n styles.copyBtn,\n 'btn py-0 text-nowrap',\n localShowCopiedText ? 'btn-success text-white' : 'btn-outline-dark border-secondary',\n props.extraButtonClassNames\n )}\n >\n {localShowCopiedText ?\n props.copiedText || getPhrase('copiedLink') :\n props.copyText || getPhrase('copy')\n }\n </IconButton>\n </CopyToClipboard>\n );\n }\n\n return (\n <CopyToClipboard text={props.value} onCopy={onCopy}>\n <button\n role={localShowCopiedText ? 'status' : ''}\n className={classNames(\n 'btn btn-outline-dark border border-secondary py-0 text-nowrap',\n props.extraButtonClassNames\n )}\n >\n {localShowCopiedText ?\n props.copiedText || getPhrase('copied') :\n props.copyText || getPhrase('copy')\n }\n </button>\n </CopyToClipboard>\n );\n }\n\n const input = (\n <div className={props.styling === 'normal-v2' ? 'd-flex flex-row gap-2 position-relative w-100' : 'input-group'}>\n {props.textarea ?\n <textarea\n className={classNames('form-control rounded w-100 h-100', !props.hasInputBg && styles.embedHtmlInput, props.textAreaClassName)}\n spellCheck={false}\n value={props.value}\n rows={props.rows || 7}\n readOnly\n /> :\n <input\n type='text'\n autoComplete='off'\n className={classNames(\n 'form-control',\n props.styling === 'normal' && props.styling\n )}\n spellCheck={false}\n value={props.value}\n readOnly\n />\n }\n \n <Button />\n </div>\n );\n\n if (props.label) {\n return (\n <Form.Group className='form-group'>\n <Form.Label>{props.label}</Form.Label>\n {input}\n </Form.Group>\n );\n }\n\n return input;\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nconst namespace = 'shared.shared-utils';\n\nexport interface EmbedResolution {\n width: '100%' | '640' | '1014' | '1280';\n height: '100%' | '360' | '576' | '720';\n label: string;\n}\n\nexport const EmbedHelper = {\n getEmbedResolutions(includeResponsive: boolean = true): EmbedResolution[] {\n const resolutions: EmbedResolution[] = [\n {\n label: LanguageService.getPhrase(namespace, 'small'),\n width: '640',\n height: '360'\n },\n {\n label: LanguageService.getPhrase(namespace, 'medium'),\n width: '1014',\n height: '576'\n },\n {\n label: LanguageService.getPhrase(namespace, 'large'),\n width: '1280',\n height: '720'\n }\n ];\n\n if (includeResponsive) {\n resolutions.unshift({\n label: LanguageService.getPhrase(namespace, 'responsive'),\n width: '100%',\n height: '100%'\n });\n }\n return resolutions;\n },\n getEmbedString(options: {\n size: EmbedResolution,\n url: string\n }): string {\n const { url, size } = options;\n\n const isResponsive = size.width === '100%';\n\n const dynamicAttributes = isResponsive ?\n 'style=\"position:absolute; top:0; left:0; width:100%; height:100%;\"' :\n `width=\"${size.width}\" height=\"${size.height}\"`;\n\n const fixedAttributes = 'frameborder=\"0\" allowfullscreen webkitallowfullscreen mozallowfullscreen allow=\"autoplay\"';\n\n const src = `src=\"${url}\"`;\n\n const iframe = `<iframe ${dynamicAttributes} ${fixedAttributes} ${src}></iframe>`;\n\n if (isResponsive)\n return `<div style=\"padding:56.25% 0 0 0; position:relative;\">${iframe}</div>`;\n\n return iframe;\n },\n buildEmbedUrl(options: {\n embedUrl: string,\n host: string,\n shareId: string,\n autoplay: boolean,\n consumerKey?: string\n }): string {\n const { embedUrl, host, shareId, autoplay, consumerKey } = options;\n\n /**\n * embedUrl didn't always exist in Share API. So we use it if it's there, but fall back to building\n * the share link if it's not. - Sha\n */\n let baseUrl = embedUrl;\n\n if (!baseUrl)\n baseUrl = UrlHelper.safeUrlConcat(host, `share/embed/${shareId}`);\n\n const params: HashObject = {};\n\n if (autoplay)\n params.a = true;\n\n if (consumerKey)\n params.consumerKey = consumerKey;\n\n return UrlHelper.urlBuilder(baseUrl, params);\n }\n};\n","$cv-share-button-height: $input-btn-padding-y * 2 + $input-btn-line-height;\n\n:local {\n .embedHtmlInput[readonly] {\n background-color: unset;\n }\n\n .copyBtnContainer {\n height: $cv-share-button-height;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmbedSize } from 'libs/shared/apps/share/components/embed-size/EmbedSize';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { BaseObject, PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { EmbedHelper, EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nimport styles from './copy-embed-html.module.scss';\n\nconst namespace = 'share.copyEmbedHtml';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface EmbedDetails {\n size: EmbedResolution;\n autoplay: boolean;\n}\n\ntype CopyEmbedHtmlProps = PropsWithAnalyticsOptions<{\n entity: BaseObject,\n entityType: SharableEntityType,\n liteUrl: string,\n entityId: string,\n shareId: string,\n embedUrl: string,\n hideLabel?: boolean,\n hasInputBg?: boolean,\n onCopy?: (details: EmbedDetails) => void,\n showEmbedCopiedText?: boolean,\n styling?: 'greyed' | 'normal' | 'normal-v2'\n}>;\n\nCopyEmbedHtml.defaultProps = {\n styling: 'normal'\n};\n\nexport function CopyEmbedHtml(props: CopyEmbedHtmlProps): JSX.Element {\n const videoSizes = EmbedHelper.getEmbedResolutions();\n\n const [ copied, setCopied ] = React.useState<boolean>(!!props.showEmbedCopiedText);\n const [ autoplay, setAutoplay ] = React.useState(false);\n const [ videoSize, setVideoSize ] = React.useState<EmbedResolution>(videoSizes.find(s => s.width === '100%'));\n const [ logged, setLogged ] = React.useState(false);\n\n /**\n * When going to the CopyEmbedView from the CreateShareView we want to show the copied text\n * for a short period of time.\n * - Sha\n */\n React.useEffect(() => {\n if (!props.showEmbedCopiedText)\n return;\n\n setTimeout(() => setCopied(false), 2000);\n }, [props.showEmbedCopiedText]);\n\n function onCopy(): void {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n if (typeof props.onCopy === 'function') {\n props.onCopy({\n size: videoSize,\n autoplay\n });\n return;\n }\n\n AnalyticsHelper.logUserAction({\n ...props.entity,\n embedDetails: {\n size: videoSize,\n autoplay\n }\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), [\n {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyEmbedHtml,\n eventVersion: EventVersion.V3\n },\n props.analyticsOptions\n ]));\n }\n\n function onSetAutoplay(autoplay: boolean) {\n setLogged(false);\n setAutoplay(autoplay);\n }\n\n function onSetVideoSize(videoSize: EmbedResolution) {\n setLogged(false);\n setVideoSize(videoSize);\n }\n\n const url = EmbedHelper.buildEmbedUrl({\n embedUrl: props.embedUrl,\n host: props.liteUrl,\n shareId: props.shareId,\n autoplay\n });\n \n const embedString = EmbedHelper.getEmbedString({\n url,\n size: videoSize\n });\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <CopyInput\n value={embedString}\n onCopy={onCopy}\n copiedText={props.styling === 'normal-v2' ? getPhrase('copiedV2') : getPhrase('copied')}\n copyText={getPhrase('copy')}\n showCopiedText={copied}\n styling={props.styling}\n extraButtonClassNames={classNames('position-absolute bottom-0 end-0', styles.copyBtnContainer)}\n hasInputBg={props.hasInputBg}\n label={props.hideLabel ? undefined : getPhrase('label')}\n textarea\n />\n <EmbedSize\n autoplay={autoplay}\n setAutoplay={onSetAutoplay}\n videoSize={videoSize}\n setVideoSize={onSetVideoSize}\n videoSizes={videoSizes}\n />\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CopyEmbedHtml } from 'libs/shared/apps/share/components/copy-embed-html/CopyEmbedHtml';\nimport { SharableEntity, SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\n\ninterface CopyEmbedProps {\n entity: SharableEntity;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n liteUrl: string;\n entityId: string;\n analyticsOptions: AnalyticsOptions;\n onClickCancel: () => void;\n}\n\nexport function CopyEmbed(props: CopyEmbedProps) {\n return (\n <>\n <div className='mb-3'>\n <CopyEmbedHtml\n embedUrl={props.shareLink.embedUrl}\n entity={props.entity}\n entityType={props.entityType}\n liteUrl={props.liteUrl}\n entityId={props.entityId}\n shareId={props.shareLink.id}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n\n <PopupButtons>\n <DivButton onClick={props.onClickCancel} className='btn btn-outline-dark'>\n <Text namespace={namespace} phrase='back' />\n </DivButton>\n </PopupButtons>\n </>\n );\n}\n","import React from 'react';\n\nexport function CodeSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M9.758 8.424a.6.6 0 1 0-.849-.848l-4 4a.6.6 0 0 0 0 .848l4 4a.6.6 0 0 0 .849-.848L6.182 12zm5.333-.848a.6.6 0 1 0-.849.848L17.818 12l-3.576 3.576a.6.6 0 0 0 .849.848l4-4a.6.6 0 0 0 0-.848z'\n clipRule='evenodd'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CodeSvg } from 'libs/shared/images/svg/objects/CodeSvg';\n\nconst namespace = 'share.getEmbedCode';\n\ninterface GetEmbedCodeProps {\n onClickGetEmbedCode: () => void;\n minimal?: boolean;\n}\n\nexport function GetEmbedCode(props: GetEmbedCodeProps) {\n return (\n <DivButton\n onClick={props.onClickGetEmbedCode}\n className='d-inline-block p-1 pe-2 rounded-1 hover-bg-light-blue'\n >\n <div className='d-flex align-items-center'>\n <div className={classNames('me-2', !props.minimal && 'bg-dark text-white rounded-1')}>\n <SvgContainer\n svg={CodeSvg}\n size={props.minimal ? SvgContainerSize.Standard : SvgContainerSize.Large}\n />\n </div>\n <Text namespace={namespace} phrase='getEmbedCode' />\n </div>\n </DivButton>\n );\n}\n","export enum ShareLinkStatus {\n Expired = 'Expired',\n Active = 'Active'\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: VisibleOnSvg, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy.privacy) {\n case 'public':\n return { icon: VisibleOnSvg, text: getPhrase('publicDescription') };\n case 'protected':\n if (privacy.overrideRestrictions)\n return { icon: VisibleOnSvg, text: getPhrase('clickViewOnly') };\n return {\n icon: LockSvg,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case 'just_my_customer':\n if (privacy.overrideRestrictions)\n return { icon: LockSvg, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n return {\n icon: LockSvg,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n /**\n * Because we plan to add restricted management later \n * for the time being we treat is the same as private \n */\n case 'restricted':\n case 'private':\n return { icon: LockSvg, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: LockSvg, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday ?\n getPhrase('expiryToday') :\n getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: TimerSvg, text };\n }\n \n let text = isToday ?\n getPhrase('passwordExpiryToday') :\n getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: LockSvg, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n }\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareLinkHelper } from 'libs/shared/apps/share/utils/ShareLinkHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\n\nimport { SharePrivacyResponse } from '../../interfaces/responses/SharePrivacyResponse';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ShareLinkInfoProps {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n onClickSavePrivacy?: (privacy: SharePrivacy, onClickSavePrivacy: boolean) => void;\n entity: BaseObject;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\ninterface ShareLinkItemProps {\n active: boolean;\n title: string;\n description: string;\n onClick: () => void;\n}\n\nfunction ShareLinkItem(props: ShareLinkItemProps) {\n const { active, title, description, onClick } = props;\n\n return (\n <button\n className={`${active ? 'bg-light-blue' : ''} dropdown-item d-flex align-items-center justify-content-between`}\n onClick={!active ? onClick : null}\n type='button'\n >\n <div className='me-4'>\n <p className='fw-semibold mb-1'>{title}</p>\n <p className='font-size-sm mb-0'>{description}</p>\n </div>\n {active && <SvgContainer svg={CheckSvg} />}\n </button>\n );\n}\n\nexport function ShareLinkInfo(props: ShareLinkInfoProps): JSX.Element {\n const [ canManageAccess, setCanManageAccess ] = React.useState(false);\n const [ privacy, setPrivacy ] = React.useState<SharePrivacy>(null);\n\n const { icon, text } = ShareLinkHelper.getIconAndText(props);\n\n React.useEffect(() => {\n setCanManageAccess(props.privacy.canManageAccess);\n setPrivacy(props.privacy.privacy);\n }, [props.privacy]);\n\n const canManageAccessPrivacy = canManageAccess ? 'just_my_customer' : 'protected';\n\n const canUpdatePrivacy = (\n !props.isPasswordProtected &&\n !props.linkExpireDate &&\n (props.shareOverrideRestrictions && !props.hasStudentExp)\n );\n\n return (\n <div className='d-flex align-items-center'>\n {(canUpdatePrivacy) ?\n (\n <div className='btn-group'>\n <button\n className='btn border-0 info-link dropdown-toggle p-1 bg-light-blue-hover'\n data-bs-toggle='dropdown'\n aria-label={getPhrase('ariaPrivacy')}\n >\n <SvgContainer svg={icon} className='svg-container me-1' />\n <span className='me-1'>{text}</span>\n </button>\n <ul className='dropdown-menu cursor-pointer'>\n {canManageAccess &&\n <li>\n <ShareLinkItem\n active={privacy === 'public'}\n title={getPhrase('public')}\n description={getPhrase('publicDescription')}\n onClick={() => props.onClickSavePrivacy('public', false)}\n />\n </li>\n }\n <li>\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && props.privacy.overrideRestrictions}\n title={getPhrase('justMySchool')}\n description={canManageAccess ? getPhrase('justMySchoolDescription') : getPhrase('clickViewOnly')}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, true)}\n />\n </li>\n <li>\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && !props.privacy.overrideRestrictions}\n title={getPhrase('respectRatings')}\n description={ShareLinkHelper.getRespectRatingText(\n props.entity,\n props.yearGroups,\n props.hasStudentExp\n )}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, false)}\n />\n </li>\n <li>\n <ShareLinkItem\n active={privacy === 'private'}\n title={getPhrase('private')}\n description={getPhrase('privateDescription')}\n onClick={() => props.onClickSavePrivacy('private', false)}\n />\n </li>\n </ul>\n </div>\n ) :\n (\n <>\n <SvgContainer svg={icon} className='svg-container me-1' />\n <span>{text}</span>\n </>\n )\n }\n </div>\n );\n}\n","import React from 'react';\n\nexport function GoogleClassroomAvatar(): JSX.Element {\n return (\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none'>\n <circle cx='12' cy='12' r='12' fill='url(#pattern0)'/>\n <defs>\n <pattern id='pattern0' patternContentUnits='objectBoundingBox' width='1' height='1'>\n <use xlinkHref='#image0_3558_14996' transform='scale(0.00520833)'/>\n </pattern>\n <image id='image0_3558_14996' width='192' height='192' xlinkHref='data:image/png;base64,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'/>\n </defs>\n </svg>\n );\n}\n","import React from 'react';\n\nexport function MicrosoftTeamsAvatar(): JSX.Element {\n return (\n <svg viewBox='0 0 40 40' fill='none'>\n <path d='M29.692 15.31c.58 0 1.146-.173 1.628-.5a2.96 2.96 0 001.078-1.331 3.004 3.004 0 00-.634-3.235 2.918 2.918 0 00-1.5-.812 2.894 2.894 0 00-1.693.169 2.938 2.938 0 00-1.314 1.093 2.997 2.997 0 00.364 3.748 2.91 2.91 0 002.071.869zM20.043 26.267V13.849a.9.9 0 00-.259-.633.877.877 0 00-.624-.262H6.883a.877.877 0 00-.624.262.9.9 0 00-.259.633v12.418c0 .24.092.469.257.64.165.172.39.27.626.276H19.16a.899.899 0 00.626-.276.923.923 0 00.257-.64zm-3.51-10.389v1.92h-2.37v6.68H11.88V17.93H9.51v-2.182h7.022v.13z' fill='#fff'/>\n <path d='M21.874 14.132v.917a4.03 4.03 0 002.05-1.47c.512-.699.79-1.545.793-2.415 0-1.1-.431-2.154-1.199-2.932a4.065 4.065 0 00-2.893-1.214 4.065 4.065 0 00-2.894 1.214 4.175 4.175 0 00-1.199 2.932h2.391a2.996 2.996 0 012.061.887c.55.552.868 1.297.89 2.081zM26.332 17.1h-4.458v8.883c0 .8-.309 1.566-.86 2.138-.552.57-1.302.9-2.091.917h-4.588a7.047 7.047 0 003.265 3.317c1.427.7 3.046.887 4.593.532a6.99 6.99 0 003.918-2.486 7.152 7.152 0 001.535-4.418v-7.551a1.348 1.348 0 00-.385-.942 1.313 1.313 0 00-.929-.39zM32.772 17.1h-3.597c.206.414.316.87.323 1.332v7.551a9.1 9.1 0 01-.516 2.859c.236.021.474.021.71 0a4.28 4.28 0 003.046-1.278A4.394 4.394 0 0034 24.477v-6.045c0-.339-.126-.665-.354-.912a1.307 1.307 0 00-.874-.42z' fill='#fff'/>\n </svg>\n );\n}\n","$ms-teams-purple: #6364a7;\n$hoverable-black: #000;\n\n:local {\n .hoverable {\n background: $hoverable-black;\n\n >:first-child {\n\n &:hover,\n &:focus {\n // Matches the hover state added automatically by google classroom\n opacity: 0.87;\n }\n }\n }\n\n .msTeamsContainer {\n background-color: $ms-teams-purple;\n }\n\n .avatar {\n width: 1.5rem;\n height: 1.5rem;\n\n &:not(:first-child) {\n margin-left: -#{map-get($spacers, 1)};\n }\n\n &.small {\n width: 1.0625rem; // 17px\n height: 1.0625rem; // 17px\n\n svg {\n vertical-align: top;\n }\n }\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { GoogleClassroomAvatar } from './avatars/GoogleClassroomAvatar';\nimport { MicrosoftTeamsAvatar } from './avatars/MicrosoftTeamsAvatar';\n\nimport styles from './share-integrations.module.scss';\n\nconst namespace = 'share.shareIntegrations';\n\ninterface ShareIntegrationsStackProps {\n size?: 'sm' | 'md';\n noTooltip?: boolean;\n}\n\nexport function ShareIntegrationsStack(props?: ShareIntegrationsStackProps): JSX.Element {\n const className = classNames(\n styles.avatar,\n props?.size === 'sm' && styles.small,\n props?.size !== 'sm' && 'border',\n 'rounded-circle overflow-hidden'\n );\n\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'shareThroughIntegrations')} spanHack disable={props.noTooltip}>\n <ul className='list-unstyled d-flex mb-0'>\n <li className={className} style={{ zIndex: 1 }}>\n <GoogleClassroomAvatar />\n </li>\n\n <li className={`${className} ${styles.msTeamsContainer}`} style={{ zIndex: 0 }}>\n <MicrosoftTeamsAvatar />\n </li>\n </ul>\n </Tooltip>\n );\n}\n","import React from 'react';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { ShareLinkInfo } from 'libs/shared/apps/share/components/share-link-info/ShareLinkInfo';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareIntegrationsStack } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsStack';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { BaseObject, ShareLink, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'share.shareAsLink';\n\ninterface ShareAsLinkProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n onClickShowSettings: () => void;\n onClickCreateLink: () => void;\n shareLinkIsLoading?: boolean;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n entityTypeId: MasterType;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n enableIntegrations: boolean;\n hasStudentExp: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareAsLink(props: ShareAsLinkProps): React.ReactElement {\n const [ logged, setLogged ] = React.useState(false);\n\n function onCopy(): void {\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n id: props.entity.id,\n name: props.entity.name\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyLink,\n eventVersion: EventVersion.V3\n }));\n }\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n <div className={`${props.shareLink ? 'w-100' : 'w-75 d-flex align-items-center'}`}>\n {props.shareLink ?\n (\n <>\n <div className='d-flex justify-content-between align-items-center mb-1'>\n <ShareLinkInfo\n linkExpireDate={props.shareLink.linkExpireDate}\n isPasswordProtected={props.shareLink.isPasswordProtected}\n privacy={props.privacy}\n entityTypeId={props.shareLink.objectTypeId}\n status={props.shareLink.status}\n onClickSavePrivacy={props.onClickSavePrivacy}\n hasStudentExp={props.hasStudentExp}\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </div>\n <CopyInput value={props.shareLink.url} onCopy={onCopy} />\n </>\n ) : (\n <div className='d-flex align-items-center'>\n <div className='me-2'>\n {props.enableIntegrations ? (\n <ShareIntegrationsStack />\n ) : (\n <SvgContainer svg={LinkSvg} className='svg-container' />\n )}\n </div>\n \n <span className='fw-semibold'><Text namespace={namespace} phrase='createLink' /></span>\n </div>\n )\n }\n </div>\n {!props.shareLink &&\n <DivButton className='info-link' onClick={props.onClickCreateLink}>\n <Text phrase='createLink' />\n </DivButton>\n }\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\n/**\n * We only need to load any script once.\n */\nconst loadedScripts: HashObject<boolean> = {};\n\nexport function useScript(src: string, shouldLoad: boolean): boolean {\n const [ loaded, setLoaded ] = React.useState(false);\n\n React.useEffect(() => {\n if (!src || !shouldLoad || loadedScripts[src])\n return;\n\n const script = document.createElement('script');\n\n script.src = src;\n script.async = true;\n script.onload = () => {\n loadedScripts[src] = true;\n /**\n * Onload event is fired before script content is parsed.\n * By calling set timeout, we ensure setLoaded is called after\n * the script is parsed in the event loop.\n */\n window.setTimeout(() => setLoaded(true), 0);\n };\n\n document.body.appendChild(script);\n\n return () => {\n script.onload = null;\n document.body.removeChild(script);\n };\n }, [ src, shouldLoad ]);\n\n return loadedScripts[src] || loaded;\n}\n","import React from 'react';\n\nimport { useScript } from 'libs/shared/hooks/useScript';\n\nconst GOOGLE_CLASSROOM_CONTAINER_ID = 'g-share-to-classroom';\n\nexport function useGoogleClassrooms(shouldLoad: boolean): string {\n /**\n * Google sdk reads the config off the window.\n */\n if (shouldLoad)\n (window as any).___gcfg = { parsetags: 'explicit' };\n\n const loaded = useScript('https://apis.google.com/js/platform.js', shouldLoad);\n\n React.useEffect(() => {\n if (!shouldLoad || !loaded)\n return;\n\n window.gapi?.sharetoclassroom?.go(GOOGLE_CLASSROOM_CONTAINER_ID);\n }, [ shouldLoad, loaded ]);\n\n return GOOGLE_CLASSROOM_CONTAINER_ID;\n}\n","import React from 'react';\n\nimport { useScript } from 'libs/shared/hooks/useScript';\n\nexport function useMicrosoftTeamsShare(shouldLoad: boolean): void {\n const loaded = useScript('https://teams.microsoft.com/share/launcher.js', shouldLoad);\n\n React.useEffect(() => {\n if (!shouldLoad || !loaded)\n return;\n\n window.shareToMicrosoftTeams?.renderButtons();\n }, [ shouldLoad, loaded ]);\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\n\nconst namespace = 'shared.lookingForIntegration';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\ninterface LookingForIntegrationProps {\n appLink: Core.AppLink;\n closePopup?: () => void;\n hideDismiss?: boolean;\n hideBackground?: boolean;\n normalText?: boolean;\n}\n\ninterface LookingForIntegrationViewModel {\n show: boolean;\n}\n\nexport function LookingForIntegration(props: LookingForIntegrationProps): JSX.Element {\n const [ visibility, setVisibility ] = useViewModel<LookingForIntegrationViewModel>(\n SharedViewModelKeys.LOOKING_FOR_INTEGRATION,\n { show: true },\n { storage: StorageType.LocalStorage }\n );\n\n if (!visibility.show)\n return <></>;\n\n return (\n <div className={classNames(`d-flex justify-content-between`, !props.hideBackground && 'rounded p-2 bg-light-blue')}>\n <AppLink\n appLink={props.appLink}\n onClick={() => props.closePopup?.()}\n className='d-inline-flex align-items-center mb-0'\n >\n <span className={classNames('ms-1 text-info', !props.normalText && 'fw-semibold')}>\n <Text namespace={namespace} phrase='lookingForIntegration' />\n </span>\n </AppLink>\n {!props.hideDismiss &&\n <button onClick={() => setVisibility({ show: false })} aria-label={`${getPhrase('ariaClose')}`}>\n <SvgContainer\n svg={CloseSvg}\n size={SvgContainerSize.Small}\n className='text-info d-inline-block svg-container'\n />\n </button>\n }\n </div>\n );\n}\n","export enum IntegrationId {\n GoogleClassroom = 'google-classroom',\n MicrosoftTeams = 'microsoft-teams',\n Vivi = 'vivi',\n AppleTv = 'apply-tv'\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\n\nimport { useGoogleClassrooms } from 'libs/shared/apps/share/views/share/components/share-integrations/useGoogleClassrooms';\nimport { useMicrosoftTeamsShare } from 'libs/shared/apps/share/views/share/components/share-integrations/useMicrosoftTeamsShare';\nimport { LookingForIntegration } from 'libs/shared/components/looking-for-integration/LookingForIntegration';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\n\nimport styles from './share-integrations.module.scss';\n\nconst DEFAULT_ICON_SIZE = '32';\n\ninterface ShareIntegrationsProps {\n integrations: IntegrationId[];\n url: string;\n appLink?: AppLink;\n iconSize?: 'sm' | 'md';\n closePopup?: () => void;\n hideLookingForIntegrations?: boolean;\n}\n\nexport function ShareIntegrations(props: ShareIntegrationsProps): JSX.Element {\n const googleContainerId = useGoogleClassrooms(props.integrations?.includes(IntegrationId.GoogleClassroom));\n useMicrosoftTeamsShare(props.integrations?.includes(IntegrationId.MicrosoftTeams));\n\n if (!props.integrations.length && !props.hideLookingForIntegrations)\n return (\n <LookingForIntegration\n appLink={props.appLink}\n closePopup={props.closePopup}\n />\n );\n\n function getIconSize() {\n switch (props.iconSize) {\n case 'sm': return '24';\n case 'md':\n default: return DEFAULT_ICON_SIZE;\n }\n }\n\n const iconSize = getIconSize();\n const integrationsContainerStyle = { height: `${iconSize}px`, width: `${iconSize}px` };\n\n return (\n <div className='d-flex gap-1 align-items-start'>\n {props.integrations.includes(IntegrationId.GoogleClassroom) &&\n <div\n id={googleContainerId}\n className='rounded partial-loading-background'\n style={integrationsContainerStyle}\n >\n <div\n className='g-sharetoclassroom'\n data-size={iconSize}\n data-url={props.url}\n />\n </div>\n }\n {props.integrations.includes(IntegrationId.MicrosoftTeams) &&\n <div className={`rounded overflow-hidden ${styles.hoverable}`}>\n <div\n className={`teams-share-button ${styles.msTeamsContainer}`}\n style={integrationsContainerStyle}\n data-href={props.url}\n data-button-type='smallTransWhite'\n data-preview='false'\n data-icon-px-size={iconSize}\n />\n </div>\n }\n </div>\n );\n}\n","import React from 'react';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\n\ninterface RestrictionBadgeProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionBadge(props: RestrictionBadgeProps): JSX.Element {\n return (\n <Badge\n type={BadgeType.Restriction}\n data={{ restrictions: props.restrictions, yearGroups: props.yearGroups }}\n inline\n />\n );\n}\n","import React from 'react';\n\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { RestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/RestrictionBadge';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemRestrictionBadgeProps {\n video: VideoTypes;\n yearGroups: YearGroup[];\n className?: string;\n}\n\nexport function VideoItemRestrictionBadge(props: VideoItemRestrictionBadgeProps): JSX.Element {\n const hasRestrictions = RestrictionHelper.hasRestrictions(props.video?._restrictions);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!hasRestrictions || !props.yearGroups || !canConsume)\n return <></>;\n \n return (\n <BadgeListContainer className={props.className || 'pt-1'}>\n <RestrictionBadge restrictions={props.video._restrictions} yearGroups={props.yearGroups} />\n </BadgeListContainer>\n );\n}\n","import React from 'react';\nimport { Form as FormikForm } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharableEntity } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst getPhrase = LanguageService.encloseNamespace('share.shareMessage');\n\nconst MessageValidationSchema = Yup.object().shape({\n message: Yup.string()\n .max(280, () => getPhrase('maxMessageLen'))\n});\n\ninterface ShareMessageRequest {\n message?: string;\n}\n\ninterface ShareMessageFormProps {\n entity: SharableEntity;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nfunction ShareMessageForm(props: ShareMessageFormProps): React.ReactElement {\n const formikProps = useFormikContextWrapper<ShareMessageRequest>();\n\n return (\n <FormikForm>\n <FormField\n component='textarea'\n name='message'\n id='message'\n placeholder={getPhrase('placeholder')}\n value={formikProps.values.message}\n label={getPhrase('label')}\n showOptionalLabel\n />\n {!props.shareOverrideRestrictions && VideoHelper.isVideoType(props.entity) &&\n <div className='mb-3'><VideoItemRestrictionBadge video={props.entity} yearGroups={props.yearGroups} /></div>}\n <PopupButtons>\n <PopupButtons.Submit variant='dark' text={getPhrase('share')} />\n </PopupButtons>\n </FormikForm>\n );\n}\n\ninterface ShareMessageProps {\n onClickShare: (message: string, onDone: () => void) => void;\n entity: SharableEntity;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareMessage(props: ShareMessageProps): React.ReactElement {\n function onSubmit(data: ShareMessageRequest, onDone: () => void): void {\n let message: string = null;\n\n if (data.message)\n message = data.message;\n\n props.onClickShare(message, onDone);\n }\n\n return (\n <FormWrapper<ShareMessageRequest>\n initialValues={{ message: '' }}\n validationSchema={MessageValidationSchema}\n onSubmit={onSubmit}\n allowInitialSubmit={true}\n >\n <ShareMessageForm\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </FormWrapper>\n );\n}\n","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { TypeFilter } from 'libs/shared/apps/search/interfaces/TypedFilter';\nimport { GetEmbedCode } from 'libs/shared/apps/share/components/get-embed-code/GetEmbedCode';\nimport { RecipientItem } from 'libs/shared/apps/share/components/recipient-item/RecipientItem';\nimport { TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT, TokenizedTypeahead } from 'libs/shared/apps/share/components/tokenized-typeahead/TokenizedTypeahead';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareAsLink } from 'libs/shared/apps/share/views/share/components/share-as-link/ShareAsLink';\nimport { ShareIntegrations } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrations';\nimport { ShareMessage } from 'libs/shared/apps/share/views/share/components/share-message/ShareMessage';\nimport { SharableEntity, SharableEntityType, SharableRecipient } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { HasLocalPermissionsFunc, usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, ClassroomGroup, CurrentUser, PropsWithAnalyticsOptions, ShareLink, ShareSearchResponse, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction filterSearchResults(\n recipientsToFilter: SharableRecipient[],\n currentSelections: SharableRecipient[],\n existingShareRecipients: SharableRecipient[],\n currentUserId: string\n): SharableRecipient[] {\n if (!recipientsToFilter)\n return [];\n\n const selectedIds = [ ...currentSelections, ...existingShareRecipients ].map(s => s.id);\n\n return recipientsToFilter.filter(s => {\n // Prevent users from sharing to other users who have already been shared this resource\n if (selectedIds.includes(s.id))\n return false;\n\n // Prevent users from sharing to themselves\n if (s.id === currentUserId)\n return false;\n\n return true;\n });\n}\n\ntype MainShareProps = PropsWithAnalyticsOptions<{\n entity: SharableEntity,\n entityType: SharableEntityType,\n directShareRecipients: SharableRecipient[],\n recentlySharedTo: SharableRecipient[],\n onClickCreateLink: () => void,\n onClickShowSettings: () => void,\n onClickShare: (recipients: SharableRecipient[], message: string, onDone?: () => void) => void,\n onClickRemoveRecipient: (recipientId: string, onError?: () => void) => void,\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void,\n onClickGetEmbedCode: () => void,\n gatewayApiUrl: string,\n imageCdnUrl: string,\n currentUser: CurrentUser,\n searchRequestHeaders?: HashObject,\n emptyStateImageUrl: string,\n errorStateImageUrl: string,\n integrations: IntegrationId[],\n shareLink?: ShareLink,\n shareLinkIsLoading?: boolean,\n fetchRecipientUsers?: (id: string, callback: (users: UserCollection) => void) => void,\n canAddPolicies: boolean,\n privacy: SharePrivacyResponse,\n integrationSettingAppLink?: Core.AppLink,\n messagePopupAppLink?: Core.AppLink,\n closePopup: () => void,\n enableIntegrationBanner?: boolean,\n canEmbed?: boolean,\n yearGroups: YearGroup[],\n shareOverrideRestrictions: boolean,\n hasLocalPermissions: HasLocalPermissionsFunc\n}>;\n\nexport function MainShare(props: MainShareProps): JSX.Element {\n const [ selections, setSelections ] = React.useState<SharableRecipient[]>([]);\n const [ showShareLinkSpinner, setShowShareLinkSpinner ] = React.useState(false);\n\n const { hasPermissions } = usePermissions();\n const { hasClassrooms } = useSettings(null);\n const hasManageIntegrationsPermission = hasPermissions(PermissionName.ManageIntegrations);\n\n function onClickShare(message: string, onDone: () => void): void {\n props.onClickShare(\n selections,\n message,\n () => {\n setSelections([]);\n onDone();\n }\n );\n }\n\n function fetchSelectionMembers(id: string): void {\n if (!props.fetchRecipientUsers)\n return;\n\n const callback = (users: UserCollection) => {\n const newSelections: SharableRecipient[] = [];\n\n selections.forEach(selection => {\n if (selection.id !== id)\n return newSelections.push(selection);\n\n const updatedSelection = ObjectHelper.deepClone<Classroom | ClassroomGroup>(selection);\n\n if (!users?.data?.length) {\n updatedSelection.users = { count: 0, data: [], pagination: null };\n } else {\n updatedSelection.users = users;\n }\n\n newSelections.push(updatedSelection);\n });\n\n setSelections(ArrayHelper.uniq(newSelections, 'id'));\n };\n\n props.fetchRecipientUsers(id, callback);\n }\n\n function getRemotePostBody(query: string): HashObject {\n const indices: TypeFilter[] = [];\n\n if (hasPermissions(PermissionName.ShareToUsers)) {\n indices.push({\n index: 'user',\n filters: {\n userType: [ UserGroup.Staff, UserGroup.Learner ],\n userProfile: {\n status: [`${ObjectStatus.Active.toLowerCase()}`],\n customerId: props.currentUser.customerId\n }\n }\n });\n }\n\n if (hasPermissions(PermissionName.ShareToClassrooms))\n indices.push({ index: 'classroom' });\n\n if (hasPermissions(PermissionName.ShareToClassroomGroups))\n indices.push({ index: 'classroom_group' });\n\n return {\n query,\n indices,\n searchType: 'user',\n limit: TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT\n };\n }\n\n const canDirectShare = hasClassrooms && (\n hasPermissions(PermissionName.ShareToUsers) ||\n hasPermissions(PermissionName.ShareToClassrooms) ||\n hasPermissions(PermissionName.ShareToClassroomGroups)\n );\n\n const recentSearches = filterSearchResults(\n props.recentlySharedTo,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n );\n\n function onClickCreateShareLink(): void {\n setShowShareLinkSpinner(true);\n props.onClickCreateLink();\n }\n\n React.useEffect(() => {\n setShowShareLinkSpinner(!!props.shareLinkIsLoading);\n }, [props.shareLinkIsLoading]);\n\n return (\n <>\n {canDirectShare && (\n <div className='bg-white rounded-bottom-3 pt-3 px-3 mb-2'>\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <TokenizedTypeahead\n // This key is used to re-initialize TokenizedTypeahead whenever recentSearches changes\n key={recentSearches?.map(s => s.id).join(':') ?? 'share:search'}\n getRemoteUrl={() => UrlHelper.safeUrlConcat(props.gatewayApiUrl, 'v4/search')}\n getRemotePostBody={getRemotePostBody}\n requestHeaders={props.searchRequestHeaders}\n formatRemoteSuggestions={(suggestions: ShareSearchResponse) =>\n filterSearchResults(\n suggestions?.results,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n )\n }\n recentSearches={recentSearches}\n selections={selections}\n onSuggestionSelected={selection => setSelections([ ...selections, selection ])}\n removeSelection={selection => setSelections(selections.filter(s => s.id !== selection.id))}\n placeholder={hasClassrooms ?\n getPhrase('searchPlaceholder') :\n getPhrase('searchPlaceholderNoClassrooms')}\n imageCdnUrl={props.imageCdnUrl}\n activationLength={2}\n fetchSelectionMembers={props.fetchRecipientUsers && fetchSelectionMembers}\n debounceTime={300}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n hasStudentExperience={hasPermissions(PermissionName.StudentExperience)}\n />\n </div>\n\n {(!selections.length && props.directShareRecipients.length) ?\n (\n <div>\n <h3 className='font-size-normal'><Text phrase='sharedTo' /></h3>\n <Scrollbars autoHeight>\n <ul className='list-unstyled'>\n {props.directShareRecipients.map(d => (\n <li key={d.id} className='mb-2 pe-1'>\n <RecipientItem\n entity={d}\n imageCdnUrl={props.imageCdnUrl}\n removeRecipient={props.onClickRemoveRecipient}\n showDisplayName={hasPermissions(PermissionName.StudentExperience)}\n />\n </li>\n ))}\n </ul>\n </Scrollbars>\n </div>\n ) : <></>\n }\n {!!selections.length && (\n // The form submit inside of ShareMessage is used as the Share button\n <div className='pb-3'>\n <ShareMessage\n onClickShare={onClickShare}\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </div>\n )}\n </div>\n )}\n\n {!selections.length && !showShareLinkSpinner && (\n <div className={`bg-white p-3 ${canDirectShare ? 'rounded-3' : 'rounded-bottom-3'}`}>\n <div>\n {props.shareLink && (\n <div className='fw-semibold mb-2'><Text namespace={namespace} phrase='shareLink' /></div>\n )}\n <ShareAsLink\n entity={props.entity}\n entityType={props.entityType}\n shareLink={props.shareLink}\n onClickShowSettings={props.onClickShowSettings}\n onClickCreateLink={onClickCreateShareLink}\n shareLinkIsLoading={props.shareLinkIsLoading}\n canAddPolicies={props.canAddPolicies}\n privacy={props.privacy}\n entityTypeId={props.entity.typeId}\n onClickSavePrivacy={props.onClickSavePrivacy}\n enableIntegrations={props.enableIntegrationBanner}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n {props.shareLink && props.enableIntegrationBanner && (\n <div className={`${props.integrations?.length && props.canEmbed ? 'float-end' : ''} mt-1 pt-1`}>\n <ShareIntegrations\n integrations={props.integrations}\n url={props.shareLink.url}\n closePopup={props.closePopup}\n appLink={hasManageIntegrationsPermission ?\n props.integrationSettingAppLink :\n props.messagePopupAppLink\n }\n />\n </div>\n )}\n {props.shareLink && props.canEmbed && (\n <div className='mt-1'>\n <GetEmbedCode onClickGetEmbedCode={props.onClickGetEmbedCode} />\n </div>\n )}\n {props.shareLink && props.canAddPolicies &&\n <button className='btn btn-link text-info mt-2 p-0' onClick={props.onClickShowSettings}>\n <Text namespace={namespace} phrase='advancedSettings' />\n </button>\n }\n </div>\n </div>\n )}\n\n {showShareLinkSpinner && (\n <div className='bg-white rounded-3 p-3 text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </>\n );\n}\n","const LINK_EXPIRY_TIME = 30; // days\nexport function getLinkExpiryDate(shouldExpire: boolean): string | null {\n if (!shouldExpire)\n return null;\n\n const date = new Date();\n date.setDate(date.getDate() + LINK_EXPIRY_TIME);\n\n return date.toISOString();\n}\n","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'shared.linkExpiry';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LinkExpiryProps {\n passwordProtectLink: boolean;\n}\n\nexport function LinkExpiry(props: LinkExpiryProps): React.ReactElement {\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n function setLinkExpireDate(): void {\n if (props.passwordProtectLink)\n return;\n\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!formikProps.values.linkExpireDate));\n }\n\n return (\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='linkExpirationHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='linkExpirationInfo' /></p>\n </div>\n <Tooltip\n title={getPhrase('passwordProtected')}\n disable={!props.passwordProtectLink}\n spanHack\n trigger='hover'\n >\n <ToggleSwitch\n onClick={setLinkExpireDate}\n on={!!formikProps.values.linkExpireDate}\n disabled={props.passwordProtectLink}\n showStateWhenDisabled\n />\n </Tooltip>\n </div>\n );\n}\n",":local {\n .passwordButton {\n position: absolute;\n right: 0;\n top: 0.5rem;\n margin-right: map-get($spacers, 2);\n }\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\nimport { VisibleOffSvg } from 'libs/shared/images/svg/actions/VisibleOffSvg';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\n\nimport styles from './set-password-input.module.scss';\n\nconst namespace = 'share.setPasswordInput';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SetPasswordInputProps {\n value: string;\n onChange: (value: string) => void;\n onReset?: () => void;\n /**\n * Allow user to view and edit current value.\n */\n canEdit?: boolean;\n /**\n * Don't allow user to view/edit current value\n * but allow them to clear it and enter a new value.\n */\n canReset?: boolean;\n placeholder?: string;\n}\n\nexport function SetPasswordInput(props: SetPasswordInputProps): JSX.Element {\n const [ revealPassword, setRevealPassword ] = React.useState(false);\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n const errorMsg = formikProps.errors?.password;\n\n return (\n <>\n <input\n className={`form-control ${errorMsg ? 'is-invalid' : ''}`}\n value={props.value}\n onChange={e => {\n !!props.canEdit && props.onChange(e.target.value);\n }}\n type={revealPassword ? 'text' : 'password'}\n placeholder={props.placeholder || getPhrase('passwordPlaceholder')}\n readOnly={!props.canEdit}\n />\n {!!errorMsg && (\n <Form.Control.Feedback type='invalid'>{errorMsg}</Form.Control.Feedback>\n )}\n {!!props.canEdit &&\n <DivButton className={styles.passwordButton} onClick={() => setRevealPassword(!revealPassword)}>\n <SvgContainer\n svg={revealPassword ? VisibleOnSvg : VisibleOffSvg}\n title={getPhrase(revealPassword ? 'hidePassword' : 'revealPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n {!props.canEdit && !!props.canReset && !!props.onReset &&\n <DivButton className={styles.passwordButton} onClick={props.onReset}>\n <SvgContainer\n svg={CloseSvg} title={getPhrase('resetPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n </>\n );\n}\n","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { SetPasswordInput } from 'libs/shared/apps/share/components/set-password-input/SetPasswordInput';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.linkPassword';\n\nconst PASSWORD_PLACEHOLDER = '********';\n\ninterface LinkPasswordProps {\n shareLink: ShareLink;\n passwordProtectLink: boolean;\n setPasswordProtectLink: (protect: boolean) => void;\n}\n\nexport function LinkPassword(props: LinkPasswordProps): React.ReactElement {\n const { passwordProtectLink, setPasswordProtectLink } = props;\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n \n const [ readonlyPassword, setReadonlyPassword ] = React.useState(!!props.shareLink?.isPasswordProtected);\n\n function onTogglePasswordProtect(): void {\n if (props.shareLink?.isPasswordProtected)\n formikProps.setFieldValue('removePassword', passwordProtectLink);\n\n formikProps.setFieldValue('password', '');\n\n setPasswordProtectLink(!passwordProtectLink);\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!passwordProtectLink));\n }\n\n function setPassword(password: string): void {\n formikProps.setFieldValue('password', password);\n }\n\n function resetPassword(): void {\n formikProps.setFieldValue('password', '');\n formikProps.setFieldValue('removePassword', true);\n setReadonlyPassword(false);\n }\n\n return (\n <div className='pb-3'>\n <div className='d-flex justify-content-between align-items-center'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='passwordProtectHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='passwordProtectInfo' /></p>\n </div>\n <ToggleSwitch onClick={onTogglePasswordProtect} on={passwordProtectLink} />\n </div>\n\n {passwordProtectLink &&\n <div className='position-relative mt-2'>\n <SetPasswordInput\n value={readonlyPassword ? PASSWORD_PLACEHOLDER : formikProps.values.password}\n onChange={setPassword}\n onReset={resetPassword}\n canEdit={!readonlyPassword}\n canReset\n />\n </div>\n }\n </div>\n );\n}\n","import { boolean, object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'share.validation';\n\nexport const ShareLinkSettingsValidationSchema = object().shape({\n removePassword: boolean(),\n resourceId: string(),\n linkExpireDate: string().nullable(),\n password: string()\n .test({\n name: 'password-length',\n exclusive: false,\n params: {},\n message: LanguageService.getPhrase(namespace, 'minPassword'),\n test: val => {\n const removePassword = ((this as any)?.parent as any)?.removePassword;\n\n if (removePassword)\n return true;\n\n if (!val?.length)\n return true;\n\n if (val.length < 3)\n return false;\n\n return true;\n }\n })\n .default('')\n});\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LinkExpiry } from 'libs/shared/apps/share/components/link-expiry/LinkExpiry';\nimport { LinkPassword } from 'libs/shared/apps/share/components/link-password/LinkPassword';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkSettingsValidationSchema } from 'libs/shared/apps/share/validation/ShareLinkSettingsValidationSchema';\nimport { SharableEntity, SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config } from 'libs/shared/interfaces';\nimport { PropsWithAnalyticsOptions, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ShareSettingsFormProps = PropsWithAnalyticsOptions<{\n entity: SharableEntity,\n entityType: SharableEntityType,\n config: Config,\n shareLink: ShareLink,\n entityId: string,\n onClickCancel: () => void,\n onClickDeleteLink: () => void,\n canEmbed?: boolean,\n privacy: SharePrivacyResponse,\n hasStudentExp: boolean,\n shareOverrideRestrictions: boolean\n}>;\n\nfunction ShareSettingsForm(props: ShareSettingsFormProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const [ passwordProtectLink, setPasswordProtectLink ] = React.useState(!!props.shareLink.isPasswordProtected);\n\n return (\n <Form>\n {props.onClickDeleteLink &&\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='mb-0'><Text namespace={namespace} phrase='deleteLinkLabel' /></label>\n <p className='mb-0'><Text namespace={namespace} phrase='deleteLinkDescription' /></p>\n </div>\n <DivButton onClick={props.onClickDeleteLink} className='info-link justify-self-start'>\n <Text namespace={namespace} phrase='deleteLink' />\n </DivButton>\n </div>\n }\n {hasPermissions(PermissionName.ManageShareLinkSettings) && (\n <>\n <LinkExpiry passwordProtectLink={passwordProtectLink} />\n {props.shareOverrideRestrictions &&\n <LinkPassword\n shareLink={props.shareLink}\n passwordProtectLink={passwordProtectLink}\n setPasswordProtectLink={setPasswordProtectLink}\n />\n }\n </>\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.onClickCancel} text={getPhrase('back')} variant='link' />\n <PopupButtons.Submit variant='dark' />\n </PopupButtons>\n </Form>\n );\n}\n\ninterface ShareSettingsProps {\n entity: SharableEntity;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n privacy: SharePrivacyResponse;\n onClickSaveLink: (data: EditShareLinkRequest, onError: () => void) => void;\n onClickCancel: () => void;\n onClickDeleteLink?: () => void;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareSettings(props: PropsWithAnalyticsOptions<ShareSettingsProps>): JSX.Element {\n const initialValues: EditShareLinkRequest = {\n password: '',\n removePassword: false,\n linkExpireDate: props.shareLink.linkExpireDate,\n overrideRestrictions: props.shareLink.overrideRestrictions\n };\n\n return (\n <>\n <FormWrapper<EditShareLinkRequest>\n initialValues={initialValues}\n onSubmit={props.onClickSaveLink}\n castInitialValues={false}\n validationSchema={ShareLinkSettingsValidationSchema}\n >\n <ShareSettingsForm\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n shareLink={props.shareLink}\n entityId={props.entityId}\n onClickCancel={props.onClickCancel}\n analyticsOptions={props.analyticsOptions}\n privacy={props.privacy}\n onClickDeleteLink={props.onClickDeleteLink}\n hasStudentExp={props.hasStudentExp}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </FormWrapper>\n </>\n );\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { Integration } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.shared-utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const IntegrationHelper = {\n getShareIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): Integration[] {\n return [\n {\n id: IntegrationId.GoogleClassroom,\n name: getPhrase('googleClassroom'),\n enabled: googleClassroomSetting,\n settingName: SettingName.ShareToGoogleClassroom\n },\n {\n id: IntegrationId.MicrosoftTeams,\n name: getPhrase('msftTeams'),\n enabled: msftTeamsSetting,\n settingName: SettingName.ShareToMicrosoftTeams\n }\n ];\n }\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { AlertType, DefaultAlertHeading } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { RecentShareHelper } from 'libs/shared/apps/share/utils/RecentShareHelper';\nimport { CopyEmbed } from 'libs/shared/apps/share/views/share/components/copy-embed/CopyEmbed';\nimport { MainShare } from 'libs/shared/apps/share/views/share/components/main-share/MainShare';\nimport { ShareSettings } from 'libs/shared/apps/share/views/share/components/share-settings/ShareSettings';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport {\n Config, CurrentUser,\n DirectShare, PopupViewProps, ShareLink, ShareRecipient, UserCollection, YearGroup\n} from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nimport { SharableEntityType, SharableRecipient, ShareViewHelper } from './ShareViewHelper';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getTitle(type: SharableEntityType): string {\n switch (type) {\n case 'video': return getPhrase('titleVideo');\n case 'clip': return getPhrase('titleClip');\n case 'interactive': return getPhrase('titleInteractive');\n case 'series': return getPhrase('titleSeries');\n case 'playlist': return getPhrase('titlePlaylist');\n case 'subject': return getPhrase('titleTopic');\n }\n}\n\nfunction getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n}\n\n/**\n * I realise these are all the same right now, but they're technically different things - Sha\n */\nconst canEmbed = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\nconst canAddPolicies = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\n\ntype ShareScreen = 'main' | 'link-settings' | 'copy-embed';\n\ninterface ShareViewProps extends PopupViewProps {\n entityId: string;\n entityType: SharableEntityType;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n gatewayApiUrl?: string;\n integrationSettingAppLink?: AppLink;\n messagePopupAppLink?: AppLink;\n enableIntegrationBanner?: boolean;\n}\n\nexport function ShareView(props: ShareViewProps): JSX.Element {\n const dispatch = useDispatch();\n\n const alerts = useAlerts();\n\n // If the gateway api url is passed down in props and not pulled from the config, we don't need to fetch the user token\n const shouldFetchUserToken = !props.gatewayApiUrl;\n\n /**\n * Our screen is initially set to null, and it is set to it's initial state\n * by ShareViewHelper.useRestrictionWarning.\n */\n const [ screen, setScreen ] = React.useState<ShareScreen>('main');\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const entity = ShareViewHelper.getFetchFunctionByType(props.entityType)(props.entityId, currentUser.data?.id);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const userToken = Flight.useBasicFetch<HashObject>(shouldFetchUserToken && UserRequests.token());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.entityId));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(\n ShareRequests.getSentDirectShareByObjectId(props.entityId)\n );\n const recipients = Flight.useBasicFetch<SharableRecipient[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n\n const recentlySharedToIds = currentUser.data && RecentShareHelper.getRecentlySharedTo(currentUser.data.id);\n\n const hasRecentlySharedRecipients = !!recentlySharedToIds?.length;\n const recentlySharedTo = Flight.useBasicFetch<SharableRecipient[]>(hasRecentlySharedRecipients &&\n ShareRequests.getRecipientsById(recentlySharedToIds, currentUser.data.customerId));\n\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequests.getPrivacy(props.entityId));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const {\n shareToGoogleClassroom,\n shareToMicrosoftTeams,\n shareOverrideRestrictions,\n isLoadingSettings\n } = useSettings(null);\n\n /**\n * We need to manually re-fetch the recipients they're updated on the directShare object.\n * See ShareRequests.getDirectShareRecipientsById for an explanation\n * of why we are doing this.\n */\n function fetchRecipients(customerId: string, directShare: DirectShare): void {\n if (directShare.recipients?.length)\n Flight.getFetch(dispatch)(ShareViewHelper.getDirectShareRecipientsRequest(customerId, directShare));\n }\n\n function fetchRecipientUsers(id: string, callback: (users: UserCollection) => void): void {\n Flight.getFetch(dispatch)(ShareRequests.getRecipientUsers(id, callback));\n }\n\n function onClickCreateLink(): void {\n if (shareLink.data)\n return;\n\n ShareViewHelper.createLink({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n alerts\n });\n }\n\n function onClickSaveLink(data: EditShareLinkRequest, onError: () => void): void {\n ShareViewHelper.updateLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n data,\n alerts,\n () => setScreen('main'),\n onError\n );\n }\n\n function onClickDeleteLink(): void {\n ShareViewHelper.deleteLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n alerts,\n () => setScreen('main')\n );\n }\n\n function onClickShare(recipients: SharableRecipient[], message: string, onDone?: () => void): void {\n const shareRecipients = recipients.map(s => ({ id: s.id, typeId: s.typeId })) as ShareRecipient[];\n\n ShareViewHelper.createOrUpdateDirectShare({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n currentUser: currentUser.data,\n recipients: shareRecipients,\n message,\n sentDirectShare: sentDirectShare.data,\n onSuccess: directShare => {\n fetchRecipients(currentUser.data.customerId, directShare);\n alerts.success({\n heading: DefaultAlertHeading.Success,\n message: getPhrase('directShareSuccess', { object: entity.data.name, recipients: ShareViewHelper.getShareRecipientsPhrase(recipients) }),\n type: AlertType.Success\n });\n },\n onError: () => alerts.error(getPhrase('directShareError', { name: entity.data.name })),\n onDone\n });\n }\n\n function onClickRemoveRecipient(recipientId: string, onError?: () => void): void {\n ShareViewHelper.removeDirectShareRecipient(\n dispatch,\n recipientId,\n props.entityType,\n sentDirectShare.data,\n directShare => fetchRecipients(currentUser.data.customerId, directShare),\n () => {\n alerts.error(getPhrase('removeDirectShareError'));\n onError && onError();\n }\n );\n }\n\n function onClickSavePrivacy(privacy: SharePrivacy, overrideRestrictions: boolean): void {\n if (privacy === 'private') {\n onClickDeleteLink();\n return;\n }\n\n Flight.fetch(\n dispatch,\n ShareRequests.updatePrivacy(\n shareLink.data.id,\n privacy,\n overrideRestrictions,\n () => alerts.success(getPhrase('privaciesSuccess', { name: entity.data.name })),\n () => alerts.error(getPhrase('privaciesError', { name: entity.data.name }))\n )\n );\n }\n\n function getSearchRequestHeaders(): HashObject {\n if (!shouldFetchUserToken)\n return null;\n\n return {\n authorization: `Bearer ${userToken.data.value}`\n };\n }\n\n /**\n * We are intentionally not checking to see if recipients.data or recentlySharedTo.data\n * have loaded because:\n * 1. Adding the first recipient will trigger fetching recipients for the first time\n * which would trigger the loading spinner.\n * 2. Adding and recipient will update the list of recently shared to which causes\n * recentlySharedTo to be re-fetched.\n */\n const dataLoaded = !!currentUser.data\n && !!config.data\n && (!shouldFetchUserToken || !!userToken.data)\n && !!sentDirectShare.hasCompleted\n && !!privacy.data\n && !!entity.data\n && !isLoadingSettings\n && !!yearGroups.hasCompleted;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getTitle(props.entityType)}\n closePopup={props.closePopup}\n showLoadingSpinner={!dataLoaded}\n contentClassName={(dataLoaded && screen) ? 'bg-transparent border-0' : ''}\n bodyClassName='p-0'\n >\n {(() => {\n if (!dataLoaded)\n return <></>;\n\n switch (screen) {\n case 'main':\n return (\n <MainShare\n shareLink={shareLink.data}\n shareLinkIsLoading={shareLink.isFetching}\n entity={entity.data}\n entityType={props.entityType}\n directShareRecipients={recipients.data || []}\n recentlySharedTo={recentlySharedTo.data || []}\n onClickCreateLink={onClickCreateLink}\n onClickShowSettings={() => setScreen('link-settings')}\n onClickShare={onClickShare}\n onClickRemoveRecipient={onClickRemoveRecipient}\n onClickGetEmbedCode={() => setScreen('copy-embed')}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n gatewayApiUrl={props.gatewayApiUrl || config.data.gatewayApiUrl}\n imageCdnUrl={config.data.imageCdnUrl}\n searchRequestHeaders={getSearchRequestHeaders()}\n currentUser={currentUser.data}\n fetchRecipientUsers={fetchRecipientUsers}\n privacy={privacy.data}\n onClickSavePrivacy={onClickSavePrivacy}\n canAddPolicies={canAddPolicies(props.entityType)}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n integrations={getEnabledIntegrations(shareToGoogleClassroom, shareToMicrosoftTeams)}\n integrationSettingAppLink={props.integrationSettingAppLink}\n messagePopupAppLink={props.messagePopupAppLink}\n closePopup={props.closePopup}\n enableIntegrationBanner={props.enableIntegrationBanner}\n canEmbed={canEmbed(props.entityType)}\n yearGroups={yearGroups.data}\n shareOverrideRestrictions={shareOverrideRestrictions}\n hasLocalPermissions={hasLocalPermissions}\n />\n );\n case 'link-settings':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <ShareSettings\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickSaveLink={onClickSaveLink}\n onClickDeleteLink={onClickDeleteLink}\n onClickCancel={() => setScreen('main')}\n privacy={privacy.data}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n </div>\n );\n case 'copy-embed':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <CopyEmbed\n entity={entity.data}\n entityType={props.entityType}\n liteUrl={config.data.liteUrl}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickCancel={() => setScreen('main')}\n />\n </div>\n );\n }\n })()}\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n"],"x_google_ignoreList":[11,12,13,14],"mappings":"21CAgBA,EAAA,CAAA,UAAA,QAAA,CAIA,GAAA,6YAQA,SAAA,GAAA,EAAA,EAAA,CACE,MAAA,mNAQF,IAAA,EAAA,uBAMI,MAAA,kHAcA,MAAA,uGAQA,EAAA,MAAA,2EAKA,MAAA,8LAUA,MAAA,oIAWA,MAAA,uJAaA,MAAA,6QAsBA,MAAA,yKAgBM,CAAA,EAAA,IAAA,EAAA,WAAA,OAAA,EAGA,uHAqBN,MAAA,8MAiBM,EAAA,GAGA,cAHA,oEAwBN,MAAA,2HASA,OAFA,EAAA,MAAA,CAEA,iHAUA,MAAA,kLAaA,OAHA,IAAA,EAAA,OAAA,GAGA,wHAUA,MAAA,6GAUI,yEAcJ,MAAA,mPAoBA,MAAA,4OAmBA,MAAA,wOAkBA,MAAA,+MAYA,MAAA,mGAcA,MAAA,0NAoBA,MAAA,uJAaA,MAAA,sFCnYE,GAAwB,EAQjB,EAAmB,CAC9B,cAAc,EAAkB,EAA2B,EAAkB,GAAgB,CAC3F,IAAI,EAAc,EAAS,EAAW,SAAS,EAAS,CAAG,EAAW,IAAI,EAAS,CAKnF,OAHK,MAAM,QAAQ,EAAY,GAC7B,EAAc,EAAE,EAEX,GAGT,cAAc,EAAkB,EAAe,EAA2B,EAAwB,CAC3F,SAAM,QAAQ,EAAI,CAGvB,IAAI,EAAQ,CACV,EAAW,SAAS,EAAU,EAAI,CAClC,OAGF,EAAW,IAAI,EAAU,EAAI,GAG/B,cAAc,EAAkB,EAA2B,EAAyC,CAClG,GAAM,CAAE,KAAI,QAAQ,GAAuB,SAAS,IAAS,EAEzD,EAAc,EAAiB,cAAc,EAAU,EAAY,EAAO,CAExE,EAAU,EAAY,QAAQ,EAAG,CAgBvC,OAVI,EAAU,IACZ,EAAY,OAAO,EAAS,EAAE,CAEhC,EAAY,QAAQ,EAAG,CAEnB,EAAY,OAAS,IACvB,EAAc,EAAY,MAAM,EAAG,EAAM,EAE3C,EAAiB,cAAc,EAAU,EAAa,EAAY,EAAO,CAElE,GAGT,iBAAiB,EAAkB,EAAY,EAAiC,CAE9E,IAAM,EADQ,EAAiB,cAAc,EAAU,EAAW,CAC5C,OAAO,GAAK,IAAM,EAAG,UAAU,CAAC,CACtD,EAAiB,cAAc,EAAU,EAAS,EAAW,EAEhE,CCzDK,GAAe,GAAmB,sBAAsB,IAOjD,GAAoB,CAI/B,oBAAoB,EAA0B,CAC5C,OAAO,EAAiB,cAAc,GAAY,EAAO,CAAE,GAAmB,EAGhF,oBAAoB,EAAgB,EAA0C,CAC5E,OAAO,EAAiB,cAAc,GAAY,EAAO,CAAE,GAAoB,EAAQ,EAE1F,OCfK,GAAY,kBAUlB,SAAgB,GAAU,EAA2C,CACnE,GAAM,CACJ,WACA,cACA,YACA,eACA,cACE,EAEJ,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,CACG,CAAC,CAAC,EAAW,SACZ,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,YAAc,CAAA,CAC7C,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAS,OAAV,CAAiB,GAAG,mBAAmB,QAAQ,wBAC5C,EAAU,MACK,CAAA,EAElB,EAAA,EAAA,KAAC,EAAS,KAAV,CAAA,SACG,EAAW,IAAI,IACd,EAAA,EAAA,KAAC,EAAS,KAAV,CAEE,YAAe,EAAa,EAAK,UAEhC,EAAK,MACQ,CAJT,GAAG,EAAK,MAAM,GAAG,EAAK,SAIb,CAChB,CACY,CAAA,CACP,CAAA,CAAA,CACP,CAAA,CACL,CAAA,CAAA,EAEL,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,WAAa,CAAA,CAC5C,CAAA,EACN,EAAA,EAAA,KAAC,GAAD,CAAU,GAAG,oBAAoB,QAAS,EAAU,aAAgB,EAAY,CAAC,EAAA,CAAa,CAAA,IC3CpG,IAAa,GAAb,KAAsD,CAMpD,YAAY,EAA6C,CACvD,KAAK,QAAQ,EAAQ,CAGvB,QAAkB,EAAmD,CACnE,GAAM,CAAE,mBAAkB,KAAI,OAAM,UAAW,EAE3C,IACF,KAAK,GAAK,GAER,IACF,KAAK,KAAO,GAEV,IACF,KAAK,OAAS,GAEZ,IACF,KAAK,iBAAmB,GAG5B,UAA0B,CAQxB,MAPe,CACb,KAAK,iBACL,KAAK,GACL,KAAK,KACL,KAAK,OACN,CAEa,OAAO,QAAQ,CAAC,KAAK,IAAI,CAGzC,UAA8B,CAC5B,IAAM,EAAqB,EAAE,CAQ7B,OANI,KAAK,OACP,EAAO,KAAO,KAAK,kBAAkB,CAAC,aAAa,EAEjD,KAAK,SACP,EAAO,OAAS,KAAK,QAEhB,EAGT,kBAAqC,CAGnC,OAFA,EAAY,MAAM,IAAI,EAAS,+EAA+E,CAAC,CAExG,KC/DE,GAAb,cAAuD,EAAyB,CAC9E,YAAY,EAAY,EAAiB,GAAI,CAC3C,MAAM,CAAE,iBAAkB,kBAAmB,KAAI,SAAQ,CAAC,GCAjD,GAA4B,CACvC,eAAe,EAA4C,CACzD,MAAQ,IAAoB,CAC1B,IAAM,EAAe,CAAE,GAAG,EAAO,CAKjC,OAHI,EAAa,eAAe,EAAI,EAClC,OAAO,EAAa,GAEf,IAIX,oBAAoB,EAAa,EAA8C,CAC7E,MAAQ,IAAoB,CAC1B,IAAM,EAAe,CAAE,GAAG,EAAO,CAYjC,OAVK,EAAa,eAAe,EAAI,EAGhC,EAAa,GAAK,SACrB,EAAa,GAAK,OAAS,EAAE,EAE/B,EAAa,GAAK,OAAO,MAAQ,EAAa,GAAK,OAAO,MACxD,EAAa,GAAK,OAAO,MAAQ,EACjC,EAEK,GATE,IAYd,CCtBY,GAAgB,CAC3B,QAA8B,EAAY,EAAgB,EAAkC,CAC1F,GAAI,IAAW,EACb,MAAO,CAAE,eAAgB,EAAO,eAAgB,KAAM,CAExD,IAAM,EAAsB,EAAY,SAAS,EAAO,EAAQ,EAAO,CAMjE,EAAsB,EAAS,EAAM,OAAS,EAClD,EAAe,EAAS,GAAG,GAC3B,KAOF,MAAO,CAAE,iBAAgB,eALc,CACrC,eAAgB,EAAe,GAAQ,GACvC,sBACD,CAEwC,EAG3C,YACE,EACA,EACA,EAC8B,CAC9B,IAAM,EAAsB,EAAE,CACxB,EAAc,EAAa,UAAU,EAAK,CAE1C,EAAO,CAAC,EAAW,CACrB,EAAO,EAAK,GACV,EAAW,CAAC,CAAC,GAAQ,CAAC,CAAC,EAAK,MAAQ,EAAK,KAAK,OAKpD,KAAO,GACA,MAAM,QAAQ,EAAK,KAAK,EADlB,CAIX,EAAM,KAAK,GAAG,EAAK,KAAqB,CAExC,IAAM,EAAa,EAAK,YACnB,EAAK,WAAW,SAChB,EAAK,WAAW,QAAQ,KAEvB,EAAU,CAAC,CAAC,GAAc,GAAG,EAAW,GAAG,IAEjD,EAAO,GAAc,EAAK,GAEtB,GACF,EAAK,KAAK,EAAQ,CAGtB,GAAI,CAAC,EAAM,OACT,OAAO,EAKT,IAAM,EAAY,EAAY,UAAU,EAAO,GAAK,EAAE,KAAO,EAAe,eAAe,CAEvF,EAAiB,CAAC,GAAG,EAAM,CAEzB,EAAa,EAAe,OAAO,EAAW,EAAE,CAEhD,EAAY,EAAe,oBAC/B,EAAY,UAAU,EAAgB,GAAK,EAAE,KAAO,EAAe,oBAAoB,CACvF,EAAe,OAcjB,OAZA,EAAe,OAAO,EAAW,EAAG,EAAW,GAAG,CAElD,EAAiB,EAAe,IAAI,IAAM,CAAE,GAAI,EAAE,GAAI,EAAE,CAKxD,EAAK,QAAQ,GAAO,CAClB,IAAM,EAAgB,EAAe,OAAO,EAAG,EAAS,CACxD,EAAY,GAAK,KAAO,GACxB,CAEK,GAEV,CChFY,GAAmB,CAE9B,iBAAiB,EAAoE,CACnF,GAAM,CAAE,OAAM,QAAS,EAEjB,EAAqB,CACnB,OACN,uBAAwB,gBACxB,MAAO,cAAc,EAAqB,oBAAoB,iCAC/D,CAKD,OAHI,EAAqB,SACvB,EAAO,OAAS,EAAqB,QAEhC,CACL,IAAK,EAAU,WAAW,+BAA+B,IAAQ,EAAO,CACxE,IAAK,EAAqB,UAAA,CAC3B,EAGH,YAAY,EAAY,EAA+B,EAAmD,CACxG,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,GAAG,EAAqB,SAAS,iCACzC,CAAC,CACF,UAAW,EAAU,WAAW,gBAAgB,IAAM,CACpD,MAAO,GAAG,EAAqB,SAAS,sBACzC,CAAC,CACF,IAAK,YAAY,IACjB,UACA,QACD,EAGH,kBACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAC9C,MAAO,GAAG,EAAqB,SAAS,iCACxC,UACD,CAAC,CACF,IAAK,mBAAmB,EAAG,GAAG,IAC9B,UACA,QACD,EAGH,8BAA8B,EAA4B,CACxD,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,GAAG,EAAqB,SAAS,iHACzC,CAAC,CACF,IAAK,YAAY,EAAG,kBACrB,EAGH,kBAAkB,EAAY,EAAuC,CACnE,GAAM,CAAE,mBAAkB,kBAAiB,eAAgB,EAErD,EAAqB,CACzB,MAAO,WAAW,EAAiB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,WAAW,EAAgB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,kBAAkB,EAAY,kCAC5N,uBAAwB,EAAuB,cAChD,CAKD,OAHI,IACF,EAAO,OAAS,GAEX,CACL,IAAK,EAAU,WAAW,wBAAwB,EAAG,UAAW,EAAO,CACvE,UAAW,EAAU,WAAW,gBAAgB,EAAG,UAAW,EAAO,CACrE,IAAK,YAAY,EAAG,SAAS,EAAS,IAAI,IAAW,KACtD,EAGH,wBAAwB,EAAY,EAAiB,EAAiC,CACpF,GAAM,CAAE,mBAAkB,kBAAiB,eAAgB,EAErD,EAAqB,CACzB,MAAO,WAAW,EAAiB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,WAAW,EAAgB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,kBAAkB,EAAY,kCAC5N,uBAAwB,EAAuB,cAC/C,UACD,CAKD,OAHI,IACF,EAAO,OAAS,GAEX,CACL,IAAK,EAAU,WAAW,gBAAgB,EAAG,UAAW,EAAO,CAC/D,IAAK,mBAAmB,EAAG,GAAG,EAAQ,UAAU,IACjD,EAGH,uBAAuB,EAAkC,CACvD,IAAM,EAAS,oBAAoB,EAAe,UAAU,GAAG,EAAe,SAAS,IACvF,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,kBAAkB,EAAO,iBAAiB,EAAO,wBAAwB,IACjF,CAAC,CACF,UAAW,EAAU,WAAW,gBAAgB,IAAM,CACpD,MAAO,kBAAkB,EAAO,iBAAiB,EAAO,wBAAwB,IACjF,CAAC,CACF,IAAK,kBAAkB,IACvB,UAAW,GACZ,EAGH,6BACE,EACA,EACgB,CAChB,IAAM,EAAS,oBAAoB,EAAe,UAAU,GAAG,EAAe,SAAS,IACvF,MAAO,CACL,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAC9C,MAAO,kBAAkB,EAAO,iBAAiB,EAAO,wBAAwB,IAChF,UACD,CAAC,CACF,IAAK,yBAAyB,EAAG,GAAG,IACpC,UAAW,GACZ,EAGH,kBAAkB,EAAiB,EAAgB,EAAiC,CAClF,MAAO,CACL,IAAK,wBAAwB,EAAQ,wCAAwC,EAAO,IACpF,IAAK,mBAAmB,IAAU,EAAS,UAAY,KACxD,EAGH,eACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,kBACL,IAAK,wBAAwB,EAAO,YACpC,OACA,KAAM,EAAU,KAChB,UACA,QACA,SACA,iBAAkB,iBACnB,EAGH,eACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,kBACL,IAAK,wBAAwB,IAC7B,OACA,KAAM,EAAU,IAChB,UACA,QACA,SACD,EAGH,eACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,kBACL,IAAK,wBAAwB,IAC7B,KAAM,EAAU,OAChB,UACA,QACA,SACA,iBAAkB,iBAClB,YAAa,CACX,KAAM,YAAY,IAClB,WAAY,GAA0B,eAAe,YAAY,IAAA,EAEpE,EAGH,aACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,8BACL,IAAK,gBACL,KAAM,CAAE,WAAY,EAAI,CACxB,KAAM,EAAU,KAChB,iBAAkB,iBAClB,UACA,QACA,SACD,EAGH,cACE,EACA,EACA,EACA,EACgB,CAOhB,IAAM,EAAmB,CACvB,iBACC,IAAI,GAAkC,EAAW,CAAE,UAAU,CAC9D,YAAY,EAAW,SACxB,CAED,EAAO,QAAQ,GAAS,CACtB,EAAiB,KAAK,mBAAmB,EAAM,KAAK,EACpD,CAEF,IAAM,EAAO,EAAO,QAAQ,EAAiB,KACvC,EAAY,OAAO,EAAM,GACvB,MAAM,QAAQ,EAAI,MAAM,CAC1B,EAAI,MAAM,KAAK,CAAE,GAAI,EAAM,GAAI,CAAC,CAEhC,EAAI,MAAQ,CAAC,CAAE,GAAI,EAAM,GAAI,CAAC,EAG9B,EAAY,cAAc,EAAM,GAC9B,MAAM,QAAQ,EAAI,aAAa,CACjC,EAAI,aAAa,KAAK,CAAE,GAAI,EAAM,GAAI,CAAC,CAEvC,EAAI,aAAe,CAAC,CAAE,GAAI,EAAM,GAAI,CAAC,EAGrC,EAAY,QAAQ,EAAM,GACxB,MAAM,QAAQ,EAAI,OAAO,CAC3B,EAAI,OAAO,KAAK,CAAE,GAAI,EAAM,GAAI,CAAC,CAEjC,EAAI,OAAS,CAAC,CAAE,GAAI,EAAM,GAAI,CAAC,EAG5B,GACN,EAAE,CAAC,CAEN,MAAO,CACL,IAAK,mBAAmB,EAAW,GAAG,EAAO,IAAI,GAAK,EAAE,GAAG,CAAC,KAAK,IAAI,GACrE,IAAK,wBAAwB,IAC7B,KAAM,EACN,KAAM,EAAU,IAChB,UACA,QACA,mBACA,YAAa,CACX,KAAM,YAAY,IAClB,WAAY,GAA0B,oBAAoB,YAAY,IAAc,EAAO,OAAA,CAC5F,CACD,UAAW,GACZ,EAGH,oBACE,EACA,EACA,EACA,EACA,EACgB,CAChB,IAAI,EAAU,wBAAwB,IAStC,OAPI,IAAW,EAAW,KACxB,GAAW,SACJ,IAAW,EAAW,YAC7B,GAAW,gBAEX,GAAW,UAEN,CACL,IAAK,wBACL,IAAK,EAAU,WAAW,EAAS,CAAE,SAAU,EAAS,CAAC,CACzD,KAAM,EAAU,OAChB,UACA,QAEA,iBAAkB,CAChB,iBACA,YAAY,EAAW,SACvB,mBAAmB,IACnB,YAAY,KAEf,EAGH,uBAAuB,EAAoB,EAAgC,CAKzE,MAAO,CACL,IAAK,wBAAwB,EAAO,+BAA+B,EAAW,GAC9E,IAAK,YAAY,EAAW,aAAa,IACzC,WAPyD,IACzD,CAAE,SAAU,EAAY,YAAa,CAAC,CAAC,GAAM,MAAM,OAAQ,EAO3D,UAAW,GACZ,EAGH,eACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,wBAAwB,IAC7B,IAAK,mBAAmB,IACxB,KAAM,CAAE,kBAAmB,EAAY,CACvC,KAAM,EAAU,IAChB,iBAAkB,CAAE,iBAAkB,YAAY,IAAc,kBAAmB,CACnF,UACA,QACA,SACD,EAGH,iBACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,wBAAwB,EAAO,8BAA8B,IAClE,IAAK,qBAAqB,IAC1B,KAAM,EAAU,OAChB,iBAAkB,CAAE,iBAAkB,YAAY,IAAc,kBAAmB,CACnF,UACA,QACA,SACD,EAIH,cACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,mBACL,IAAK,0BAA0B,EAAG,UAClC,KAAM,EACN,KAAM,EAAU,IAChB,UACA,QAEA,iBAAkB,iBAClB,YAAa,CACX,KAAM,YAAY,EAAG,SACrB,WAAa,GACX,GAAc,YAAY,YAAY,EAAG,SAAU,EAAgB,EAAA,EAExE,EAGH,kBAAkB,EAA4B,CAC5C,MAAO,CACL,IAAK,wBAAwB,EAAG,sBAChC,IAAK,6BAA6B,IACnC,EAEJ,CCzYK,GAAY,CAChB,cAAe,EAAY,IAAoB,EAAU,WAAW,gBAAgB,IAAM,CACxF,MAAO,EAAqB,OAC5B,UACD,CAAC,CACF,kBAAmB,EAAY,EAAqB,IAC3C,wBAAwB,EAAG,8DAA8D,EAAW,GAE9G,CAEY,GAAiB,CAC5B,OAAO,EAAkC,CACvC,IAAM,EAAiB,CAAE,MAAO,EAAqB,OAAQ,CAE7D,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,EAAe,CACvE,UAAW,EAAU,WAAW,gBAAgB,IAAM,EAAe,CACrE,IAAK,UAAU,IAChB,EAEH,aAAa,EAAY,EAAiC,CACxD,MAAO,CACL,IAAK,GAAU,aAAa,EAAI,EAAQ,CACxC,IAAK,iBAAiB,EAAG,GAAG,IAC7B,EAEH,iBAAiB,EAAY,EAAqB,EAAmB,CACnE,MAAO,CACL,IAAK,GAAU,iBAAiB,EAAI,EAAW,CAC/C,IAAK,UAAU,EAAG,eAAe,IAClC,EAEH,4BAA4B,EAA4B,CACtD,MAAO,CACL,IAAK,wBAAwB,EAAG,iEAChC,IAAK,UAAU,EAAG,kBACnB,EAEH,aAAa,EAAY,EAAiB,EAAsB,EAAuC,CACrG,IAAM,EAAa,GAAgB,kBAAkB,EAAK,CAEpD,EAAM,CAAE,SAAU,EAAI,SAAU,EAAQ,EAAM,CAAC,OAAO,GAAK,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAE/E,MAAO,CACL,IAAK,EAAU,WAAW,4BAA4B,EAAG,SAAU,CACjE,MAAO,IAAI,EAAW,GAAG,EAAqB,mBAC9C,SACD,CAAC,CACF,UAAW,EAAU,WAAW,4BAA4B,EAAG,SAAU,CACvE,MAAO,IAAI,EAAW,GAAG,GAAoB,mBAC7C,SACD,CAAC,CACF,MACD,EAEJ,CChCK,EAAY,EAAgB,iBADhB,eAC2C,CAEhD,EAAkB,CAC7B,gBAAgB,EAAsC,CACpD,OAAQ,EAAR,CACE,IAAK,QACH,OAAO,EAAW,MAEpB,IAAK,WACH,OAAO,EAAW,SAEpB,IAAK,UACH,OAAO,EAAW,QAEpB,IAAK,SACH,OAAO,EAAW,OAEpB,IAAK,cACH,OAAO,EAAW,YAEpB,IAAK,OACH,OAAO,EAAW,OAIxB,WAAW,EAQF,CACP,IAAM,EAAW,GAA4B,CAC3C,EAAgB,cACd,CAAE,GAAG,EAAc,WAAY,EAAQ,OAAO,KAAM,CACpD,EAAgB,aAAa,EAAgB,oBAAoB,EAAQ,WAAW,CAAE,CACpF,WAAY,EAAW,OACvB,OAAQ,EAAW,UACnB,aAAc,EAAa,GAC5B,CAAC,CACH,CAEG,EAAQ,SACV,EAAQ,QAAQ,EAAa,EAG3B,MAAc,CAClB,EAAQ,OAAO,MAAM,EAAU,kBAAmB,CAAE,KAAM,EAAQ,OAAO,KAAM,CAAC,CAAC,EAG7E,EAA+B,CACnC,WAAY,EAAQ,OAAO,GAC3B,qBAAsB,GACvB,CAEG,EAAQ,WACV,EAAK,SAAW,EAAQ,UAEtB,EAAQ,iBACV,EAAK,eAAiB,EAAQ,gBAEhC,EAAa,EAAQ,SAAU,EAAc,gBAAgB,EAAM,EAAS,EAAM,CAAC,EAGrF,WACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACM,CAwBN,EAAa,EAAU,EAAc,cAAc,EAAW,EAvB7C,GAAgC,CAC/C,EAAgB,cACd,CAAE,GAAG,EAAkB,WAAY,EAAO,KAAM,CAChD,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,KACvB,OAAQ,EAAW,UACnB,aAAc,EAAa,GAC5B,CAAC,CACH,CAEG,GACF,EAAU,EAAiB,CAE7B,EAAO,QAAQ,EAAU,cAAe,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,MAG/D,CACd,GACF,GAAS,CAEX,EAAO,MAAM,EAAU,YAAa,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,EAGI,CAAC,EAGtF,WACE,EACA,EACA,EACA,EACA,EACA,EACA,EACM,CAyBN,EAAa,EAAU,EAAc,gBAAgB,MAxB/B,CACpB,EAAgB,cACd,CAAE,GAAG,EAAW,WAAY,EAAO,KAAM,CACzC,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,OACvB,OAAQ,EAAW,UACpB,CAAC,CACH,CAEG,GACF,GAAW,CAEb,EAAO,QAAQ,EAAU,gBAAiB,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,MAGjE,CAClB,EAAO,MAAM,EAAU,cAAe,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,MAG5D,CACf,GACF,GAAQ,EAG2E,CAAC,EAG1F,0BAA0B,EAWjB,CACP,GAAM,CACJ,WAAU,SAAQ,aAAY,cAAa,aAAY,kBAAiB,UACxE,YAAW,UAAS,UAClB,EAEE,EAAW,GAAoC,CAC/C,GACF,EAAU,EAAmB,CAE/B,EAAgB,cACd,CACE,GAAI,EAAO,GACX,KAAM,EAAO,KACb,WAAY,EAAW,OACxB,CACD,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,MACvB,WAAY,EAAiB,YAC7B,aAAc,EAAa,GAC5B,CAAC,CACH,CAED,EAAW,IAAI,GAAa,CAC1B,GAAkB,oBAAoB,EAAY,GAAI,CAAE,GAAI,EAAU,GAAI,CAAC,EAC3E,EAGE,EAAuC,CAC3C,SAAU,EAAO,GACjB,aAAc,EAAgB,gBAAgB,EAAW,CACzD,aACA,UACD,CAEK,EAAqC,CACzC,aACA,UACD,CAMD,EAAa,EAJG,EACd,EAAc,4BAA4B,EAAgB,GAAI,EAAY,EAAS,EAAS,EAAO,CACnG,EAAc,kBAAkB,EAAY,EAAS,EAAS,EAAO,CAExC,EAGjC,2BACE,EACA,EACA,EACA,EACA,EACA,EACM,CAaN,EACE,EACA,EAAc,2BACZ,EAAgB,GAChB,EAhBa,GAAoC,CAC/C,GACF,EAAU,EAAmB,CAE/B,EAAgB,cACd,CAAE,WAAY,EAAG,CACjB,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,QACxB,CAAC,CACH,EASC,EACD,CACF,EAGH,gCAAgC,EAAoB,EAA2C,CAG7F,MAFsB,CAAC,CAAC,GAAa,YAAY,QAG/C,EAAc,6BAA6B,EAAY,GAAI,EAAY,WAAY,EAAW,EAGlG,mBAAmB,EAAgC,CACjD,OAAQ,EAAR,CACE,IAAK,WACH,OAAO,EAAW,SACpB,IAAK,UACH,OAAO,EAAW,eACpB,IAAK,QACH,OAAO,EAAW,MACpB,IAAK,SACH,OAAO,EAAW,OACpB,IAAK,cACH,OAAO,EAAW,YACpB,IAAK,OACH,OAAO,EAAW,OAIxB,oBAAoB,EAAkD,CACpE,MAAO,CACL,OAAQ,EAAgB,mBAAmB,EAAW,CACtD,SAAU,EAAgB,MAC1B,cAAe,EAAc,SAC9B,EAGH,uBAAyB,GAA6B,CACpD,OAAQ,EAAR,CACE,IAAK,QACH,MAAQ,IAAe,EAA4B,GAAc,MAAM,EAAG,CAAC,CAG7E,IAAK,WACH,MAAQ,IAAe,EAA+B,GAAiB,YAAY,EAAG,CAAC,CAGzF,IAAK,UACH,OAAQ,EAAY,IACX,EAAqC,GAAuB,eAAe,EAAI,EAAO,CAAC,CAIlG,IAAK,SACH,MAAQ,IAAe,EAA6B,GAAe,OAAO,EAAG,CAAC,CAGhF,IAAK,cACH,MAAQ,IACN,EAA0C,GAAoB,oBAAoB,EAAG,CAAC,CAG1F,IAAK,OACH,MAAQ,IACN,EAA2B,GAAa,KAAK,EAAG,CAAC,GAKzD,YAAY,EAAwC,CAgBlD,MAdI,cAAe,GAAoB,EAAe,UAC7C,EAAe,WAAW,IAE/B,eAAgB,GAAoB,EAAe,WAC9C,EAAe,YAAY,IAGhC,UAAW,EACN,EAAe,OAAO,IAG3B,eAAgB,EACX,EAAe,YAAY,IAE7B,IAGT,yBAAyB,EAA0B,CACjD,GAAI,CAAC,EAAW,OACd,OAEF,IAAI,EAA8C,EAAE,CAEpD,GAAI,EAAW,SAAW,EACxB,OAAO,EAAY,MAAM,EAAW,CAAC,KAGvC,EAAW,QAAQ,GAAK,CACtB,IAAI,EAEJ,OAAQ,EAAE,OAAV,CACE,KAAK,EAAW,KACd,EAAW,QACX,MAEF,KAAK,EAAW,UACd,EAAW,aACX,MAEF,KAAK,EAAW,eACd,EAAW,kBACX,MAGJ,IAAM,EAAgB,EAAW,IAAa,EAAE,CAEhD,EAAc,KAAK,EAAE,CAErB,EAAa,CACX,GAAG,GACF,GAAW,EAAY,KAAK,EAAA,CAC9B,EACD,CAEF,IAAM,EAAyB,EAAW,YACxC,CAAC,EAAW,iBACZ,CAAC,EAAW,MACR,EAAqB,EAAW,iBACpC,CAAC,EAAW,YACZ,CAAC,EAAW,MACR,EAAoB,EAAW,OACnC,CAAC,EAAW,YACZ,CAAC,EAAW,gBAEd,GAAI,EACF,OAAO,EAAU,aAAc,CAAE,WAAY,EAAW,WAAW,OAAQ,CAAC,CAE9E,GAAI,EACF,OAAO,EAAU,SAAU,CAAE,WAAY,EAAW,gBAAgB,OAAQ,CAAC,CAE/E,GAAI,EACF,OAAO,EAAU,QAAS,CAAE,WAAY,EAAW,MAAM,OAAQ,CAAC,CAEpE,IAAM,EAAkB,EAAE,CAEtB,EAAW,YAAY,QACzB,EAAgB,KAAK,EAAU,aAAc,CAAE,WAAY,EAAW,WAAW,OAAQ,CAAC,CAAC,CAEzF,EAAW,iBAAiB,QAC9B,EAAgB,KAAK,EAAU,SAAU,CAAE,WAAY,EAAW,gBAAgB,OAAQ,CAAC,CAAC,CAE1F,EAAW,OAAO,QACpB,EAAgB,KAAK,EAAU,QAAS,CAAE,WAAY,EAAW,MAAM,OAAQ,CAAC,CAAC,CAEnF,IAAM,EAAgB,EAAgB,KAAK,CAE3C,MAAO,GAAG,EAAgB,KAAK,KAAK,CAAC,GAAG,EAAU,MAAM,CAAC,GAAG,KAE/D,eC1ZD,EAAO,QAAU,UAAY,CAC3B,IAAI,EAAY,SAAS,cAAc,CACvC,GAAI,CAAC,EAAU,WACb,OAAO,UAAY,GAKrB,IAAK,IAHD,EAAS,SAAS,cAElB,EAAS,EAAE,CACN,EAAI,EAAG,EAAI,EAAU,WAAY,IACxC,EAAO,KAAK,EAAU,WAAW,EAAE,CAAC,CAGtC,OAAQ,EAAO,QAAQ,aAAa,CAApC,CACE,IAAK,QACL,IAAK,WACH,EAAO,MAAM,CACb,MAEF,QACE,EAAS,KACT,MAIJ,OADA,EAAU,iBAAiB,CACpB,UAAY,CACjB,EAAU,OAAS,SACnB,EAAU,iBAAiB,CAEtB,EAAU,YACb,EAAO,QAAQ,SAAS,EAAO,CAC7B,EAAU,SAAS,EAAM,EACzB,CAGJ,GACA,EAAO,OAAO,oBClClB,IAAI,EAAA,IAAA,CAEA,EAA4B,CAC9B,aAAc,OACd,YAAa,MACb,QAAW,OACZ,CAEG,EAAiB,mCAErB,SAAS,EAAO,EAAS,CACvB,IAAI,GAAW,YAAY,KAAK,UAAU,UAAU,CAAG,IAAM,QAAU,KACvE,OAAO,EAAQ,QAAQ,gBAAiB,EAAQ,CAGlD,SAAS,EAAK,EAAM,EAAS,CAC3B,IAAI,EACF,EACA,EACA,EACA,EACA,EACA,EAAU,GACZ,AACE,IAAU,EAAE,CAEd,EAAQ,EAAQ,OAAS,GACzB,GAAI,CAkDF,GAjDA,EAAmB,GAAiB,CAEpC,EAAQ,SAAS,aAAa,CAC9B,EAAY,SAAS,cAAc,CAEnC,EAAO,SAAS,cAAc,OAAO,CACrC,EAAK,YAAc,EAEnB,EAAK,WAAa,OAElB,EAAK,MAAM,IAAM,QAEjB,EAAK,MAAM,SAAW,QACtB,EAAK,MAAM,IAAM,EACjB,EAAK,MAAM,KAAO,mBAElB,EAAK,MAAM,WAAa,MAExB,EAAK,MAAM,iBAAmB,OAC9B,EAAK,MAAM,cAAgB,OAC3B,EAAK,MAAM,aAAe,OAC1B,EAAK,MAAM,WAAa,OACxB,EAAK,iBAAiB,OAAQ,SAAS,EAAG,CAExC,GADA,EAAE,iBAAiB,CACf,EAAQ,OAEV,GADA,EAAE,gBAAgB,CACP,EAAE,gBAAkB,OAAa,CAC1C,GAAS,QAAQ,KAAK,gCAAgC,CACtD,GAAS,QAAQ,KAAK,2BAA2B,CACjD,OAAO,cAAc,WAAW,CAChC,IAAI,EAAS,EAA0B,EAAQ,SAAW,EAA0B,QACpF,OAAO,cAAc,QAAQ,EAAQ,EAAK,MAE1C,EAAE,cAAc,WAAW,CAC3B,EAAE,cAAc,QAAQ,EAAQ,OAAQ,EAAK,CAG7C,EAAQ,SACV,EAAE,gBAAgB,CAClB,EAAQ,OAAO,EAAE,cAAc,GAEjC,CAEF,SAAS,KAAK,YAAY,EAAK,CAE/B,EAAM,mBAAmB,EAAK,CAC9B,EAAU,SAAS,EAAM,CAGrB,CADa,SAAS,YAAY,OAAO,CAE3C,MAAU,MAAM,gCAAgC,CAElD,EAAU,SACH,EAAK,CACZ,GAAS,QAAQ,MAAM,qCAAsC,EAAI,CACjE,GAAS,QAAQ,KAAK,2BAA2B,CACjD,GAAI,CACF,OAAO,cAAc,QAAQ,EAAQ,QAAU,OAAQ,EAAK,CAC5D,EAAQ,QAAU,EAAQ,OAAO,OAAO,cAAc,CACtD,EAAU,SACH,EAAK,CACZ,GAAS,QAAQ,MAAM,uCAAwC,EAAI,CACnE,GAAS,QAAQ,MAAM,yBAAyB,CAChD,EAAU,EAAO,YAAa,EAAU,EAAQ,QAAU,EAAe,CACzE,OAAO,OAAO,EAAS,EAAK,SAEtB,CACJ,IACE,OAAO,EAAU,aAAe,WAClC,EAAU,YAAY,EAAM,CAE5B,EAAU,iBAAiB,EAI3B,GACF,SAAS,KAAK,YAAY,EAAK,CAEjC,GAAkB,CAGpB,OAAO,EAGT,EAAO,QAAU,eChHjB,SAAS,EAAQ,EAAK,CAAE,0BAA2B,MAAO,GAAwB,OAAO,QAArB,YAA2C,OAAO,OAAO,UAA1B,SAAqC,SAAU,EAAK,CAAE,OAAO,OAAO,GAAS,SAAU,EAAK,CAAE,OAAO,GAAqB,OAAO,QAArB,YAA+B,EAAI,cAAgB,QAAU,IAAQ,OAAO,UAAY,SAAW,OAAO,GAAQ,EAAQ,EAAI,CAE7U,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,gBAAkB,IAAK,GAE/B,IAAI,EAAS,EAAA,GAAA,CAAwC,CAEjD,EAAmB,EAAA,IAAA,CAAoD,CAEvE,EAAY,CAAC,OAAQ,SAAU,UAAW,WAAW,CAEzD,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAW,EAAK,CAE9F,SAAS,EAAQ,EAAQ,EAAgB,CAAE,IAAI,EAAO,OAAO,KAAK,EAAO,CAAE,GAAI,OAAO,sBAAuB,CAAE,IAAI,EAAU,OAAO,sBAAsB,EAAO,CAAE,IAAmB,EAAU,EAAQ,OAAO,SAAU,EAAK,CAAE,OAAO,OAAO,yBAAyB,EAAQ,EAAI,CAAC,YAAc,EAAG,EAAK,KAAK,MAAM,EAAM,EAAQ,CAAI,OAAO,EAE9U,SAAS,EAAc,EAAQ,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAiB,UAAU,IAAlB,KAAsC,EAAE,CAAjB,UAAU,GAAS,EAAI,EAAI,EAAQ,OAAO,EAAO,CAAE,CAAC,EAAE,CAAC,QAAQ,SAAU,EAAK,CAAE,EAAgB,EAAQ,EAAK,EAAO,GAAK,EAAI,CAAG,OAAO,0BAA4B,OAAO,iBAAiB,EAAQ,OAAO,0BAA0B,EAAO,CAAC,CAAG,EAAQ,OAAO,EAAO,CAAC,CAAC,QAAQ,SAAU,EAAK,CAAE,OAAO,eAAe,EAAQ,EAAK,OAAO,yBAAyB,EAAQ,EAAI,CAAC,EAAI,CAAI,OAAO,EAEjf,SAAS,EAAyB,EAAQ,EAAU,CAAE,GAAI,GAAU,KAAM,MAAO,EAAE,CAAE,IAAI,EAAS,EAA8B,EAAQ,EAAS,CAAM,EAAK,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAI,EAAmB,OAAO,sBAAsB,EAAO,CAAE,IAAK,EAAI,EAAG,EAAI,EAAiB,OAAQ,IAAO,EAAM,EAAiB,GAAQ,IAAS,QAAQ,EAAI,EAAI,IAAkB,OAAO,UAAU,qBAAqB,KAAK,EAAQ,EAAI,GAAY,EAAO,GAAO,EAAO,IAAU,OAAO,EAEne,SAAS,EAA8B,EAAQ,EAAU,CAAE,GAAI,GAAU,KAAM,MAAO,EAAE,CAAE,IAAI,EAAS,EAAE,CAAM,EAAa,OAAO,KAAK,EAAO,CAAM,EAAK,EAAG,IAAK,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAO,EAAM,EAAW,GAAQ,IAAS,QAAQ,EAAI,EAAI,KAAa,EAAO,GAAO,EAAO,IAAQ,OAAO,EAE1S,SAAS,EAAgB,EAAU,EAAa,CAAE,GAAI,EAAE,aAAoB,GAAgB,MAAU,UAAU,oCAAoC,CAEpJ,SAAS,EAAkB,EAAQ,EAAO,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CAAE,IAAI,EAAa,EAAM,GAAI,EAAW,WAAa,EAAW,YAAc,GAAO,EAAW,aAAe,GAAU,UAAW,IAAY,EAAW,SAAW,IAAM,OAAO,eAAe,EAAQ,EAAW,IAAK,EAAW,EAExT,SAAS,EAAa,EAAa,EAAY,EAAa,CAA4M,OAAtM,GAAY,EAAkB,EAAY,UAAW,EAAW,CAAM,GAAa,EAAkB,EAAa,EAAY,CAAE,OAAO,eAAe,EAAa,YAAa,CAAE,SAAU,GAAO,CAAC,CAAS,EAE/Q,SAAS,EAAU,EAAU,EAAY,CAAE,GAAI,OAAO,GAAe,YAAc,IAAe,KAAQ,MAAU,UAAU,qDAAqD,CAAI,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,SAAU,GAAM,aAAc,GAAM,CAAE,CAAC,CAAE,OAAO,eAAe,EAAU,YAAa,CAAE,SAAU,GAAO,CAAC,CAAM,GAAY,EAAgB,EAAU,EAAW,CAEjc,SAAS,EAAgB,EAAG,EAAG,CAA4G,MAA1G,GAAkB,OAAO,gBAAkB,SAAyB,EAAG,EAAG,CAAmB,MAAjB,GAAE,UAAY,EAAU,GAAa,EAAgB,EAAG,EAAE,CAEvK,SAAS,EAAa,EAAS,CAAE,IAAI,EAA4B,GAA2B,CAAE,OAAO,UAAgC,CAAE,IAAI,EAAQ,EAAgB,EAAQ,CAAE,EAAQ,GAAI,EAA2B,CAAE,IAAI,EAAY,EAAgB,KAAK,CAAC,YAAa,EAAS,QAAQ,UAAU,EAAO,UAAW,EAAU,MAAW,EAAS,EAAM,MAAM,KAAM,UAAU,CAAI,OAAO,EAA2B,KAAM,EAAO,EAEna,SAAS,EAA2B,EAAM,EAAM,CAAE,GAAI,IAAS,EAAQ,EAAK,GAAK,UAAY,OAAO,GAAS,YAAe,OAAO,KAAiB,IAAS,IAAK,GAAK,MAAU,UAAU,2DAA2D,CAAI,OAAO,EAAuB,EAAK,CAE7R,SAAS,EAAuB,EAAM,CAAE,GAAI,IAAS,IAAK,GAAK,MAAU,eAAe,4DAA4D,CAAI,OAAO,EAE/J,SAAS,GAA4B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAAkF,OAAhF,QAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,QAAS,EAAE,CAAE,UAAY,GAAG,CAAC,CAAS,QAAkB,CAAE,MAAO,IAE/T,SAAS,EAAgB,EAAG,CAAqJ,MAAnJ,GAAkB,OAAO,eAAiB,OAAO,eAAiB,SAAyB,EAAG,CAAE,OAAO,EAAE,WAAa,OAAO,eAAe,EAAE,EAAY,EAAgB,EAAE,CAE1M,SAAS,EAAgB,EAAK,EAAK,EAAO,CAA0J,OAApJ,KAAO,EAAO,OAAO,eAAe,EAAK,EAAK,CAAS,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,CAAC,CAAW,EAAI,GAAO,EAAgB,EAE3M,IAAI,GAA+B,SAAU,EAAsB,CACjE,EAAU,EAAiB,EAAqB,CAEhD,IAAI,EAAS,EAAa,EAAgB,CAE1C,SAAS,GAAkB,CACzB,IAAI,EAEJ,EAAgB,KAAM,EAAgB,CAEjC,IAA6B,MACnB,WA0Bf,MAvBA,GAAQ,EAAO,KAAK,MAAM,EAAQ,CAAC,KAAK,CAAC,OAAO,EAAK,CAAC,CAEtD,EAAgB,EAAuB,EAAM,CAAE,UAAW,SAAU,EAAO,CACzE,IAAI,EAAc,EAAM,MACpB,EAAO,EAAY,KACnB,EAAS,EAAY,OACrB,EAAW,EAAY,SACvB,EAAU,EAAY,QAEtB,EAAO,EAAO,QAAW,SAAS,KAAK,EAAS,CAEhD,GAAU,EAAG,EAAiB,SAAY,EAAM,EAAQ,CAExD,GACF,EAAO,EAAM,EAAO,CAIlB,GAAQ,EAAK,OAAS,OAAO,EAAK,MAAM,SAAY,YACtD,EAAK,MAAM,QAAQ,EAAM,EAE3B,CAEK,EAqBT,OAlBA,EAAa,EAAiB,CAAC,CAC7B,IAAK,SACL,MAAO,UAAkB,CACvB,IAAI,EAAe,KAAK,MACZ,EAAa,KACX,EAAa,OACZ,EAAa,QAH5B,IAII,EAAW,EAAa,SACxB,EAAQ,EAAyB,EAAc,EAAU,CAEzD,EAAO,EAAO,QAAW,SAAS,KAAK,EAAS,CAEpD,OAAoB,EAAO,QAAW,aAAa,EAAM,EAAc,EAAc,EAAE,CAAE,EAAM,CAAE,EAAE,CAAE,CACnG,QAAS,KAAK,QACf,CAAC,CAAC,EAEN,CAAC,CAAC,CAEI,GACP,EAAO,QAAW,cAAc,CAElC,EAAQ,gBAAkB,GAE1B,EAAgB,GAAiB,eAAgB,CAC/C,OAAQ,IAAA,GACR,QAAS,IAAA,GACV,CAAC,kBC/GF,IACI,EAAA,IAAA,CAA2B,gBAE/B,EAAgB,gBAAkB,EAClC,EAAO,QAAU,yGESX,EAAY,EAAgB,iBADhB,mBAC2C,CAkB7D,GAAU,aAAe,CACvB,QAAS,SACV,CAED,SAAgB,GAAU,EAAoC,CAC5D,GAAM,CAAE,EAAqB,GAAA,EAAiC,SAAS,EAAM,gBAAkB,GAAM,CAErG,SAAS,GAA4B,CACnC,eAAiB,EAAuB,GAAM,CAAE,IAAK,CAGvD,SAAS,GAAe,CAClB,EAAM,QACR,EAAM,QAAQ,CAEZ,KAGJ,EAAuB,GAAK,CAC5B,GAA2B,EAG7B,EAAM,cAAgB,CACf,EAAM,gBAGX,GAA2B,EAC1B,CAAC,EAAM,eAAe,CAAC,CAE1B,SAAS,GAAS,CAuBhB,OAtBI,EAAM,UAAY,aAElB,EAAA,EAAA,KAAC,GAAA,gBAAD,CAAiB,KAAM,EAAM,MAAe,mBAC1C,EAAA,EAAA,KAAC,EAAD,CACE,KAAM,EAAsB,SAAW,GACvC,IAAK,EAAsB,GAAW,GACtC,UAAW,EACT,GAAO,QACP,uBACA,EAAsB,yBAA2B,oCACjD,EAAM,sBACP,UAEA,EACC,EAAM,YAAc,EAAU,aAAa,CAC3C,EAAM,UAAY,EAAU,OAAO,CAE1B,CAAA,CACG,CAAA,EAKpB,EAAA,EAAA,KAAC,GAAA,gBAAD,CAAiB,KAAM,EAAM,MAAe,mBAC1C,EAAA,EAAA,KAAC,SAAD,CACE,KAAM,EAAsB,SAAW,GACvC,UAAW,EACT,gEACA,EAAM,sBACP,UAEA,EACC,EAAM,YAAc,EAAU,SAAS,CACvC,EAAM,UAAY,EAAU,OAAO,CAE9B,CAAA,CACO,CAAA,CAItB,IAAM,GACJ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAM,UAAY,YAAc,gDAAkD,uBAAlG,CACG,EAAM,UACL,EAAA,EAAA,KAAC,WAAD,CACE,UAAW,EAAW,mCAAoC,CAAC,EAAM,YAAc,GAAO,eAAgB,EAAM,kBAAkB,CAC9H,WAAY,GACZ,MAAO,EAAM,MACb,KAAM,EAAM,MAAQ,EACpB,SAAA,GACA,CAAA,EACF,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,OACL,aAAa,MACb,UAAW,EACT,eACA,EAAM,UAAY,UAAY,EAAM,QACrC,CACD,WAAY,GACZ,MAAO,EAAM,MACb,SAAA,GACA,CAAA,EAGJ,EAAA,EAAA,KAAC,EAAD,EAAU,CAAA,CACN,GAYR,OATI,EAAM,OAEN,EAAA,EAAA,MAAC,GAAK,MAAN,CAAY,UAAU,sBAAtB,EACE,EAAA,EAAA,KAAC,GAAK,MAAN,CAAA,SAAa,EAAM,MAAmB,CAAA,CACrC,EACU,GAIV,ECvIT,IAAM,GAAY,sBAQL,GAAc,CACzB,oBAAoB,EAA6B,GAAyB,CACxE,IAAM,EAAiC,CACrC,CACE,MAAO,EAAgB,UAAU,GAAW,QAAQ,CACpD,MAAO,MACP,OAAQ,MACT,CACD,CACE,MAAO,EAAgB,UAAU,GAAW,SAAS,CACrD,MAAO,OACP,OAAQ,MACT,CACD,CACE,MAAO,EAAgB,UAAU,GAAW,QAAQ,CACpD,MAAO,OACP,OAAQ,OAEX,CASD,OAPI,GACF,EAAY,QAAQ,CAClB,MAAO,EAAgB,UAAU,GAAW,aAAa,CACzD,MAAO,OACP,OAAQ,OACT,CAAC,CAEG,GAET,eAAe,EAGJ,CACT,GAAM,CAAE,MAAK,QAAS,EAEhB,EAAe,EAAK,QAAU,OAU9B,EAAS,WARW,EACxB,qEACA,UAAU,EAAK,MAAM,YAAY,EAAK,OAAO,GAMH,6FAFhC,QAAQ,EAAI,GAE8C,YAKtE,OAHI,EACK,yDAAyD,EAAO,QAElE,GAET,cAAc,EAMH,CACT,GAAM,CAAE,WAAU,OAAM,UAAS,WAAU,eAAgB,EAMvD,EAAU,EAEd,AACE,IAAU,EAAU,cAAc,EAAM,eAAe,IAAU,CAEnE,IAAM,EAAqB,EAAE,CAQ7B,OANI,IACF,EAAO,EAAI,IAET,IACF,EAAO,YAAc,GAEhB,EAAU,WAAW,EAAS,EAAO,EAE/C,4FE3EK,GAAY,sBACZ,GAAY,EAAgB,iBAAiB,GAAU,CAqB7D,GAAc,aAAe,CAC3B,QAAS,SACV,CAED,SAAgB,GAAc,EAAwC,CACpE,IAAM,EAAa,GAAY,qBAAqB,CAE9C,CAAE,EAAQ,GAAA,EAAoB,SAAkB,CAAC,CAAC,EAAM,oBAAoB,CAC5E,CAAE,EAAU,GAAA,EAAsB,SAAS,GAAM,CACjD,CAAE,EAAW,GAAA,EAAuB,SAA0B,EAAW,KAAK,GAAK,EAAE,QAAU,OAAO,CAAC,CACvG,CAAE,EAAQ,GAAA,EAAoB,SAAS,GAAM,CAOnD,EAAM,cAAgB,CACf,EAAM,qBAGX,eAAiB,EAAU,GAAM,CAAE,IAAK,EACvC,CAAC,EAAM,oBAAoB,CAAC,CAE/B,SAAS,GAAe,CACtB,KAAU,GAAK,CACf,eAAiB,EAAU,GAAM,CAAE,IAAK,CAGpC,GAKJ,IAFA,EAAU,GAAK,CAEX,OAAO,EAAM,QAAW,WAAY,CACtC,EAAM,OAAO,CACX,KAAM,EACN,WACD,CAAC,CACF,OAGF,EAAgB,cAAc,CAC5B,GAAG,EAAM,OACT,aAAc,CACZ,KAAM,EACN,WACD,CACF,CAAE,EAAgB,aAAa,EAAgB,oBAAoB,EAAM,WAAW,CAAE,CACrF,CACE,WAAY,EAAW,MACvB,WAAY,EAAiB,cAC7B,aAAc,EAAa,GAC5B,CACD,EAAM,iBACP,CAAC,CAAC,EAGL,SAAS,EAAc,EAAmB,CACxC,EAAU,GAAM,CAChB,EAAY,EAAS,CAGvB,SAAS,EAAe,EAA4B,CAClD,EAAU,GAAM,CAChB,EAAa,EAAU,CAGzB,IAAM,EAAM,GAAY,cAAc,CACpC,SAAU,EAAM,SAChB,KAAM,EAAM,QACZ,QAAS,EAAM,QACf,WACD,CAAC,CAEI,EAAc,GAAY,eAAe,CAC7C,MACA,KAAM,EACP,CAAC,CAEF,OACE,EAAA,EAAA,MAAC,GAAyB,SAA1B,CAAmC,MAAO,YAA1C,EACE,EAAA,EAAA,KAAC,GAAD,CACE,MAAO,EACC,SACR,WAAY,EAAM,UAAY,YAAc,GAAU,WAAW,CAAG,GAAU,SAAS,CACvF,SAAU,GAAU,OAAO,CAC3B,eAAgB,EAChB,QAAS,EAAM,QACf,sBAAuB,EAAW,mCAAoC,GAAO,iBAAiB,CAC9F,WAAY,EAAM,WAClB,MAAO,EAAM,UAAY,IAAA,GAAY,GAAU,QAAQ,CACvD,SAAA,GACA,CAAA,EACF,EAAA,EAAA,KAAC,GAAD,CACY,WACV,YAAa,EACF,YACX,aAAc,EACF,aACZ,CAAA,CACgC,GCjIxC,IAAM,GAAY,eAYlB,SAAgB,GAAU,EAAuB,CAC/C,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,GAAD,CACE,SAAU,EAAM,UAAU,SAC1B,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,QAAS,EAAM,UAAU,GACzB,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAAA,EAEN,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAD,CAAW,QAAS,EAAM,cAAe,UAAU,iCACjD,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,OAAS,CAAA,CAClC,CAAA,CACC,CAAA,CACd,CAAA,CAAA,aCzCP,SAAA,GAAA,EAAA,CACE,OAAA,EAAA,EAAA,KAAA,MAAA,gSCMF,IAAM,GAAY,qBAOlB,SAAgB,GAAa,EAA0B,CACrD,OACE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,oBACf,UAAU,kEAEV,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAW,OAAQ,CAAC,EAAM,SAAW,+BAA+B,WAClF,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,GACL,KAAM,EAAM,QAAU,EAAiB,SAAW,EAAiB,MACnE,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,eAAiB,CAAA,CAChD,GACI,CAAA,CC/BhB,IAAY,GAAL,SAAA,EAAA,OACL,GAAA,QAAA,UACA,EAAA,OAAA,eACD,CCWK,EAAY,EAAgB,iBADhB,sBAC2C,CAahD,EAAkB,CAC7B,sBAAwB,GAAmC,CACzD,GAAM,CAAE,eAAc,UAAS,gBAAe,SAAQ,cAAe,EAErE,GAAI,IAAiB,EAAW,OAAS,IAAiB,EAAW,OACnE,MAAO,CAAE,KAAM,EAAc,KAAM,EAAU,EAAgB,uBAAyB,0BAA0B,CAAE,CAMhH,UAAM,QAAQ,EAAQ,CAG1B,OAAQ,EAAQ,QAAhB,CACE,IAAK,SACH,MAAO,CAAE,KAAM,EAAc,KAAM,EAAU,oBAAoB,CAAE,CACrE,IAAK,YAGH,OAFI,EAAQ,qBACH,CAAE,KAAM,EAAc,KAAM,EAAU,gBAAgB,CAAE,CAC1D,CACL,KAAM,EACN,KAAM,EAAgB,qBAAqB,EAAQ,EAAY,EAAc,CAC9E,CACH,IAAK,mBAGH,OAFI,EAAQ,qBACH,CAAE,KAAM,EAAS,KAAM,EAAU,EAAgB,uBAAyB,0BAA0B,CAAE,CACxG,CACL,KAAM,EACN,KAAM,EAAgB,qBAAqB,EAAQ,EAAY,EAAc,CAC9E,CAKH,IAAK,aACL,IAAK,UACH,MAAO,CAAE,KAAM,EAAS,KAAM,EAAU,qBAAqB,CAAE,CACjE,QACE,MAAO,EAAE,GAIf,eAAiB,GAAmC,CAClD,GAAM,CAAE,iBAAgB,sBAAqB,UAAW,EACxD,GAAI,CAAC,GAAkB,CAAC,EACtB,OAAO,EAAgB,sBAAsB,EAAQ,CAEvD,GAAI,CAAC,EACH,MAAO,CAAE,KAAM,EAAS,KAAM,EAAU,WAAW,CAAE,CAEvD,IAAM,EAAU,GAAW,QAAQ,EAAe,CAC5C,EAAgB,GAAW,YAAY,EAAgB,IAAI,KAAQ,MAAM,CAE/E,GAAI,CAAC,EAAqB,CACxB,IAAI,EAAO,EACT,EAAU,cAAc,CACxB,EAAU,SAAU,CAAE,KAAM,EAAe,CAAC,CAK9C,OAHI,IAAW,GAAgB,UAC7B,EAAO,EAAU,UAAU,EAEtB,CAAE,KAAM,GAAU,OAAM,CAGjC,IAAI,EAAO,EACT,EAAU,sBAAsB,CAChC,EAAU,iBAAkB,CAAE,KAAM,EAAe,CAAC,CAKtD,OAHI,IAAW,GAAgB,UAC7B,EAAO,EAAU,kBAAkB,EAE9B,CAAE,KAAM,EAAS,OAAM,EAGhC,qBAAqB,EAAmB,EAAyB,EAAwB,CACvF,GAAI,CAAC,GAAS,CAAC,EACb,OAAO,KAET,GAAI,EACF,OAAO,EAAU,uBAAuB,CAE1C,GAAI,CAAC,EAAY,YAAY,EAAM,CACjC,OAAO,EAAU,mBAAmB,CAEtC,IAAM,EAAc,GAAkB,uBAAuB,EAAM,eAAe,MAAM,CAKxF,GAAI,GAAe,CAAC,EAAY,UAC9B,OAAO,EAAU,aAAa,CAEhC,IAAM,EAAS,EAAY,UAAU,EAAM,CAEvC,EACA,EAEJ,IAAK,IAAM,KAAa,GAIlB,CAAC,GAAgB,EAAU,MAAQ,EAAa,SAClD,EAAe,GAKb,KAAe,EAAU,OAAS,EAAY,aAM9C,GAAU,EAAU,OAAO,MAAQ,EAAO,QAM1C,CAAC,GAAuB,EAAU,MAAQ,EAAoB,SAChE,EAAsB,IAuB1B,OAjBK,EAOD,EAAW,SAAW,EACjB,EAAU,gBAAgB,CAM/B,EAAoB,QAAU,EAAa,MACtC,EAAU,eAAgB,CAAE,UAAW,EAAa,KAAM,CAAC,CAE7D,EAAU,iBAAkB,CAAE,UAAW,EAAoB,KAAM,CAAC,CAhBlE,EAAU,YAAY,EAkBlC,CC9JK,EAAY,EAAgB,iBADhB,sBAC2C,CAsB7D,SAAS,GAAc,EAA2B,CAChD,GAAM,CAAE,SAAQ,QAAO,cAAa,WAAY,EAEhD,OACE,EAAA,EAAA,MAAC,SAAD,CACE,UAAW,GAAG,EAAS,gBAAkB,GAAG,kEAC5C,QAAU,EAAmB,KAAV,EACnB,KAAK,kBAHP,EAKE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,4BAAoB,EAAU,CAAA,EAC3C,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,6BAAqB,EAAgB,CAAA,CAAA,GAEnD,IAAU,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,GAAY,CAAA,CAAA,GAKhD,SAAgB,GAAc,EAAwC,CACpE,GAAM,CAAE,EAAiB,GAAA,EAA6B,SAAS,GAAM,CAC/D,CAAE,EAAS,GAAA,EAAqB,SAAuB,KAAK,CAE5D,CAAE,OAAM,QAAS,EAAgB,eAAe,EAAM,CAE5D,EAAM,cAAgB,CACpB,EAAmB,EAAM,QAAQ,gBAAgB,CACjD,EAAW,EAAM,QAAQ,QAAQ,EAChC,CAAC,EAAM,QAAQ,CAAC,CAEnB,IAAM,EAAyB,EAAkB,mBAAqB,YAQtE,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qCANf,CAAC,EAAM,qBACP,CAAC,EAAM,gBACN,EAAM,2BAA6B,CAAC,EAAM,eAOrC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACE,EAAA,EAAA,MAAC,SAAD,CACE,UAAU,iEACV,iBAAe,WACf,aAAY,EAAU,cAAc,UAHtC,EAKE,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,EAAM,UAAU,qBAAuB,CAAA,EAC1D,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAQ,EAAY,CAAA,CAAA,IAEtC,EAAA,EAAA,MAAC,KAAD,CAAI,UAAU,wCAAd,CACG,IACC,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,SACpB,MAAO,EAAU,SAAS,CAC1B,YAAa,EAAU,oBAAoB,CAC3C,YAAe,EAAM,mBAAmB,SAAU,GAAA,CAClD,CAAA,CACC,CAAA,EAEP,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,GAA0B,EAAM,QAAQ,qBAC5D,MAAO,EAAU,eAAe,CAChC,YAA+B,EAAlB,EAA4B,0BAAuC,gBAAgB,CAChG,YAAe,EAAM,mBAAmB,EAAwB,GAAA,CAChE,CAAA,CACC,CAAA,EACL,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,GAA0B,CAAC,EAAM,QAAQ,qBAC7D,MAAO,EAAU,iBAAiB,CAClC,YAAa,EAAgB,qBAC3B,EAAM,OACN,EAAM,WACN,EAAM,cACP,CACD,YAAe,EAAM,mBAAmB,EAAwB,GAAA,CAChE,CAAA,CACC,CAAA,EACL,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,UACpB,MAAO,EAAU,UAAU,CAC3B,YAAa,EAAU,qBAAqB,CAC5C,YAAe,EAAM,mBAAmB,UAAW,GAAA,CACnD,CAAA,CACC,CAAA,QAKT,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,EAAM,UAAU,qBAAuB,CAAA,EAC1D,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAY,CAAA,CAClB,CAAA,CAAA,CAGH,CAAA,CCtIV,SAAgB,IAAqC,CACnD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,gBAArD,EACE,EAAA,EAAA,KAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,iBAAkB,CAAA,EACtD,EAAA,EAAA,MAAC,OAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,UAAD,CAAS,GAAG,WAAW,oBAAoB,oBAAoB,MAAM,IAAI,OAAO,cAC9E,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qBAAqB,UAAU,oBAAqB,CAAA,CAC3D,CAAA,EACV,EAAA,EAAA,KAAC,QAAD,CAAO,GAAG,oBAAoB,MAAM,MAAM,OAAO,MAAM,UAAU,qzaAAsza,CAAA,CACl3a,CAAA,CAAA,CACH,GCVV,SAAgB,IAAoC,CAClD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,QAAQ,YAAY,KAAK,gBAA9B,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,0fAA0f,KAAK,OAAQ,CAAA,EAC/gB,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,4sBAA4sB,KAAK,OAAQ,CAAA,CAC7tB,yIEKJ,GAAY,0BAOlB,SAAgB,GAAuB,EAAkD,CACvF,IAAM,EAAY,EAChB,EAAO,OACP,GAAO,OAAS,MAAQ,EAAO,MAC/B,GAAO,OAAS,MAAQ,SACxB,iCACD,CAED,OACE,EAAA,EAAA,KAAC,EAAD,CAAS,MAAO,EAAgB,UAAU,GAAW,2BAA2B,CAAE,SAAA,GAAS,QAAS,EAAM,oBACxG,EAAA,EAAA,MAAC,KAAD,CAAI,UAAU,qCAAd,EACE,EAAA,EAAA,KAAC,KAAD,CAAe,YAAW,MAAO,CAAE,OAAQ,EAAG,WAC5C,EAAA,EAAA,KAAC,GAAD,EAAyB,CAAA,CACtB,CAAA,EAEL,EAAA,EAAA,KAAC,KAAD,CAAI,UAAW,GAAG,EAAU,GAAG,EAAO,mBAAoB,MAAO,CAAE,OAAQ,EAAG,WAC5E,EAAA,EAAA,KAAC,GAAD,EAAwB,CAAA,CACrB,CAAA,CAAA,GAEC,CAAA,CCpBd,IAAM,GAAY,oBAmBlB,SAAgB,GAAY,EAA6C,CACvE,GAAM,CAAE,EAAQ,GAAA,EAAoB,SAAS,GAAM,CAEnD,SAAS,GAAe,CAElB,IAGJ,EAAU,GAAK,CAEf,EAAgB,cAAc,CAC5B,GAAI,EAAM,OAAO,GACjB,KAAM,EAAM,OAAO,KACpB,CAAE,EAAgB,aAAa,EAAgB,oBAAoB,EAAM,WAAW,CAAE,CACrF,WAAY,EAAW,MACvB,WAAY,EAAiB,SAC7B,aAAc,EAAa,GAC5B,CAAC,CAAC,EAGL,OACE,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,UACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6DAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAM,UAAY,QAAU,4CAC5C,EAAM,WAEH,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mEACb,EAAA,EAAA,KAAC,GAAD,CACE,eAAgB,EAAM,UAAU,eAChC,oBAAqB,EAAM,UAAU,oBACrC,QAAS,EAAM,QACf,aAAc,EAAM,UAAU,aAC9B,OAAQ,EAAM,UAAU,OACxB,mBAAoB,EAAM,mBAC1B,cAAe,EAAM,cACrB,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,GAAD,CAAW,MAAO,EAAM,UAAU,IAAa,SAAU,CAAA,CACxD,CAAA,CAAA,EAEH,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gBACZ,EAAM,oBACL,EAAA,EAAA,KAAC,GAAD,EAA0B,CAAA,EAE1B,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,GAAS,UAAU,gBAAkB,CAAA,CAEtD,CAAA,EAEN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,wBAAc,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,aAAe,CAAA,CAAO,CAAA,CAAA,GAIzF,CAAA,CACL,CAAC,EAAM,YACN,EAAA,EAAA,KAAC,EAAD,CAAW,UAAU,YAAY,QAAS,EAAM,4BAC9C,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,aAAe,CAAA,CAClB,CAAA,CAAA,GAGf,CAAA,CC9FP,IAAM,GAAqC,EAAE,CAE7C,SAAgB,GAAU,EAAa,EAA8B,CACnE,GAAM,CAAE,EAAQ,GAAA,EAAoB,SAAS,GAAM,CA4BnD,OA1BA,EAAM,cAAgB,CACpB,GAAI,CAAC,GAAO,CAAC,GAAc,GAAc,GACvC,OAEF,IAAM,EAAS,SAAS,cAAc,SAAS,CAgB/C,MAdA,GAAO,IAAM,EACb,EAAO,MAAQ,GACf,EAAO,WAAe,CACpB,GAAc,GAAO,GAMrB,OAAO,eAAiB,EAAU,GAAK,CAAE,EAAE,EAG7C,SAAS,KAAK,YAAY,EAAO,KAEpB,CACX,EAAO,OAAS,KAChB,SAAS,KAAK,YAAY,EAAO,GAElC,CAAE,EAAK,EAAY,CAAC,CAEhB,GAAc,IAAQ,EClC/B,IAAM,GAAgC,uBAEtC,SAAgB,GAAoB,EAA6B,CAI3D,IACD,OAAe,QAAU,CAAE,UAAW,WAAY,EAErD,IAAM,EAAS,GAAU,yCAA0C,EAAW,CAS9E,OAPA,EAAM,cAAgB,CAChB,CAAC,GAAc,CAAC,GAGpB,OAAO,MAAM,kBAAkB,GAAG,GAA8B,EAC/D,CAAE,EAAY,EAAQ,CAAC,CAEnB,GClBT,SAAgB,GAAuB,EAA2B,CAChE,IAAM,EAAS,GAAU,gDAAiD,EAAW,CAErF,EAAM,cAAgB,CAChB,CAAC,GAAc,CAAC,GAGpB,OAAO,uBAAuB,eAAe,EAC5C,CAAE,EAAY,EAAQ,CAAC,CCE5B,IAAM,GAAY,+BACZ,GAAY,EAAgB,iBAAiB,GAAU,CAa7D,SAAgB,GAAsB,EAAgD,CACpF,GAAM,CAAE,EAAY,GAAkB,GACpC,GAAoB,wBACpB,CAAE,KAAM,GAAM,CACd,CAAE,QAAS,GAAY,aAAc,CACtC,CAKD,OAHK,EAAW,MAId,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAW,iCAAkC,CAAC,EAAM,gBAAkB,4BAA4B,UAAlH,EACE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,QACf,YAAe,EAAM,cAAc,CACnC,UAAU,kDAEV,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAW,iBAAkB,CAAC,EAAM,YAAc,cAAc,WAC/E,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,wBAA0B,CAAA,CACxD,CAAA,CACC,CAAA,CACT,CAAC,EAAM,cACR,EAAA,EAAA,KAAC,SAAD,CAAQ,YAAe,EAAc,CAAE,KAAM,GAAO,CAAC,CAAE,aAAY,GAAG,GAAU,YAAY,aAC1F,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,GACL,KAAM,EAAiB,MACvB,UAAU,yCACV,CAAA,CACK,CAAA,CAAA,IApBJ,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CCpChB,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,gBAAA,mBACA,EAAA,eAAA,kBACA,EAAA,KAAA,OACA,EAAA,QAAA,iBACD,CCMK,GAAoB,KAW1B,SAAgB,GAAkB,EAA4C,CAC5E,IAAM,EAAoB,GAAoB,EAAM,cAAc,SAAS,EAAc,gBAAgB,CAAC,CAG1G,GAFA,GAAuB,EAAM,cAAc,SAAS,EAAc,eAAe,CAAC,CAE9E,CAAC,EAAM,aAAa,QAAU,CAAC,EAAM,2BACvC,OACE,EAAA,EAAA,KAAC,GAAD,CACE,QAAS,EAAM,QACf,WAAY,EAAM,WAClB,CAAA,CAGN,SAAS,GAAc,CACrB,OAAQ,EAAM,SAAd,CACE,IAAK,KAAM,MAAO,KAElB,QAAS,OAAO,IAIpB,IAAM,EAAW,GAAa,CACxB,EAA6B,CAAE,OAAQ,GAAG,EAAS,IAAK,MAAO,GAAG,EAAS,IAAK,CAEtF,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,CACG,EAAM,aAAa,SAAS,EAAc,gBAAgB,GACzD,EAAA,EAAA,KAAC,MAAD,CACE,GAAI,EACJ,UAAU,qCACV,MAAO,YAEP,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,qBACV,YAAW,EACX,WAAU,EAAM,IAChB,CAAA,CACE,CAAA,CAEP,EAAM,aAAa,SAAS,EAAc,eAAe,GAC1D,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,2BAA2B,EAAO,sBAChD,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,sBAAsB,EAAO,mBACxC,MAAO,EACP,YAAW,EAAM,IACjB,mBAAiB,kBACjB,eAAa,QACb,oBAAmB,EACnB,CAAA,CACE,CAAA,CAAA,iBC5DZ,SAAA,GAAA,EAAA,CACE,OAAA,EAAA,EAAA,KAAA,GAAA,4FCGF,SAAgB,GAA0B,EAAoD,CAC5F,IAAM,EAAkB,GAAkB,gBAAgB,EAAM,OAAO,cAAc,CAC/E,CAAE,cAAe,EAAY,iBAAiB,EAAM,MAAM,CAKhE,MAHI,CAAC,GAAmB,CAAC,EAAM,YAAc,CAAC,GACrC,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,EAGZ,EAAA,EAAA,KAAC,GAAD,CAAoB,UAAW,EAAM,WAAa,iBAChD,EAAA,EAAA,KAAC,GAAD,CAAkB,aAAc,EAAM,MAAM,cAAe,WAAY,EAAM,WAAc,CAAA,CACxE,CAAA,CCVzB,IAAM,GAAY,EAAgB,iBAAiB,qBAAqB,CAElE,GAAA,EAA8B,QAAQ,CAAC,MAAM,CACjD,QAAA,EAAa,QAAQ,CAClB,IAAI,QAAW,GAAU,gBAAgB,CAAC,CAC9C,CAAC,CAYF,SAAS,GAAiB,EAAkD,CAC1E,IAAM,EAAc,IAA8C,CAElE,OACE,EAAA,EAAA,MAAC,GAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,GAAD,CACE,UAAU,WACV,KAAK,UACL,GAAG,UACH,YAAa,GAAU,cAAc,CACrC,MAAO,EAAY,OAAO,QAC1B,MAAO,GAAU,QAAQ,CACzB,kBAAA,GACA,CAAA,CACD,CAAC,EAAM,2BAA6B,EAAY,YAAY,EAAM,OAAO,GACxE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBAAO,EAAA,EAAA,KAAC,GAAD,CAA2B,MAAO,EAAM,OAAQ,WAAY,EAAM,WAAc,CAAA,CAAM,CAAA,EAC9G,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAa,OAAd,CAAqB,QAAQ,OAAO,KAAM,GAAU,QAAQ,CAAI,CAAA,CACnD,CAAA,CACJ,CAAA,CAAA,CAWjB,SAAgB,GAAa,EAA8C,CACzE,SAAS,EAAS,EAA2B,EAA0B,CACrE,IAAI,EAAkB,KAElB,EAAK,UACP,EAAU,EAAK,SAEjB,EAAM,aAAa,EAAS,EAAO,CAGrC,OACE,EAAA,EAAA,KAAC,GAAD,CACE,cAAe,CAAE,QAAS,GAAI,CAC9B,iBAAkB,GACR,WACV,mBAAoB,aAEpB,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACU,CAAA,CCrDlB,IAAM,GAAY,eACZ,GAAY,EAAgB,iBAAiB,GAAU,CAE7D,SAAS,GACP,EACA,EACA,EACA,EACqB,CACrB,GAAI,CAAC,EACH,MAAO,EAAE,CAEX,IAAM,EAAc,CAAE,GAAG,EAAmB,GAAG,EAAyB,CAAC,IAAI,GAAK,EAAE,GAAG,CAEvF,OAAO,EAAmB,OAAO,GAM/B,EAJI,EAAY,SAAS,EAAE,GAAG,EAI1B,EAAE,KAAO,GAIb,CAoCJ,SAAgB,GAAU,EAAoC,CAC5D,GAAM,CAAE,EAAY,GAAA,EAAwB,SAA8B,EAAE,CAAC,CACvE,CAAE,EAAsB,GAAA,EAAkC,SAAS,GAAM,CAEzE,CAAE,kBAAmB,IAAgB,CACrC,CAAE,iBAAkB,GAAY,KAAK,CACrC,EAAkC,EAAe,EAAe,mBAAmB,CAEzF,SAAS,EAAa,EAAiB,EAA0B,CAC/D,EAAM,aACJ,EACA,MACM,CACJ,EAAc,EAAE,CAAC,CACjB,GAAQ,EAEX,CAGH,SAAS,EAAsB,EAAkB,CAC1C,EAAM,qBAwBX,EAAM,oBAAoB,EArBR,GAA0B,CAC1C,IAAM,EAAqC,EAAE,CAE7C,EAAW,QAAQ,GAAa,CAC9B,GAAI,EAAU,KAAO,EACnB,OAAO,EAAc,KAAK,EAAU,CAEtC,IAAM,EAAmB,EAAa,UAAsC,EAAU,CAEjF,GAAO,MAAM,OAGhB,EAAiB,MAAQ,EAFzB,EAAiB,MAAQ,CAAE,MAAO,EAAG,KAAM,EAAE,CAAE,WAAY,KAAM,CAKnE,EAAc,KAAK,EAAiB,EACpC,CAEF,EAAc,EAAY,KAAK,EAAe,KAAK,CAAC,EAGf,CAGzC,SAAS,EAAkB,EAA2B,CACpD,IAAM,EAAwB,EAAE,CAqBhC,OAnBI,EAAe,EAAe,aAAa,EAC7C,EAAQ,KAAK,CACX,MAAO,OACP,QAAS,CACP,SAAU,CAAE,GAAU,MAAO,GAAU,QAAS,CAChD,YAAa,CACX,OAAQ,CAAC,GAAG,GAAa,OAAO,aAAa,GAAG,CAChD,WAAY,EAAM,YAAY,aAGnC,CAAC,CAGA,EAAe,EAAe,kBAAkB,EAClD,EAAQ,KAAK,CAAE,MAAO,YAAa,CAAC,CAElC,EAAe,EAAe,uBAAuB,EACvD,EAAQ,KAAK,CAAE,MAAO,kBAAmB,CAAC,CAErC,CACL,QACA,UACA,WAAY,OACZ,MAAA,GACD,CAGH,IAAM,EAAiB,IACrB,EAAe,EAAe,aAAa,EAC3C,EAAe,EAAe,kBAAkB,EAChD,EAAe,EAAe,uBAAuB,EAGjD,EAAiB,GACrB,EAAM,iBACN,EACA,EAAM,sBACN,EAAM,YAAY,GACnB,CAED,SAAS,GAA+B,CACtC,EAAwB,GAAK,CAC7B,EAAM,mBAAmB,CAO3B,OAJA,EAAM,cAAgB,CACpB,EAAwB,CAAC,CAAC,EAAM,mBAAmB,EAClD,CAAC,EAAM,mBAAmB,CAAC,EAG5B,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,CACG,IACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oDAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mEACb,EAAA,EAAA,KAAC,GAAD,CAGE,iBAAoB,EAAU,cAAc,EAAM,cAAe,YAAY,CAC1D,oBACnB,eAAgB,EAAM,qBACtB,wBAA0B,GACxB,GACE,GAAa,QACb,EACA,EAAM,sBACN,EAAM,YAAY,GACnB,CAEa,iBACJ,aACZ,qBAAsB,GAAa,EAAc,CAAE,GAAG,EAAY,EAAW,CAAC,CAC9E,gBAAiB,GAAa,EAAc,EAAW,OAAO,GAAK,EAAE,KAAO,EAAU,GAAG,CAAC,CAC1F,YACE,GADW,EACD,oBACA,gCAAgC,CAC5C,YAAa,EAAM,YACnB,iBAAkB,EAClB,sBAAuB,EAAM,qBAAuB,EACpD,aAAc,IACd,mBAAoB,EAAM,mBAC1B,mBAAoB,EAAM,mBAC1B,qBAAsB,EAAe,EAAe,kBAAA,CACpD,CA1BK,GAAgB,IAAI,GAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAI,eAAA,CA2B/C,CAAA,CAEJ,CAAC,EAAW,QAAU,EAAM,sBAAsB,QAEhD,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,6BAAmB,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,WAAa,CAAA,CAAK,CAAA,EAChE,EAAA,EAAA,KAAC,GAAA,WAAD,CAAY,WAAA,aACV,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,yBACX,EAAM,sBAAsB,IAAI,IAC/B,EAAA,EAAA,KAAC,KAAD,CAAe,UAAU,sBACvB,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EACR,YAAa,EAAM,YACnB,gBAAiB,EAAM,uBACvB,gBAAiB,EAAe,EAAe,kBAAA,CAC/C,CAAA,CACC,CAPI,EAAE,GAON,CAAA,CAEJ,CAAA,CACM,CAAA,CACT,CAAA,CAAA,EACJ,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CAEV,CAAC,CAAC,EAAW,SAEZ,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,GAAD,CACgB,eACd,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACE,CAAA,IAKX,CAAC,EAAW,QAAU,CAAC,IACtB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,gBAAgB,EAAiB,YAAc,+BAC7D,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,CACG,EAAM,YACL,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BAAmB,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,YAAc,CAAA,CAAM,CAAA,EAE3F,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,UAAW,EAAM,UACjB,oBAAqB,EAAM,oBAC3B,kBAAmB,EACnB,mBAAoB,EAAM,mBAC1B,eAAgB,EAAM,eACtB,QAAS,EAAM,QACf,aAAc,EAAM,OAAO,OAC3B,mBAAoB,EAAM,mBAC1B,mBAAoB,EAAM,wBAC1B,cAAe,EAAe,EAAe,kBAAkB,CAC/D,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACD,EAAM,WAAa,EAAM,0BACxB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAM,cAAc,QAAU,EAAM,SAAW,YAAc,GAAG,sBACjF,EAAA,EAAA,KAAC,GAAD,CACE,aAAc,EAAM,aACpB,IAAK,EAAM,UAAU,IACrB,WAAY,EAAM,WAClB,QAAS,EACP,EAAM,0BACN,EAAM,oBAER,CAAA,CACE,CAAA,CAEP,EAAM,WAAa,EAAM,WACxB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,GAAD,CAAc,oBAAqB,EAAM,oBAAuB,CAAA,CAC5D,CAAA,CAEP,EAAM,WAAa,EAAM,iBACxB,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,kCAAkC,QAAS,EAAM,8BACjE,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,mBAAqB,CAAA,CACjD,CAAA,CAEP,CAAA,CAAA,CACF,CAAA,CAGP,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+CACb,EAAA,EAAA,KAAC,GAAD,CAAS,GAAG,MAAM,UAAU,SAAS,KAAK,SAAW,CAAA,CACjD,CAAA,CAEP,CAAA,CAAA,CC1TP,IAAM,GAAmB,GACzB,SAAgB,GAAkB,EAAsC,CACtE,GAAI,CAAC,EACH,OAAO,KAET,IAAM,EAAO,IAAI,KAGjB,OAFA,EAAK,QAAQ,EAAK,SAAS,CAAG,GAAiB,CAExC,EAAK,aAAa,CCG3B,IAAM,GAAY,oBACZ,GAAY,EAAgB,iBAAiB,GAAU,CAM7D,SAAgB,GAAW,EAA4C,CACrE,IAAM,EAAc,IAAwC,CAE5D,SAAS,GAA0B,CAC7B,EAAM,qBAGV,EAAY,cAAc,iBAAkB,GAAkB,CAAC,EAAY,OAAO,eAAe,CAAC,CAGpG,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kEAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAU,MAAM,QAAQ,aAAG,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,wBAA0B,CAAA,CAAQ,CAAA,EACvG,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,gBAAM,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,qBAAuB,CAAA,CAAI,CAAA,CAC7E,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,GAAU,oBAAoB,CACrC,QAAS,CAAC,EAAM,oBAChB,SAAA,GACA,QAAQ,kBAER,EAAA,EAAA,KAAC,GAAD,CACE,QAAS,EACT,GAAI,CAAC,CAAC,EAAY,OAAO,eACzB,SAAU,EAAM,oBAChB,sBAAA,GACA,CAAA,CACM,CAAA,CACN,qDE/BJ,GAAY,EAAgB,iBADhB,yBAC2C,CAkB7D,SAAgB,GAAiB,EAA2C,CAC1E,GAAM,CAAE,EAAgB,GAAA,EAA4B,SAAS,GAAM,CAI7D,EAFc,IAAwC,CAE/B,QAAQ,SAErC,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CACE,UAAW,gBAAgB,EAAW,aAAe,KACrD,MAAO,EAAM,MACb,SAAU,GAAK,CACX,EAAM,SAAW,EAAM,SAAS,EAAE,OAAO,MAAM,EAEnD,KAAM,EAAiB,OAAS,WAChC,YAAa,EAAM,aAAe,GAAU,sBAAsB,CAClE,SAAU,CAAC,EAAM,QACjB,CAAA,CACD,CAAC,CAAC,IACD,EAAA,EAAA,KAAC,GAAK,QAAQ,SAAd,CAAuB,KAAK,mBAAW,EAAiC,CAAA,CAEzE,CAAC,CAAC,EAAM,UACP,EAAA,EAAA,KAAC,EAAD,CAAW,UAAW,GAAO,eAAgB,YAAe,EAAkB,CAAC,EAAe,WAC5F,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,EAAiB,EAAe,GACrC,MAAO,GAAU,EAAiB,eAAiB,iBAAiB,CACpE,iBAAiB,MACjB,CAAA,CACQ,CAAA,CAEb,CAAC,EAAM,SAAW,CAAC,CAAC,EAAM,UAAY,CAAC,CAAC,EAAM,UAC7C,EAAA,EAAA,KAAC,EAAD,CAAW,UAAW,GAAO,eAAgB,QAAS,EAAM,kBAC1D,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,GAAU,MAAO,GAAU,gBAAgB,CAChD,iBAAiB,MACjB,CAAA,CACQ,CAAA,CAEb,CAAA,CAAA,CC/DP,IAAM,GAAY,sBAEZ,GAAuB,WAQ7B,SAAgB,GAAa,EAA8C,CACzE,GAAM,CAAE,sBAAqB,0BAA2B,EAElD,EAAc,IAAwC,CAEtD,CAAE,EAAkB,GAAA,EAA8B,SAAS,CAAC,CAAC,EAAM,WAAW,oBAAoB,CAExG,SAAS,GAAgC,CACnC,EAAM,WAAW,qBACnB,EAAY,cAAc,iBAAkB,EAAoB,CAElE,EAAY,cAAc,WAAY,GAAG,CAEzC,EAAuB,CAAC,EAAoB,CAC5C,EAAY,cAAc,iBAAkB,GAAkB,CAAC,EAAoB,CAAC,CAGtF,SAAS,EAAY,EAAwB,CAC3C,EAAY,cAAc,WAAY,EAAS,CAGjD,SAAS,GAAsB,CAC7B,EAAY,cAAc,WAAY,GAAG,CACzC,EAAY,cAAc,iBAAkB,GAAK,CACjD,EAAoB,GAAM,CAG5B,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6DAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAU,MAAM,QAAQ,aAAG,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,yBAA2B,CAAA,CAAQ,CAAA,EACxG,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,gBAAM,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,sBAAwB,CAAA,CAAI,CAAA,CAC9E,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,GAAD,CAAc,QAAS,EAAyB,GAAI,EAAuB,CAAA,CACvE,GAEL,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mCACb,EAAA,EAAA,KAAC,GAAD,CACE,MAAO,EAAmB,GAAuB,EAAY,OAAO,SACpE,SAAU,EACV,QAAS,EACT,QAAS,CAAC,EACV,SAAA,GACA,CAAA,CACE,CAAA,CAEJ,GC9DV,IAAa,IAAA,EAAA,EAAA,SAA4C,CAAC,MAAM,CAC9D,gBAAA,EAAA,EAAA,UAAyB,CACzB,YAAA,EAAA,EAAA,SAAoB,CACpB,gBAAA,EAAA,EAAA,SAAwB,CAAC,UAAU,CACnC,UAAA,EAAA,EAAA,SAAkB,CACf,KAAK,CACJ,KAAM,kBACN,UAAW,GACX,OAAQ,EAAE,CACV,QAAS,EAAgB,UAXb,mBAWkC,cAAc,CAC5D,KAAM,GAMC,GAAK,OAGV,EAAI,EAAI,OAAS,GAFR,GAOZ,CAAC,CACD,QAAQ,GAAG,CACf,CAAC,CCZI,GAAY,eACZ,GAAY,EAAgB,iBAAiB,GAAU,CAgB7D,SAAS,GAAkB,EAA4C,CACrE,GAAM,CAAE,kBAAmB,IAAgB,CAErC,CAAE,EAAqB,GAAA,EAAiC,SAAS,CAAC,CAAC,EAAM,UAAU,oBAAoB,CAE7G,OACE,EAAA,EAAA,MAAC,GAAD,CAAA,SAAA,CACG,EAAM,oBACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kEAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAU,iBAAO,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,kBAAoB,CAAA,CAAQ,CAAA,EACvF,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iBAAO,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,wBAA0B,CAAA,CAAI,CAAA,CACjF,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CAAW,QAAS,EAAM,kBAAmB,UAAU,yCACrD,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,aAAe,CAAA,CACxC,CAAA,CACR,GAEP,EAAe,EAAe,wBAAwB,GACrD,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,GAAD,CAAiC,sBAAuB,CAAA,CACvD,EAAM,4BACL,EAAA,EAAA,KAAC,GAAD,CACE,UAAW,EAAM,UACI,sBACG,yBACxB,CAAA,CAEH,CAAA,CAAA,EAGL,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAa,OAAd,CAAqB,QAAS,EAAM,cAAe,KAAM,GAAU,OAAO,CAAE,QAAQ,OAAS,CAAA,EAC7F,EAAA,EAAA,KAAC,EAAa,OAAd,CAAqB,QAAQ,OAAS,CAAA,CACzB,CAAA,CAAA,CACV,CAAA,CAAA,CAkBX,SAAgB,GAAc,EAAmE,CAQ/F,OACE,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACiB,cAVuB,CAC1C,SAAU,GACV,eAAgB,GAChB,eAAgB,EAAM,UAAU,eAChC,qBAAsB,EAAM,UAAU,qBACvC,CAMK,SAAU,EAAM,gBAChB,kBAAmB,GACnB,iBAAkB,aAElB,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,OAAQ,EAAM,OACd,UAAW,EAAM,UACjB,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,iBAAkB,EAAM,iBACxB,QAAS,EAAM,QACf,kBAAmB,EAAM,kBACzB,cAAe,EAAM,cACrB,0BAA2B,EAAM,0BACjC,CAAA,CACU,CAAA,CACb,CAAA,CCjHP,IAAM,GAAY,EAAgB,iBADhB,sBAC2C,CAEhD,GAAoB,CAC/B,qBAAqB,EAAiC,EAA0C,CAC9F,MAAO,CACL,CACE,GAAI,EAAc,gBAClB,KAAM,GAAU,kBAAkB,CAClC,QAAS,EACT,YAAa,GAAY,uBAC1B,CACD,CACE,GAAI,EAAc,eAClB,KAAM,GAAU,YAAY,CAC5B,QAAS,EACT,YAAa,GAAY,sBAC1B,CACF,EAEJ,CCSK,GAAY,eACZ,EAAY,EAAgB,iBAAiB,GAAU,CAE7D,SAAS,GAAS,EAAkC,CAClD,OAAQ,EAAR,CACE,IAAK,QAAS,OAAO,EAAU,aAAa,CAC5C,IAAK,OAAQ,OAAO,EAAU,YAAY,CAC1C,IAAK,cAAe,OAAO,EAAU,mBAAmB,CACxD,IAAK,SAAU,OAAO,EAAU,cAAc,CAC9C,IAAK,WAAY,OAAO,EAAU,gBAAgB,CAClD,IAAK,UAAW,OAAO,EAAU,aAAa,EAIlD,SAAS,GAAuB,EAAiC,EAA4C,CAE3G,OADqB,GAAkB,qBAAqB,EAAwB,EAAiB,CACjF,OAAO,GAAK,EAAE,QAAQ,CAAC,IAAI,GAAK,EAAE,GAAG,CAM3D,IAAM,GAAY,GAA6B,IAAS,SAAW,IAAS,eAAiB,IAAS,OAChG,GAAkB,GAA6B,IAAS,SAAW,IAAS,eAAiB,IAAS,OAe5G,SAAgB,GAAU,EAAoC,CAC5D,IAAM,EAAW,IAAa,CAExB,EAAS,IAAW,CAGpB,EAAuB,CAAC,EAAM,cAM9B,CAAE,EAAQ,GAAA,EAAoB,SAAsB,OAAO,CAE3D,CAAE,iBAAgB,uBAAwB,IAAgB,CAE1D,EAAc,EAAkC,EAAa,aAAa,CAAC,CAC3E,EAAS,EAAgB,uBAAuB,EAAM,WAAW,CAAC,EAAM,SAAU,EAAY,MAAM,GAAG,CACvG,EAAS,EAA6B,GAAe,QAAQ,CAAC,CAC9D,EAAY,EAAiC,GAAwB,EAAa,OAAO,CAAC,CAC1F,EAAY,EAAgC,EAAc,uBAAuB,EAAM,SAAS,CAAC,CACjG,EAAkB,EACtB,EAAc,6BAA6B,EAAM,SAAS,CAC3D,CACK,EAAa,EAA0C,EAAY,MAAM,YAC7E,EAAgB,gCAAgC,EAAY,KAAK,WAAY,EAAgB,KAAK,CAAC,CAE/F,EAAsB,EAAY,MAAQ,GAAkB,oBAAoB,EAAY,KAAK,GAAG,CAGpG,EAAmB,EADW,CAAC,CAAC,GAAqB,QAEzD,EAAc,kBAAkB,EAAqB,EAAY,KAAK,WAAW,CAAC,CAE9E,EAAU,EAA2C,EAAc,WAAW,EAAM,SAAS,CAAC,CAC9F,EAAa,EACjB,EAAY,MAAM,iBAAmB,GAAiB,WAAW,EAAY,KAAK,WAAW,CAC9F,CAEK,CACJ,yBACA,wBACA,4BACA,qBACE,GAAY,KAAK,CAOrB,SAAS,EAAgB,EAAoB,EAAgC,CACvE,EAAY,YAAY,QAC1B,GAAgB,EAAS,CAAC,EAAgB,gCAAgC,EAAY,EAAY,CAAC,CAGvG,SAAS,GAAoB,EAAY,EAAiD,CACxF,GAAgB,EAAS,CAAC,EAAc,kBAAkB,EAAI,EAAS,CAAC,CAG1E,SAAS,IAA0B,CAC7B,EAAU,MAGd,EAAgB,WAAW,CACzB,WACA,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,SACD,CAAC,CAGJ,SAAS,GAAgB,EAA4B,EAA2B,CAC9E,EAAgB,WACd,EACA,EAAO,KACP,EAAM,WACN,EAAU,KACV,EACA,MACM,EAAU,OAAO,CACvB,EACD,CAGH,SAAS,IAA0B,CACjC,EAAgB,WACd,EACA,EAAO,KACP,EAAM,WACN,EAAU,KACV,MACM,EAAU,OAAO,CACxB,CAGH,SAAS,GAAa,EAAiC,EAAiB,EAA2B,CACjG,IAAM,EAAkB,EAAW,IAAI,IAAM,CAAE,GAAI,EAAE,GAAI,OAAQ,EAAE,OAAQ,EAAE,CAE7E,EAAgB,0BAA0B,CACxC,WACA,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,YAAa,EAAY,KACzB,WAAY,EACZ,UACA,gBAAiB,EAAgB,KACjC,UAAW,GAAe,CACxB,EAAgB,EAAY,KAAK,WAAY,EAAY,CACzD,EAAO,QAAQ,CACb,QAAS,GAAoB,QAC7B,QAAS,EAAU,qBAAsB,CAAE,OAAQ,EAAO,KAAK,KAAM,WAAY,EAAgB,yBAAyB,EAAA,CAAa,CAAC,CACxI,KAAM,GAAU,QACjB,CAAC,EAEJ,YAAe,EAAO,MAAM,EAAU,mBAAoB,CAAE,KAAM,EAAO,KAAK,KAAM,CAAC,CAAC,CACtF,SACD,CAAC,CAGJ,SAAS,EAAuB,EAAqB,EAA4B,CAC/E,EAAgB,2BACd,EACA,EACA,EAAM,WACN,EAAgB,KAChB,GAAe,EAAgB,EAAY,KAAK,WAAY,EAAY,KAClE,CACJ,EAAO,MAAM,EAAU,yBAAyB,CAAC,CACjD,GAAW,GAAS,EAEvB,CAGH,SAAS,GAAmB,EAAuB,EAAqC,CACtF,GAAI,IAAY,UAAW,CACzB,IAAmB,CACnB,OAGF,EACE,EACA,EAAc,cACZ,EAAU,KAAK,GACf,EACA,MACM,EAAO,QAAQ,EAAU,mBAAoB,CAAE,KAAM,EAAO,KAAK,KAAM,CAAC,CAAC,KACzE,EAAO,MAAM,EAAU,iBAAkB,CAAE,KAAM,EAAO,KAAK,KAAM,CAAC,CAAC,CAC5E,CACF,CAGH,SAAS,IAAsC,CAI7C,OAHK,EAGE,CACL,cAAe,UAAU,EAAU,KAAK,QACzC,CAJQ,KAeX,IAAM,EAAa,CAAC,CAAC,EAAY,MAC5B,CAAC,CAAC,EAAO,OACR,CAAC,GAAwB,CAAC,CAAC,EAAU,OACtC,CAAC,CAAC,EAAgB,cAClB,CAAC,CAAC,EAAQ,MACV,CAAC,CAAC,EAAO,MACT,CAAC,GACD,CAAC,CAAC,EAAW,aAElB,OACE,EAAA,EAAA,KAAC,GAAyB,SAA1B,CAAmC,MAAO,aACxC,EAAA,EAAA,KAAC,GAAD,CACE,MAAO,GAAS,EAAM,WAAW,CACjC,WAAY,EAAM,WAClB,mBAAoB,CAAC,EACrB,iBAAmB,GAAc,EAAU,0BAA4B,GACvE,cAAc,oBAEN,CACN,GAAI,CAAC,EACH,OAAO,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CAEd,OAAQ,EAAR,CACE,IAAK,OACH,OACE,EAAA,EAAA,KAAC,GAAD,CACE,UAAW,EAAU,KACrB,mBAAoB,EAAU,WAC9B,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,sBAAuB,EAAW,MAAQ,EAAE,CAC5C,iBAAkB,EAAiB,MAAQ,EAAE,CAC1B,qBACnB,wBAA2B,EAAU,gBAAgB,CACvC,gBACU,yBACxB,wBAA2B,EAAU,aAAa,CAClD,iBAAkB,EAAgB,oBAAoB,EAAM,WAAW,CACvE,cAAe,EAAM,eAAiB,EAAO,KAAK,cAClD,YAAa,EAAO,KAAK,YACzB,qBAAsB,IAAyB,CAC/C,YAAa,EAAY,KACJ,uBACrB,QAAS,EAAQ,KACG,sBACpB,eAAgB,GAAe,EAAM,WAAW,CAChD,mBAAoB,EAAM,mBAC1B,mBAAoB,EAAM,mBAC1B,aAAc,GAAuB,EAAwB,EAAsB,CACnF,0BAA2B,EAAM,0BACjC,oBAAqB,EAAM,oBAC3B,WAAY,EAAM,WAClB,wBAAyB,EAAM,wBAC/B,SAAU,GAAS,EAAM,WAAW,CACpC,WAAY,EAAW,KACI,4BACN,sBACrB,CAAA,CAEN,IAAK,gBACH,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0CACb,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,OAAQ,EAAO,KACf,UAAW,EAAU,KACrB,SAAU,EAAM,SAChB,iBAAkB,EAAgB,oBAAoB,EAAM,WAAW,CACtD,mBACE,qBACnB,kBAAqB,EAAU,OAAO,CACtC,QAAS,EAAQ,KACjB,cAAe,EAAe,EAAe,kBAAkB,CACpC,4BAC3B,CAAA,CACE,CAAA,CAEV,IAAK,aACH,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0CACb,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,QAAS,EAAO,KAAK,QACrB,UAAW,EAAU,KACrB,SAAU,EAAM,SAChB,iBAAkB,EAAgB,oBAAoB,EAAM,WAAW,CACvE,kBAAqB,EAAU,OAAA,CAC/B,CAAA,CACE,CAAA,MAIR,CAAA,CAC0B,CAAA"}
1
+ {"version":3,"file":"DxD2uVzf2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/share/flight-requests/ShareRequests.ts","../../../../libs/shared/src/utils/RecentItemHelper.ts","../../../../libs/shared/src/apps/share/utils/RecentShareHelper.ts","../../../../libs/shared/src/apps/share/components/embed-size/EmbedSize.tsx","../../../../libs/common/src/backbone/interfaces/BaseCollectionIdentifier.ts","../../../../libs/shared/src/apps/playlists/interfaces/identifiers/PlaylistVideoCollectionIdentifier.ts","../../../../libs/shared/src/apps/playlists/utils/PlaylistStateUpdateHelper.ts","../../../../libs/shared/src/utils/ReorderHelper.ts","../../../../libs/shared/src/flight-requests/PlaylistRequests.ts","../../../../libs/shared/src/flight-requests/SeriesRequests.ts","../../../../libs/shared/src/apps/share/views/share/ShareViewHelper.ts","../../../../../node_modules/toggle-selection/index.js","../../../../../node_modules/copy-to-clipboard/index.js","../../../../../node_modules/react-copy-to-clipboard/lib/Component.js","../../../../../node_modules/react-copy-to-clipboard/lib/index.js","../../../../libs/shared/src/components/copy-input/copy-input.module.scss","../../../../libs/shared/src/components/copy-input/CopyInput.tsx","../../../../libs/shared/src/utils/EmbedHelper.ts","../../../../libs/shared/src/apps/share/components/copy-embed-html/copy-embed-html.module.scss","../../../../libs/shared/src/apps/share/components/copy-embed-html/CopyEmbedHtml.tsx","../../../../libs/shared/src/apps/share/views/share/components/copy-embed/CopyEmbed.tsx","../../../../libs/shared/src/images/svg/objects/CodeSvg.tsx","../../../../libs/shared/src/apps/share/components/get-embed-code/GetEmbedCode.tsx","../../../../libs/shared/src/enums/ShareLinkStatus.ts","../../../../libs/shared/src/apps/share/utils/ShareLinkHelper.ts","../../../../libs/shared/src/apps/share/components/share-link-info/ShareLinkInfo.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/avatars/GoogleClassroomAvatar.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/avatars/MicrosoftTeamsAvatar.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/share-integrations.module.scss","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrationsStack.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-as-link/ShareAsLink.tsx","../../../../libs/shared/src/hooks/useScript.ts","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/useGoogleClassrooms.ts","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/useMicrosoftTeamsShare.ts","../../../../libs/shared/src/components/looking-for-integration/LookingForIntegration.tsx","../../../../libs/shared/src/enums/IntegrationId.ts","../../../../libs/shared/src/apps/share/views/share/components/share-integrations/ShareIntegrations.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/RestrictionBadge.tsx","../../../../libs/shared/src/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge.tsx","../../../../libs/shared/src/apps/share/views/share/components/share-message/ShareMessage.tsx","../../../../libs/shared/src/apps/share/views/share/components/main-share/MainShare.tsx","../../../../libs/shared/src/apps/share/utils/LinkExpiryHelper.ts","../../../../libs/shared/src/apps/share/components/link-expiry/LinkExpiry.tsx","../../../../libs/shared/src/apps/share/components/set-password-input/set-password-input.module.scss","../../../../libs/shared/src/apps/share/components/set-password-input/SetPasswordInput.tsx","../../../../libs/shared/src/apps/share/components/link-password/LinkPassword.tsx","../../../../libs/shared/src/apps/share/validation/ShareLinkSettingsValidationSchema.ts","../../../../libs/shared/src/apps/share/views/share/components/share-settings/ShareSettings.tsx","../../../../libs/shared/src/utils/IntegrationHelper.ts","../../../../libs/shared/src/apps/share/views/share/ShareView.tsx"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { CreateDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/CreateDirectShareRequest';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/CreateShareLinkRequest';\nimport { EditDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/EditDirectShareRequest';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { GetSentItemsParams } from 'libs/shared/apps/share/interfaces/requests/GetSentItemsParams';\nimport { CheckShareLinkPasswordResponse } from 'libs/shared/apps/share/interfaces/responses/CheckShareLinkPasswordResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { DirectShare, ShareLink, ShareRecipient, UnionShareObject, UserCollection } from 'libs/shared/interfaces';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share'\n};\n\nconst SharedObjectQueries: {[index: string]: string } = {\n video: 'thumbnail,series,_canBeConsumed,_restrictions',\n clip: '_parentVideo[_rating],_canBeConsumed,_thumbnail,_restrictions',\n interactive: '_canBeConsumed,_parentVideo[_rating],_parentClip,_thumbnail,_restrictions',\n series: 'tallPoster,videos[thumbnail,count()]{limit:1}',\n playlist: 'cover,videos[thumbnail,count()]{limit:1},clips[_thumbnail,count()]{limit:1},interactives[_thumbnail,count()]{limit:1}'\n};\n\nfunction getShareRecipientQuery(ids: string[], customerId: string): HashObject {\n return {\n 'id': ids,\n 'query.user': `yearGroups,avatar,userprofiles{customer.id:${customerId}}`,\n 'query.classroom': `enrolments[count()]{role:student,limit:0},customer{id:${customerId}}`,\n 'query.classroom_group': 'classroom,users[count()]{limit:0}'\n };\n}\n\nexport const ShareRequests = {\n getShareObject(\n shareId: string,\n success?: (obj: UnionShareObject) => void,\n error?: (xhr: Xhr) => void\n ): Flight.Request {\n return {\n /**\n * This is a custom endpoint written into Lite that will use\n * client credentials no matter if the user is signed in or not\n */\n url: `/api/share/find/${shareId}`,\n key: `share:${shareId}`,\n bootstrapName: `share:${shareId}`,\n success,\n error\n };\n },\n\n getShareRecipients(shareId: string): Flight.Request {\n return {\n url: `/api/share/find/${shareId}/recipients`,\n key: `share:${shareId}:recipients`,\n normalize: false\n };\n },\n\n sharedObjectsById(ids: string[]): Flight.Request {\n ids.sort();\n \n const idsQueries = ids.map(id => `id=${id}`);\n const assocQueries = Object.keys(SharedObjectQueries).map(key => `query.${key}=${SharedObjectQueries[key]}`);\n\n return {\n url: `{gateway}/v1/objects?${[ ...idsQueries, ...assocQueries, `permissionFilterOption=${PermissionFilterOption.StripMetadata}` ].join('&')}`,\n key: `objects:${ids.join(',')}`,\n normalize: false\n };\n },\n\n sentShare(params: GetSentItemsParams = {}): Flight.Request {\n const key = Object.values(params).join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/users/me/share/sent-items', params),\n key: `sent:shares:${key}`,\n normalize: false\n };\n },\n\n /**\n * Direct share requests\n */\n getSentDirectShareByObjectId(objectId: string): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/share/direct/sent-items?objectId=${objectId}`,\n key: `direct:share:sent:object:${objectId}`,\n normalizeOptions\n };\n },\n\n createDirectShare(\n data: CreateDirectShareRequest,\n success?: (data: DirectShare) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/share',\n key: 'create:direct:share',\n data,\n type: HttpVerbs.POST,\n normalizeOptions,\n invalidationKeys: [ `direct:share:sent:object:${data.objectId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n updateDirectShareRecipients(\n shareId: string,\n data: EditDirectShareRequest,\n success?: (data: DirectShare) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n const updateStateKey = `direct:share:recipients:${shareId}`;\n\n return {\n url: `{gateway}/v1/share/${shareId}/recipients`,\n key: 'edit:direct:share',\n data,\n type: HttpVerbs.POST,\n normalizeOptions,\n invalidationKeys: 'sent:shares',\n updateState: {\n keys: updateStateKey,\n updateData: (state: HashObject) => {\n /**\n * As getDirectShareRecipientsById caches by shareId\n * and not the objectIds being fetched, if we're removing\n * the last recipient we need to manually set the recipients\n * to an empty array as a re-fetch won't be triggered.\n */\n if (!state[updateStateKey] || data.recipients.length)\n return state;\n\n return {\n ...state,\n [updateStateKey]: []\n };\n }\n },\n success,\n error,\n always\n };\n },\n\n removeDirectShareRecipient(\n shareId: string,\n recipientId: string,\n success?: (data: DirectShare) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n const updateStateKey = `direct:share:recipients:${shareId}`;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/share/${shareId}/recipients`, {\n recipientId\n }),\n key: 'remove:direct:share:recipient',\n type: HttpVerbs.DELETE,\n normalizeOptions,\n invalidationKeys: 'sent:shares',\n updateState: {\n keys: updateStateKey,\n updateData: (state: HashObject) => {\n /**\n * As getDirectShareRecipientsById caches by shareId\n * and not the objectIds being fetched, if we're removing\n * the last recipient we need to manually set the recipients\n * to an empty array as a re-fetch won't be triggered.\n */\n if (!state[updateStateKey])\n return state;\n\n return {\n ...state,\n [updateStateKey]: []\n };\n }\n },\n success,\n error,\n always\n };\n },\n\n /**\n * This request differs from getRecipientsById in that the key doesn't contain\n * the ids being fetched. This is useful because it means that if we need to\n * re-fetch the data because `ids` changes, the data prop will always be set\n * because the key won't change.\n * When using getRecipientsById, the would be a period of time where `data`\n * is `undefined` because it is technically a new request.\n */\n getDirectShareRecipientsById(shareId: string, recipients: ShareRecipient[], customerId: string): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/objects', getShareRecipientQuery(recipients.map(r => r.id), customerId)),\n key: `direct:share:recipients:${shareId}`\n };\n },\n\n getRecipientsById(ids: string[], customerId: string): Flight.Request {\n ids.sort();\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/objects', getShareRecipientQuery(ids, customerId)),\n key: `share:recipients:${ids.join(',')}`\n };\n },\n\n /**\n * Fetch a classroom or classroom group with users\n */\n getRecipientUsers(id: string, success?: (users: UserCollection) => void): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/users?query={limit:100}`,\n key: `share:recipients:${id}:users`,\n success\n };\n },\n\n getObjectsSharedWithUser(cursor?: string): Flight.Request {\n const params: HashObject = { permissionFilterOption: PermissionFilterOption.StripMetadata };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/users/me/share/received-items', params),\n key: `shared:with:me:${cursor}`\n };\n },\n\n /**\n * Share link requests\n */\n getShareLinkByObjectId(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/share/links?objectId=${id}`,\n key: `share:link:object:${id}`,\n normalizeOptions,\n formatData: (resp: HashObject) => {\n /**\n * When removing the linkExpireDate, the cache is invalidated\n * but the normalised state still has the linkExpireDate, so we need\n * to set it to null if it's not present\n */\n return {\n ...resp,\n linkExpireDate: resp.linkExpireDate || null\n };\n }\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest,\n success?: (shareLink: ShareLink) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/share/links',\n key: 'create:share:link',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ `share:link:object:${data.resourceId}`, `privacy:${data.resourceId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n editShareLink(\n shareLink: ShareLink,\n data: EditShareLinkRequest,\n success?: (shareLink: ShareLink) => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/share/links/${shareLink.id}`,\n key: 'edit:share:link',\n data,\n type: HttpVerbs.PUT,\n normalizeOptions,\n invalidationKeys: [ `share:${shareLink.id}`, `share:link:object:${shareLink.objectId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n deleteShareLink(\n shareLink: ShareLink,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/share/links/${shareLink.id}`,\n key: 'delete:share:link',\n type: HttpVerbs.DELETE,\n normalizeOptions,\n invalidationKeys: [ `share:${shareLink.id}`, `share:link:object:${shareLink.objectId}`, 'sent:shares' ],\n success,\n error,\n always\n };\n },\n\n checkPassword(\n id: string,\n password: string,\n success?: (res: CheckShareLinkPasswordResponse) => void,\n error?: (xhr: Xhr) => void\n ): Flight.PublicRequest {\n return {\n url: `{gateway}/v1/share/links/${id}/password/verify`,\n publicUrl: `{gateway}/v1/share/links/${id}/password/verify/public`,\n key: `checkpassword:${id}`,\n type: HttpVerbs.POST,\n data: { password },\n success,\n error\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n\n updatePrivacy(\n id: string,\n privacy: SharePrivacy,\n overrideRestrictions: boolean,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/share/links/${id}/privacy`,\n key: 'update:privacy',\n type: HttpVerbs.PUT,\n data: {\n privacy,\n overrideRestrictions\n },\n invalidationKeys: [ 'privacy', 'sent:shares' ],\n normalize: false,\n success,\n error\n };\n },\n\n createAnonSession(\n shareId: string,\n sessionId: string,\n sessionName: string\n ): Flight.Request {\n return {\n url: `{gateway}/v1/shares/${shareId}/anon-sessions`,\n key: 'create:anon:session',\n type: HttpVerbs.POST,\n data: {\n sessionId,\n sessionName\n },\n normalize: false\n };\n },\n\n getAnonSessions(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v1/shares/${shareId}/anon-sessions`,\n key: `anon:session:${shareId}`,\n normalize: false\n };\n }\n};\n","import { StorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nconst DEFAULT_STORAGE_LIMIT = 5;\n\ninterface AddRecentItemOptions {\n id: string;\n limit?: number;\n expire?: boolean;\n}\n\nexport const RecentItemHelper = {\n getRecentItem(cacheKey: string, dataSource: StorageHelper, expire: boolean = true): string[] {\n let recentItems = expire ? dataSource.cacheGet(cacheKey) : dataSource.get(cacheKey);\n\n if (!Array.isArray(recentItems))\n recentItems = [];\n\n return recentItems;\n },\n\n setRecentItem(cacheKey: string, ids: string[], dataSource: StorageHelper, expire?: boolean): void {\n if (!Array.isArray(ids))\n return;\n\n if (expire) {\n dataSource.cacheSet(cacheKey, ids);\n return;\n }\n\n dataSource.set(cacheKey, ids);\n },\n\n addRecentItem(cacheKey: string, dataSource: StorageHelper, options: AddRecentItemOptions): string[] {\n const { id, limit = DEFAULT_STORAGE_LIMIT, expire = true } = options;\n\n let recentItems = RecentItemHelper.getRecentItem(cacheKey, dataSource, expire);\n\n const idIndex = recentItems.indexOf(id);\n\n /**\n * If the item is already in the stored list, \n * remove it so that it will be inserted at the first position.\n */\n if (idIndex > -1)\n recentItems.splice(idIndex, 1);\n\n recentItems.unshift(id);\n\n if (recentItems.length > limit)\n recentItems = recentItems.slice(0, limit);\n\n RecentItemHelper.setRecentItem(cacheKey, recentItems, dataSource, expire);\n\n return recentItems;\n },\n\n removeRecentItem(cacheKey: string, id: string, dataSource: StorageHelper): void {\n const items = RecentItemHelper.getRecentItem(cacheKey, dataSource);\n const omitted = items.filter(i => i !== id.toString());\n RecentItemHelper.setRecentItem(cacheKey, omitted, dataSource);\n }\n};\n","import { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\n\nimport { RecentItemHelper } from 'libs/shared/utils/RecentItemHelper';\n\nconst getCacheKey = (userId: string) => `recently:shared:to:${userId}`;\n\ninterface AddRecentShareOptions {\n id: string;\n limit?: number;\n}\n\nexport const RecentShareHelper = {\n /**\n * Get a list of ids of recipients recently shared to.\n */\n getRecentlySharedTo(userId: string): string[] {\n return RecentItemHelper.getRecentItem(getCacheKey(userId), LocalStorageHelper);\n },\n \n addRecentlySharedTo(userId: string, options: AddRecentShareOptions): string[] {\n return RecentItemHelper.addRecentItem(getCacheKey(userId), LocalStorageHelper, options);\n }\n};\n","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nconst namespace = 'share.embedSize';\n\ninterface EmbedSizeProps {\n autoplay: boolean;\n setAutoplay: (autoplay: boolean) => void;\n videoSize: EmbedResolution;\n setVideoSize: (videoSize: EmbedResolution) => void;\n videoSizes: EmbedResolution[];\n}\n\nexport function EmbedSize(props: EmbedSizeProps): React.ReactElement {\n const {\n autoplay,\n setAutoplay,\n videoSize,\n setVideoSize,\n videoSizes\n } = props;\n\n return (\n <div className='d-flex align-items-center'>\n {!!videoSizes.length &&\n <>\n <div className='me-1'>\n <Text namespace={namespace} phrase='videoSize' />\n </div>\n <div className='pe-3'>\n <Dropdown>\n <Dropdown.Toggle id='embed-resolution' variant='outline-dark'>\n {videoSize.label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n {videoSizes.map(size => (\n <Dropdown.Item\n key={`${size.width}x${size.height}`}\n onClick={() => setVideoSize(size)}\n >\n {size.label}\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n </div>\n </>\n }\n <div className='me-2'>\n <Text namespace={namespace} phrase='autoplay' />\n </div>\n <Checkbox id='autoplay-checkbox' checked={autoplay} onChange={() => setAutoplay(!autoplay)} />\n </div>\n );\n}\n","import { ObjectHash } from 'backbone';\n\nimport { ErrorHelper } from 'libs/common/backbone/core/BaseError';\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport interface BaseCollectionIdentifierOptions<T> {\n collectionPrefix?: string;\n id?: string;\n sort?: T;\n cursor?: string;\n}\n\nexport class BaseCollectionIdentifier<T = HashObject> {\n public id: string;\n public sort: T;\n public cursor: string;\n public collectionPrefix: string;\n\n constructor(options: BaseCollectionIdentifierOptions<T>) {\n this.setData(options);\n }\n\n protected setData(options: BaseCollectionIdentifierOptions<T>): void {\n const { collectionPrefix, id, sort, cursor } = options;\n\n if (id)\n this.id = id;\n\n if (sort)\n this.sort = sort;\n\n if (cursor)\n this.cursor = cursor;\n\n if (collectionPrefix)\n this.collectionPrefix = collectionPrefix;\n }\n\n public toString(): string {\n const params = [\n this.collectionPrefix,\n this.id,\n this.sort,\n this.cursor\n ];\n\n return params.filter(Boolean).join(':');\n }\n\n public toParams(): ObjectHash {\n const params: ObjectHash = {};\n\n if (this.sort)\n params.sort = this.getSortTypeParam().toLowerCase();\n\n if (this.cursor)\n params.cursor = this.cursor;\n\n return params;\n }\n\n protected getSortTypeParam(): string {\n ErrorHelper.throw(new DevError('getSortTypeParam must be implemented when extending BaseCollectionIdentifier'));\n\n return '';\n }\n}\n","import { BaseCollectionIdentifier } from 'libs/common/backbone/interfaces';\n\nexport class PlaylistVideoCollectionIdentifier extends BaseCollectionIdentifier {\n constructor(id: string, cursor: string = '') {\n super({ collectionPrefix: 'playlist:videos', id, cursor });\n }\n}\n","import { HashObject } from 'libs/common/react/interfaces/HashObject';\n\ntype StateMap = {[key: string]: HashObject };\n\nexport const PlaylistStateUpdateHelper = {\n deletePlaylist(key: string): (state: StateMap) => StateMap {\n return (state: StateMap) => {\n const updatedState = { ...state };\n\n if (updatedState.hasOwnProperty(key))\n delete updatedState[key];\n\n return updatedState;\n };\n },\n\n incrementVideoCount(key: string, count: number): (state: StateMap) => StateMap {\n return (state: StateMap) => {\n const updatedState = { ...state };\n\n if (!updatedState.hasOwnProperty(key))\n return state;\n\n if (!updatedState[key].videos)\n updatedState[key].videos = {};\n\n updatedState[key].videos.count = updatedState[key].videos.count ?\n updatedState[key].videos.count + count :\n count;\n\n return updatedState;\n };\n }\n};\n","import { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { BaseObject, ReorderRequest } from 'libs/shared/interfaces';\n\ninterface ReorderResult<T extends BaseObject> {\n reorderRequest: ReorderRequest;\n reorderedItems: T[];\n}\n\nexport const ReorderHelper = {\n reorder<T extends BaseObject>(items: T[], oldIdx: number, newIdx: number): ReorderResult<T> {\n if (oldIdx === newIdx)\n return { reorderedItems: items, reorderRequest: null };\n\n const reorderedItems: T[] = ArrayHelper.moveItem(items, oldIdx, newIdx);\n\n /**\n * If newIdx is the last idx then we set\n * destinationMemberId to null.\n */\n const destinationMemberId = newIdx < items.length - 1 ?\n reorderedItems[newIdx + 1].id :\n null;\n\n const reorderRequest: ReorderRequest = {\n sourceMemberId: reorderedItems[newIdx].id,\n destinationMemberId\n };\n\n return { reorderedItems, reorderRequest };\n },\n\n updateState(\n dataPrefix: string,\n reorderRequest: ReorderRequest,\n data: {[key: string]: HashObject }\n ): {[key: string]: HashObject } {\n const items: BaseObject[] = [];\n const updatedData = ObjectHelper.deepClone(data);\n\n const keys = [dataPrefix]; // Maintain an ordered list of keys.\n let page = data[dataPrefix];\n const pageSize = !!page && !!page.data && page.data.length;\n\n /**\n * Flatten items\n */\n while (page) {\n if (!Array.isArray(page.data))\n break;\n\n items.push(...page.data as BaseObject[]);\n\n const nextCursor = page.pagination\n && page.pagination.cursors\n && page.pagination.cursors.next;\n\n const nextKey = !!nextCursor && `${dataPrefix}:${nextCursor}`;\n\n page = nextCursor && data[nextKey];\n\n if (page)\n keys.push(nextKey);\n }\n\n if (!items.length)\n return data;\n\n /**\n * Reorder items\n */\n const removeIdx = ArrayHelper.findIndex(items, i => i.id === reorderRequest.sourceMemberId);\n\n let reorderedItems = [...items];\n\n const itemToMove = reorderedItems.splice(removeIdx, 1);\n\n const insertIdx = reorderRequest.destinationMemberId ?\n ArrayHelper.findIndex(reorderedItems, r => r.id === reorderRequest.destinationMemberId) :\n reorderedItems.length;\n\n reorderedItems.splice(insertIdx, 0, itemToMove[0]);\n\n reorderedItems = reorderedItems.map(v => ({ id: v.id }));\n\n /**\n * Paginate reordered items\n */\n keys.forEach(key => {\n const itemsToInsert = reorderedItems.splice(0, pageSize);\n updatedData[key].data = itemsToInsert;\n });\n\n return updatedData;\n }\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { CreateOrUpdatePlaylistRequest, PlaylistCollectionIdentifier, PlaylistVideoCollectionIdentifier } from 'libs/shared/apps/playlists/interfaces';\nimport { PlaylistStateUpdateHelper } from 'libs/shared/apps/playlists/utils/PlaylistStateUpdateHelper';\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { Following, ReorderRequest, UserCollection, VideoTypes } from 'libs/shared/interfaces';\nimport { ObjectApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\nimport { ReorderHelper } from 'libs/shared/utils/ReorderHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nexport const PlaylistRequests = {\n // TODO: Get working with objects api (playlist count needs to include clips and ints too)\n getUserPlaylists(collectionIdentifier: PlaylistCollectionIdentifier): Flight.Request {\n const { sort, type } = collectionIdentifier;\n\n const params: HashObject = {\n sort: sort,\n PermissionFilterOption: 'stripMetadata',\n query: `{limit:100}${SharedWithStatements.PLAYLIST_COLLECTION},_isClickViewCurated,_liteOwner`\n };\n\n if (collectionIdentifier.cursor)\n params.cursor = collectionIdentifier.cursor;\n\n return {\n url: UrlHelper.urlBuilder(`/api/domain/v2/me/playlists/${type}`, params),\n key: collectionIdentifier.toString()\n };\n },\n\n getPlaylist(id: string, success?: (data: any) => void, error?: (data: any) => void): Flight.PublicRequest {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated,_liteOwner`\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated`\n }),\n key: `playlist:${id}`,\n success,\n error\n };\n },\n\n getSharedPlaylist(\n id: string,\n shareId: string,\n success?: (data: any) => void,\n error?: (data: any) => void\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated,_liteOwner`,\n shareId\n }),\n key: `shared:playlist:${id}:${shareId}`,\n success,\n error\n };\n },\n\n playlistWithThumbnailAndCount(id: string): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `${SharedWithStatements.PLAYLIST},_isClickViewCurated,_liteOwner,videos[count()]{limit:1},interactives[count()]{limit:1},clips[count()]{limit:1}`\n }),\n key: `playlist:${id}:thumbnail:count`\n };\n },\n\n getPlaylistVideos(id: string, cursor?: string): Flight.PublicRequest {\n const { VIDEO_COLLECTION, CLIP_COLLECTION, INTERACTIVE } = SharedWithStatements;\n\n const params: HashObject = {\n query: `(videos[${VIDEO_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|clips[${CLIP_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|interactives[${INTERACTIVE}]){orderBy:orderindex,limit:100}`,\n permissionFilterOption: PermissionFilterOption.StripMetadata\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}/members`, params),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}/members`, params),\n key: `playlist:${id}:videos${cursor ? `:${cursor}` : ''}`\n };\n },\n\n getSharedPlaylistVideos(id: string, shareId: string, cursor?: string): Flight.Request {\n const { VIDEO_COLLECTION, CLIP_COLLECTION, INTERACTIVE } = SharedWithStatements;\n\n const params: HashObject = {\n query: `(videos[${VIDEO_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|clips[${CLIP_COLLECTION}]{status:[${CurationStatus.Published},${CurationStatus.Archived}]}|interactives[${INTERACTIVE}]){orderBy:orderindex,limit:100}`,\n permissionFilterOption: PermissionFilterOption.StripMetadata,\n shareId\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}/members`, params),\n key: `shared:playlist:${id}:${shareId}:videos:${cursor}`\n };\n },\n\n getPlaylistVideosCount(id: string): Flight.PublicRequest {\n const filter = `{limit:0,status:[${CurationStatus.Published},${CurationStatus.Archived}]}`;\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, {\n query: `videos[count()]${filter},clips[count()]${filter},interactives[count()]${filter}`\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `videos[count()]${filter},clips[count()]${filter},interactives[count()]${filter}`\n }),\n key: `playlist:count:${id}`,\n normalize: false\n };\n },\n\n getSharedPlaylistVideosCount(\n id: string,\n shareId: string\n ): Flight.Request {\n const filter = `{limit:0,status:[${CurationStatus.Published},${CurationStatus.Archived}]}`;\n return {\n url: UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: `videos[count()]${filter},clips[count()]${filter},interactives[count()]${filter}`,\n shareId\n }),\n key: `shared:playlist:count:${id}:${shareId}`,\n normalize: false\n };\n },\n\n getVideoPlaylists(videoId: string, userId: string, cursor?: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${videoId}/playlists?query={limit:100,owner.id:[${userId}]}`,\n key: `video:playlists:${videoId}${cursor ? ':cursor' : ''}`\n };\n },\n\n createPlaylist(\n userId: string,\n data: CreateOrUpdatePlaylistRequest,\n success?: (data: any) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'create:playlist',\n url: `{gateway}/v1/objects/${userId}/playlists`,\n data,\n type: HttpVerbs.POST,\n success,\n error,\n always,\n invalidationKeys: 'user:playlists'\n };\n },\n\n updatePlaylist(\n id: string,\n data: CreateOrUpdatePlaylistRequest,\n success?: (data: any) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'update:playlist',\n url: `{gateway}/v1/objects/${id}`,\n data,\n type: HttpVerbs.PUT,\n success,\n error,\n always\n };\n },\n\n deletePlaylist(\n id: string,\n success?: (data: any) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n key: 'delete:playlist',\n url: `{gateway}/v1/objects/${id}`,\n type: HttpVerbs.DELETE,\n success,\n error,\n always,\n invalidationKeys: 'user:playlists',\n updateState: {\n keys: `playlist:${id}`,\n updateData: PlaylistStateUpdateHelper.deletePlaylist(`playlist:${id}`)\n }\n };\n },\n\n copyPlaylist(\n id: string,\n success?: (data: any) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/playlists/copy',\n key: 'copy:playlist',\n data: { playlistId: id },\n type: HttpVerbs.POST,\n invalidationKeys: 'user:playlists',\n success,\n error,\n always\n };\n },\n\n addToPlaylist(\n playlistId: string,\n videos: VideoTypes[],\n success?: (data: any) => void,\n error?: (data: ObjectApiXhr) => void\n ): Flight.Request {\n /**\n * Invalidate:\n * - Playlists as they are fetched with first video.\n * - Playlist video collection.\n * - Playlists for each video.\n */\n const invalidationKeys = [\n 'user:playlists',\n (new PlaylistVideoCollectionIdentifier(playlistId)).toString(),\n `playlist:${playlistId}:videos`\n ];\n\n videos.forEach(video => {\n invalidationKeys.push(`video:playlists:${video.id}`);\n });\n\n const body = videos.reduce((acc: HashObject, video: VideoTypes) => {\n if (VideoHelper.isClip(video)) {\n if (Array.isArray(acc.clips))\n acc.clips.push({ id: video.id });\n else\n acc.clips = [{ id: video.id }];\n }\n\n if (VideoHelper.isInteractive(video)) {\n if (Array.isArray(acc.interactives))\n acc.interactives.push({ id: video.id });\n else\n acc.interactives = [{ id: video.id }];\n }\n\n if (VideoHelper.isVideo(video)) {\n if (Array.isArray(acc.videos))\n acc.videos.push({ id: video.id });\n else\n acc.videos = [{ id: video.id }];\n }\n\n return acc;\n }, {});\n\n return {\n key: `add:to:playlist:${playlistId}:${videos.map(v => v.id).join(':')}`,\n url: `{gateway}/v1/objects/${playlistId}`,\n data: body,\n type: HttpVerbs.PUT,\n success,\n error,\n invalidationKeys,\n updateState: {\n keys: `playlist:${playlistId}`,\n updateData: PlaylistStateUpdateHelper.incrementVideoCount(`playlist:${playlistId}`, videos.length)\n },\n normalize: false\n };\n },\n\n removePlaylistVideo(\n playlistId: string,\n videoId: string,\n typeId: MasterType,\n success?: (data: any) => void,\n error?: (data: any) => void\n ): Flight.Request {\n let baseUrl = `{gateway}/v1/objects/${playlistId}`;\n\n if (typeId === MasterType.Clip)\n baseUrl += '/clips';\n else if (typeId === MasterType.Interactive)\n baseUrl += '/interactives';\n else\n baseUrl += '/videos';\n\n return {\n key: 'remove:playlist:video',\n url: UrlHelper.urlBuilder(baseUrl, { memberId: videoId }),\n type: HttpVerbs.DELETE,\n success,\n error,\n // Invalidate playlists as they are fetched with the first video.\n invalidationKeys: [\n 'user:playlists',\n `playlist:${playlistId}:videos`,\n `video:playlists:${videoId}`,\n `playlist:${playlistId}`\n ]\n };\n },\n\n getIsFollowingPlaylist(playlistId: string, userId: string): Flight.Request {\n const formatData: ((data: UserCollection) => Following) = (data: UserCollection) => (\n { objectId: playlistId, isFollowing: !!data?.data?.length }\n );\n\n return {\n url: `{gateway}/v1/objects/${userId}/followedPlaylists?query={id:${playlistId}}`,\n key: `playlist:${playlistId}:following:${userId}`,\n formatData,\n normalize: false\n };\n },\n\n followPlaylist(\n playlistId: string,\n userId: string,\n success?: (data: any) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${userId}`,\n key: `follow:playlist:${playlistId}`,\n data: { followedPlaylists: playlistId },\n type: HttpVerbs.PUT,\n invalidationKeys: [ 'user:playlists', `playlist:${playlistId}`, 'shared:playlist' ],\n success,\n error,\n always\n };\n },\n\n unfollowPlaylist(\n playlistId: string,\n userId: string,\n success?: (data: any) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${userId}/followedPlaylists?memberId=${playlistId}`,\n key: `unfollow:playlist:${playlistId}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [ 'user:playlists', `playlist:${playlistId}`, 'shared:playlist' ],\n success,\n error,\n always\n };\n },\n\n // TODO: Use objects api and get working with clips + ints\n reorderVideos(\n id: string,\n reorderRequest: ReorderRequest,\n success?: (data: any) => void,\n error?: (data: any) => void\n ): Flight.Request {\n return {\n key: `reorder:playlist`,\n url: `{gateway}/v1/playlists/${id}/reorder`,\n data: reorderRequest,\n type: HttpVerbs.PUT,\n success,\n error,\n // Invalidate playlists as they are fetched with the first video.\n invalidationKeys: 'user:playlists',\n updateState: {\n keys: `playlist:${id}:videos`,\n updateData: (data: {[key: string]: HashObject }) =>\n ReorderHelper.updateState(`playlist:${id}:videos`, reorderRequest, data)\n }\n };\n },\n\n getVideoCandidate(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}?query=_restrictions`,\n key: `add:to:playlist:candidate:${id}`\n };\n }\n};\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { PublicWithStatement, SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { VideoSortType } from 'libs/shared/enums/VideoSortType';\nimport { VideoSortHelper } from 'libs/shared/utils/VideoSortHelper';\n\nconst endpoints = {\n sharedSeries: (id: string, shareId: string) => UrlHelper.urlBuilder(`/api/objects/${id}`, {\n query: SharedWithStatements.SERIES,\n shareId\n }),\n seriesWithVideos: (id: string, videoCount: number = 3) => {\n return `{gateway}/v1/objects/${id}?query=banner,videos[season,thumbnail,_canBeConsumed]{limit:${videoCount}}`;\n }\n};\n\nexport const SeriesRequests = {\n series(id: string): Flight.PublicRequest {\n const queryStringObj = { query: SharedWithStatements.SERIES };\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/${id}`, queryStringObj),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/${id}`, queryStringObj),\n key: `series:${id}`\n };\n },\n sharedSeries(id: string, shareId: string): Flight.Request {\n return {\n url: endpoints.sharedSeries(id, shareId),\n key: `shared:series:${id}:${shareId}`\n };\n },\n seriesWithVideos(id: string, videoCount: number = 3): Flight.Request {\n return {\n url: endpoints.seriesWithVideos(id, videoCount),\n key: `series:${id}:with:videos:${videoCount}`\n };\n },\n seriesWithThumbnailAndCount(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}?query=videos[season,thumbnail,_canBeConsumed,count()]{limit:1}`,\n key: `series:${id}:thumbnail:count`\n };\n },\n seriesVideos(id: string, userId?: string, sort?: VideoSortType, cursor?: string): Flight.PublicRequest {\n const sortFilter = VideoSortHelper.getVideoSortParam(sort);\n\n const key = [ 'series', id, 'videos', cursor, sort ].filter(k => !!k).join(':');\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/collections/${id}/videos`, {\n query: `{${sortFilter}}${SharedWithStatements.VIDEO_COLLECTION}`,\n cursor\n }),\n publicUrl: UrlHelper.urlBuilder(`/api/objects/collections/${id}/videos`, {\n query: `{${sortFilter}}${PublicWithStatement.VIDEO_COLLECTION}`,\n cursor\n }),\n key\n };\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport {\n AnalyticsOptions, EntityType, EventVersion, LocationContext, ShareDescriptors, UserAction, WorkflowPhase\n} from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { CreateDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/CreateDirectShareRequest';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/CreateShareLinkRequest';\nimport { EditDirectShareRequest } from 'libs/shared/apps/share/interfaces/requests/EditDirectShareRequest';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { RecentShareHelper } from 'libs/shared/apps/share/utils/RecentShareHelper';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { SeriesRequests } from 'libs/shared/flight-requests/SeriesRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { Alerts } from 'libs/shared/hooks/UseAlerts';\nimport { BaseObject, Classification, Classroom, ClassroomGroup, Clip, CurrentUser, DirectShare, InteractiveMetadata, Playlist, Series, ShareLink, ShareRecipient, Subject, User, Video } from 'libs/shared/interfaces';\n\nexport type SharableEntityType = 'video' | 'playlist' | 'subject' | 'series' | 'interactive' | 'clip';\nexport type SharableEntity = Video | Playlist | Subject | Series | InteractiveMetadata | Clip;\nexport type SharableRecipient = User | Classroom | ClassroomGroup;\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const ShareViewHelper = {\n getObjectTypeId(type: SharableEntityType): MasterType {\n switch (type) {\n case 'video':\n return MasterType.Video;\n\n case 'playlist':\n return MasterType.Playlist;\n\n case 'subject':\n return MasterType.Subject;\n\n case 'series':\n return MasterType.Series;\n\n case 'interactive':\n return MasterType.Interactive;\n\n case 'clip':\n return MasterType.Clip;\n }\n },\n\n createLink(options: {\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n alerts: Alerts,\n password?: string,\n linkExpireDate?: string,\n success?: (shareLink: ShareLink) => void\n }): void {\n const success = (newShareLink: ShareLink) => {\n AnalyticsHelper.logUserAction(\n { ...newShareLink, objectName: options.entity.name },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(options.entityType), {\n actionType: UserAction.Create,\n entity: EntityType.ShareLink,\n eventVersion: EventVersion.V3\n })\n );\n\n if (options.success)\n options.success(newShareLink);\n };\n\n const error = () => {\n options.alerts.error(getPhrase('createLinkError', { name: options.entity.name }));\n };\n\n const data: CreateShareLinkRequest = {\n resourceId: options.entity.id,\n overrideRestrictions: false\n };\n\n if (options.password)\n data.password = options.password;\n\n if (options.linkExpireDate)\n data.linkExpireDate = options.linkExpireDate;\n\n Flight.fetch(options.dispatch, ShareRequests.createShareLink(data, success, error));\n },\n\n updateLink(\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n shareLink: ShareLink,\n data: EditShareLinkRequest,\n alerts: Alerts,\n onSuccess?: (data?: ShareLink) => void,\n onError?: () => void\n ): void {\n const success = (updatedShareLink: ShareLink) => {\n AnalyticsHelper.logUserAction(\n { ...updatedShareLink, objectName: entity.name },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Edit,\n entity: EntityType.ShareLink,\n eventVersion: EventVersion.V3\n })\n );\n\n if (onSuccess)\n onSuccess(updatedShareLink);\n\n alerts.success(getPhrase('editSuccess', { name: entity.name, escapeText: true }));\n };\n\n const error = () => {\n if (onError)\n onError();\n\n alerts.error(getPhrase('editError', { name: entity.name, escapeText: true }));\n };\n\n Flight.fetch(dispatch, ShareRequests.editShareLink(shareLink, data, success, error));\n },\n\n deleteLink(\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n shareLink: ShareLink,\n alerts: Alerts,\n onSuccess?: () => void,\n onDone?: () => void\n ): void {\n const success = () => {\n AnalyticsHelper.logUserAction(\n { ...shareLink, objectName: entity.name },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Delete,\n entity: EntityType.ShareLink\n })\n );\n\n if (onSuccess)\n onSuccess();\n\n alerts.success(getPhrase('deleteSuccess', { name: entity.name, escapeText: true }));\n };\n\n const error = () => {\n alerts.error(getPhrase('deleteError', { name: entity.name, escapeText: true }));\n };\n\n const always = () => {\n if (onDone)\n onDone();\n };\n\n Flight.fetch(dispatch, ShareRequests.deleteShareLink(shareLink, success, error, always));\n },\n\n createOrUpdateDirectShare(options: {\n dispatch: Flight.Dispatch,\n entity: SharableEntity,\n entityType: SharableEntityType,\n currentUser: CurrentUser,\n recipients: ShareRecipient[],\n sentDirectShare?: DirectShare,\n message: string,\n onSuccess?: (updatedDirectShare: DirectShare) => void,\n onError?: () => void,\n onDone?: () => void\n }): void {\n const {\n dispatch, entity, entityType, currentUser, recipients, sentDirectShare, message,\n onSuccess, onError, onDone\n } = options;\n\n const success = (updatedDirectShare: DirectShare) => {\n if (onSuccess)\n onSuccess(updatedDirectShare);\n\n AnalyticsHelper.logUserAction(\n {\n id: entity.id,\n name: entity.name,\n shareCount: recipients.length\n },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.DirectShare,\n eventVersion: EventVersion.V3\n })\n );\n\n recipients.map(recipient => {\n RecentShareHelper.addRecentlySharedTo(currentUser.id, { id: recipient.id });\n });\n };\n\n const createData: CreateDirectShareRequest = {\n objectId: entity.id,\n objectTypeId: ShareViewHelper.getObjectTypeId(entityType),\n recipients,\n message\n };\n\n const updateData: EditDirectShareRequest = {\n recipients,\n message\n };\n\n const request = sentDirectShare ?\n ShareRequests.updateDirectShareRecipients(sentDirectShare.id, updateData, success, onError, onDone) :\n ShareRequests.createDirectShare(createData, success, onError, onDone);\n\n Flight.fetch(dispatch, request);\n },\n\n removeDirectShareRecipient(\n dispatch: Flight.Dispatch,\n recipientId: string,\n entityType: SharableEntityType,\n sentDirectShare?: DirectShare,\n onSuccess?: (updatedDirectShare: DirectShare) => void,\n onError?: () => void\n ): void {\n const success = (updatedDirectShare: DirectShare) => {\n if (onSuccess)\n onSuccess(updatedDirectShare);\n\n AnalyticsHelper.logUserAction(\n { shareCount: 1 },\n AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(entityType), {\n actionType: UserAction.Unshare\n })\n );\n };\n\n Flight.fetch(\n dispatch,\n ShareRequests.removeDirectShareRecipient(\n sentDirectShare.id,\n recipientId,\n success,\n onError\n )\n );\n },\n\n getDirectShareRecipientsRequest(customerId: string, directShare?: DirectShare): Flight.Request {\n const hasRecipients = !!directShare?.recipients?.length;\n\n return hasRecipients &&\n ShareRequests.getDirectShareRecipientsById(directShare.id, directShare.recipients, customerId);\n },\n\n getAnalyticsEntity(entityType: string): EntityType {\n switch (entityType) {\n case 'playlist':\n return EntityType.Playlist;\n case 'subject':\n return EntityType.Classification;\n case 'video':\n return EntityType.Video;\n case 'series':\n return EntityType.Series;\n case 'interactive':\n return EntityType.Interactive;\n case 'clip':\n return EntityType.Clip;\n }\n },\n\n getAnalyticsOptions(entityType: SharableEntityType): AnalyticsOptions {\n return {\n entity: ShareViewHelper.getAnalyticsEntity(entityType),\n location: LocationContext.Popup,\n workflowPhase: WorkflowPhase.Complete\n };\n },\n\n getFetchFunctionByType: (type: SharableEntityType) => {\n switch (type) {\n case 'video': {\n return (id: string) => Flight.useBasicFetch<Video>(VideoRequests.video(id));\n }\n\n case 'playlist': {\n return (id: string) => Flight.useBasicFetch<Playlist>(PlaylistRequests.getPlaylist(id));\n }\n\n case 'subject': {\n return (id: string, userId: string) => {\n return Flight.useBasicFetch<Classification>(ClassificationRequests.classification(id, userId));\n };\n }\n\n case 'series': {\n return (id: string) => Flight.useBasicFetch<Series>(SeriesRequests.series(id));\n }\n\n case 'interactive': {\n return (id: string) =>\n Flight.useBasicFetch<InteractiveMetadata>(InteractiveRequests.interactiveMetadata(id));\n }\n\n case 'clip': {\n return (id: string) =>\n Flight.useBasicFetch<Clip>(ClipRequests.clip(id));\n }\n }\n },\n\n getImageUrl(sharedResource: SharableEntity): string {\n // Videos and potentially interactives + clips\n if ('thumbnail' in sharedResource && !!sharedResource.thumbnail)\n return sharedResource.thumbnail?.url;\n\n if ('_thumbnail' in sharedResource && !!sharedResource._thumbnail)\n return sharedResource._thumbnail?.url;\n\n // Topics and playlists\n if ('cover' in sharedResource)\n return sharedResource.cover?.url;\n\n // Series\n if ('tallPoster' in sharedResource)\n return sharedResource.tallPoster?.url;\n\n return '';\n },\n\n getShareRecipientsPhrase(selections: BaseObject[]) {\n if (!selections.length)\n return;\n\n let recipients: {[type: string]: BaseObject[] } = {};\n\n if (selections.length === 1) {\n return ArrayHelper.first(selections).name;\n }\n \n selections.forEach(s => {\n let paramKey;\n \n switch (s.typeId) {\n case MasterType.User:\n paramKey = 'users';\n break;\n \n case MasterType.Classroom:\n paramKey = 'classrooms';\n break;\n \n case MasterType.ClassroomGroup:\n paramKey = 'classroomGroups';\n break;\n }\n\n const recipientType = recipients[paramKey] ?? [];\n\n recipientType.push(s);\n\n recipients = {\n ...recipients,\n [paramKey]: ArrayHelper.uniq(recipientType)\n };\n });\n\n const onlyClassroomsSelected = recipients.classrooms &&\n !recipients.classroomGroups &&\n !recipients.users;\n const onlyGroupsSelected = recipients.classroomGroups &&\n !recipients.classrooms &&\n !recipients.users;\n const onlyUsersSelected = recipients.users &&\n !recipients.classrooms &&\n !recipients.classroomGroups;\n \n if (onlyClassroomsSelected)\n return getPhrase('classrooms', { smartCount: recipients.classrooms.length });\n \n if (onlyGroupsSelected)\n return getPhrase('groups', { smartCount: recipients.classroomGroups.length });\n \n if (onlyUsersSelected)\n return getPhrase('users', { smartCount: recipients.users.length });\n \n const mixedSelections = [];\n \n if (recipients.classrooms?.length)\n mixedSelections.push(getPhrase('classrooms', { smartCount: recipients.classrooms.length }));\n \n if (recipients.classroomGroups?.length)\n mixedSelections.push(getPhrase('groups', { smartCount: recipients.classroomGroups.length }));\n \n if (recipients.users?.length)\n mixedSelections.push(getPhrase('users', { smartCount: recipients.users.length }));\n \n const lastSelection = mixedSelections.pop();\n \n return `${mixedSelections.join(', ')} ${getPhrase('and')} ${lastSelection}`;\n }\n};\n","\nmodule.exports = function () {\n var selection = document.getSelection();\n if (!selection.rangeCount) {\n return function () {};\n }\n var active = document.activeElement;\n\n var ranges = [];\n for (var i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return function () {\n selection.type === 'Caret' &&\n selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(function(range) {\n selection.addRange(range);\n });\n }\n\n active &&\n active.focus();\n };\n};\n","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n \"text/plain\": \"Text\",\n \"text/html\": \"Url\",\n \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n var debug,\n message,\n reselectPrevious,\n range,\n selection,\n mark,\n success = false;\n if (!options) {\n options = {};\n }\n debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement(\"span\");\n mark.textContent = text;\n // avoid screen readers from reading out loud the text\n mark.ariaHidden = \"true\"\n // reset user styles for span element\n mark.style.all = \"unset\";\n // prevents scrolling to the end of the page\n mark.style.position = \"fixed\";\n mark.style.top = 0;\n mark.style.clip = \"rect(0, 0, 0, 0)\";\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = \"pre\";\n // do not inherit user-select (it may be `none`)\n mark.style.webkitUserSelect = \"text\";\n mark.style.MozUserSelect = \"text\";\n mark.style.msUserSelect = \"text\";\n mark.style.userSelect = \"text\";\n mark.addEventListener(\"copy\", function(e) {\n e.stopPropagation();\n if (options.format) {\n e.preventDefault();\n if (typeof e.clipboardData === \"undefined\") { // IE 11\n debug && console.warn(\"unable to use e.clipboardData\");\n debug && console.warn(\"trying IE specific stuff\");\n window.clipboardData.clearData();\n var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n window.clipboardData.setData(format, text);\n } else { // all other browsers\n e.clipboardData.clearData();\n e.clipboardData.setData(options.format, text);\n }\n }\n if (options.onCopy) {\n e.preventDefault();\n options.onCopy(e.clipboardData);\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection.addRange(range);\n\n var successful = document.execCommand(\"copy\");\n if (!successful) {\n throw new Error(\"copy command was unsuccessful\");\n }\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using execCommand: \", err);\n debug && console.warn(\"trying IE specific stuff\");\n try {\n window.clipboardData.setData(options.format || \"text\", text);\n options.onCopy && options.onCopy(window.clipboardData);\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using clipboardData: \", err);\n debug && console.error(\"falling back to prompt\");\n message = format(\"message\" in options ? options.message : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (typeof selection.removeRange == \"function\") {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious();\n }\n\n return success;\n}\n\nmodule.exports = copy;\n","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.CopyToClipboard = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _copyToClipboard = _interopRequireDefault(require(\"copy-to-clipboard\"));\n\nvar _excluded = [\"text\", \"onCopy\", \"options\", \"children\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar CopyToClipboard = /*#__PURE__*/function (_React$PureComponent) {\n _inherits(CopyToClipboard, _React$PureComponent);\n\n var _super = _createSuper(CopyToClipboard);\n\n function CopyToClipboard() {\n var _this;\n\n _classCallCheck(this, CopyToClipboard);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n _defineProperty(_assertThisInitialized(_this), \"onClick\", function (event) {\n var _this$props = _this.props,\n text = _this$props.text,\n onCopy = _this$props.onCopy,\n children = _this$props.children,\n options = _this$props.options;\n\n var elem = _react[\"default\"].Children.only(children);\n\n var result = (0, _copyToClipboard[\"default\"])(text, options);\n\n if (onCopy) {\n onCopy(text, result);\n } // Bypass onClick if it was present\n\n\n if (elem && elem.props && typeof elem.props.onClick === 'function') {\n elem.props.onClick(event);\n }\n });\n\n return _this;\n }\n\n _createClass(CopyToClipboard, [{\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n _text = _this$props2.text,\n _onCopy = _this$props2.onCopy,\n _options = _this$props2.options,\n children = _this$props2.children,\n props = _objectWithoutProperties(_this$props2, _excluded);\n\n var elem = _react[\"default\"].Children.only(children);\n\n return /*#__PURE__*/_react[\"default\"].cloneElement(elem, _objectSpread(_objectSpread({}, props), {}, {\n onClick: this.onClick\n }));\n }\n }]);\n\n return CopyToClipboard;\n}(_react[\"default\"].PureComponent);\n\nexports.CopyToClipboard = CopyToClipboard;\n\n_defineProperty(CopyToClipboard, \"defaultProps\", {\n onCopy: undefined,\n options: undefined\n});","\"use strict\";\n\nvar _require = require('./Component'),\n CopyToClipboard = _require.CopyToClipboard;\n\nCopyToClipboard.CopyToClipboard = CopyToClipboard;\nmodule.exports = CopyToClipboard;",":local {\n .normal[readonly] {\n background-color: unset;\n }\n\n .copyBtn {\n transition: all 0.3s;\n }\n\n .embedHtmlInput[readonly] {\n background-color: unset;\n }\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { CopySvg } from 'libs/shared/images/svg/actions/CopySvg';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\n\nimport { IconButton } from '../icon-button/IconButton';\n\nimport styles from './copy-input.module.scss';\n\nconst namespace = 'shared.copyInput';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CopyInputProps {\n value: string;\n label?: string;\n // Greyed means the input will be greyed out. Normal means it will appear like a normal input\n styling?: 'greyed' | 'normal' | 'normal-v2';\n onCopy?: () => void;\n copyText?: string;\n copiedText?: string;\n showCopiedText?: boolean;\n extraButtonClassNames?: string;\n textarea?: boolean;\n hasInputBg?: boolean;\n rows?: number;\n textAreaClassName?: string;\n}\n\nCopyInput.defaultProps = {\n styling: 'normal'\n};\n\nexport function CopyInput(props: CopyInputProps): JSX.Element {\n const [ localShowCopiedText, setLocalShowCopiedText ] = React.useState(props.showCopiedText || false);\n\n function revertLocalShowCopiedText() {\n setTimeout(() => setLocalShowCopiedText(false), 2000);\n }\n\n function onCopy(): void {\n if (props.onCopy)\n props.onCopy();\n\n if (localShowCopiedText)\n return;\n\n setLocalShowCopiedText(true);\n revertLocalShowCopiedText();\n }\n\n React.useEffect(() => {\n if (!props.showCopiedText)\n return;\n \n revertLocalShowCopiedText();\n }, [props.showCopiedText]);\n\n function Button() {\n if (props.styling === 'normal-v2') {\n return (\n <CopyToClipboard text={props.value} onCopy={onCopy}>\n <IconButton\n role={localShowCopiedText ? 'status' : ''}\n svg={localShowCopiedText ? CheckSvg : CopySvg}\n className={classNames(\n styles.copyBtn,\n 'btn py-0 text-nowrap',\n localShowCopiedText ? 'btn-success text-white' : 'btn-outline-dark border-secondary',\n props.extraButtonClassNames\n )}\n >\n {localShowCopiedText ?\n props.copiedText || getPhrase('copiedLink') :\n props.copyText || getPhrase('copy')\n }\n </IconButton>\n </CopyToClipboard>\n );\n }\n\n return (\n <CopyToClipboard text={props.value} onCopy={onCopy}>\n <button\n role={localShowCopiedText ? 'status' : ''}\n className={classNames(\n 'btn btn-outline-dark border border-secondary py-0 text-nowrap',\n props.extraButtonClassNames\n )}\n >\n {localShowCopiedText ?\n props.copiedText || getPhrase('copied') :\n props.copyText || getPhrase('copy')\n }\n </button>\n </CopyToClipboard>\n );\n }\n\n const input = (\n <div className={props.styling === 'normal-v2' ? 'd-flex flex-row gap-2 position-relative w-100' : 'input-group'}>\n {props.textarea ?\n <textarea\n className={classNames('form-control rounded w-100 h-100', !props.hasInputBg && styles.embedHtmlInput, props.textAreaClassName)}\n spellCheck={false}\n value={props.value}\n rows={props.rows || 7}\n readOnly\n /> :\n <input\n type='text'\n autoComplete='off'\n className={classNames(\n 'form-control',\n props.styling === 'normal' && props.styling\n )}\n spellCheck={false}\n value={props.value}\n readOnly\n />\n }\n \n <Button />\n </div>\n );\n\n if (props.label) {\n return (\n <Form.Group className='form-group'>\n <Form.Label>{props.label}</Form.Label>\n {input}\n </Form.Group>\n );\n }\n\n return input;\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nconst namespace = 'shared.shared-utils';\n\nexport interface EmbedResolution {\n width: '100%' | '640' | '1014' | '1280';\n height: '100%' | '360' | '576' | '720';\n label: string;\n}\n\nexport const EmbedHelper = {\n getEmbedResolutions(includeResponsive: boolean = true): EmbedResolution[] {\n const resolutions: EmbedResolution[] = [\n {\n label: LanguageService.getPhrase(namespace, 'small'),\n width: '640',\n height: '360'\n },\n {\n label: LanguageService.getPhrase(namespace, 'medium'),\n width: '1014',\n height: '576'\n },\n {\n label: LanguageService.getPhrase(namespace, 'large'),\n width: '1280',\n height: '720'\n }\n ];\n\n if (includeResponsive) {\n resolutions.unshift({\n label: LanguageService.getPhrase(namespace, 'responsive'),\n width: '100%',\n height: '100%'\n });\n }\n return resolutions;\n },\n getEmbedString(options: {\n size: EmbedResolution,\n url: string\n }): string {\n const { url, size } = options;\n\n const isResponsive = size.width === '100%';\n\n const dynamicAttributes = isResponsive ?\n 'style=\"position:absolute; top:0; left:0; width:100%; height:100%;\"' :\n `width=\"${size.width}\" height=\"${size.height}\"`;\n\n const fixedAttributes = 'frameborder=\"0\" allowfullscreen webkitallowfullscreen mozallowfullscreen allow=\"autoplay\"';\n\n const src = `src=\"${url}\"`;\n\n const iframe = `<iframe ${dynamicAttributes} ${fixedAttributes} ${src}></iframe>`;\n\n if (isResponsive)\n return `<div style=\"padding:56.25% 0 0 0; position:relative;\">${iframe}</div>`;\n\n return iframe;\n },\n buildEmbedUrl(options: {\n embedUrl: string,\n host: string,\n shareId: string,\n autoplay: boolean,\n consumerKey?: string\n }): string {\n const { embedUrl, host, shareId, autoplay, consumerKey } = options;\n\n /**\n * embedUrl didn't always exist in Share API. So we use it if it's there, but fall back to building\n * the share link if it's not. - Sha\n */\n let baseUrl = embedUrl;\n\n if (!baseUrl)\n baseUrl = UrlHelper.safeUrlConcat(host, `share/embed/${shareId}`);\n\n const params: HashObject = {};\n\n if (autoplay)\n params.a = true;\n\n if (consumerKey)\n params.consumerKey = consumerKey;\n\n return UrlHelper.urlBuilder(baseUrl, params);\n }\n};\n","$cv-share-button-height: $input-btn-padding-y * 2 + $input-btn-line-height;\n\n:local {\n .embedHtmlInput[readonly] {\n background-color: unset;\n }\n\n .copyBtnContainer {\n height: $cv-share-button-height;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmbedSize } from 'libs/shared/apps/share/components/embed-size/EmbedSize';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { BaseObject, PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { EmbedHelper, EmbedResolution } from 'libs/shared/utils/EmbedHelper';\n\nimport styles from './copy-embed-html.module.scss';\n\nconst namespace = 'share.copyEmbedHtml';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface EmbedDetails {\n size: EmbedResolution;\n autoplay: boolean;\n}\n\ntype CopyEmbedHtmlProps = PropsWithAnalyticsOptions<{\n entity: BaseObject,\n entityType: SharableEntityType,\n liteUrl: string,\n entityId: string,\n shareId: string,\n embedUrl: string,\n hideLabel?: boolean,\n hasInputBg?: boolean,\n onCopy?: (details: EmbedDetails) => void,\n showEmbedCopiedText?: boolean,\n styling?: 'greyed' | 'normal' | 'normal-v2'\n}>;\n\nCopyEmbedHtml.defaultProps = {\n styling: 'normal'\n};\n\nexport function CopyEmbedHtml(props: CopyEmbedHtmlProps): JSX.Element {\n const videoSizes = EmbedHelper.getEmbedResolutions();\n\n const [ copied, setCopied ] = React.useState<boolean>(!!props.showEmbedCopiedText);\n const [ autoplay, setAutoplay ] = React.useState(false);\n const [ videoSize, setVideoSize ] = React.useState<EmbedResolution>(videoSizes.find(s => s.width === '100%'));\n const [ logged, setLogged ] = React.useState(false);\n\n /**\n * When going to the CopyEmbedView from the CreateShareView we want to show the copied text\n * for a short period of time.\n * - Sha\n */\n React.useEffect(() => {\n if (!props.showEmbedCopiedText)\n return;\n\n setTimeout(() => setCopied(false), 2000);\n }, [props.showEmbedCopiedText]);\n\n function onCopy(): void {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n if (typeof props.onCopy === 'function') {\n props.onCopy({\n size: videoSize,\n autoplay\n });\n return;\n }\n\n AnalyticsHelper.logUserAction({\n ...props.entity,\n embedDetails: {\n size: videoSize,\n autoplay\n }\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), [\n {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyEmbedHtml,\n eventVersion: EventVersion.V3\n },\n props.analyticsOptions\n ]));\n }\n\n function onSetAutoplay(autoplay: boolean) {\n setLogged(false);\n setAutoplay(autoplay);\n }\n\n function onSetVideoSize(videoSize: EmbedResolution) {\n setLogged(false);\n setVideoSize(videoSize);\n }\n\n const url = EmbedHelper.buildEmbedUrl({\n embedUrl: props.embedUrl,\n host: props.liteUrl,\n shareId: props.shareId,\n autoplay\n });\n \n const embedString = EmbedHelper.getEmbedString({\n url,\n size: videoSize\n });\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <CopyInput\n value={embedString}\n onCopy={onCopy}\n copiedText={props.styling === 'normal-v2' ? getPhrase('copiedV2') : getPhrase('copied')}\n copyText={getPhrase('copy')}\n showCopiedText={copied}\n styling={props.styling}\n extraButtonClassNames={classNames('position-absolute bottom-0 end-0', styles.copyBtnContainer)}\n hasInputBg={props.hasInputBg}\n label={props.hideLabel ? undefined : getPhrase('label')}\n textarea\n />\n <EmbedSize\n autoplay={autoplay}\n setAutoplay={onSetAutoplay}\n videoSize={videoSize}\n setVideoSize={onSetVideoSize}\n videoSizes={videoSizes}\n />\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { CopyEmbedHtml } from 'libs/shared/apps/share/components/copy-embed-html/CopyEmbedHtml';\nimport { SharableEntity, SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\n\ninterface CopyEmbedProps {\n entity: SharableEntity;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n liteUrl: string;\n entityId: string;\n analyticsOptions: AnalyticsOptions;\n onClickCancel: () => void;\n}\n\nexport function CopyEmbed(props: CopyEmbedProps) {\n return (\n <>\n <div className='mb-3'>\n <CopyEmbedHtml\n embedUrl={props.shareLink.embedUrl}\n entity={props.entity}\n entityType={props.entityType}\n liteUrl={props.liteUrl}\n entityId={props.entityId}\n shareId={props.shareLink.id}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n\n <PopupButtons>\n <DivButton onClick={props.onClickCancel} className='btn btn-outline-dark'>\n <Text namespace={namespace} phrase='back' />\n </DivButton>\n </PopupButtons>\n </>\n );\n}\n","import React from 'react';\n\nexport function CodeSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M9.758 8.424a.6.6 0 1 0-.849-.848l-4 4a.6.6 0 0 0 0 .848l4 4a.6.6 0 0 0 .849-.848L6.182 12zm5.333-.848a.6.6 0 1 0-.849.848L17.818 12l-3.576 3.576a.6.6 0 0 0 .849.848l4-4a.6.6 0 0 0 0-.848z'\n clipRule='evenodd'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CodeSvg } from 'libs/shared/images/svg/objects/CodeSvg';\n\nconst namespace = 'share.getEmbedCode';\n\ninterface GetEmbedCodeProps {\n onClickGetEmbedCode: () => void;\n minimal?: boolean;\n}\n\nexport function GetEmbedCode(props: GetEmbedCodeProps) {\n return (\n <DivButton\n onClick={props.onClickGetEmbedCode}\n className='d-inline-block p-1 pe-2 rounded-1 hover-bg-light-blue'\n >\n <div className='d-flex align-items-center'>\n <div className={classNames('me-2', !props.minimal && 'bg-dark text-white rounded-1')}>\n <SvgContainer\n svg={CodeSvg}\n size={props.minimal ? SvgContainerSize.Standard : SvgContainerSize.Large}\n />\n </div>\n <Text namespace={namespace} phrase='getEmbedCode' />\n </div>\n </DivButton>\n );\n}\n","export enum ShareLinkStatus {\n Expired = 'Expired',\n Active = 'Active'\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: VisibleOnSvg, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy.privacy) {\n case 'public':\n return { icon: VisibleOnSvg, text: getPhrase('publicDescription') };\n case 'protected':\n if (privacy.overrideRestrictions)\n return { icon: VisibleOnSvg, text: getPhrase('clickViewOnly') };\n return {\n icon: LockSvg,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case 'just_my_customer':\n if (privacy.overrideRestrictions)\n return { icon: LockSvg, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n return {\n icon: LockSvg,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n /**\n * Because we plan to add restricted management later \n * for the time being we treat is the same as private \n */\n case 'restricted':\n case 'private':\n return { icon: LockSvg, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: LockSvg, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday ?\n getPhrase('expiryToday') :\n getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: TimerSvg, text };\n }\n \n let text = isToday ?\n getPhrase('passwordExpiryToday') :\n getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: LockSvg, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n }\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareLinkHelper } from 'libs/shared/apps/share/utils/ShareLinkHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { CheckSvg } from 'libs/shared/images/svg/status/CheckSvg';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\n\nimport { SharePrivacyResponse } from '../../interfaces/responses/SharePrivacyResponse';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ShareLinkInfoProps {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n onClickSavePrivacy?: (privacy: SharePrivacy, onClickSavePrivacy: boolean) => void;\n entity: BaseObject;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\ninterface ShareLinkItemProps {\n active: boolean;\n title: string;\n description: string;\n onClick: () => void;\n}\n\nfunction ShareLinkItem(props: ShareLinkItemProps) {\n const { active, title, description, onClick } = props;\n\n return (\n <button\n className={`${active ? 'bg-light-blue' : ''} dropdown-item d-flex align-items-center justify-content-between`}\n onClick={!active ? onClick : null}\n type='button'\n >\n <div className='me-4'>\n <p className='fw-semibold mb-1'>{title}</p>\n <p className='font-size-sm mb-0'>{description}</p>\n </div>\n {active && <SvgContainer svg={CheckSvg} />}\n </button>\n );\n}\n\nexport function ShareLinkInfo(props: ShareLinkInfoProps): JSX.Element {\n const [ canManageAccess, setCanManageAccess ] = React.useState(false);\n const [ privacy, setPrivacy ] = React.useState<SharePrivacy>(null);\n\n const { icon, text } = ShareLinkHelper.getIconAndText(props);\n\n React.useEffect(() => {\n setCanManageAccess(props.privacy.canManageAccess);\n setPrivacy(props.privacy.privacy);\n }, [props.privacy]);\n\n const canManageAccessPrivacy = canManageAccess ? 'just_my_customer' : 'protected';\n\n const canUpdatePrivacy = (\n !props.isPasswordProtected &&\n !props.linkExpireDate &&\n (props.shareOverrideRestrictions && !props.hasStudentExp)\n );\n\n return (\n <div className='d-flex align-items-center'>\n {(canUpdatePrivacy) ?\n (\n <div className='btn-group'>\n <button\n className='btn border-0 info-link dropdown-toggle p-1 bg-light-blue-hover'\n data-bs-toggle='dropdown'\n aria-label={getPhrase('ariaPrivacy')}\n >\n <SvgContainer svg={icon} className='svg-container me-1' />\n <span className='me-1'>{text}</span>\n </button>\n <ul className='dropdown-menu cursor-pointer'>\n {canManageAccess &&\n <li>\n <ShareLinkItem\n active={privacy === 'public'}\n title={getPhrase('public')}\n description={getPhrase('publicDescription')}\n onClick={() => props.onClickSavePrivacy('public', false)}\n />\n </li>\n }\n <li>\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && props.privacy.overrideRestrictions}\n title={getPhrase('justMySchool')}\n description={canManageAccess ? getPhrase('justMySchoolDescription') : getPhrase('clickViewOnly')}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, true)}\n />\n </li>\n <li>\n <ShareLinkItem\n active={privacy === canManageAccessPrivacy && !props.privacy.overrideRestrictions}\n title={getPhrase('respectRatings')}\n description={ShareLinkHelper.getRespectRatingText(\n props.entity,\n props.yearGroups,\n props.hasStudentExp\n )}\n onClick={() => props.onClickSavePrivacy(canManageAccessPrivacy, false)}\n />\n </li>\n <li>\n <ShareLinkItem\n active={privacy === 'private'}\n title={getPhrase('private')}\n description={getPhrase('privateDescription')}\n onClick={() => props.onClickSavePrivacy('private', false)}\n />\n </li>\n </ul>\n </div>\n ) :\n (\n <>\n <SvgContainer svg={icon} className='svg-container me-1' />\n <span>{text}</span>\n </>\n )\n }\n </div>\n );\n}\n","import React from 'react';\n\nexport function GoogleClassroomAvatar(): JSX.Element {\n return (\n <svg width='24' height='24' viewBox='0 0 24 24' fill='none'>\n <circle cx='12' cy='12' r='12' fill='url(#pattern0)'/>\n <defs>\n <pattern id='pattern0' patternContentUnits='objectBoundingBox' width='1' height='1'>\n <use xlinkHref='#image0_3558_14996' transform='scale(0.00520833)'/>\n </pattern>\n <image id='image0_3558_14996' width='192' height='192' xlinkHref='data:image/png;base64,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'/>\n </defs>\n </svg>\n );\n}\n","import React from 'react';\n\nexport function MicrosoftTeamsAvatar(): JSX.Element {\n return (\n <svg viewBox='0 0 40 40' fill='none'>\n <path d='M29.692 15.31c.58 0 1.146-.173 1.628-.5a2.96 2.96 0 001.078-1.331 3.004 3.004 0 00-.634-3.235 2.918 2.918 0 00-1.5-.812 2.894 2.894 0 00-1.693.169 2.938 2.938 0 00-1.314 1.093 2.997 2.997 0 00.364 3.748 2.91 2.91 0 002.071.869zM20.043 26.267V13.849a.9.9 0 00-.259-.633.877.877 0 00-.624-.262H6.883a.877.877 0 00-.624.262.9.9 0 00-.259.633v12.418c0 .24.092.469.257.64.165.172.39.27.626.276H19.16a.899.899 0 00.626-.276.923.923 0 00.257-.64zm-3.51-10.389v1.92h-2.37v6.68H11.88V17.93H9.51v-2.182h7.022v.13z' fill='#fff'/>\n <path d='M21.874 14.132v.917a4.03 4.03 0 002.05-1.47c.512-.699.79-1.545.793-2.415 0-1.1-.431-2.154-1.199-2.932a4.065 4.065 0 00-2.893-1.214 4.065 4.065 0 00-2.894 1.214 4.175 4.175 0 00-1.199 2.932h2.391a2.996 2.996 0 012.061.887c.55.552.868 1.297.89 2.081zM26.332 17.1h-4.458v8.883c0 .8-.309 1.566-.86 2.138-.552.57-1.302.9-2.091.917h-4.588a7.047 7.047 0 003.265 3.317c1.427.7 3.046.887 4.593.532a6.99 6.99 0 003.918-2.486 7.152 7.152 0 001.535-4.418v-7.551a1.348 1.348 0 00-.385-.942 1.313 1.313 0 00-.929-.39zM32.772 17.1h-3.597c.206.414.316.87.323 1.332v7.551a9.1 9.1 0 01-.516 2.859c.236.021.474.021.71 0a4.28 4.28 0 003.046-1.278A4.394 4.394 0 0034 24.477v-6.045c0-.339-.126-.665-.354-.912a1.307 1.307 0 00-.874-.42z' fill='#fff'/>\n </svg>\n );\n}\n","$ms-teams-purple: #6364a7;\n$hoverable-black: #000;\n\n:local {\n .hoverable {\n background: $hoverable-black;\n\n >:first-child {\n\n &:hover,\n &:focus {\n // Matches the hover state added automatically by google classroom\n opacity: 0.87;\n }\n }\n }\n\n .msTeamsContainer {\n background-color: $ms-teams-purple;\n }\n\n .avatar {\n width: 1.5rem;\n height: 1.5rem;\n\n &:not(:first-child) {\n margin-left: -#{map-get($spacers, 1)};\n }\n\n &.small {\n width: 1.0625rem; // 17px\n height: 1.0625rem; // 17px\n\n svg {\n vertical-align: top;\n }\n }\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { GoogleClassroomAvatar } from './avatars/GoogleClassroomAvatar';\nimport { MicrosoftTeamsAvatar } from './avatars/MicrosoftTeamsAvatar';\n\nimport styles from './share-integrations.module.scss';\n\nconst namespace = 'share.shareIntegrations';\n\ninterface ShareIntegrationsStackProps {\n size?: 'sm' | 'md';\n noTooltip?: boolean;\n}\n\nexport function ShareIntegrationsStack(props?: ShareIntegrationsStackProps): JSX.Element {\n const className = classNames(\n styles.avatar,\n props?.size === 'sm' && styles.small,\n props?.size !== 'sm' && 'border',\n 'rounded-circle overflow-hidden'\n );\n\n return (\n <Tooltip title={LanguageService.getPhrase(namespace, 'shareThroughIntegrations')} spanHack disable={props.noTooltip}>\n <ul className='list-unstyled d-flex mb-0'>\n <li className={className} style={{ zIndex: 1 }}>\n <GoogleClassroomAvatar />\n </li>\n\n <li className={`${className} ${styles.msTeamsContainer}`} style={{ zIndex: 0 }}>\n <MicrosoftTeamsAvatar />\n </li>\n </ul>\n </Tooltip>\n );\n}\n","import React from 'react';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EventVersion, ShareDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { ShareLinkInfo } from 'libs/shared/apps/share/components/share-link-info/ShareLinkInfo';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareIntegrationsStack } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrationsStack';\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { CopyInput } from 'libs/shared/components/copy-input/CopyInput';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { LinkSvg } from 'libs/shared/images/svg/objects/LinkSvg';\nimport { BaseObject, ShareLink, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'share.shareAsLink';\n\ninterface ShareAsLinkProps {\n entity: BaseObject;\n entityType: SharableEntityType;\n shareLink: ShareLink;\n onClickShowSettings: () => void;\n onClickCreateLink: () => void;\n shareLinkIsLoading?: boolean;\n canAddPolicies: boolean;\n privacy: SharePrivacyResponse;\n entityTypeId: MasterType;\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void;\n enableIntegrations: boolean;\n hasStudentExp: boolean;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareAsLink(props: ShareAsLinkProps): React.ReactElement {\n const [ logged, setLogged ] = React.useState(false);\n\n function onCopy(): void {\n // Because our users are double clickers\n if (logged)\n return;\n\n setLogged(true);\n\n AnalyticsHelper.logUserAction({\n id: props.entity.id,\n name: props.entity.name\n }, AnalyticsHelper.mergeOptions(ShareViewHelper.getAnalyticsOptions(props.entityType), {\n actionType: UserAction.Share,\n descriptor: ShareDescriptors.CopyLink,\n eventVersion: EventVersion.V3\n }));\n }\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n <div className={`${props.shareLink ? 'w-100' : 'w-75 d-flex align-items-center'}`}>\n {props.shareLink ?\n (\n <>\n <div className='d-flex justify-content-between align-items-center mb-1'>\n <ShareLinkInfo\n linkExpireDate={props.shareLink.linkExpireDate}\n isPasswordProtected={props.shareLink.isPasswordProtected}\n privacy={props.privacy}\n entityTypeId={props.shareLink.objectTypeId}\n status={props.shareLink.status}\n onClickSavePrivacy={props.onClickSavePrivacy}\n hasStudentExp={props.hasStudentExp}\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </div>\n <CopyInput value={props.shareLink.url} onCopy={onCopy} />\n </>\n ) : (\n <div className='d-flex align-items-center'>\n <div className='me-2'>\n {props.enableIntegrations ? (\n <ShareIntegrationsStack />\n ) : (\n <SvgContainer svg={LinkSvg} className='svg-container' />\n )}\n </div>\n \n <span className='fw-semibold'><Text namespace={namespace} phrase='createLink' /></span>\n </div>\n )\n }\n </div>\n {!props.shareLink &&\n <DivButton className='info-link' onClick={props.onClickCreateLink}>\n <Text phrase='createLink' />\n </DivButton>\n }\n </div>\n </>\n );\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\n/**\n * We only need to load any script once.\n */\nconst loadedScripts: HashObject<boolean> = {};\n\nexport function useScript(src: string, shouldLoad: boolean): boolean {\n const [ loaded, setLoaded ] = React.useState(false);\n\n React.useEffect(() => {\n if (!src || !shouldLoad || loadedScripts[src])\n return;\n\n const script = document.createElement('script');\n\n script.src = src;\n script.async = true;\n script.onload = () => {\n loadedScripts[src] = true;\n /**\n * Onload event is fired before script content is parsed.\n * By calling set timeout, we ensure setLoaded is called after\n * the script is parsed in the event loop.\n */\n window.setTimeout(() => setLoaded(true), 0);\n };\n\n document.body.appendChild(script);\n\n return () => {\n script.onload = null;\n document.body.removeChild(script);\n };\n }, [ src, shouldLoad ]);\n\n return loadedScripts[src] || loaded;\n}\n","import React from 'react';\n\nimport { useScript } from 'libs/shared/hooks/useScript';\n\nconst GOOGLE_CLASSROOM_CONTAINER_ID = 'g-share-to-classroom';\n\nexport function useGoogleClassrooms(shouldLoad: boolean): string {\n /**\n * Google sdk reads the config off the window.\n */\n if (shouldLoad)\n (window as any).___gcfg = { parsetags: 'explicit' };\n\n const loaded = useScript('https://apis.google.com/js/platform.js', shouldLoad);\n\n React.useEffect(() => {\n if (!shouldLoad || !loaded)\n return;\n\n window.gapi?.sharetoclassroom?.go(GOOGLE_CLASSROOM_CONTAINER_ID);\n }, [ shouldLoad, loaded ]);\n\n return GOOGLE_CLASSROOM_CONTAINER_ID;\n}\n","import React from 'react';\n\nimport { useScript } from 'libs/shared/hooks/useScript';\n\nexport function useMicrosoftTeamsShare(shouldLoad: boolean): void {\n const loaded = useScript('https://teams.microsoft.com/share/launcher.js', shouldLoad);\n\n React.useEffect(() => {\n if (!shouldLoad || !loaded)\n return;\n\n window.shareToMicrosoftTeams?.renderButtons();\n }, [ shouldLoad, loaded ]);\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\n\nconst namespace = 'shared.lookingForIntegration';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\ninterface LookingForIntegrationProps {\n appLink: Core.AppLink;\n closePopup?: () => void;\n hideDismiss?: boolean;\n hideBackground?: boolean;\n normalText?: boolean;\n}\n\ninterface LookingForIntegrationViewModel {\n show: boolean;\n}\n\nexport function LookingForIntegration(props: LookingForIntegrationProps): JSX.Element {\n const [ visibility, setVisibility ] = useViewModel<LookingForIntegrationViewModel>(\n SharedViewModelKeys.LOOKING_FOR_INTEGRATION,\n { show: true },\n { storage: StorageType.LocalStorage }\n );\n\n if (!visibility.show)\n return <></>;\n\n return (\n <div className={classNames(`d-flex justify-content-between`, !props.hideBackground && 'rounded p-2 bg-light-blue')}>\n <AppLink\n appLink={props.appLink}\n onClick={() => props.closePopup?.()}\n className='d-inline-flex align-items-center mb-0'\n >\n <span className={classNames('ms-1 text-info', !props.normalText && 'fw-semibold')}>\n <Text namespace={namespace} phrase='lookingForIntegration' />\n </span>\n </AppLink>\n {!props.hideDismiss &&\n <button onClick={() => setVisibility({ show: false })} aria-label={`${getPhrase('ariaClose')}`}>\n <SvgContainer\n svg={CloseSvg}\n size={SvgContainerSize.Small}\n className='text-info d-inline-block svg-container'\n />\n </button>\n }\n </div>\n );\n}\n","export enum IntegrationId {\n GoogleClassroom = 'google-classroom',\n MicrosoftTeams = 'microsoft-teams',\n Vivi = 'vivi',\n AppleTv = 'apply-tv'\n}\n","import React from 'react';\n\nimport { AppLink } from 'libs/common/backbone/core';\n\nimport { useGoogleClassrooms } from 'libs/shared/apps/share/views/share/components/share-integrations/useGoogleClassrooms';\nimport { useMicrosoftTeamsShare } from 'libs/shared/apps/share/views/share/components/share-integrations/useMicrosoftTeamsShare';\nimport { LookingForIntegration } from 'libs/shared/components/looking-for-integration/LookingForIntegration';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\n\nimport styles from './share-integrations.module.scss';\n\nconst DEFAULT_ICON_SIZE = '32';\n\ninterface ShareIntegrationsProps {\n integrations: IntegrationId[];\n url: string;\n appLink?: AppLink;\n iconSize?: 'sm' | 'md';\n closePopup?: () => void;\n hideLookingForIntegrations?: boolean;\n}\n\nexport function ShareIntegrations(props: ShareIntegrationsProps): JSX.Element {\n const googleContainerId = useGoogleClassrooms(props.integrations?.includes(IntegrationId.GoogleClassroom));\n useMicrosoftTeamsShare(props.integrations?.includes(IntegrationId.MicrosoftTeams));\n\n if (!props.integrations.length && !props.hideLookingForIntegrations)\n return (\n <LookingForIntegration\n appLink={props.appLink}\n closePopup={props.closePopup}\n />\n );\n\n function getIconSize() {\n switch (props.iconSize) {\n case 'sm': return '24';\n case 'md':\n default: return DEFAULT_ICON_SIZE;\n }\n }\n\n const iconSize = getIconSize();\n const integrationsContainerStyle = { height: `${iconSize}px`, width: `${iconSize}px` };\n\n return (\n <div className='d-flex gap-1 align-items-start'>\n {props.integrations.includes(IntegrationId.GoogleClassroom) &&\n <div\n id={googleContainerId}\n className='rounded partial-loading-background'\n style={integrationsContainerStyle}\n >\n <div\n className='g-sharetoclassroom'\n data-size={iconSize}\n data-url={props.url}\n />\n </div>\n }\n {props.integrations.includes(IntegrationId.MicrosoftTeams) &&\n <div className={`rounded overflow-hidden ${styles.hoverable}`}>\n <div\n className={`teams-share-button ${styles.msTeamsContainer}`}\n style={integrationsContainerStyle}\n data-href={props.url}\n data-button-type='smallTransWhite'\n data-preview='false'\n data-icon-px-size={iconSize}\n />\n </div>\n }\n </div>\n );\n}\n","import React from 'react';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { Restrictions, YearGroup } from 'libs/shared/interfaces';\n\ninterface RestrictionBadgeProps {\n restrictions: Restrictions;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionBadge(props: RestrictionBadgeProps): JSX.Element {\n return (\n <Badge\n type={BadgeType.Restriction}\n data={{ restrictions: props.restrictions, yearGroups: props.yearGroups }}\n inline\n />\n );\n}\n","import React from 'react';\n\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { RestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/RestrictionBadge';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemRestrictionBadgeProps {\n video: VideoTypes;\n yearGroups: YearGroup[];\n className?: string;\n}\n\nexport function VideoItemRestrictionBadge(props: VideoItemRestrictionBadgeProps): JSX.Element {\n const hasRestrictions = RestrictionHelper.hasRestrictions(props.video?._restrictions);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!hasRestrictions || !props.yearGroups || !canConsume)\n return <></>;\n \n return (\n <BadgeListContainer className={props.className || 'pt-1'}>\n <RestrictionBadge restrictions={props.video._restrictions} yearGroups={props.yearGroups} />\n </BadgeListContainer>\n );\n}\n","import React from 'react';\nimport { Form as FormikForm } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharableEntity } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { VideoItemRestrictionBadge } from 'libs/shared/components/video-list/components/video-item-restriction-badge/VideoItemRestrictionBadge';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst getPhrase = LanguageService.encloseNamespace('share.shareMessage');\n\nconst MessageValidationSchema = Yup.object().shape({\n message: Yup.string()\n .max(280, () => getPhrase('maxMessageLen'))\n});\n\ninterface ShareMessageRequest {\n message?: string;\n}\n\ninterface ShareMessageFormProps {\n entity: SharableEntity;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nfunction ShareMessageForm(props: ShareMessageFormProps): React.ReactElement {\n const formikProps = useFormikContextWrapper<ShareMessageRequest>();\n\n return (\n <FormikForm>\n <FormField\n component='textarea'\n name='message'\n id='message'\n placeholder={getPhrase('placeholder')}\n value={formikProps.values.message}\n label={getPhrase('label')}\n showOptionalLabel\n />\n {!props.shareOverrideRestrictions && VideoHelper.isVideoType(props.entity) &&\n <div className='mb-3'><VideoItemRestrictionBadge video={props.entity} yearGroups={props.yearGroups} /></div>}\n <PopupButtons>\n <PopupButtons.Submit variant='dark' text={getPhrase('share')} />\n </PopupButtons>\n </FormikForm>\n );\n}\n\ninterface ShareMessageProps {\n onClickShare: (message: string, onDone: () => void) => void;\n entity: SharableEntity;\n yearGroups: YearGroup[];\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareMessage(props: ShareMessageProps): React.ReactElement {\n function onSubmit(data: ShareMessageRequest, onDone: () => void): void {\n let message: string = null;\n\n if (data.message)\n message = data.message;\n\n props.onClickShare(message, onDone);\n }\n\n return (\n <FormWrapper<ShareMessageRequest>\n initialValues={{ message: '' }}\n validationSchema={MessageValidationSchema}\n onSubmit={onSubmit}\n allowInitialSubmit={true}\n >\n <ShareMessageForm\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </FormWrapper>\n );\n}\n","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { TypeFilter } from 'libs/shared/apps/search/interfaces/TypedFilter';\nimport { GetEmbedCode } from 'libs/shared/apps/share/components/get-embed-code/GetEmbedCode';\nimport { RecipientItem } from 'libs/shared/apps/share/components/recipient-item/RecipientItem';\nimport { TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT, TokenizedTypeahead } from 'libs/shared/apps/share/components/tokenized-typeahead/TokenizedTypeahead';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { ShareAsLink } from 'libs/shared/apps/share/views/share/components/share-as-link/ShareAsLink';\nimport { ShareIntegrations } from 'libs/shared/apps/share/views/share/components/share-integrations/ShareIntegrations';\nimport { ShareMessage } from 'libs/shared/apps/share/views/share/components/share-message/ShareMessage';\nimport { SharableEntity, SharableEntityType, SharableRecipient } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { HasLocalPermissionsFunc, usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, ClassroomGroup, CurrentUser, PropsWithAnalyticsOptions, ShareLink, ShareSearchResponse, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction filterSearchResults(\n recipientsToFilter: SharableRecipient[],\n currentSelections: SharableRecipient[],\n existingShareRecipients: SharableRecipient[],\n currentUserId: string\n): SharableRecipient[] {\n if (!recipientsToFilter)\n return [];\n\n const selectedIds = [ ...currentSelections, ...existingShareRecipients ].map(s => s.id);\n\n return recipientsToFilter.filter(s => {\n // Prevent users from sharing to other users who have already been shared this resource\n if (selectedIds.includes(s.id))\n return false;\n\n // Prevent users from sharing to themselves\n if (s.id === currentUserId)\n return false;\n\n return true;\n });\n}\n\ntype MainShareProps = PropsWithAnalyticsOptions<{\n entity: SharableEntity,\n entityType: SharableEntityType,\n directShareRecipients: SharableRecipient[],\n recentlySharedTo: SharableRecipient[],\n onClickCreateLink: () => void,\n onClickShowSettings: () => void,\n onClickShare: (recipients: SharableRecipient[], message: string, onDone?: () => void) => void,\n onClickRemoveRecipient: (recipientId: string, onError?: () => void) => void,\n onClickSavePrivacy: (privacy: SharePrivacy, overrideRestrictions: boolean) => void,\n onClickGetEmbedCode: () => void,\n gatewayApiUrl: string,\n imageCdnUrl: string,\n currentUser: CurrentUser,\n searchRequestHeaders?: HashObject,\n emptyStateImageUrl: string,\n errorStateImageUrl: string,\n integrations: IntegrationId[],\n shareLink?: ShareLink,\n shareLinkIsLoading?: boolean,\n fetchRecipientUsers?: (id: string, callback: (users: UserCollection) => void) => void,\n canAddPolicies: boolean,\n privacy: SharePrivacyResponse,\n integrationSettingAppLink?: Core.AppLink,\n messagePopupAppLink?: Core.AppLink,\n closePopup: () => void,\n enableIntegrationBanner?: boolean,\n canEmbed?: boolean,\n yearGroups: YearGroup[],\n shareOverrideRestrictions: boolean,\n hasLocalPermissions: HasLocalPermissionsFunc\n}>;\n\nexport function MainShare(props: MainShareProps): JSX.Element {\n const [ selections, setSelections ] = React.useState<SharableRecipient[]>([]);\n const [ showShareLinkSpinner, setShowShareLinkSpinner ] = React.useState(false);\n\n const { hasPermissions } = usePermissions();\n const { hasClassrooms } = useSettings(null);\n const hasManageIntegrationsPermission = hasPermissions(PermissionName.ManageIntegrations);\n\n function onClickShare(message: string, onDone: () => void): void {\n props.onClickShare(\n selections,\n message,\n () => {\n setSelections([]);\n onDone();\n }\n );\n }\n\n function fetchSelectionMembers(id: string): void {\n if (!props.fetchRecipientUsers)\n return;\n\n const callback = (users: UserCollection) => {\n const newSelections: SharableRecipient[] = [];\n\n selections.forEach(selection => {\n if (selection.id !== id)\n return newSelections.push(selection);\n\n const updatedSelection = ObjectHelper.deepClone<Classroom | ClassroomGroup>(selection);\n\n if (!users?.data?.length) {\n updatedSelection.users = { count: 0, data: [], pagination: null };\n } else {\n updatedSelection.users = users;\n }\n\n newSelections.push(updatedSelection);\n });\n\n setSelections(ArrayHelper.uniq(newSelections, 'id'));\n };\n\n props.fetchRecipientUsers(id, callback);\n }\n\n function getRemotePostBody(query: string): HashObject {\n const indices: TypeFilter[] = [];\n\n if (hasPermissions(PermissionName.ShareToUsers)) {\n indices.push({\n index: 'user',\n filters: {\n userType: [ UserGroup.Staff, UserGroup.Learner ],\n userProfile: {\n status: [`${ObjectStatus.Active.toLowerCase()}`],\n customerId: props.currentUser.customerId\n }\n }\n });\n }\n\n if (hasPermissions(PermissionName.ShareToClassrooms))\n indices.push({ index: 'classroom' });\n\n if (hasPermissions(PermissionName.ShareToClassroomGroups))\n indices.push({ index: 'classroom_group' });\n\n return {\n query,\n indices,\n searchType: 'user',\n limit: TOKENIZED_TYPEAHEAD_SUGGESTIONS_LIMIT\n };\n }\n\n const canDirectShare = hasClassrooms && (\n hasPermissions(PermissionName.ShareToUsers) ||\n hasPermissions(PermissionName.ShareToClassrooms) ||\n hasPermissions(PermissionName.ShareToClassroomGroups)\n );\n\n const recentSearches = filterSearchResults(\n props.recentlySharedTo,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n );\n\n function onClickCreateShareLink(): void {\n setShowShareLinkSpinner(true);\n props.onClickCreateLink();\n }\n\n React.useEffect(() => {\n setShowShareLinkSpinner(!!props.shareLinkIsLoading);\n }, [props.shareLinkIsLoading]);\n\n return (\n <>\n {canDirectShare && (\n <div className='bg-white rounded-bottom-3 pt-3 px-3 mb-2'>\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <TokenizedTypeahead\n // This key is used to re-initialize TokenizedTypeahead whenever recentSearches changes\n key={recentSearches?.map(s => s.id).join(':') ?? 'share:search'}\n getRemoteUrl={() => UrlHelper.safeUrlConcat(props.gatewayApiUrl, 'v4/search')}\n getRemotePostBody={getRemotePostBody}\n requestHeaders={props.searchRequestHeaders}\n formatRemoteSuggestions={(suggestions: ShareSearchResponse) =>\n filterSearchResults(\n suggestions?.results,\n selections,\n props.directShareRecipients,\n props.currentUser.id\n )\n }\n recentSearches={recentSearches}\n selections={selections}\n onSuggestionSelected={selection => setSelections([ ...selections, selection ])}\n removeSelection={selection => setSelections(selections.filter(s => s.id !== selection.id))}\n placeholder={hasClassrooms ?\n getPhrase('searchPlaceholder') :\n getPhrase('searchPlaceholderNoClassrooms')}\n imageCdnUrl={props.imageCdnUrl}\n activationLength={2}\n fetchSelectionMembers={props.fetchRecipientUsers && fetchSelectionMembers}\n debounceTime={300}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n hasStudentExperience={hasPermissions(PermissionName.StudentExperience)}\n />\n </div>\n\n {(!selections.length && props.directShareRecipients.length) ?\n (\n <div>\n <h3 className='font-size-normal'><Text phrase='sharedTo' /></h3>\n <Scrollbars autoHeight>\n <ul className='list-unstyled'>\n {props.directShareRecipients.map(d => (\n <li key={d.id} className='mb-2 pe-1'>\n <RecipientItem\n entity={d}\n imageCdnUrl={props.imageCdnUrl}\n removeRecipient={props.onClickRemoveRecipient}\n showDisplayName={hasPermissions(PermissionName.StudentExperience)}\n />\n </li>\n ))}\n </ul>\n </Scrollbars>\n </div>\n ) : <></>\n }\n {!!selections.length && (\n // The form submit inside of ShareMessage is used as the Share button\n <div className='pb-3'>\n <ShareMessage\n onClickShare={onClickShare}\n entity={props.entity}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </div>\n )}\n </div>\n )}\n\n {!selections.length && !showShareLinkSpinner && (\n <div className={`bg-white p-3 ${canDirectShare ? 'rounded-3' : 'rounded-bottom-3'}`}>\n <div>\n {props.shareLink && (\n <div className='fw-semibold mb-2'><Text namespace={namespace} phrase='shareLink' /></div>\n )}\n <ShareAsLink\n entity={props.entity}\n entityType={props.entityType}\n shareLink={props.shareLink}\n onClickShowSettings={props.onClickShowSettings}\n onClickCreateLink={onClickCreateShareLink}\n shareLinkIsLoading={props.shareLinkIsLoading}\n canAddPolicies={props.canAddPolicies}\n privacy={props.privacy}\n entityTypeId={props.entity.typeId}\n onClickSavePrivacy={props.onClickSavePrivacy}\n enableIntegrations={props.enableIntegrationBanner}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n yearGroups={props.yearGroups}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n {props.shareLink && props.enableIntegrationBanner && (\n <div className={`${props.integrations?.length && props.canEmbed ? 'float-end' : ''} mt-1 pt-1`}>\n <ShareIntegrations\n integrations={props.integrations}\n url={props.shareLink.url}\n closePopup={props.closePopup}\n appLink={hasManageIntegrationsPermission ?\n props.integrationSettingAppLink :\n props.messagePopupAppLink\n }\n />\n </div>\n )}\n {props.shareLink && props.canEmbed && (\n <div className='mt-1'>\n <GetEmbedCode onClickGetEmbedCode={props.onClickGetEmbedCode} />\n </div>\n )}\n {props.shareLink && props.canAddPolicies &&\n <button className='btn btn-link text-info mt-2 p-0' onClick={props.onClickShowSettings}>\n <Text namespace={namespace} phrase='advancedSettings' />\n </button>\n }\n </div>\n </div>\n )}\n\n {showShareLinkSpinner && (\n <div className='bg-white rounded-3 p-3 text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </>\n );\n}\n","const LINK_EXPIRY_TIME = 30; // days\nexport function getLinkExpiryDate(shouldExpire: boolean): string | null {\n if (!shouldExpire)\n return null;\n\n const date = new Date();\n date.setDate(date.getDate() + LINK_EXPIRY_TIME);\n\n return date.toISOString();\n}\n","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'shared.linkExpiry';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LinkExpiryProps {\n passwordProtectLink: boolean;\n}\n\nexport function LinkExpiry(props: LinkExpiryProps): React.ReactElement {\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n function setLinkExpireDate(): void {\n if (props.passwordProtectLink)\n return;\n\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!formikProps.values.linkExpireDate));\n }\n\n return (\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='linkExpirationHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='linkExpirationInfo' /></p>\n </div>\n <Tooltip\n title={getPhrase('passwordProtected')}\n disable={!props.passwordProtectLink}\n spanHack\n trigger='hover'\n >\n <ToggleSwitch\n onClick={setLinkExpireDate}\n on={!!formikProps.values.linkExpireDate}\n disabled={props.passwordProtectLink}\n showStateWhenDisabled\n />\n </Tooltip>\n </div>\n );\n}\n",":local {\n .passwordButton {\n position: absolute;\n right: 0;\n top: 0.5rem;\n margin-right: map-get($spacers, 2);\n }\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\nimport { VisibleOffSvg } from 'libs/shared/images/svg/actions/VisibleOffSvg';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\n\nimport styles from './set-password-input.module.scss';\n\nconst namespace = 'share.setPasswordInput';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SetPasswordInputProps {\n value: string;\n onChange: (value: string) => void;\n onReset?: () => void;\n /**\n * Allow user to view and edit current value.\n */\n canEdit?: boolean;\n /**\n * Don't allow user to view/edit current value\n * but allow them to clear it and enter a new value.\n */\n canReset?: boolean;\n placeholder?: string;\n}\n\nexport function SetPasswordInput(props: SetPasswordInputProps): JSX.Element {\n const [ revealPassword, setRevealPassword ] = React.useState(false);\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n\n const errorMsg = formikProps.errors?.password;\n\n return (\n <>\n <input\n className={`form-control ${errorMsg ? 'is-invalid' : ''}`}\n value={props.value}\n onChange={e => {\n !!props.canEdit && props.onChange(e.target.value);\n }}\n type={revealPassword ? 'text' : 'password'}\n placeholder={props.placeholder || getPhrase('passwordPlaceholder')}\n readOnly={!props.canEdit}\n />\n {!!errorMsg && (\n <Form.Control.Feedback type='invalid'>{errorMsg}</Form.Control.Feedback>\n )}\n {!!props.canEdit &&\n <DivButton className={styles.passwordButton} onClick={() => setRevealPassword(!revealPassword)}>\n <SvgContainer\n svg={revealPassword ? VisibleOnSvg : VisibleOffSvg}\n title={getPhrase(revealPassword ? 'hidePassword' : 'revealPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n {!props.canEdit && !!props.canReset && !!props.onReset &&\n <DivButton className={styles.passwordButton} onClick={props.onReset}>\n <SvgContainer\n svg={CloseSvg} title={getPhrase('resetPassword')}\n tooltipPlacement='top'\n />\n </DivButton>\n }\n </>\n );\n}\n","import React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { SetPasswordInput } from 'libs/shared/apps/share/components/set-password-input/SetPasswordInput';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { getLinkExpiryDate } from 'libs/shared/apps/share/utils/LinkExpiryHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.linkPassword';\n\nconst PASSWORD_PLACEHOLDER = '********';\n\ninterface LinkPasswordProps {\n shareLink: ShareLink;\n passwordProtectLink: boolean;\n setPasswordProtectLink: (protect: boolean) => void;\n}\n\nexport function LinkPassword(props: LinkPasswordProps): React.ReactElement {\n const { passwordProtectLink, setPasswordProtectLink } = props;\n\n const formikProps = useFormikContext<EditShareLinkRequest>();\n \n const [ readonlyPassword, setReadonlyPassword ] = React.useState(!!props.shareLink?.isPasswordProtected);\n\n function onTogglePasswordProtect(): void {\n if (props.shareLink?.isPasswordProtected)\n formikProps.setFieldValue('removePassword', passwordProtectLink);\n\n formikProps.setFieldValue('password', '');\n\n setPasswordProtectLink(!passwordProtectLink);\n formikProps.setFieldValue('linkExpireDate', getLinkExpiryDate(!passwordProtectLink));\n }\n\n function setPassword(password: string): void {\n formikProps.setFieldValue('password', password);\n }\n\n function resetPassword(): void {\n formikProps.setFieldValue('password', '');\n formikProps.setFieldValue('removePassword', true);\n setReadonlyPassword(false);\n }\n\n return (\n <div className='pb-3'>\n <div className='d-flex justify-content-between align-items-center'>\n <div>\n <label className='m-0' htmlFor=''><Text namespace={namespace} phrase='passwordProtectHeading' /></label>\n <p className='m-0'><Text namespace={namespace} phrase='passwordProtectInfo' /></p>\n </div>\n <ToggleSwitch onClick={onTogglePasswordProtect} on={passwordProtectLink} />\n </div>\n\n {passwordProtectLink &&\n <div className='position-relative mt-2'>\n <SetPasswordInput\n value={readonlyPassword ? PASSWORD_PLACEHOLDER : formikProps.values.password}\n onChange={setPassword}\n onReset={resetPassword}\n canEdit={!readonlyPassword}\n canReset\n />\n </div>\n }\n </div>\n );\n}\n","import { boolean, object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'share.validation';\n\nexport const ShareLinkSettingsValidationSchema = object().shape({\n removePassword: boolean(),\n resourceId: string(),\n linkExpireDate: string().nullable(),\n password: string()\n .test({\n name: 'password-length',\n exclusive: false,\n params: {},\n message: LanguageService.getPhrase(namespace, 'minPassword'),\n test: val => {\n const removePassword = ((this as any)?.parent as any)?.removePassword;\n\n if (removePassword)\n return true;\n\n if (!val?.length)\n return true;\n\n if (val.length < 3)\n return false;\n\n return true;\n }\n })\n .default('')\n});\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LinkExpiry } from 'libs/shared/apps/share/components/link-expiry/LinkExpiry';\nimport { LinkPassword } from 'libs/shared/apps/share/components/link-password/LinkPassword';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { ShareLinkSettingsValidationSchema } from 'libs/shared/apps/share/validation/ShareLinkSettingsValidationSchema';\nimport { SharableEntity, SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config } from 'libs/shared/interfaces';\nimport { PropsWithAnalyticsOptions, ShareLink } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ShareSettingsFormProps = PropsWithAnalyticsOptions<{\n entity: SharableEntity,\n entityType: SharableEntityType,\n config: Config,\n shareLink: ShareLink,\n entityId: string,\n onClickCancel: () => void,\n onClickDeleteLink: () => void,\n canEmbed?: boolean,\n privacy: SharePrivacyResponse,\n hasStudentExp: boolean,\n shareOverrideRestrictions: boolean\n}>;\n\nfunction ShareSettingsForm(props: ShareSettingsFormProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const [ passwordProtectLink, setPasswordProtectLink ] = React.useState(!!props.shareLink.isPasswordProtected);\n\n return (\n <Form>\n {props.onClickDeleteLink &&\n <div className='d-flex justify-content-between align-items-center pb-3'>\n <div>\n <label className='mb-0'><Text namespace={namespace} phrase='deleteLinkLabel' /></label>\n <p className='mb-0'><Text namespace={namespace} phrase='deleteLinkDescription' /></p>\n </div>\n <DivButton onClick={props.onClickDeleteLink} className='info-link justify-self-start'>\n <Text namespace={namespace} phrase='deleteLink' />\n </DivButton>\n </div>\n }\n {hasPermissions(PermissionName.ManageShareLinkSettings) && (\n <>\n <LinkExpiry passwordProtectLink={passwordProtectLink} />\n {props.shareOverrideRestrictions &&\n <LinkPassword\n shareLink={props.shareLink}\n passwordProtectLink={passwordProtectLink}\n setPasswordProtectLink={setPasswordProtectLink}\n />\n }\n </>\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.onClickCancel} text={getPhrase('back')} variant='link' />\n <PopupButtons.Submit variant='dark' />\n </PopupButtons>\n </Form>\n );\n}\n\ninterface ShareSettingsProps {\n entity: SharableEntity;\n entityType: SharableEntityType;\n config: Config;\n shareLink: ShareLink;\n entityId: string;\n privacy: SharePrivacyResponse;\n onClickSaveLink: (data: EditShareLinkRequest, onError: () => void) => void;\n onClickCancel: () => void;\n onClickDeleteLink?: () => void;\n hasStudentExp: boolean;\n shareOverrideRestrictions: boolean;\n}\n\nexport function ShareSettings(props: PropsWithAnalyticsOptions<ShareSettingsProps>): JSX.Element {\n const initialValues: EditShareLinkRequest = {\n password: '',\n removePassword: false,\n linkExpireDate: props.shareLink.linkExpireDate,\n overrideRestrictions: props.shareLink.overrideRestrictions\n };\n\n return (\n <>\n <FormWrapper<EditShareLinkRequest>\n initialValues={initialValues}\n onSubmit={props.onClickSaveLink}\n castInitialValues={false}\n validationSchema={ShareLinkSettingsValidationSchema}\n >\n <ShareSettingsForm\n entity={props.entity}\n entityType={props.entityType}\n config={props.config}\n shareLink={props.shareLink}\n entityId={props.entityId}\n onClickCancel={props.onClickCancel}\n analyticsOptions={props.analyticsOptions}\n privacy={props.privacy}\n onClickDeleteLink={props.onClickDeleteLink}\n hasStudentExp={props.hasStudentExp}\n shareOverrideRestrictions={props.shareOverrideRestrictions}\n />\n </FormWrapper>\n </>\n );\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { Integration } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.shared-utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const IntegrationHelper = {\n getShareIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): Integration[] {\n return [\n {\n id: IntegrationId.GoogleClassroom,\n name: getPhrase('googleClassroom'),\n enabled: googleClassroomSetting,\n settingName: SettingName.ShareToGoogleClassroom\n },\n {\n id: IntegrationId.MicrosoftTeams,\n name: getPhrase('msftTeams'),\n enabled: msftTeamsSetting,\n settingName: SettingName.ShareToMicrosoftTeams\n }\n ];\n }\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLink } from 'libs/common/backbone/core';\nimport { AlertType, DefaultAlertHeading } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { EditShareLinkRequest } from 'libs/shared/apps/share/interfaces/requests/EditShareLinkRequest';\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { SharePrivacy } from 'libs/shared/apps/share/interfaces/SharePrivacy';\nimport { RecentShareHelper } from 'libs/shared/apps/share/utils/RecentShareHelper';\nimport { CopyEmbed } from 'libs/shared/apps/share/views/share/components/copy-embed/CopyEmbed';\nimport { MainShare } from 'libs/shared/apps/share/views/share/components/main-share/MainShare';\nimport { ShareSettings } from 'libs/shared/apps/share/views/share/components/share-settings/ShareSettings';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LanguageNamespaceContext } from 'libs/shared/components/text/Text';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport {\n Config, CurrentUser,\n DirectShare, PopupViewProps, ShareLink, ShareRecipient, UserCollection, YearGroup\n} from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nimport { SharableEntityType, SharableRecipient, ShareViewHelper } from './ShareViewHelper';\n\nconst namespace = 'shared.share';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getTitle(type: SharableEntityType): string {\n switch (type) {\n case 'video': return getPhrase('titleVideo');\n case 'clip': return getPhrase('titleClip');\n case 'interactive': return getPhrase('titleInteractive');\n case 'series': return getPhrase('titleSeries');\n case 'playlist': return getPhrase('titlePlaylist');\n case 'subject': return getPhrase('titleTopic');\n }\n}\n\nfunction getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n}\n\n/**\n * I realise these are all the same right now, but they're technically different things - Sha\n */\nconst canEmbed = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\nconst canAddPolicies = (type: SharableEntityType) => type === 'video' || type === 'interactive' || type === 'clip';\n\ntype ShareScreen = 'main' | 'link-settings' | 'copy-embed';\n\ninterface ShareViewProps extends PopupViewProps {\n entityId: string;\n entityType: SharableEntityType;\n emptyStateImageUrl: string;\n errorStateImageUrl: string;\n gatewayApiUrl?: string;\n integrationSettingAppLink?: AppLink;\n messagePopupAppLink?: AppLink;\n enableIntegrationBanner?: boolean;\n}\n\nexport function ShareView(props: ShareViewProps): JSX.Element {\n const dispatch = useDispatch();\n\n const alerts = useAlerts();\n\n // If the gateway api url is passed down in props and not pulled from the config, we don't need to fetch the user token\n const shouldFetchUserToken = !props.gatewayApiUrl;\n\n /**\n * Our screen is initially set to null, and it is set to it's initial state\n * by ShareViewHelper.useRestrictionWarning.\n */\n const [ screen, setScreen ] = React.useState<ShareScreen>('main');\n\n const { hasPermissions, hasLocalPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const entity = ShareViewHelper.getFetchFunctionByType(props.entityType)(props.entityId, currentUser.data?.id);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const userToken = Flight.useBasicFetch<HashObject>(shouldFetchUserToken && UserRequests.token());\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.entityId));\n const sentDirectShare = Flight.useBasicFetch<DirectShare>(\n ShareRequests.getSentDirectShareByObjectId(props.entityId)\n );\n const recipients = Flight.useBasicFetch<SharableRecipient[]>(currentUser.data?.customerId &&\n ShareViewHelper.getDirectShareRecipientsRequest(currentUser.data.customerId, sentDirectShare.data));\n\n const recentlySharedToIds = currentUser.data && RecentShareHelper.getRecentlySharedTo(currentUser.data.id);\n\n const hasRecentlySharedRecipients = !!recentlySharedToIds?.length;\n const recentlySharedTo = Flight.useBasicFetch<SharableRecipient[]>(hasRecentlySharedRecipients &&\n ShareRequests.getRecipientsById(recentlySharedToIds, currentUser.data.customerId));\n\n const privacy = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequests.getPrivacy(props.entityId));\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const {\n shareToGoogleClassroom,\n shareToMicrosoftTeams,\n shareOverrideRestrictions,\n isLoadingSettings\n } = useSettings(null);\n\n /**\n * We need to manually re-fetch the recipients they're updated on the directShare object.\n * See ShareRequests.getDirectShareRecipientsById for an explanation\n * of why we are doing this.\n */\n function fetchRecipients(customerId: string, directShare: DirectShare): void {\n if (directShare.recipients?.length)\n Flight.getFetch(dispatch)(ShareViewHelper.getDirectShareRecipientsRequest(customerId, directShare));\n }\n\n function fetchRecipientUsers(id: string, callback: (users: UserCollection) => void): void {\n Flight.getFetch(dispatch)(ShareRequests.getRecipientUsers(id, callback));\n }\n\n function onClickCreateLink(): void {\n if (shareLink.data)\n return;\n\n ShareViewHelper.createLink({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n alerts\n });\n }\n\n function onClickSaveLink(data: EditShareLinkRequest, onError: () => void): void {\n ShareViewHelper.updateLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n data,\n alerts,\n () => setScreen('main'),\n onError\n );\n }\n\n function onClickDeleteLink(): void {\n ShareViewHelper.deleteLink(\n dispatch,\n entity.data,\n props.entityType,\n shareLink.data,\n alerts,\n () => setScreen('main')\n );\n }\n\n function onClickShare(recipients: SharableRecipient[], message: string, onDone?: () => void): void {\n const shareRecipients = recipients.map(s => ({ id: s.id, typeId: s.typeId })) as ShareRecipient[];\n\n ShareViewHelper.createOrUpdateDirectShare({\n dispatch,\n entity: entity.data,\n entityType: props.entityType,\n currentUser: currentUser.data,\n recipients: shareRecipients,\n message,\n sentDirectShare: sentDirectShare.data,\n onSuccess: directShare => {\n fetchRecipients(currentUser.data.customerId, directShare);\n alerts.success({\n heading: DefaultAlertHeading.Success,\n message: getPhrase('directShareSuccess', { object: entity.data.name, recipients: ShareViewHelper.getShareRecipientsPhrase(recipients) }),\n type: AlertType.Success\n });\n },\n onError: () => alerts.error(getPhrase('directShareError', { name: entity.data.name })),\n onDone\n });\n }\n\n function onClickRemoveRecipient(recipientId: string, onError?: () => void): void {\n ShareViewHelper.removeDirectShareRecipient(\n dispatch,\n recipientId,\n props.entityType,\n sentDirectShare.data,\n directShare => fetchRecipients(currentUser.data.customerId, directShare),\n () => {\n alerts.error(getPhrase('removeDirectShareError'));\n onError && onError();\n }\n );\n }\n\n function onClickSavePrivacy(privacy: SharePrivacy, overrideRestrictions: boolean): void {\n if (privacy === 'private') {\n onClickDeleteLink();\n return;\n }\n\n Flight.fetch(\n dispatch,\n ShareRequests.updatePrivacy(\n shareLink.data.id,\n privacy,\n overrideRestrictions,\n () => alerts.success(getPhrase('privaciesSuccess', { name: entity.data.name })),\n () => alerts.error(getPhrase('privaciesError', { name: entity.data.name }))\n )\n );\n }\n\n function getSearchRequestHeaders(): HashObject {\n if (!shouldFetchUserToken)\n return null;\n\n return {\n authorization: `Bearer ${userToken.data.value}`\n };\n }\n\n /**\n * We are intentionally not checking to see if recipients.data or recentlySharedTo.data\n * have loaded because:\n * 1. Adding the first recipient will trigger fetching recipients for the first time\n * which would trigger the loading spinner.\n * 2. Adding and recipient will update the list of recently shared to which causes\n * recentlySharedTo to be re-fetched.\n */\n const dataLoaded = !!currentUser.data\n && !!config.data\n && (!shouldFetchUserToken || !!userToken.data)\n && !!sentDirectShare.hasCompleted\n && !!privacy.data\n && !!entity.data\n && !isLoadingSettings\n && !!yearGroups.hasCompleted;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getTitle(props.entityType)}\n closePopup={props.closePopup}\n showLoadingSpinner={!dataLoaded}\n contentClassName={(dataLoaded && screen) ? 'bg-transparent border-0' : ''}\n bodyClassName='p-0'\n >\n {(() => {\n if (!dataLoaded)\n return <></>;\n\n switch (screen) {\n case 'main':\n return (\n <MainShare\n shareLink={shareLink.data}\n shareLinkIsLoading={shareLink.isFetching}\n entity={entity.data}\n entityType={props.entityType}\n directShareRecipients={recipients.data || []}\n recentlySharedTo={recentlySharedTo.data || []}\n onClickCreateLink={onClickCreateLink}\n onClickShowSettings={() => setScreen('link-settings')}\n onClickShare={onClickShare}\n onClickRemoveRecipient={onClickRemoveRecipient}\n onClickGetEmbedCode={() => setScreen('copy-embed')}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n gatewayApiUrl={props.gatewayApiUrl || config.data.gatewayApiUrl}\n imageCdnUrl={config.data.imageCdnUrl}\n searchRequestHeaders={getSearchRequestHeaders()}\n currentUser={currentUser.data}\n fetchRecipientUsers={fetchRecipientUsers}\n privacy={privacy.data}\n onClickSavePrivacy={onClickSavePrivacy}\n canAddPolicies={canAddPolicies(props.entityType)}\n emptyStateImageUrl={props.emptyStateImageUrl}\n errorStateImageUrl={props.errorStateImageUrl}\n integrations={getEnabledIntegrations(shareToGoogleClassroom, shareToMicrosoftTeams)}\n integrationSettingAppLink={props.integrationSettingAppLink}\n messagePopupAppLink={props.messagePopupAppLink}\n closePopup={props.closePopup}\n enableIntegrationBanner={props.enableIntegrationBanner}\n canEmbed={canEmbed(props.entityType)}\n yearGroups={yearGroups.data}\n shareOverrideRestrictions={shareOverrideRestrictions}\n hasLocalPermissions={hasLocalPermissions}\n />\n );\n case 'link-settings':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <ShareSettings\n entity={entity.data}\n entityType={props.entityType}\n config={config.data}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickSaveLink={onClickSaveLink}\n onClickDeleteLink={onClickDeleteLink}\n onClickCancel={() => setScreen('main')}\n privacy={privacy.data}\n hasStudentExp={hasPermissions(PermissionName.StudentExperience)}\n shareOverrideRestrictions={shareOverrideRestrictions}\n />\n </div>\n );\n case 'copy-embed':\n return (\n <div className='bg-white p-3 rounded-bottom-3'>\n <CopyEmbed\n entity={entity.data}\n entityType={props.entityType}\n liteUrl={config.data.liteUrl}\n shareLink={shareLink.data}\n entityId={props.entityId}\n analyticsOptions={ShareViewHelper.getAnalyticsOptions(props.entityType)}\n onClickCancel={() => setScreen('main')}\n />\n </div>\n );\n }\n })()}\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n"],"x_google_ignoreList":[11,12,13,14],"mappings":"21CAgBA,EAAA,CAAA,UAAA,QAAA,CAIA,GAAA,6YAQA,SAAA,GAAA,EAAA,EAAA,CACE,MAAA,mNAQF,IAAA,EAAA,uBAMI,MAAA,kHAcA,MAAA,uGAQA,EAAA,MAAA,2EAKA,MAAA,8LAUA,MAAA,oIAWA,MAAA,uJAaA,MAAA,6QAsBA,MAAA,yKAgBM,CAAA,EAAA,IAAA,EAAA,WAAA,OAAA,EAGA,uHAqBN,MAAA,8MAiBM,EAAA,GAGA,cAHA,oEAwBN,MAAA,2HASA,OAFA,EAAA,MAAA,CAEA,iHAUA,MAAA,kLAaA,OAHA,IAAA,EAAA,OAAA,GAGA,wHAUA,MAAA,6GAUI,yEAcJ,MAAA,mPAoBA,MAAA,4OAmBA,MAAA,wOAkBA,MAAA,+MAYA,MAAA,mGAcA,MAAA,0NAoBA,MAAA,uJAaA,MAAA,sFCnYE,GAAwB,EAQjB,EAAmB,CAC9B,cAAc,EAAkB,EAA2B,EAAkB,GAAgB,CAC3F,IAAI,EAAc,EAAS,EAAW,SAAS,EAAS,CAAG,EAAW,IAAI,EAAS,CAKnF,OAHK,MAAM,QAAQ,EAAY,GAC7B,EAAc,EAAE,EAEX,GAGT,cAAc,EAAkB,EAAe,EAA2B,EAAwB,CAC3F,SAAM,QAAQ,EAAI,CAGvB,IAAI,EAAQ,CACV,EAAW,SAAS,EAAU,EAAI,CAClC,OAGF,EAAW,IAAI,EAAU,EAAI,GAG/B,cAAc,EAAkB,EAA2B,EAAyC,CAClG,GAAM,CAAE,KAAI,QAAQ,GAAuB,SAAS,IAAS,EAEzD,EAAc,EAAiB,cAAc,EAAU,EAAY,EAAO,CAExE,EAAU,EAAY,QAAQ,EAAG,CAgBvC,OAVI,EAAU,IACZ,EAAY,OAAO,EAAS,EAAE,CAEhC,EAAY,QAAQ,EAAG,CAEnB,EAAY,OAAS,IACvB,EAAc,EAAY,MAAM,EAAG,EAAM,EAE3C,EAAiB,cAAc,EAAU,EAAa,EAAY,EAAO,CAElE,GAGT,iBAAiB,EAAkB,EAAY,EAAiC,CAE9E,IAAM,EADQ,EAAiB,cAAc,EAAU,EAAW,CAC5C,OAAO,GAAK,IAAM,EAAG,UAAU,CAAC,CACtD,EAAiB,cAAc,EAAU,EAAS,EAAW,EAEhE,CCzDK,GAAe,GAAmB,sBAAsB,IAOjD,GAAoB,CAI/B,oBAAoB,EAA0B,CAC5C,OAAO,EAAiB,cAAc,GAAY,EAAO,CAAE,GAAmB,EAGhF,oBAAoB,EAAgB,EAA0C,CAC5E,OAAO,EAAiB,cAAc,GAAY,EAAO,CAAE,GAAoB,EAAQ,EAE1F,OCfK,GAAY,kBAUlB,SAAgB,GAAU,EAA2C,CACnE,GAAM,CACJ,WACA,cACA,YACA,eACA,cACE,EAEJ,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,CACG,CAAC,CAAC,EAAW,SACZ,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,YAAc,CAAA,CAC7C,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAS,OAAV,CAAiB,GAAG,mBAAmB,QAAQ,wBAC5C,EAAU,MACK,CAAA,EAElB,EAAA,EAAA,KAAC,EAAS,KAAV,CAAA,SACG,EAAW,IAAI,IACd,EAAA,EAAA,KAAC,EAAS,KAAV,CAEE,YAAe,EAAa,EAAK,UAEhC,EAAK,MACQ,CAJT,GAAG,EAAK,MAAM,GAAG,EAAK,SAIb,CAChB,CACY,CAAA,CACP,CAAA,CAAA,CACP,CAAA,CACL,CAAA,CAAA,EAEL,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,WAAa,CAAA,CAC5C,CAAA,EACN,EAAA,EAAA,KAAC,GAAD,CAAU,GAAG,oBAAoB,QAAS,EAAU,aAAgB,EAAY,CAAC,EAAA,CAAa,CAAA,IC3CpG,IAAa,GAAb,KAAsD,CAMpD,YAAY,EAA6C,CACvD,KAAK,QAAQ,EAAQ,CAGvB,QAAkB,EAAmD,CACnE,GAAM,CAAE,mBAAkB,KAAI,OAAM,UAAW,EAE3C,IACF,KAAK,GAAK,GAER,IACF,KAAK,KAAO,GAEV,IACF,KAAK,OAAS,GAEZ,IACF,KAAK,iBAAmB,GAG5B,UAA0B,CAQxB,MAPe,CACb,KAAK,iBACL,KAAK,GACL,KAAK,KACL,KAAK,OACN,CAEa,OAAO,QAAQ,CAAC,KAAK,IAAI,CAGzC,UAA8B,CAC5B,IAAM,EAAqB,EAAE,CAQ7B,OANI,KAAK,OACP,EAAO,KAAO,KAAK,kBAAkB,CAAC,aAAa,EAEjD,KAAK,SACP,EAAO,OAAS,KAAK,QAEhB,EAGT,kBAAqC,CAGnC,OAFA,EAAY,MAAM,IAAI,EAAS,+EAA+E,CAAC,CAExG,KC/DE,GAAb,cAAuD,EAAyB,CAC9E,YAAY,EAAY,EAAiB,GAAI,CAC3C,MAAM,CAAE,iBAAkB,kBAAmB,KAAI,SAAQ,CAAC,GCAjD,GAA4B,CACvC,eAAe,EAA4C,CACzD,MAAQ,IAAoB,CAC1B,IAAM,EAAe,CAAE,GAAG,EAAO,CAKjC,OAHI,EAAa,eAAe,EAAI,EAClC,OAAO,EAAa,GAEf,IAIX,oBAAoB,EAAa,EAA8C,CAC7E,MAAQ,IAAoB,CAC1B,IAAM,EAAe,CAAE,GAAG,EAAO,CAYjC,OAVK,EAAa,eAAe,EAAI,EAGhC,EAAa,GAAK,SACrB,EAAa,GAAK,OAAS,EAAE,EAE/B,EAAa,GAAK,OAAO,MAAQ,EAAa,GAAK,OAAO,MACxD,EAAa,GAAK,OAAO,MAAQ,EACjC,EAEK,GATE,IAYd,CCtBY,GAAgB,CAC3B,QAA8B,EAAY,EAAgB,EAAkC,CAC1F,GAAI,IAAW,EACb,MAAO,CAAE,eAAgB,EAAO,eAAgB,KAAM,CAExD,IAAM,EAAsB,EAAY,SAAS,EAAO,EAAQ,EAAO,CAMjE,EAAsB,EAAS,EAAM,OAAS,EAClD,EAAe,EAAS,GAAG,GAC3B,KAOF,MAAO,CAAE,iBAAgB,eALc,CACrC,eAAgB,EAAe,GAAQ,GACvC,sBACD,CAEwC,EAG3C,YACE,EACA,EACA,EAC8B,CAC9B,IAAM,EAAsB,EAAE,CACxB,EAAc,EAAa,UAAU,EAAK,CAE1C,EAAO,CAAC,EAAW,CACrB,EAAO,EAAK,GACV,EAAW,CAAC,CAAC,GAAQ,CAAC,CAAC,EAAK,MAAQ,EAAK,KAAK,OAKpD,KAAO,GACA,MAAM,QAAQ,EAAK,KAAK,EADlB,CAIX,EAAM,KAAK,GAAG,EAAK,KAAqB,CAExC,IAAM,EAAa,EAAK,YACnB,EAAK,WAAW,SAChB,EAAK,WAAW,QAAQ,KAEvB,EAAU,CAAC,CAAC,GAAc,GAAG,EAAW,GAAG,IAEjD,EAAO,GAAc,EAAK,GAEtB,GACF,EAAK,KAAK,EAAQ,CAGtB,GAAI,CAAC,EAAM,OACT,OAAO,EAKT,IAAM,EAAY,EAAY,UAAU,EAAO,GAAK,EAAE,KAAO,EAAe,eAAe,CAEvF,EAAiB,CAAC,GAAG,EAAM,CAEzB,EAAa,EAAe,OAAO,EAAW,EAAE,CAEhD,EAAY,EAAe,oBAC/B,EAAY,UAAU,EAAgB,GAAK,EAAE,KAAO,EAAe,oBAAoB,CACvF,EAAe,OAcjB,OAZA,EAAe,OAAO,EAAW,EAAG,EAAW,GAAG,CAElD,EAAiB,EAAe,IAAI,IAAM,CAAE,GAAI,EAAE,GAAI,EAAE,CAKxD,EAAK,QAAQ,GAAO,CAClB,IAAM,EAAgB,EAAe,OAAO,EAAG,EAAS,CACxD,EAAY,GAAK,KAAO,GACxB,CAEK,GAEV,CChFY,GAAmB,CAE9B,iBAAiB,EAAoE,CACnF,GAAM,CAAE,OAAM,QAAS,EAEjB,EAAqB,CACnB,OACN,uBAAwB,gBACxB,MAAO,cAAc,EAAqB,oBAAoB,iCAC/D,CAKD,OAHI,EAAqB,SACvB,EAAO,OAAS,EAAqB,QAEhC,CACL,IAAK,EAAU,WAAW,+BAA+B,IAAQ,EAAO,CACxE,IAAK,EAAqB,UAAA,CAC3B,EAGH,YAAY,EAAY,EAA+B,EAAmD,CACxG,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,GAAG,EAAqB,SAAS,iCACzC,CAAC,CACF,UAAW,EAAU,WAAW,gBAAgB,IAAM,CACpD,MAAO,GAAG,EAAqB,SAAS,sBACzC,CAAC,CACF,IAAK,YAAY,IACjB,UACA,QACD,EAGH,kBACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAC9C,MAAO,GAAG,EAAqB,SAAS,iCACxC,UACD,CAAC,CACF,IAAK,mBAAmB,EAAG,GAAG,IAC9B,UACA,QACD,EAGH,8BAA8B,EAA4B,CACxD,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,GAAG,EAAqB,SAAS,iHACzC,CAAC,CACF,IAAK,YAAY,EAAG,kBACrB,EAGH,kBAAkB,EAAY,EAAuC,CACnE,GAAM,CAAE,mBAAkB,kBAAiB,eAAgB,EAErD,EAAqB,CACzB,MAAO,WAAW,EAAiB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,WAAW,EAAgB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,kBAAkB,EAAY,kCAC5N,uBAAwB,EAAuB,cAChD,CAKD,OAHI,IACF,EAAO,OAAS,GAEX,CACL,IAAK,EAAU,WAAW,wBAAwB,EAAG,UAAW,EAAO,CACvE,UAAW,EAAU,WAAW,gBAAgB,EAAG,UAAW,EAAO,CACrE,IAAK,YAAY,EAAG,SAAS,EAAS,IAAI,IAAW,KACtD,EAGH,wBAAwB,EAAY,EAAiB,EAAiC,CACpF,GAAM,CAAE,mBAAkB,kBAAiB,eAAgB,EAErD,EAAqB,CACzB,MAAO,WAAW,EAAiB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,WAAW,EAAgB,YAAY,EAAe,UAAU,GAAG,EAAe,SAAS,kBAAkB,EAAY,kCAC5N,uBAAwB,EAAuB,cAC/C,UACD,CAKD,OAHI,IACF,EAAO,OAAS,GAEX,CACL,IAAK,EAAU,WAAW,gBAAgB,EAAG,UAAW,EAAO,CAC/D,IAAK,mBAAmB,EAAG,GAAG,EAAQ,UAAU,IACjD,EAGH,uBAAuB,EAAkC,CACvD,IAAM,EAAS,oBAAoB,EAAe,UAAU,GAAG,EAAe,SAAS,IACvF,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,CACtD,MAAO,kBAAkB,EAAO,iBAAiB,EAAO,wBAAwB,IACjF,CAAC,CACF,UAAW,EAAU,WAAW,gBAAgB,IAAM,CACpD,MAAO,kBAAkB,EAAO,iBAAiB,EAAO,wBAAwB,IACjF,CAAC,CACF,IAAK,kBAAkB,IACvB,UAAW,GACZ,EAGH,6BACE,EACA,EACgB,CAChB,IAAM,EAAS,oBAAoB,EAAe,UAAU,GAAG,EAAe,SAAS,IACvF,MAAO,CACL,IAAK,EAAU,WAAW,gBAAgB,IAAM,CAC9C,MAAO,kBAAkB,EAAO,iBAAiB,EAAO,wBAAwB,IAChF,UACD,CAAC,CACF,IAAK,yBAAyB,EAAG,GAAG,IACpC,UAAW,GACZ,EAGH,kBAAkB,EAAiB,EAAgB,EAAiC,CAClF,MAAO,CACL,IAAK,wBAAwB,EAAQ,wCAAwC,EAAO,IACpF,IAAK,mBAAmB,IAAU,EAAS,UAAY,KACxD,EAGH,eACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,kBACL,IAAK,wBAAwB,EAAO,YACpC,OACA,KAAM,EAAU,KAChB,UACA,QACA,SACA,iBAAkB,iBACnB,EAGH,eACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,kBACL,IAAK,wBAAwB,IAC7B,OACA,KAAM,EAAU,IAChB,UACA,QACA,SACD,EAGH,eACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,kBACL,IAAK,wBAAwB,IAC7B,KAAM,EAAU,OAChB,UACA,QACA,SACA,iBAAkB,iBAClB,YAAa,CACX,KAAM,YAAY,IAClB,WAAY,GAA0B,eAAe,YAAY,IAAA,EAEpE,EAGH,aACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,8BACL,IAAK,gBACL,KAAM,CAAE,WAAY,EAAI,CACxB,KAAM,EAAU,KAChB,iBAAkB,iBAClB,UACA,QACA,SACD,EAGH,cACE,EACA,EACA,EACA,EACgB,CAOhB,IAAM,EAAmB,CACvB,iBACC,IAAI,GAAkC,EAAW,CAAE,UAAU,CAC9D,YAAY,EAAW,SACxB,CAED,EAAO,QAAQ,GAAS,CACtB,EAAiB,KAAK,mBAAmB,EAAM,KAAK,EACpD,CAEF,IAAM,EAAO,EAAO,QAAQ,EAAiB,KACvC,EAAY,OAAO,EAAM,GACvB,MAAM,QAAQ,EAAI,MAAM,CAC1B,EAAI,MAAM,KAAK,CAAE,GAAI,EAAM,GAAI,CAAC,CAEhC,EAAI,MAAQ,CAAC,CAAE,GAAI,EAAM,GAAI,CAAC,EAG9B,EAAY,cAAc,EAAM,GAC9B,MAAM,QAAQ,EAAI,aAAa,CACjC,EAAI,aAAa,KAAK,CAAE,GAAI,EAAM,GAAI,CAAC,CAEvC,EAAI,aAAe,CAAC,CAAE,GAAI,EAAM,GAAI,CAAC,EAGrC,EAAY,QAAQ,EAAM,GACxB,MAAM,QAAQ,EAAI,OAAO,CAC3B,EAAI,OAAO,KAAK,CAAE,GAAI,EAAM,GAAI,CAAC,CAEjC,EAAI,OAAS,CAAC,CAAE,GAAI,EAAM,GAAI,CAAC,EAG5B,GACN,EAAE,CAAC,CAEN,MAAO,CACL,IAAK,mBAAmB,EAAW,GAAG,EAAO,IAAI,GAAK,EAAE,GAAG,CAAC,KAAK,IAAI,GACrE,IAAK,wBAAwB,IAC7B,KAAM,EACN,KAAM,EAAU,IAChB,UACA,QACA,mBACA,YAAa,CACX,KAAM,YAAY,IAClB,WAAY,GAA0B,oBAAoB,YAAY,IAAc,EAAO,OAAA,CAC5F,CACD,UAAW,GACZ,EAGH,oBACE,EACA,EACA,EACA,EACA,EACgB,CAChB,IAAI,EAAU,wBAAwB,IAStC,OAPI,IAAW,EAAW,KACxB,GAAW,SACJ,IAAW,EAAW,YAC7B,GAAW,gBAEX,GAAW,UAEN,CACL,IAAK,wBACL,IAAK,EAAU,WAAW,EAAS,CAAE,SAAU,EAAS,CAAC,CACzD,KAAM,EAAU,OAChB,UACA,QAEA,iBAAkB,CAChB,iBACA,YAAY,EAAW,SACvB,mBAAmB,IACnB,YAAY,KAEf,EAGH,uBAAuB,EAAoB,EAAgC,CAKzE,MAAO,CACL,IAAK,wBAAwB,EAAO,+BAA+B,EAAW,GAC9E,IAAK,YAAY,EAAW,aAAa,IACzC,WAPyD,IACzD,CAAE,SAAU,EAAY,YAAa,CAAC,CAAC,GAAM,MAAM,OAAQ,EAO3D,UAAW,GACZ,EAGH,eACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,wBAAwB,IAC7B,IAAK,mBAAmB,IACxB,KAAM,CAAE,kBAAmB,EAAY,CACvC,KAAM,EAAU,IAChB,iBAAkB,CAAE,iBAAkB,YAAY,IAAc,kBAAmB,CACnF,UACA,QACA,SACD,EAGH,iBACE,EACA,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,wBAAwB,EAAO,8BAA8B,IAClE,IAAK,qBAAqB,IAC1B,KAAM,EAAU,OAChB,iBAAkB,CAAE,iBAAkB,YAAY,IAAc,kBAAmB,CACnF,UACA,QACA,SACD,EAIH,cACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,mBACL,IAAK,0BAA0B,EAAG,UAClC,KAAM,EACN,KAAM,EAAU,IAChB,UACA,QAEA,iBAAkB,iBAClB,YAAa,CACX,KAAM,YAAY,EAAG,SACrB,WAAa,GACX,GAAc,YAAY,YAAY,EAAG,SAAU,EAAgB,EAAA,EAExE,EAGH,kBAAkB,EAA4B,CAC5C,MAAO,CACL,IAAK,wBAAwB,EAAG,sBAChC,IAAK,6BAA6B,IACnC,EAEJ,CCzYK,GAAY,CAChB,cAAe,EAAY,IAAoB,EAAU,WAAW,gBAAgB,IAAM,CACxF,MAAO,EAAqB,OAC5B,UACD,CAAC,CACF,kBAAmB,EAAY,EAAqB,IAC3C,wBAAwB,EAAG,8DAA8D,EAAW,GAE9G,CAEY,GAAiB,CAC5B,OAAO,EAAkC,CACvC,IAAM,EAAiB,CAAE,MAAO,EAAqB,OAAQ,CAE7D,MAAO,CACL,IAAK,EAAU,WAAW,wBAAwB,IAAM,EAAe,CACvE,UAAW,EAAU,WAAW,gBAAgB,IAAM,EAAe,CACrE,IAAK,UAAU,IAChB,EAEH,aAAa,EAAY,EAAiC,CACxD,MAAO,CACL,IAAK,GAAU,aAAa,EAAI,EAAQ,CACxC,IAAK,iBAAiB,EAAG,GAAG,IAC7B,EAEH,iBAAiB,EAAY,EAAqB,EAAmB,CACnE,MAAO,CACL,IAAK,GAAU,iBAAiB,EAAI,EAAW,CAC/C,IAAK,UAAU,EAAG,eAAe,IAClC,EAEH,4BAA4B,EAA4B,CACtD,MAAO,CACL,IAAK,wBAAwB,EAAG,iEAChC,IAAK,UAAU,EAAG,kBACnB,EAEH,aAAa,EAAY,EAAiB,EAAsB,EAAuC,CACrG,IAAM,EAAa,GAAgB,kBAAkB,EAAK,CAEpD,EAAM,CAAE,SAAU,EAAI,SAAU,EAAQ,EAAM,CAAC,OAAO,GAAK,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAE/E,MAAO,CACL,IAAK,EAAU,WAAW,4BAA4B,EAAG,SAAU,CACjE,MAAO,IAAI,EAAW,GAAG,EAAqB,mBAC9C,SACD,CAAC,CACF,UAAW,EAAU,WAAW,4BAA4B,EAAG,SAAU,CACvE,MAAO,IAAI,EAAW,GAAG,GAAoB,mBAC7C,SACD,CAAC,CACF,MACD,EAEJ,CChCK,EAAY,EAAgB,iBADhB,eAC2C,CAEhD,EAAkB,CAC7B,gBAAgB,EAAsC,CACpD,OAAQ,EAAR,CACE,IAAK,QACH,OAAO,EAAW,MAEpB,IAAK,WACH,OAAO,EAAW,SAEpB,IAAK,UACH,OAAO,EAAW,QAEpB,IAAK,SACH,OAAO,EAAW,OAEpB,IAAK,cACH,OAAO,EAAW,YAEpB,IAAK,OACH,OAAO,EAAW,OAIxB,WAAW,EAQF,CACP,IAAM,EAAW,GAA4B,CAC3C,EAAgB,cACd,CAAE,GAAG,EAAc,WAAY,EAAQ,OAAO,KAAM,CACpD,EAAgB,aAAa,EAAgB,oBAAoB,EAAQ,WAAW,CAAE,CACpF,WAAY,EAAW,OACvB,OAAQ,EAAW,UACnB,aAAc,EAAa,GAC5B,CAAC,CACH,CAEG,EAAQ,SACV,EAAQ,QAAQ,EAAa,EAG3B,MAAc,CAClB,EAAQ,OAAO,MAAM,EAAU,kBAAmB,CAAE,KAAM,EAAQ,OAAO,KAAM,CAAC,CAAC,EAG7E,EAA+B,CACnC,WAAY,EAAQ,OAAO,GAC3B,qBAAsB,GACvB,CAEG,EAAQ,WACV,EAAK,SAAW,EAAQ,UAEtB,EAAQ,iBACV,EAAK,eAAiB,EAAQ,gBAEhC,EAAa,EAAQ,SAAU,EAAc,gBAAgB,EAAM,EAAS,EAAM,CAAC,EAGrF,WACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACM,CAwBN,EAAa,EAAU,EAAc,cAAc,EAAW,EAvB7C,GAAgC,CAC/C,EAAgB,cACd,CAAE,GAAG,EAAkB,WAAY,EAAO,KAAM,CAChD,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,KACvB,OAAQ,EAAW,UACnB,aAAc,EAAa,GAC5B,CAAC,CACH,CAEG,GACF,EAAU,EAAiB,CAE7B,EAAO,QAAQ,EAAU,cAAe,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,MAG/D,CACd,GACF,GAAS,CAEX,EAAO,MAAM,EAAU,YAAa,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,EAGI,CAAC,EAGtF,WACE,EACA,EACA,EACA,EACA,EACA,EACA,EACM,CAyBN,EAAa,EAAU,EAAc,gBAAgB,MAxB/B,CACpB,EAAgB,cACd,CAAE,GAAG,EAAW,WAAY,EAAO,KAAM,CACzC,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,OACvB,OAAQ,EAAW,UACpB,CAAC,CACH,CAEG,GACF,GAAW,CAEb,EAAO,QAAQ,EAAU,gBAAiB,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,MAGjE,CAClB,EAAO,MAAM,EAAU,cAAe,CAAE,KAAM,EAAO,KAAM,WAAY,GAAM,CAAC,CAAC,MAG5D,CACf,GACF,GAAQ,EAG2E,CAAC,EAG1F,0BAA0B,EAWjB,CACP,GAAM,CACJ,WAAU,SAAQ,aAAY,cAAa,aAAY,kBAAiB,UACxE,YAAW,UAAS,UAClB,EAEE,EAAW,GAAoC,CAC/C,GACF,EAAU,EAAmB,CAE/B,EAAgB,cACd,CACE,GAAI,EAAO,GACX,KAAM,EAAO,KACb,WAAY,EAAW,OACxB,CACD,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,MACvB,WAAY,EAAiB,YAC7B,aAAc,EAAa,GAC5B,CAAC,CACH,CAED,EAAW,IAAI,GAAa,CAC1B,GAAkB,oBAAoB,EAAY,GAAI,CAAE,GAAI,EAAU,GAAI,CAAC,EAC3E,EAGE,EAAuC,CAC3C,SAAU,EAAO,GACjB,aAAc,EAAgB,gBAAgB,EAAW,CACzD,aACA,UACD,CAEK,EAAqC,CACzC,aACA,UACD,CAMD,EAAa,EAJG,EACd,EAAc,4BAA4B,EAAgB,GAAI,EAAY,EAAS,EAAS,EAAO,CACnG,EAAc,kBAAkB,EAAY,EAAS,EAAS,EAAO,CAExC,EAGjC,2BACE,EACA,EACA,EACA,EACA,EACA,EACM,CAaN,EACE,EACA,EAAc,2BACZ,EAAgB,GAChB,EAhBa,GAAoC,CAC/C,GACF,EAAU,EAAmB,CAE/B,EAAgB,cACd,CAAE,WAAY,EAAG,CACjB,EAAgB,aAAa,EAAgB,oBAAoB,EAAW,CAAE,CAC5E,WAAY,EAAW,QACxB,CAAC,CACH,EASC,EACD,CACF,EAGH,gCAAgC,EAAoB,EAA2C,CAG7F,MAFsB,CAAC,CAAC,GAAa,YAAY,QAG/C,EAAc,6BAA6B,EAAY,GAAI,EAAY,WAAY,EAAW,EAGlG,mBAAmB,EAAgC,CACjD,OAAQ,EAAR,CACE,IAAK,WACH,OAAO,EAAW,SACpB,IAAK,UACH,OAAO,EAAW,eACpB,IAAK,QACH,OAAO,EAAW,MACpB,IAAK,SACH,OAAO,EAAW,OACpB,IAAK,cACH,OAAO,EAAW,YACpB,IAAK,OACH,OAAO,EAAW,OAIxB,oBAAoB,EAAkD,CACpE,MAAO,CACL,OAAQ,EAAgB,mBAAmB,EAAW,CACtD,SAAU,EAAgB,MAC1B,cAAe,EAAc,SAC9B,EAGH,uBAAyB,GAA6B,CACpD,OAAQ,EAAR,CACE,IAAK,QACH,MAAQ,IAAe,EAA4B,GAAc,MAAM,EAAG,CAAC,CAG7E,IAAK,WACH,MAAQ,IAAe,EAA+B,GAAiB,YAAY,EAAG,CAAC,CAGzF,IAAK,UACH,OAAQ,EAAY,IACX,EAAqC,GAAuB,eAAe,EAAI,EAAO,CAAC,CAIlG,IAAK,SACH,MAAQ,IAAe,EAA6B,GAAe,OAAO,EAAG,CAAC,CAGhF,IAAK,cACH,MAAQ,IACN,EAA0C,GAAoB,oBAAoB,EAAG,CAAC,CAG1F,IAAK,OACH,MAAQ,IACN,EAA2B,GAAa,KAAK,EAAG,CAAC,GAKzD,YAAY,EAAwC,CAgBlD,MAdI,cAAe,GAAoB,EAAe,UAC7C,EAAe,WAAW,IAE/B,eAAgB,GAAoB,EAAe,WAC9C,EAAe,YAAY,IAGhC,UAAW,EACN,EAAe,OAAO,IAG3B,eAAgB,EACX,EAAe,YAAY,IAE7B,IAGT,yBAAyB,EAA0B,CACjD,GAAI,CAAC,EAAW,OACd,OAEF,IAAI,EAA8C,EAAE,CAEpD,GAAI,EAAW,SAAW,EACxB,OAAO,EAAY,MAAM,EAAW,CAAC,KAGvC,EAAW,QAAQ,GAAK,CACtB,IAAI,EAEJ,OAAQ,EAAE,OAAV,CACE,KAAK,EAAW,KACd,EAAW,QACX,MAEF,KAAK,EAAW,UACd,EAAW,aACX,MAEF,KAAK,EAAW,eACd,EAAW,kBACX,MAGJ,IAAM,EAAgB,EAAW,IAAa,EAAE,CAEhD,EAAc,KAAK,EAAE,CAErB,EAAa,CACX,GAAG,GACF,GAAW,EAAY,KAAK,EAAA,CAC9B,EACD,CAEF,IAAM,EAAyB,EAAW,YACxC,CAAC,EAAW,iBACZ,CAAC,EAAW,MACR,EAAqB,EAAW,iBACpC,CAAC,EAAW,YACZ,CAAC,EAAW,MACR,EAAoB,EAAW,OACnC,CAAC,EAAW,YACZ,CAAC,EAAW,gBAEd,GAAI,EACF,OAAO,EAAU,aAAc,CAAE,WAAY,EAAW,WAAW,OAAQ,CAAC,CAE9E,GAAI,EACF,OAAO,EAAU,SAAU,CAAE,WAAY,EAAW,gBAAgB,OAAQ,CAAC,CAE/E,GAAI,EACF,OAAO,EAAU,QAAS,CAAE,WAAY,EAAW,MAAM,OAAQ,CAAC,CAEpE,IAAM,EAAkB,EAAE,CAEtB,EAAW,YAAY,QACzB,EAAgB,KAAK,EAAU,aAAc,CAAE,WAAY,EAAW,WAAW,OAAQ,CAAC,CAAC,CAEzF,EAAW,iBAAiB,QAC9B,EAAgB,KAAK,EAAU,SAAU,CAAE,WAAY,EAAW,gBAAgB,OAAQ,CAAC,CAAC,CAE1F,EAAW,OAAO,QACpB,EAAgB,KAAK,EAAU,QAAS,CAAE,WAAY,EAAW,MAAM,OAAQ,CAAC,CAAC,CAEnF,IAAM,EAAgB,EAAgB,KAAK,CAE3C,MAAO,GAAG,EAAgB,KAAK,KAAK,CAAC,GAAG,EAAU,MAAM,CAAC,GAAG,KAE/D,eC1ZD,EAAO,QAAU,UAAY,CAC3B,IAAI,EAAY,SAAS,cAAc,CACvC,GAAI,CAAC,EAAU,WACb,OAAO,UAAY,GAKrB,IAAK,IAHD,EAAS,SAAS,cAElB,EAAS,EAAE,CACN,EAAI,EAAG,EAAI,EAAU,WAAY,IACxC,EAAO,KAAK,EAAU,WAAW,EAAE,CAAC,CAGtC,OAAQ,EAAO,QAAQ,aAAa,CAApC,CACE,IAAK,QACL,IAAK,WACH,EAAO,MAAM,CACb,MAEF,QACE,EAAS,KACT,MAIJ,OADA,EAAU,iBAAiB,CACpB,UAAY,CACjB,EAAU,OAAS,SACnB,EAAU,iBAAiB,CAEtB,EAAU,YACb,EAAO,QAAQ,SAAS,EAAO,CAC7B,EAAU,SAAS,EAAM,EACzB,CAGJ,GACA,EAAO,OAAO,oBClClB,IAAI,EAAA,IAAA,CAEA,EAA4B,CAC9B,aAAc,OACd,YAAa,MACb,QAAW,OACZ,CAEG,EAAiB,mCAErB,SAAS,EAAO,EAAS,CACvB,IAAI,GAAW,YAAY,KAAK,UAAU,UAAU,CAAG,IAAM,QAAU,KACvE,OAAO,EAAQ,QAAQ,gBAAiB,EAAQ,CAGlD,SAAS,EAAK,EAAM,EAAS,CAC3B,IAAI,EACF,EACA,EACA,EACA,EACA,EACA,EAAU,GACZ,AACE,IAAU,EAAE,CAEd,EAAQ,EAAQ,OAAS,GACzB,GAAI,CAkDF,GAjDA,EAAmB,GAAiB,CAEpC,EAAQ,SAAS,aAAa,CAC9B,EAAY,SAAS,cAAc,CAEnC,EAAO,SAAS,cAAc,OAAO,CACrC,EAAK,YAAc,EAEnB,EAAK,WAAa,OAElB,EAAK,MAAM,IAAM,QAEjB,EAAK,MAAM,SAAW,QACtB,EAAK,MAAM,IAAM,EACjB,EAAK,MAAM,KAAO,mBAElB,EAAK,MAAM,WAAa,MAExB,EAAK,MAAM,iBAAmB,OAC9B,EAAK,MAAM,cAAgB,OAC3B,EAAK,MAAM,aAAe,OAC1B,EAAK,MAAM,WAAa,OACxB,EAAK,iBAAiB,OAAQ,SAAS,EAAG,CAExC,GADA,EAAE,iBAAiB,CACf,EAAQ,OAEV,GADA,EAAE,gBAAgB,CACP,EAAE,gBAAkB,OAAa,CAC1C,GAAS,QAAQ,KAAK,gCAAgC,CACtD,GAAS,QAAQ,KAAK,2BAA2B,CACjD,OAAO,cAAc,WAAW,CAChC,IAAI,EAAS,EAA0B,EAAQ,SAAW,EAA0B,QACpF,OAAO,cAAc,QAAQ,EAAQ,EAAK,MAE1C,EAAE,cAAc,WAAW,CAC3B,EAAE,cAAc,QAAQ,EAAQ,OAAQ,EAAK,CAG7C,EAAQ,SACV,EAAE,gBAAgB,CAClB,EAAQ,OAAO,EAAE,cAAc,GAEjC,CAEF,SAAS,KAAK,YAAY,EAAK,CAE/B,EAAM,mBAAmB,EAAK,CAC9B,EAAU,SAAS,EAAM,CAGrB,CADa,SAAS,YAAY,OAAO,CAE3C,MAAU,MAAM,gCAAgC,CAElD,EAAU,SACH,EAAK,CACZ,GAAS,QAAQ,MAAM,qCAAsC,EAAI,CACjE,GAAS,QAAQ,KAAK,2BAA2B,CACjD,GAAI,CACF,OAAO,cAAc,QAAQ,EAAQ,QAAU,OAAQ,EAAK,CAC5D,EAAQ,QAAU,EAAQ,OAAO,OAAO,cAAc,CACtD,EAAU,SACH,EAAK,CACZ,GAAS,QAAQ,MAAM,uCAAwC,EAAI,CACnE,GAAS,QAAQ,MAAM,yBAAyB,CAChD,EAAU,EAAO,YAAa,EAAU,EAAQ,QAAU,EAAe,CACzE,OAAO,OAAO,EAAS,EAAK,SAEtB,CACJ,IACE,OAAO,EAAU,aAAe,WAClC,EAAU,YAAY,EAAM,CAE5B,EAAU,iBAAiB,EAI3B,GACF,SAAS,KAAK,YAAY,EAAK,CAEjC,GAAkB,CAGpB,OAAO,EAGT,EAAO,QAAU,eChHjB,SAAS,EAAQ,EAAK,CAAE,0BAA2B,MAAO,GAAwB,OAAO,QAArB,YAA2C,OAAO,OAAO,UAA1B,SAAqC,SAAU,EAAK,CAAE,OAAO,OAAO,GAAS,SAAU,EAAK,CAAE,OAAO,GAAqB,OAAO,QAArB,YAA+B,EAAI,cAAgB,QAAU,IAAQ,OAAO,UAAY,SAAW,OAAO,GAAQ,EAAQ,EAAI,CAE7U,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,gBAAkB,IAAK,GAE/B,IAAI,EAAS,EAAA,GAAA,CAAwC,CAEjD,EAAmB,EAAA,IAAA,CAAoD,CAEvE,EAAY,CAAC,OAAQ,SAAU,UAAW,WAAW,CAEzD,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAW,EAAK,CAE9F,SAAS,EAAQ,EAAQ,EAAgB,CAAE,IAAI,EAAO,OAAO,KAAK,EAAO,CAAE,GAAI,OAAO,sBAAuB,CAAE,IAAI,EAAU,OAAO,sBAAsB,EAAO,CAAE,IAAmB,EAAU,EAAQ,OAAO,SAAU,EAAK,CAAE,OAAO,OAAO,yBAAyB,EAAQ,EAAI,CAAC,YAAc,EAAG,EAAK,KAAK,MAAM,EAAM,EAAQ,CAAI,OAAO,EAE9U,SAAS,EAAc,EAAQ,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAiB,UAAU,IAAlB,KAAsC,EAAE,CAAjB,UAAU,GAAS,EAAI,EAAI,EAAQ,OAAO,EAAO,CAAE,CAAC,EAAE,CAAC,QAAQ,SAAU,EAAK,CAAE,EAAgB,EAAQ,EAAK,EAAO,GAAK,EAAI,CAAG,OAAO,0BAA4B,OAAO,iBAAiB,EAAQ,OAAO,0BAA0B,EAAO,CAAC,CAAG,EAAQ,OAAO,EAAO,CAAC,CAAC,QAAQ,SAAU,EAAK,CAAE,OAAO,eAAe,EAAQ,EAAK,OAAO,yBAAyB,EAAQ,EAAI,CAAC,EAAI,CAAI,OAAO,EAEjf,SAAS,EAAyB,EAAQ,EAAU,CAAE,GAAI,GAAU,KAAM,MAAO,EAAE,CAAE,IAAI,EAAS,EAA8B,EAAQ,EAAS,CAAM,EAAK,EAAG,GAAI,OAAO,sBAAuB,CAAE,IAAI,EAAmB,OAAO,sBAAsB,EAAO,CAAE,IAAK,EAAI,EAAG,EAAI,EAAiB,OAAQ,IAAO,EAAM,EAAiB,GAAQ,IAAS,QAAQ,EAAI,EAAI,IAAkB,OAAO,UAAU,qBAAqB,KAAK,EAAQ,EAAI,GAAY,EAAO,GAAO,EAAO,IAAU,OAAO,EAEne,SAAS,EAA8B,EAAQ,EAAU,CAAE,GAAI,GAAU,KAAM,MAAO,EAAE,CAAE,IAAI,EAAS,EAAE,CAAM,EAAa,OAAO,KAAK,EAAO,CAAM,EAAK,EAAG,IAAK,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAO,EAAM,EAAW,GAAQ,IAAS,QAAQ,EAAI,EAAI,KAAa,EAAO,GAAO,EAAO,IAAQ,OAAO,EAE1S,SAAS,EAAgB,EAAU,EAAa,CAAE,GAAI,EAAE,aAAoB,GAAgB,MAAU,UAAU,oCAAoC,CAEpJ,SAAS,EAAkB,EAAQ,EAAO,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CAAE,IAAI,EAAa,EAAM,GAAI,EAAW,WAAa,EAAW,YAAc,GAAO,EAAW,aAAe,GAAU,UAAW,IAAY,EAAW,SAAW,IAAM,OAAO,eAAe,EAAQ,EAAW,IAAK,EAAW,EAExT,SAAS,EAAa,EAAa,EAAY,EAAa,CAA4M,OAAtM,GAAY,EAAkB,EAAY,UAAW,EAAW,CAAM,GAAa,EAAkB,EAAa,EAAY,CAAE,OAAO,eAAe,EAAa,YAAa,CAAE,SAAU,GAAO,CAAC,CAAS,EAE/Q,SAAS,EAAU,EAAU,EAAY,CAAE,GAAI,OAAO,GAAe,YAAc,IAAe,KAAQ,MAAU,UAAU,qDAAqD,CAAI,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,SAAU,GAAM,aAAc,GAAM,CAAE,CAAC,CAAE,OAAO,eAAe,EAAU,YAAa,CAAE,SAAU,GAAO,CAAC,CAAM,GAAY,EAAgB,EAAU,EAAW,CAEjc,SAAS,EAAgB,EAAG,EAAG,CAA4G,MAA1G,GAAkB,OAAO,gBAAkB,SAAyB,EAAG,EAAG,CAAmB,MAAjB,GAAE,UAAY,EAAU,GAAa,EAAgB,EAAG,EAAE,CAEvK,SAAS,EAAa,EAAS,CAAE,IAAI,EAA4B,GAA2B,CAAE,OAAO,UAAgC,CAAE,IAAI,EAAQ,EAAgB,EAAQ,CAAE,EAAQ,GAAI,EAA2B,CAAE,IAAI,EAAY,EAAgB,KAAK,CAAC,YAAa,EAAS,QAAQ,UAAU,EAAO,UAAW,EAAU,MAAW,EAAS,EAAM,MAAM,KAAM,UAAU,CAAI,OAAO,EAA2B,KAAM,EAAO,EAEna,SAAS,EAA2B,EAAM,EAAM,CAAE,GAAI,IAAS,EAAQ,EAAK,GAAK,UAAY,OAAO,GAAS,YAAe,OAAO,KAAiB,IAAS,IAAK,GAAK,MAAU,UAAU,2DAA2D,CAAI,OAAO,EAAuB,EAAK,CAE7R,SAAS,EAAuB,EAAM,CAAE,GAAI,IAAS,IAAK,GAAK,MAAU,eAAe,4DAA4D,CAAI,OAAO,EAE/J,SAAS,GAA4B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAAkF,OAAhF,QAAQ,UAAU,QAAQ,KAAK,QAAQ,UAAU,QAAS,EAAE,CAAE,UAAY,GAAG,CAAC,CAAS,QAAkB,CAAE,MAAO,IAE/T,SAAS,EAAgB,EAAG,CAAqJ,MAAnJ,GAAkB,OAAO,eAAiB,OAAO,eAAiB,SAAyB,EAAG,CAAE,OAAO,EAAE,WAAa,OAAO,eAAe,EAAE,EAAY,EAAgB,EAAE,CAE1M,SAAS,EAAgB,EAAK,EAAK,EAAO,CAA0J,OAApJ,KAAO,EAAO,OAAO,eAAe,EAAK,EAAK,CAAS,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,CAAC,CAAW,EAAI,GAAO,EAAgB,EAE3M,IAAI,GAA+B,SAAU,EAAsB,CACjE,EAAU,EAAiB,EAAqB,CAEhD,IAAI,EAAS,EAAa,EAAgB,CAE1C,SAAS,GAAkB,CACzB,IAAI,EAEJ,EAAgB,KAAM,EAAgB,CAEjC,IAA6B,MACnB,WA0Bf,MAvBA,GAAQ,EAAO,KAAK,MAAM,EAAQ,CAAC,KAAK,CAAC,OAAO,EAAK,CAAC,CAEtD,EAAgB,EAAuB,EAAM,CAAE,UAAW,SAAU,EAAO,CACzE,IAAI,EAAc,EAAM,MACpB,EAAO,EAAY,KACnB,EAAS,EAAY,OACrB,EAAW,EAAY,SACvB,EAAU,EAAY,QAEtB,EAAO,EAAO,QAAW,SAAS,KAAK,EAAS,CAEhD,GAAU,EAAG,EAAiB,SAAY,EAAM,EAAQ,CAExD,GACF,EAAO,EAAM,EAAO,CAIlB,GAAQ,EAAK,OAAS,OAAO,EAAK,MAAM,SAAY,YACtD,EAAK,MAAM,QAAQ,EAAM,EAE3B,CAEK,EAqBT,OAlBA,EAAa,EAAiB,CAAC,CAC7B,IAAK,SACL,MAAO,UAAkB,CACvB,IAAI,EAAe,KAAK,MACZ,EAAa,KACX,EAAa,OACZ,EAAa,QAH5B,IAII,EAAW,EAAa,SACxB,EAAQ,EAAyB,EAAc,EAAU,CAEzD,EAAO,EAAO,QAAW,SAAS,KAAK,EAAS,CAEpD,OAAoB,EAAO,QAAW,aAAa,EAAM,EAAc,EAAc,EAAE,CAAE,EAAM,CAAE,EAAE,CAAE,CACnG,QAAS,KAAK,QACf,CAAC,CAAC,EAEN,CAAC,CAAC,CAEI,GACP,EAAO,QAAW,cAAc,CAElC,EAAQ,gBAAkB,GAE1B,EAAgB,GAAiB,eAAgB,CAC/C,OAAQ,IAAA,GACR,QAAS,IAAA,GACV,CAAC,kBC/GF,IACI,EAAA,IAAA,CAA2B,gBAE/B,EAAgB,gBAAkB,EAClC,EAAO,QAAU,yGESX,EAAY,EAAgB,iBADhB,mBAC2C,CAkB7D,GAAU,aAAe,CACvB,QAAS,SACV,CAED,SAAgB,GAAU,EAAoC,CAC5D,GAAM,CAAE,EAAqB,GAAA,EAAiC,SAAS,EAAM,gBAAkB,GAAM,CAErG,SAAS,GAA4B,CACnC,eAAiB,EAAuB,GAAM,CAAE,IAAK,CAGvD,SAAS,GAAe,CAClB,EAAM,QACR,EAAM,QAAQ,CAEZ,KAGJ,EAAuB,GAAK,CAC5B,GAA2B,EAG7B,EAAM,cAAgB,CACf,EAAM,gBAGX,GAA2B,EAC1B,CAAC,EAAM,eAAe,CAAC,CAE1B,SAAS,GAAS,CAuBhB,OAtBI,EAAM,UAAY,aAElB,EAAA,EAAA,KAAC,GAAA,gBAAD,CAAiB,KAAM,EAAM,MAAe,mBAC1C,EAAA,EAAA,KAAC,EAAD,CACE,KAAM,EAAsB,SAAW,GACvC,IAAK,EAAsB,GAAW,GACtC,UAAW,EACT,GAAO,QACP,uBACA,EAAsB,yBAA2B,oCACjD,EAAM,sBACP,UAEA,EACC,EAAM,YAAc,EAAU,aAAa,CAC3C,EAAM,UAAY,EAAU,OAAO,CAE1B,CAAA,CACG,CAAA,EAKpB,EAAA,EAAA,KAAC,GAAA,gBAAD,CAAiB,KAAM,EAAM,MAAe,mBAC1C,EAAA,EAAA,KAAC,SAAD,CACE,KAAM,EAAsB,SAAW,GACvC,UAAW,EACT,gEACA,EAAM,sBACP,UAEA,EACC,EAAM,YAAc,EAAU,SAAS,CACvC,EAAM,UAAY,EAAU,OAAO,CAE9B,CAAA,CACO,CAAA,CAItB,IAAM,GACJ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAM,UAAY,YAAc,gDAAkD,uBAAlG,CACG,EAAM,UACL,EAAA,EAAA,KAAC,WAAD,CACE,UAAW,EAAW,mCAAoC,CAAC,EAAM,YAAc,GAAO,eAAgB,EAAM,kBAAkB,CAC9H,WAAY,GACZ,MAAO,EAAM,MACb,KAAM,EAAM,MAAQ,EACpB,SAAA,GACA,CAAA,EACF,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,OACL,aAAa,MACb,UAAW,EACT,eACA,EAAM,UAAY,UAAY,EAAM,QACrC,CACD,WAAY,GACZ,MAAO,EAAM,MACb,SAAA,GACA,CAAA,EAGJ,EAAA,EAAA,KAAC,EAAD,EAAU,CAAA,CACN,GAYR,OATI,EAAM,OAEN,EAAA,EAAA,MAAC,GAAK,MAAN,CAAY,UAAU,sBAAtB,EACE,EAAA,EAAA,KAAC,GAAK,MAAN,CAAA,SAAa,EAAM,MAAmB,CAAA,CACrC,EACU,GAIV,ECvIT,IAAM,GAAY,sBAQL,GAAc,CACzB,oBAAoB,EAA6B,GAAyB,CACxE,IAAM,EAAiC,CACrC,CACE,MAAO,EAAgB,UAAU,GAAW,QAAQ,CACpD,MAAO,MACP,OAAQ,MACT,CACD,CACE,MAAO,EAAgB,UAAU,GAAW,SAAS,CACrD,MAAO,OACP,OAAQ,MACT,CACD,CACE,MAAO,EAAgB,UAAU,GAAW,QAAQ,CACpD,MAAO,OACP,OAAQ,OAEX,CASD,OAPI,GACF,EAAY,QAAQ,CAClB,MAAO,EAAgB,UAAU,GAAW,aAAa,CACzD,MAAO,OACP,OAAQ,OACT,CAAC,CAEG,GAET,eAAe,EAGJ,CACT,GAAM,CAAE,MAAK,QAAS,EAEhB,EAAe,EAAK,QAAU,OAU9B,EAAS,WARW,EACxB,qEACA,UAAU,EAAK,MAAM,YAAY,EAAK,OAAO,GAMH,6FAFhC,QAAQ,EAAI,GAE8C,YAKtE,OAHI,EACK,yDAAyD,EAAO,QAElE,GAET,cAAc,EAMH,CACT,GAAM,CAAE,WAAU,OAAM,UAAS,WAAU,eAAgB,EAMvD,EAAU,EAEd,AACE,IAAU,EAAU,cAAc,EAAM,eAAe,IAAU,CAEnE,IAAM,EAAqB,EAAE,CAQ7B,OANI,IACF,EAAO,EAAI,IAET,IACF,EAAO,YAAc,GAEhB,EAAU,WAAW,EAAS,EAAO,EAE/C,4FE3EK,GAAY,sBACZ,GAAY,EAAgB,iBAAiB,GAAU,CAqB7D,GAAc,aAAe,CAC3B,QAAS,SACV,CAED,SAAgB,GAAc,EAAwC,CACpE,IAAM,EAAa,GAAY,qBAAqB,CAE9C,CAAE,EAAQ,GAAA,EAAoB,SAAkB,CAAC,CAAC,EAAM,oBAAoB,CAC5E,CAAE,EAAU,GAAA,EAAsB,SAAS,GAAM,CACjD,CAAE,EAAW,GAAA,EAAuB,SAA0B,EAAW,KAAK,GAAK,EAAE,QAAU,OAAO,CAAC,CACvG,CAAE,EAAQ,GAAA,EAAoB,SAAS,GAAM,CAOnD,EAAM,cAAgB,CACf,EAAM,qBAGX,eAAiB,EAAU,GAAM,CAAE,IAAK,EACvC,CAAC,EAAM,oBAAoB,CAAC,CAE/B,SAAS,GAAe,CACtB,KAAU,GAAK,CACf,eAAiB,EAAU,GAAM,CAAE,IAAK,CAGpC,GAKJ,IAFA,EAAU,GAAK,CAEX,OAAO,EAAM,QAAW,WAAY,CACtC,EAAM,OAAO,CACX,KAAM,EACN,WACD,CAAC,CACF,OAGF,EAAgB,cAAc,CAC5B,GAAG,EAAM,OACT,aAAc,CACZ,KAAM,EACN,WACD,CACF,CAAE,EAAgB,aAAa,EAAgB,oBAAoB,EAAM,WAAW,CAAE,CACrF,CACE,WAAY,EAAW,MACvB,WAAY,EAAiB,cAC7B,aAAc,EAAa,GAC5B,CACD,EAAM,iBACP,CAAC,CAAC,EAGL,SAAS,EAAc,EAAmB,CACxC,EAAU,GAAM,CAChB,EAAY,EAAS,CAGvB,SAAS,EAAe,EAA4B,CAClD,EAAU,GAAM,CAChB,EAAa,EAAU,CAGzB,IAAM,EAAM,GAAY,cAAc,CACpC,SAAU,EAAM,SAChB,KAAM,EAAM,QACZ,QAAS,EAAM,QACf,WACD,CAAC,CAEI,EAAc,GAAY,eAAe,CAC7C,MACA,KAAM,EACP,CAAC,CAEF,OACE,EAAA,EAAA,MAAC,GAAyB,SAA1B,CAAmC,MAAO,YAA1C,EACE,EAAA,EAAA,KAAC,GAAD,CACE,MAAO,EACC,SACR,WAAY,EAAM,UAAY,YAAc,GAAU,WAAW,CAAG,GAAU,SAAS,CACvF,SAAU,GAAU,OAAO,CAC3B,eAAgB,EAChB,QAAS,EAAM,QACf,sBAAuB,EAAW,mCAAoC,GAAO,iBAAiB,CAC9F,WAAY,EAAM,WAClB,MAAO,EAAM,UAAY,IAAA,GAAY,GAAU,QAAQ,CACvD,SAAA,GACA,CAAA,EACF,EAAA,EAAA,KAAC,GAAD,CACY,WACV,YAAa,EACF,YACX,aAAc,EACF,aACZ,CAAA,CACgC,GCjIxC,IAAM,GAAY,eAYlB,SAAgB,GAAU,EAAuB,CAC/C,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,GAAD,CACE,SAAU,EAAM,UAAU,SAC1B,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,QAAS,EAAM,UAAU,GACzB,iBAAkB,EAAM,iBACxB,CAAA,CACE,CAAA,EAEN,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAD,CAAW,QAAS,EAAM,cAAe,UAAU,iCACjD,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,OAAS,CAAA,CAClC,CAAA,CACC,CAAA,CACd,CAAA,CAAA,aCzCP,SAAA,GAAA,EAAA,CACE,OAAA,EAAA,EAAA,KAAA,MAAA,gSCMF,IAAM,GAAY,qBAOlB,SAAgB,GAAa,EAA0B,CACrD,OACE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,oBACf,UAAU,kEAEV,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAW,OAAQ,CAAC,EAAM,SAAW,+BAA+B,WAClF,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,GACL,KAAM,EAAM,QAAU,EAAiB,SAAW,EAAiB,MACnE,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,eAAiB,CAAA,CAChD,GACI,CAAA,CC/BhB,IAAY,GAAL,SAAA,EAAA,OACL,GAAA,QAAA,UACA,EAAA,OAAA,eACD,CCWK,EAAY,EAAgB,iBADhB,sBAC2C,CAahD,EAAkB,CAC7B,sBAAwB,GAAmC,CACzD,GAAM,CAAE,eAAc,UAAS,gBAAe,SAAQ,cAAe,EAErE,GAAI,IAAiB,EAAW,OAAS,IAAiB,EAAW,OACnE,MAAO,CAAE,KAAM,EAAc,KAAM,EAAU,EAAgB,uBAAyB,0BAA0B,CAAE,CAMhH,UAAM,QAAQ,EAAQ,CAG1B,OAAQ,EAAQ,QAAhB,CACE,IAAK,SACH,MAAO,CAAE,KAAM,EAAc,KAAM,EAAU,oBAAoB,CAAE,CACrE,IAAK,YAGH,OAFI,EAAQ,qBACH,CAAE,KAAM,EAAc,KAAM,EAAU,gBAAgB,CAAE,CAC1D,CACL,KAAM,EACN,KAAM,EAAgB,qBAAqB,EAAQ,EAAY,EAAc,CAC9E,CACH,IAAK,mBAGH,OAFI,EAAQ,qBACH,CAAE,KAAM,EAAS,KAAM,EAAU,EAAgB,uBAAyB,0BAA0B,CAAE,CACxG,CACL,KAAM,EACN,KAAM,EAAgB,qBAAqB,EAAQ,EAAY,EAAc,CAC9E,CAKH,IAAK,aACL,IAAK,UACH,MAAO,CAAE,KAAM,EAAS,KAAM,EAAU,qBAAqB,CAAE,CACjE,QACE,MAAO,EAAE,GAIf,eAAiB,GAAmC,CAClD,GAAM,CAAE,iBAAgB,sBAAqB,UAAW,EACxD,GAAI,CAAC,GAAkB,CAAC,EACtB,OAAO,EAAgB,sBAAsB,EAAQ,CAEvD,GAAI,CAAC,EACH,MAAO,CAAE,KAAM,EAAS,KAAM,EAAU,WAAW,CAAE,CAEvD,IAAM,EAAU,GAAW,QAAQ,EAAe,CAC5C,EAAgB,GAAW,YAAY,EAAgB,IAAI,KAAQ,MAAM,CAE/E,GAAI,CAAC,EAAqB,CACxB,IAAI,EAAO,EACT,EAAU,cAAc,CACxB,EAAU,SAAU,CAAE,KAAM,EAAe,CAAC,CAK9C,OAHI,IAAW,GAAgB,UAC7B,EAAO,EAAU,UAAU,EAEtB,CAAE,KAAM,GAAU,OAAM,CAGjC,IAAI,EAAO,EACT,EAAU,sBAAsB,CAChC,EAAU,iBAAkB,CAAE,KAAM,EAAe,CAAC,CAKtD,OAHI,IAAW,GAAgB,UAC7B,EAAO,EAAU,kBAAkB,EAE9B,CAAE,KAAM,EAAS,OAAM,EAGhC,qBAAqB,EAAmB,EAAyB,EAAwB,CACvF,GAAI,CAAC,GAAS,CAAC,EACb,OAAO,KAET,GAAI,EACF,OAAO,EAAU,uBAAuB,CAE1C,GAAI,CAAC,EAAY,YAAY,EAAM,CACjC,OAAO,EAAU,mBAAmB,CAEtC,IAAM,EAAc,GAAkB,uBAAuB,EAAM,eAAe,MAAM,CAKxF,GAAI,GAAe,CAAC,EAAY,UAC9B,OAAO,EAAU,aAAa,CAEhC,IAAM,EAAS,EAAY,UAAU,EAAM,CAEvC,EACA,EAEJ,IAAK,IAAM,KAAa,GAIlB,CAAC,GAAgB,EAAU,MAAQ,EAAa,SAClD,EAAe,GAKb,KAAe,EAAU,OAAS,EAAY,aAM9C,GAAU,EAAU,OAAO,MAAQ,EAAO,QAM1C,CAAC,GAAuB,EAAU,MAAQ,EAAoB,SAChE,EAAsB,IAuB1B,OAjBK,EAOD,EAAW,SAAW,EACjB,EAAU,gBAAgB,CAM/B,EAAoB,QAAU,EAAa,MACtC,EAAU,eAAgB,CAAE,UAAW,EAAa,KAAM,CAAC,CAE7D,EAAU,iBAAkB,CAAE,UAAW,EAAoB,KAAM,CAAC,CAhBlE,EAAU,YAAY,EAkBlC,CC9JK,EAAY,EAAgB,iBADhB,sBAC2C,CAsB7D,SAAS,GAAc,EAA2B,CAChD,GAAM,CAAE,SAAQ,QAAO,cAAa,WAAY,EAEhD,OACE,EAAA,EAAA,MAAC,SAAD,CACE,UAAW,GAAG,EAAS,gBAAkB,GAAG,kEAC5C,QAAU,EAAmB,KAAV,EACnB,KAAK,kBAHP,EAKE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,4BAAoB,EAAU,CAAA,EAC3C,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,6BAAqB,EAAgB,CAAA,CAAA,GAEnD,IAAU,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,GAAY,CAAA,CAAA,GAKhD,SAAgB,GAAc,EAAwC,CACpE,GAAM,CAAE,EAAiB,GAAA,EAA6B,SAAS,GAAM,CAC/D,CAAE,EAAS,GAAA,EAAqB,SAAuB,KAAK,CAE5D,CAAE,OAAM,QAAS,EAAgB,eAAe,EAAM,CAE5D,EAAM,cAAgB,CACpB,EAAmB,EAAM,QAAQ,gBAAgB,CACjD,EAAW,EAAM,QAAQ,QAAQ,EAChC,CAAC,EAAM,QAAQ,CAAC,CAEnB,IAAM,EAAyB,EAAkB,mBAAqB,YAQtE,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qCANf,CAAC,EAAM,qBACP,CAAC,EAAM,gBACN,EAAM,2BAA6B,CAAC,EAAM,eAOrC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACE,EAAA,EAAA,MAAC,SAAD,CACE,UAAU,iEACV,iBAAe,WACf,aAAY,EAAU,cAAc,UAHtC,EAKE,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,EAAM,UAAU,qBAAuB,CAAA,EAC1D,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAQ,EAAY,CAAA,CAAA,IAEtC,EAAA,EAAA,MAAC,KAAD,CAAI,UAAU,wCAAd,CACG,IACC,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,SACpB,MAAO,EAAU,SAAS,CAC1B,YAAa,EAAU,oBAAoB,CAC3C,YAAe,EAAM,mBAAmB,SAAU,GAAA,CAClD,CAAA,CACC,CAAA,EAEP,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,GAA0B,EAAM,QAAQ,qBAC5D,MAAO,EAAU,eAAe,CAChC,YAA+B,EAAlB,EAA4B,0BAAuC,gBAAgB,CAChG,YAAe,EAAM,mBAAmB,EAAwB,GAAA,CAChE,CAAA,CACC,CAAA,EACL,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,GAA0B,CAAC,EAAM,QAAQ,qBAC7D,MAAO,EAAU,iBAAiB,CAClC,YAAa,EAAgB,qBAC3B,EAAM,OACN,EAAM,WACN,EAAM,cACP,CACD,YAAe,EAAM,mBAAmB,EAAwB,GAAA,CAChE,CAAA,CACC,CAAA,EACL,EAAA,EAAA,KAAC,KAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,IAAY,UACpB,MAAO,EAAU,UAAU,CAC3B,YAAa,EAAU,qBAAqB,CAC5C,YAAe,EAAM,mBAAmB,UAAW,GAAA,CACnD,CAAA,CACC,CAAA,QAKT,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,EAAM,UAAU,qBAAuB,CAAA,EAC1D,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAY,CAAA,CAClB,CAAA,CAAA,CAGH,CAAA,CCtIV,SAAgB,IAAqC,CACnD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,gBAArD,EACE,EAAA,EAAA,KAAC,SAAD,CAAQ,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,KAAK,iBAAkB,CAAA,EACtD,EAAA,EAAA,MAAC,OAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,UAAD,CAAS,GAAG,WAAW,oBAAoB,oBAAoB,MAAM,IAAI,OAAO,cAC9E,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qBAAqB,UAAU,oBAAqB,CAAA,CAC3D,CAAA,EACV,EAAA,EAAA,KAAC,QAAD,CAAO,GAAG,oBAAoB,MAAM,MAAM,OAAO,MAAM,UAAU,qzaAAsza,CAAA,CACl3a,CAAA,CAAA,CACH,GCVV,SAAgB,IAAoC,CAClD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,QAAQ,YAAY,KAAK,gBAA9B,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,0fAA0f,KAAK,OAAQ,CAAA,EAC/gB,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,4sBAA4sB,KAAK,OAAQ,CAAA,CAC7tB,yIEKJ,GAAY,0BAOlB,SAAgB,GAAuB,EAAkD,CACvF,IAAM,EAAY,EAChB,EAAO,OACP,GAAO,OAAS,MAAQ,EAAO,MAC/B,GAAO,OAAS,MAAQ,SACxB,iCACD,CAED,OACE,EAAA,EAAA,KAAC,EAAD,CAAS,MAAO,EAAgB,UAAU,GAAW,2BAA2B,CAAE,SAAA,GAAS,QAAS,EAAM,oBACxG,EAAA,EAAA,MAAC,KAAD,CAAI,UAAU,qCAAd,EACE,EAAA,EAAA,KAAC,KAAD,CAAe,YAAW,MAAO,CAAE,OAAQ,EAAG,WAC5C,EAAA,EAAA,KAAC,GAAD,EAAyB,CAAA,CACtB,CAAA,EAEL,EAAA,EAAA,KAAC,KAAD,CAAI,UAAW,GAAG,EAAU,GAAG,EAAO,mBAAoB,MAAO,CAAE,OAAQ,EAAG,WAC5E,EAAA,EAAA,KAAC,GAAD,EAAwB,CAAA,CACrB,CAAA,CAAA,GAEC,CAAA,CCpBd,IAAM,GAAY,oBAmBlB,SAAgB,GAAY,EAA6C,CACvE,GAAM,CAAE,EAAQ,GAAA,EAAoB,SAAS,GAAM,CAEnD,SAAS,GAAe,CAElB,IAGJ,EAAU,GAAK,CAEf,EAAgB,cAAc,CAC5B,GAAI,EAAM,OAAO,GACjB,KAAM,EAAM,OAAO,KACpB,CAAE,EAAgB,aAAa,EAAgB,oBAAoB,EAAM,WAAW,CAAE,CACrF,WAAY,EAAW,MACvB,WAAY,EAAiB,SAC7B,aAAc,EAAa,GAC5B,CAAC,CAAC,EAGL,OACE,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,UACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6DAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAM,UAAY,QAAU,4CAC5C,EAAM,WAEH,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mEACb,EAAA,EAAA,KAAC,GAAD,CACE,eAAgB,EAAM,UAAU,eAChC,oBAAqB,EAAM,UAAU,oBACrC,QAAS,EAAM,QACf,aAAc,EAAM,UAAU,aAC9B,OAAQ,EAAM,UAAU,OACxB,mBAAoB,EAAM,mBAC1B,cAAe,EAAM,cACrB,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,GAAD,CAAW,MAAO,EAAM,UAAU,IAAa,SAAU,CAAA,CACxD,CAAA,CAAA,EAEH,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gBACZ,EAAM,oBACL,EAAA,EAAA,KAAC,GAAD,EAA0B,CAAA,EAE1B,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,GAAS,UAAU,gBAAkB,CAAA,CAEtD,CAAA,EAEN,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,wBAAc,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,aAAe,CAAA,CAAO,CAAA,CAAA,GAIzF,CAAA,CACL,CAAC,EAAM,YACN,EAAA,EAAA,KAAC,EAAD,CAAW,UAAU,YAAY,QAAS,EAAM,4BAC9C,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,aAAe,CAAA,CAClB,CAAA,CAAA,GAGf,CAAA,CC9FP,IAAM,GAAqC,EAAE,CAE7C,SAAgB,GAAU,EAAa,EAA8B,CACnE,GAAM,CAAE,EAAQ,GAAA,EAAoB,SAAS,GAAM,CA4BnD,OA1BA,EAAM,cAAgB,CACpB,GAAI,CAAC,GAAO,CAAC,GAAc,GAAc,GACvC,OAEF,IAAM,EAAS,SAAS,cAAc,SAAS,CAgB/C,MAdA,GAAO,IAAM,EACb,EAAO,MAAQ,GACf,EAAO,WAAe,CACpB,GAAc,GAAO,GAMrB,OAAO,eAAiB,EAAU,GAAK,CAAE,EAAE,EAG7C,SAAS,KAAK,YAAY,EAAO,KAEpB,CACX,EAAO,OAAS,KAChB,SAAS,KAAK,YAAY,EAAO,GAElC,CAAE,EAAK,EAAY,CAAC,CAEhB,GAAc,IAAQ,EClC/B,IAAM,GAAgC,uBAEtC,SAAgB,GAAoB,EAA6B,CAI3D,IACD,OAAe,QAAU,CAAE,UAAW,WAAY,EAErD,IAAM,EAAS,GAAU,yCAA0C,EAAW,CAS9E,OAPA,EAAM,cAAgB,CAChB,CAAC,GAAc,CAAC,GAGpB,OAAO,MAAM,kBAAkB,GAAG,GAA8B,EAC/D,CAAE,EAAY,EAAQ,CAAC,CAEnB,GClBT,SAAgB,GAAuB,EAA2B,CAChE,IAAM,EAAS,GAAU,gDAAiD,EAAW,CAErF,EAAM,cAAgB,CAChB,CAAC,GAAc,CAAC,GAGpB,OAAO,uBAAuB,eAAe,EAC5C,CAAE,EAAY,EAAQ,CAAC,CCE5B,IAAM,GAAY,+BACZ,GAAY,EAAgB,iBAAiB,GAAU,CAa7D,SAAgB,GAAsB,EAAgD,CACpF,GAAM,CAAE,EAAY,GAAkB,GACpC,GAAoB,wBACpB,CAAE,KAAM,GAAM,CACd,CAAE,QAAS,GAAY,aAAc,CACtC,CAKD,OAHK,EAAW,MAId,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAW,iCAAkC,CAAC,EAAM,gBAAkB,4BAA4B,UAAlH,EACE,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,QACf,YAAe,EAAM,cAAc,CACnC,UAAU,kDAEV,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAW,iBAAkB,CAAC,EAAM,YAAc,cAAc,WAC/E,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,wBAA0B,CAAA,CACxD,CAAA,CACC,CAAA,CACT,CAAC,EAAM,cACR,EAAA,EAAA,KAAC,SAAD,CAAQ,YAAe,EAAc,CAAE,KAAM,GAAO,CAAC,CAAE,aAAY,GAAG,GAAU,YAAY,aAC1F,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,GACL,KAAM,EAAiB,MACvB,UAAU,yCACV,CAAA,CACK,CAAA,CAAA,IApBJ,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CCpChB,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,gBAAA,mBACA,EAAA,eAAA,kBACA,EAAA,KAAA,OACA,EAAA,QAAA,iBACD,CCMK,GAAoB,KAW1B,SAAgB,GAAkB,EAA4C,CAC5E,IAAM,EAAoB,GAAoB,EAAM,cAAc,SAAS,EAAc,gBAAgB,CAAC,CAG1G,GAFA,GAAuB,EAAM,cAAc,SAAS,EAAc,eAAe,CAAC,CAE9E,CAAC,EAAM,aAAa,QAAU,CAAC,EAAM,2BACvC,OACE,EAAA,EAAA,KAAC,GAAD,CACE,QAAS,EAAM,QACf,WAAY,EAAM,WAClB,CAAA,CAGN,SAAS,GAAc,CACrB,OAAQ,EAAM,SAAd,CACE,IAAK,KAAM,MAAO,KAElB,QAAS,OAAO,IAIpB,IAAM,EAAW,GAAa,CACxB,EAA6B,CAAE,OAAQ,GAAG,EAAS,IAAK,MAAO,GAAG,EAAS,IAAK,CAEtF,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,CACG,EAAM,aAAa,SAAS,EAAc,gBAAgB,GACzD,EAAA,EAAA,KAAC,MAAD,CACE,GAAI,EACJ,UAAU,qCACV,MAAO,YAEP,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,qBACV,YAAW,EACX,WAAU,EAAM,IAChB,CAAA,CACE,CAAA,CAEP,EAAM,aAAa,SAAS,EAAc,eAAe,GAC1D,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,2BAA2B,EAAO,sBAChD,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,sBAAsB,EAAO,mBACxC,MAAO,EACP,YAAW,EAAM,IACjB,mBAAiB,kBACjB,eAAa,QACb,oBAAmB,EACnB,CAAA,CACE,CAAA,CAAA,iBC5DZ,SAAA,GAAA,EAAA,CACE,OAAA,EAAA,EAAA,KAAA,GAAA,4FCGF,SAAgB,GAA0B,EAAoD,CAC5F,IAAM,EAAkB,GAAkB,gBAAgB,EAAM,OAAO,cAAc,CAC/E,CAAE,cAAe,EAAY,iBAAiB,EAAM,MAAM,CAKhE,MAHI,CAAC,GAAmB,CAAC,EAAM,YAAc,CAAC,GACrC,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,EAGZ,EAAA,EAAA,KAAC,GAAD,CAAoB,UAAW,EAAM,WAAa,iBAChD,EAAA,EAAA,KAAC,GAAD,CAAkB,aAAc,EAAM,MAAM,cAAe,WAAY,EAAM,WAAc,CAAA,CACxE,CAAA,CCVzB,IAAM,GAAY,EAAgB,iBAAiB,qBAAqB,CAElE,GAAA,EAA8B,QAAQ,CAAC,MAAM,CACjD,QAAA,EAAa,QAAQ,CAClB,IAAI,QAAW,GAAU,gBAAgB,CAAC,CAC9C,CAAC,CAYF,SAAS,GAAiB,EAAkD,CAC1E,IAAM,EAAc,IAA8C,CAElE,OACE,EAAA,EAAA,MAAC,GAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,GAAD,CACE,UAAU,WACV,KAAK,UACL,GAAG,UACH,YAAa,GAAU,cAAc,CACrC,MAAO,EAAY,OAAO,QAC1B,MAAO,GAAU,QAAQ,CACzB,kBAAA,GACA,CAAA,CACD,CAAC,EAAM,2BAA6B,EAAY,YAAY,EAAM,OAAO,GACxE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBAAO,EAAA,EAAA,KAAC,GAAD,CAA2B,MAAO,EAAM,OAAQ,WAAY,EAAM,WAAc,CAAA,CAAM,CAAA,EAC9G,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAa,OAAd,CAAqB,QAAQ,OAAO,KAAM,GAAU,QAAQ,CAAI,CAAA,CACnD,CAAA,CACJ,CAAA,CAAA,CAWjB,SAAgB,GAAa,EAA8C,CACzE,SAAS,EAAS,EAA2B,EAA0B,CACrE,IAAI,EAAkB,KAElB,EAAK,UACP,EAAU,EAAK,SAEjB,EAAM,aAAa,EAAS,EAAO,CAGrC,OACE,EAAA,EAAA,KAAC,GAAD,CACE,cAAe,CAAE,QAAS,GAAI,CAC9B,iBAAkB,GACR,WACV,mBAAoB,aAEpB,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACU,CAAA,CCrDlB,IAAM,GAAY,eACZ,GAAY,EAAgB,iBAAiB,GAAU,CAE7D,SAAS,GACP,EACA,EACA,EACA,EACqB,CACrB,GAAI,CAAC,EACH,MAAO,EAAE,CAEX,IAAM,EAAc,CAAE,GAAG,EAAmB,GAAG,EAAyB,CAAC,IAAI,GAAK,EAAE,GAAG,CAEvF,OAAO,EAAmB,OAAO,GAM/B,EAJI,EAAY,SAAS,EAAE,GAAG,EAI1B,EAAE,KAAO,GAIb,CAoCJ,SAAgB,GAAU,EAAoC,CAC5D,GAAM,CAAE,EAAY,GAAA,EAAwB,SAA8B,EAAE,CAAC,CACvE,CAAE,EAAsB,GAAA,EAAkC,SAAS,GAAM,CAEzE,CAAE,kBAAmB,IAAgB,CACrC,CAAE,iBAAkB,GAAY,KAAK,CACrC,EAAkC,EAAe,EAAe,mBAAmB,CAEzF,SAAS,EAAa,EAAiB,EAA0B,CAC/D,EAAM,aACJ,EACA,MACM,CACJ,EAAc,EAAE,CAAC,CACjB,GAAQ,EAEX,CAGH,SAAS,EAAsB,EAAkB,CAC1C,EAAM,qBAwBX,EAAM,oBAAoB,EArBR,GAA0B,CAC1C,IAAM,EAAqC,EAAE,CAE7C,EAAW,QAAQ,GAAa,CAC9B,GAAI,EAAU,KAAO,EACnB,OAAO,EAAc,KAAK,EAAU,CAEtC,IAAM,EAAmB,EAAa,UAAsC,EAAU,CAEjF,GAAO,MAAM,OAGhB,EAAiB,MAAQ,EAFzB,EAAiB,MAAQ,CAAE,MAAO,EAAG,KAAM,EAAE,CAAE,WAAY,KAAM,CAKnE,EAAc,KAAK,EAAiB,EACpC,CAEF,EAAc,EAAY,KAAK,EAAe,KAAK,CAAC,EAGf,CAGzC,SAAS,EAAkB,EAA2B,CACpD,IAAM,EAAwB,EAAE,CAqBhC,OAnBI,EAAe,EAAe,aAAa,EAC7C,EAAQ,KAAK,CACX,MAAO,OACP,QAAS,CACP,SAAU,CAAE,GAAU,MAAO,GAAU,QAAS,CAChD,YAAa,CACX,OAAQ,CAAC,GAAG,GAAa,OAAO,aAAa,GAAG,CAChD,WAAY,EAAM,YAAY,aAGnC,CAAC,CAGA,EAAe,EAAe,kBAAkB,EAClD,EAAQ,KAAK,CAAE,MAAO,YAAa,CAAC,CAElC,EAAe,EAAe,uBAAuB,EACvD,EAAQ,KAAK,CAAE,MAAO,kBAAmB,CAAC,CAErC,CACL,QACA,UACA,WAAY,OACZ,MAAA,GACD,CAGH,IAAM,EAAiB,IACrB,EAAe,EAAe,aAAa,EAC3C,EAAe,EAAe,kBAAkB,EAChD,EAAe,EAAe,uBAAuB,EAGjD,EAAiB,GACrB,EAAM,iBACN,EACA,EAAM,sBACN,EAAM,YAAY,GACnB,CAED,SAAS,GAA+B,CACtC,EAAwB,GAAK,CAC7B,EAAM,mBAAmB,CAO3B,OAJA,EAAM,cAAgB,CACpB,EAAwB,CAAC,CAAC,EAAM,mBAAmB,EAClD,CAAC,EAAM,mBAAmB,CAAC,EAG5B,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,CACG,IACC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oDAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mEACb,EAAA,EAAA,KAAC,GAAD,CAGE,iBAAoB,EAAU,cAAc,EAAM,cAAe,YAAY,CAC1D,oBACnB,eAAgB,EAAM,qBACtB,wBAA0B,GACxB,GACE,GAAa,QACb,EACA,EAAM,sBACN,EAAM,YAAY,GACnB,CAEa,iBACJ,aACZ,qBAAsB,GAAa,EAAc,CAAE,GAAG,EAAY,EAAW,CAAC,CAC9E,gBAAiB,GAAa,EAAc,EAAW,OAAO,GAAK,EAAE,KAAO,EAAU,GAAG,CAAC,CAC1F,YACE,GADW,EACD,oBACA,gCAAgC,CAC5C,YAAa,EAAM,YACnB,iBAAkB,EAClB,sBAAuB,EAAM,qBAAuB,EACpD,aAAc,IACd,mBAAoB,EAAM,mBAC1B,mBAAoB,EAAM,mBAC1B,qBAAsB,EAAe,EAAe,kBAAA,CACpD,CA1BK,GAAgB,IAAI,GAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAI,eAAA,CA2B/C,CAAA,CAEJ,CAAC,EAAW,QAAU,EAAM,sBAAsB,QAEhD,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,6BAAmB,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,WAAa,CAAA,CAAK,CAAA,EAChE,EAAA,EAAA,KAAC,GAAA,WAAD,CAAY,WAAA,aACV,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,yBACX,EAAM,sBAAsB,IAAI,IAC/B,EAAA,EAAA,KAAC,KAAD,CAAe,UAAU,sBACvB,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EACR,YAAa,EAAM,YACnB,gBAAiB,EAAM,uBACvB,gBAAiB,EAAe,EAAe,kBAAA,CAC/C,CAAA,CACC,CAPI,EAAE,GAON,CAAA,CAEJ,CAAA,CACM,CAAA,CACT,CAAA,CAAA,EACJ,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CAEV,CAAC,CAAC,EAAW,SAEZ,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,GAAD,CACgB,eACd,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACE,CAAA,IAKX,CAAC,EAAW,QAAU,CAAC,IACtB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,gBAAgB,EAAiB,YAAc,+BAC7D,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,CACG,EAAM,YACL,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BAAmB,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,YAAc,CAAA,CAAM,CAAA,EAE3F,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,UAAW,EAAM,UACjB,oBAAqB,EAAM,oBAC3B,kBAAmB,EACnB,mBAAoB,EAAM,mBAC1B,eAAgB,EAAM,eACtB,QAAS,EAAM,QACf,aAAc,EAAM,OAAO,OAC3B,mBAAoB,EAAM,mBAC1B,mBAAoB,EAAM,wBAC1B,cAAe,EAAe,EAAe,kBAAkB,CAC/D,WAAY,EAAM,WAClB,0BAA2B,EAAM,0BACjC,CAAA,CACD,EAAM,WAAa,EAAM,0BACxB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAM,cAAc,QAAU,EAAM,SAAW,YAAc,GAAG,sBACjF,EAAA,EAAA,KAAC,GAAD,CACE,aAAc,EAAM,aACpB,IAAK,EAAM,UAAU,IACrB,WAAY,EAAM,WAClB,QAAS,EACP,EAAM,0BACN,EAAM,oBAER,CAAA,CACE,CAAA,CAEP,EAAM,WAAa,EAAM,WACxB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,KAAC,GAAD,CAAc,oBAAqB,EAAM,oBAAuB,CAAA,CAC5D,CAAA,CAEP,EAAM,WAAa,EAAM,iBACxB,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,kCAAkC,QAAS,EAAM,8BACjE,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,mBAAqB,CAAA,CACjD,CAAA,CAEP,CAAA,CAAA,CACF,CAAA,CAGP,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+CACb,EAAA,EAAA,KAAC,GAAD,CAAS,GAAG,MAAM,UAAU,SAAS,KAAK,SAAW,CAAA,CACjD,CAAA,CAEP,CAAA,CAAA,CC1TP,IAAM,GAAmB,GACzB,SAAgB,GAAkB,EAAsC,CACtE,GAAI,CAAC,EACH,OAAO,KAET,IAAM,EAAO,IAAI,KAGjB,OAFA,EAAK,QAAQ,EAAK,SAAS,CAAG,GAAiB,CAExC,EAAK,aAAa,CCG3B,IAAM,GAAY,oBACZ,GAAY,EAAgB,iBAAiB,GAAU,CAM7D,SAAgB,GAAW,EAA4C,CACrE,IAAM,EAAc,IAAwC,CAE5D,SAAS,GAA0B,CAC7B,EAAM,qBAGV,EAAY,cAAc,iBAAkB,GAAkB,CAAC,EAAY,OAAO,eAAe,CAAC,CAGpG,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kEAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAU,MAAM,QAAQ,aAAG,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,wBAA0B,CAAA,CAAQ,CAAA,EACvG,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,gBAAM,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,qBAAuB,CAAA,CAAI,CAAA,CAC7E,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,GAAU,oBAAoB,CACrC,QAAS,CAAC,EAAM,oBAChB,SAAA,GACA,QAAQ,kBAER,EAAA,EAAA,KAAC,GAAD,CACE,QAAS,EACT,GAAI,CAAC,CAAC,EAAY,OAAO,eACzB,SAAU,EAAM,oBAChB,sBAAA,GACA,CAAA,CACM,CAAA,CACN,qDE/BJ,GAAY,EAAgB,iBADhB,yBAC2C,CAkB7D,SAAgB,GAAiB,EAA2C,CAC1E,GAAM,CAAE,EAAgB,GAAA,EAA4B,SAAS,GAAM,CAI7D,EAFc,IAAwC,CAE/B,QAAQ,SAErC,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CACE,UAAW,gBAAgB,EAAW,aAAe,KACrD,MAAO,EAAM,MACb,SAAU,GAAK,CACX,EAAM,SAAW,EAAM,SAAS,EAAE,OAAO,MAAM,EAEnD,KAAM,EAAiB,OAAS,WAChC,YAAa,EAAM,aAAe,GAAU,sBAAsB,CAClE,SAAU,CAAC,EAAM,QACjB,CAAA,CACD,CAAC,CAAC,IACD,EAAA,EAAA,KAAC,GAAK,QAAQ,SAAd,CAAuB,KAAK,mBAAW,EAAiC,CAAA,CAEzE,CAAC,CAAC,EAAM,UACP,EAAA,EAAA,KAAC,EAAD,CAAW,UAAW,GAAO,eAAgB,YAAe,EAAkB,CAAC,EAAe,WAC5F,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,EAAiB,EAAe,GACrC,MAAO,GAAU,EAAiB,eAAiB,iBAAiB,CACpE,iBAAiB,MACjB,CAAA,CACQ,CAAA,CAEb,CAAC,EAAM,SAAW,CAAC,CAAC,EAAM,UAAY,CAAC,CAAC,EAAM,UAC7C,EAAA,EAAA,KAAC,EAAD,CAAW,UAAW,GAAO,eAAgB,QAAS,EAAM,kBAC1D,EAAA,EAAA,KAAC,EAAD,CACE,IAAK,GAAU,MAAO,GAAU,gBAAgB,CAChD,iBAAiB,MACjB,CAAA,CACQ,CAAA,CAEb,CAAA,CAAA,CC/DP,IAAM,GAAY,sBAEZ,GAAuB,WAQ7B,SAAgB,GAAa,EAA8C,CACzE,GAAM,CAAE,sBAAqB,0BAA2B,EAElD,EAAc,IAAwC,CAEtD,CAAE,EAAkB,GAAA,EAA8B,SAAS,CAAC,CAAC,EAAM,WAAW,oBAAoB,CAExG,SAAS,GAAgC,CACnC,EAAM,WAAW,qBACnB,EAAY,cAAc,iBAAkB,EAAoB,CAElE,EAAY,cAAc,WAAY,GAAG,CAEzC,EAAuB,CAAC,EAAoB,CAC5C,EAAY,cAAc,iBAAkB,GAAkB,CAAC,EAAoB,CAAC,CAGtF,SAAS,EAAY,EAAwB,CAC3C,EAAY,cAAc,WAAY,EAAS,CAGjD,SAAS,GAAsB,CAC7B,EAAY,cAAc,WAAY,GAAG,CACzC,EAAY,cAAc,iBAAkB,GAAK,CACjD,EAAoB,GAAM,CAG5B,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6DAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAU,MAAM,QAAQ,aAAG,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,yBAA2B,CAAA,CAAQ,CAAA,EACxG,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,gBAAM,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,sBAAwB,CAAA,CAAI,CAAA,CAC9E,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,GAAD,CAAc,QAAS,EAAyB,GAAI,EAAuB,CAAA,CACvE,GAEL,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mCACb,EAAA,EAAA,KAAC,GAAD,CACE,MAAO,EAAmB,GAAuB,EAAY,OAAO,SACpE,SAAU,EACV,QAAS,EACT,QAAS,CAAC,EACV,SAAA,GACA,CAAA,CACE,CAAA,CAEJ,GC9DV,IAAa,IAAA,EAAA,EAAA,SAA4C,CAAC,MAAM,CAC9D,gBAAA,EAAA,EAAA,UAAyB,CACzB,YAAA,EAAA,EAAA,SAAoB,CACpB,gBAAA,EAAA,EAAA,SAAwB,CAAC,UAAU,CACnC,UAAA,EAAA,EAAA,SAAkB,CACf,KAAK,CACJ,KAAM,kBACN,UAAW,GACX,OAAQ,EAAE,CACV,QAAS,EAAgB,UAXb,mBAWkC,cAAc,CAC5D,KAAM,GAMC,GAAK,OAGV,EAAI,EAAI,OAAS,GAFR,GAOZ,CAAC,CACD,QAAQ,GAAG,CACf,CAAC,CCZI,GAAY,eACZ,GAAY,EAAgB,iBAAiB,GAAU,CAgB7D,SAAS,GAAkB,EAA4C,CACrE,GAAM,CAAE,kBAAmB,IAAgB,CAErC,CAAE,EAAqB,GAAA,EAAiC,SAAS,CAAC,CAAC,EAAM,UAAU,oBAAoB,CAE7G,OACE,EAAA,EAAA,MAAC,GAAD,CAAA,SAAA,CACG,EAAM,oBACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kEAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,UAAU,iBAAO,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,kBAAoB,CAAA,CAAQ,CAAA,EACvF,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,iBAAO,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,wBAA0B,CAAA,CAAI,CAAA,CACjF,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CAAW,QAAS,EAAM,kBAAmB,UAAU,yCACrD,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,GAAW,OAAO,aAAe,CAAA,CACxC,CAAA,CACR,GAEP,EAAe,EAAe,wBAAwB,GACrD,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,GAAD,CAAiC,sBAAuB,CAAA,CACvD,EAAM,4BACL,EAAA,EAAA,KAAC,GAAD,CACE,UAAW,EAAM,UACI,sBACG,yBACxB,CAAA,CAEH,CAAA,CAAA,EAGL,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAa,OAAd,CAAqB,QAAS,EAAM,cAAe,KAAM,GAAU,OAAO,CAAE,QAAQ,OAAS,CAAA,EAC7F,EAAA,EAAA,KAAC,EAAa,OAAd,CAAqB,QAAQ,OAAS,CAAA,CACzB,CAAA,CAAA,CACV,CAAA,CAAA,CAkBX,SAAgB,GAAc,EAAmE,CAQ/F,OACE,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CACiB,cAVuB,CAC1C,SAAU,GACV,eAAgB,GAChB,eAAgB,EAAM,UAAU,eAChC,qBAAsB,EAAM,UAAU,qBACvC,CAMK,SAAU,EAAM,gBAChB,kBAAmB,GACnB,iBAAkB,aAElB,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,OAAQ,EAAM,OACd,UAAW,EAAM,UACjB,SAAU,EAAM,SAChB,cAAe,EAAM,cACrB,iBAAkB,EAAM,iBACxB,QAAS,EAAM,QACf,kBAAmB,EAAM,kBACzB,cAAe,EAAM,cACrB,0BAA2B,EAAM,0BACjC,CAAA,CACU,CAAA,CACb,CAAA,CCjHP,IAAM,GAAY,EAAgB,iBADhB,sBAC2C,CAEhD,GAAoB,CAC/B,qBAAqB,EAAiC,EAA0C,CAC9F,MAAO,CACL,CACE,GAAI,EAAc,gBAClB,KAAM,GAAU,kBAAkB,CAClC,QAAS,EACT,YAAa,GAAY,uBAC1B,CACD,CACE,GAAI,EAAc,eAClB,KAAM,GAAU,YAAY,CAC5B,QAAS,EACT,YAAa,GAAY,sBAC1B,CACF,EAEJ,CCSK,GAAY,eACZ,EAAY,EAAgB,iBAAiB,GAAU,CAE7D,SAAS,GAAS,EAAkC,CAClD,OAAQ,EAAR,CACE,IAAK,QAAS,OAAO,EAAU,aAAa,CAC5C,IAAK,OAAQ,OAAO,EAAU,YAAY,CAC1C,IAAK,cAAe,OAAO,EAAU,mBAAmB,CACxD,IAAK,SAAU,OAAO,EAAU,cAAc,CAC9C,IAAK,WAAY,OAAO,EAAU,gBAAgB,CAClD,IAAK,UAAW,OAAO,EAAU,aAAa,EAIlD,SAAS,GAAuB,EAAiC,EAA4C,CAE3G,OADqB,GAAkB,qBAAqB,EAAwB,EAAiB,CACjF,OAAO,GAAK,EAAE,QAAQ,CAAC,IAAI,GAAK,EAAE,GAAG,CAM3D,IAAM,GAAY,GAA6B,IAAS,SAAW,IAAS,eAAiB,IAAS,OAChG,GAAkB,GAA6B,IAAS,SAAW,IAAS,eAAiB,IAAS,OAe5G,SAAgB,GAAU,EAAoC,CAC5D,IAAM,EAAW,IAAa,CAExB,EAAS,IAAW,CAGpB,EAAuB,CAAC,EAAM,cAM9B,CAAE,EAAQ,GAAA,EAAoB,SAAsB,OAAO,CAE3D,CAAE,iBAAgB,uBAAwB,IAAgB,CAE1D,EAAc,EAAkC,EAAa,aAAa,CAAC,CAC3E,EAAS,EAAgB,uBAAuB,EAAM,WAAW,CAAC,EAAM,SAAU,EAAY,MAAM,GAAG,CACvG,EAAS,EAA6B,GAAe,QAAQ,CAAC,CAC9D,EAAY,EAAiC,GAAwB,EAAa,OAAO,CAAC,CAC1F,EAAY,EAAgC,EAAc,uBAAuB,EAAM,SAAS,CAAC,CACjG,EAAkB,EACtB,EAAc,6BAA6B,EAAM,SAAS,CAC3D,CACK,EAAa,EAA0C,EAAY,MAAM,YAC7E,EAAgB,gCAAgC,EAAY,KAAK,WAAY,EAAgB,KAAK,CAAC,CAE/F,EAAsB,EAAY,MAAQ,GAAkB,oBAAoB,EAAY,KAAK,GAAG,CAGpG,EAAmB,EADW,CAAC,CAAC,GAAqB,QAEzD,EAAc,kBAAkB,EAAqB,EAAY,KAAK,WAAW,CAAC,CAE9E,EAAU,EAA2C,EAAc,WAAW,EAAM,SAAS,CAAC,CAC9F,EAAa,EACjB,EAAY,MAAM,iBAAmB,GAAiB,WAAW,EAAY,KAAK,WAAW,CAC9F,CAEK,CACJ,yBACA,wBACA,4BACA,qBACE,GAAY,KAAK,CAOrB,SAAS,EAAgB,EAAoB,EAAgC,CACvE,EAAY,YAAY,QAC1B,GAAgB,EAAS,CAAC,EAAgB,gCAAgC,EAAY,EAAY,CAAC,CAGvG,SAAS,GAAoB,EAAY,EAAiD,CACxF,GAAgB,EAAS,CAAC,EAAc,kBAAkB,EAAI,EAAS,CAAC,CAG1E,SAAS,IAA0B,CAC7B,EAAU,MAGd,EAAgB,WAAW,CACzB,WACA,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,SACD,CAAC,CAGJ,SAAS,GAAgB,EAA4B,EAA2B,CAC9E,EAAgB,WACd,EACA,EAAO,KACP,EAAM,WACN,EAAU,KACV,EACA,MACM,EAAU,OAAO,CACvB,EACD,CAGH,SAAS,IAA0B,CACjC,EAAgB,WACd,EACA,EAAO,KACP,EAAM,WACN,EAAU,KACV,MACM,EAAU,OAAO,CACxB,CAGH,SAAS,GAAa,EAAiC,EAAiB,EAA2B,CACjG,IAAM,EAAkB,EAAW,IAAI,IAAM,CAAE,GAAI,EAAE,GAAI,OAAQ,EAAE,OAAQ,EAAE,CAE7E,EAAgB,0BAA0B,CACxC,WACA,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,YAAa,EAAY,KACzB,WAAY,EACZ,UACA,gBAAiB,EAAgB,KACjC,UAAW,GAAe,CACxB,EAAgB,EAAY,KAAK,WAAY,EAAY,CACzD,EAAO,QAAQ,CACb,QAAS,GAAoB,QAC7B,QAAS,EAAU,qBAAsB,CAAE,OAAQ,EAAO,KAAK,KAAM,WAAY,EAAgB,yBAAyB,EAAA,CAAa,CAAC,CACxI,KAAM,GAAU,QACjB,CAAC,EAEJ,YAAe,EAAO,MAAM,EAAU,mBAAoB,CAAE,KAAM,EAAO,KAAK,KAAM,CAAC,CAAC,CACtF,SACD,CAAC,CAGJ,SAAS,EAAuB,EAAqB,EAA4B,CAC/E,EAAgB,2BACd,EACA,EACA,EAAM,WACN,EAAgB,KAChB,GAAe,EAAgB,EAAY,KAAK,WAAY,EAAY,KAClE,CACJ,EAAO,MAAM,EAAU,yBAAyB,CAAC,CACjD,GAAW,GAAS,EAEvB,CAGH,SAAS,GAAmB,EAAuB,EAAqC,CACtF,GAAI,IAAY,UAAW,CACzB,IAAmB,CACnB,OAGF,EACE,EACA,EAAc,cACZ,EAAU,KAAK,GACf,EACA,MACM,EAAO,QAAQ,EAAU,mBAAoB,CAAE,KAAM,EAAO,KAAK,KAAM,CAAC,CAAC,KACzE,EAAO,MAAM,EAAU,iBAAkB,CAAE,KAAM,EAAO,KAAK,KAAM,CAAC,CAAC,CAC5E,CACF,CAGH,SAAS,IAAsC,CAI7C,OAHK,EAGE,CACL,cAAe,UAAU,EAAU,KAAK,QACzC,CAJQ,KAeX,IAAM,EAAa,CAAC,CAAC,EAAY,MAC5B,CAAC,CAAC,EAAO,OACR,CAAC,GAAwB,CAAC,CAAC,EAAU,OACtC,CAAC,CAAC,EAAgB,cAClB,CAAC,CAAC,EAAQ,MACV,CAAC,CAAC,EAAO,MACT,CAAC,GACD,CAAC,CAAC,EAAW,aAElB,OACE,EAAA,EAAA,KAAC,GAAyB,SAA1B,CAAmC,MAAO,aACxC,EAAA,EAAA,KAAC,GAAD,CACE,MAAO,GAAS,EAAM,WAAW,CACjC,WAAY,EAAM,WAClB,mBAAoB,CAAC,EACrB,iBAAmB,GAAc,EAAU,0BAA4B,GACvE,cAAc,oBAEN,CACN,GAAI,CAAC,EACH,OAAO,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA,CAEd,OAAQ,EAAR,CACE,IAAK,OACH,OACE,EAAA,EAAA,KAAC,GAAD,CACE,UAAW,EAAU,KACrB,mBAAoB,EAAU,WAC9B,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,sBAAuB,EAAW,MAAQ,EAAE,CAC5C,iBAAkB,EAAiB,MAAQ,EAAE,CAC1B,qBACnB,wBAA2B,EAAU,gBAAgB,CACvC,gBACU,yBACxB,wBAA2B,EAAU,aAAa,CAClD,iBAAkB,EAAgB,oBAAoB,EAAM,WAAW,CACvE,cAAe,EAAM,eAAiB,EAAO,KAAK,cAClD,YAAa,EAAO,KAAK,YACzB,qBAAsB,IAAyB,CAC/C,YAAa,EAAY,KACJ,uBACrB,QAAS,EAAQ,KACG,sBACpB,eAAgB,GAAe,EAAM,WAAW,CAChD,mBAAoB,EAAM,mBAC1B,mBAAoB,EAAM,mBAC1B,aAAc,GAAuB,EAAwB,EAAsB,CACnF,0BAA2B,EAAM,0BACjC,oBAAqB,EAAM,oBAC3B,WAAY,EAAM,WAClB,wBAAyB,EAAM,wBAC/B,SAAU,GAAS,EAAM,WAAW,CACpC,WAAY,EAAW,KACI,4BACN,sBACrB,CAAA,CAEN,IAAK,gBACH,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0CACb,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,OAAQ,EAAO,KACf,UAAW,EAAU,KACrB,SAAU,EAAM,SAChB,iBAAkB,EAAgB,oBAAoB,EAAM,WAAW,CACtD,mBACE,qBACnB,kBAAqB,EAAU,OAAO,CACtC,QAAS,EAAQ,KACjB,cAAe,EAAe,EAAe,kBAAkB,CACpC,4BAC3B,CAAA,CACE,CAAA,CAEV,IAAK,aACH,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,0CACb,EAAA,EAAA,KAAC,GAAD,CACE,OAAQ,EAAO,KACf,WAAY,EAAM,WAClB,QAAS,EAAO,KAAK,QACrB,UAAW,EAAU,KACrB,SAAU,EAAM,SAChB,iBAAkB,EAAgB,oBAAoB,EAAM,WAAW,CACvE,kBAAqB,EAAU,OAAA,CAC/B,CAAA,CACE,CAAA,MAIR,CAAA,CAC0B,CAAA"}