{"version":3,"sources":["vendor/ember-cli/app-prefix.js","connections-ui/adapter.js","connections-ui/adapters/application.js","connections-ui/adapters/call-forwarding.js","connections-ui/adapters/callv2.js","connections-ui/adapters/coded-geolocation.js","connections-ui/adapters/conversation.js","connections-ui/adapters/division.js","connections-ui/adapters/externalcontacts/contact.js","connections-ui/adapters/externalcontacts/external-organization.js","connections-ui/adapters/geolocation-settings.js","connections-ui/adapters/geolocation.js","connections-ui/adapters/grant.js","connections-ui/adapters/group-policy.js","connections-ui/adapters/group.js","connections-ui/adapters/library.js","connections-ui/adapters/location.js","connections-ui/adapters/meeting.js","connections-ui/adapters/person.js","connections-ui/adapters/public-api-user.js","connections-ui/adapters/purecloud-user.js","connections-ui/adapters/purecloud.js","connections-ui/adapters/queue.js","connections-ui/adapters/recorded-call.js","connections-ui/adapters/recording.js","connections-ui/adapters/response.js","connections-ui/adapters/role.js","connections-ui/adapters/station.js","connections-ui/adapters/user.js","connections-ui/adapters/voicemail-message.js","connections-ui/app.js","connections-ui/application-loading/template.js","connections-ui/attach-media-stream/util.js","connections-ui/audio-visualizer/component.js","connections-ui/authenticators/directory.js","connections-ui/authenticators/test.js","connections-ui/authorizers/directory.js","connections-ui/cldrs/ar.js","connections-ui/cldrs/cs.js","connections-ui/cldrs/da.js","connections-ui/cldrs/de.js","connections-ui/cldrs/en.js","connections-ui/cldrs/es.js","connections-ui/cldrs/fi.js","connections-ui/cldrs/fr.js","connections-ui/cldrs/he.js","connections-ui/cldrs/hi.js","connections-ui/cldrs/it.js","connections-ui/cldrs/ja.js","connections-ui/cldrs/ko.js","connections-ui/cldrs/nl.js","connections-ui/cldrs/no.js","connections-ui/cldrs/pl.js","connections-ui/cldrs/pt.js","connections-ui/cldrs/ru.js","connections-ui/cldrs/sv.js","connections-ui/cldrs/th.js","connections-ui/cldrs/tr.js","connections-ui/cldrs/uk.js","connections-ui/cldrs/zh.js","connections-ui/components/accessible-checkbox/component.js","connections-ui/components/admin-ui-modal/component.js","connections-ui/components/admin-ui-modal/template.js","connections-ui/components/alert-message/component.js","connections-ui/components/analog-clock/component.js","connections-ui/components/analog-clock/template.js","connections-ui/components/anchor-tag/component.js","connections-ui/components/anchor-tag/template.js","connections-ui/components/app-img/component.js","connections-ui/components/app-img/template.js","connections-ui/components/audio-player-v2/component.js","connections-ui/components/audio-player-v2/participant/component.js","connections-ui/components/audio-player-v2/timeline/component.js","connections-ui/components/audio-player-v2/waveform-graph/component.js","connections-ui/components/audio-player/component.js","connections-ui/components/audio-player/seek-bar/component.js","connections-ui/components/audio-player/seek-bar/template.js","connections-ui/components/audio-player/template.js","connections-ui/components/audio-recorder/component.js","connections-ui/components/audio-recorder/template.js","connections-ui/components/auth-loading/component.js","connections-ui/components/auth-loading/template.js","connections-ui/components/basic-dropdown.js","connections-ui/components/basic-dropdown/content-element.js","connections-ui/components/basic-dropdown/content.js","connections-ui/components/basic-dropdown/trigger.js","connections-ui/components/card-tree/card-tree-entry/component.js","connections-ui/components/card-tree/card-tree-entry/template.js","connections-ui/components/card-tree/component.js","connections-ui/components/card-tree/template.js","connections-ui/components/card-view/component.js","connections-ui/components/card-view/template.js","connections-ui/components/characters-used/component.js","connections-ui/components/characters-used/template.js","connections-ui/components/chat-settings/component.js","connections-ui/components/chat-settings/template.js","connections-ui/components/click-outside.js","connections-ui/components/create-entity-menu/component.js","connections-ui/components/create-entity-menu/template.js","connections-ui/components/date-picker/component.js","connections-ui/components/date-picker/template.js","connections-ui/components/desktop-notification/component.js","connections-ui/components/document-title.js","connections-ui/components/drag-drop-container/component.js","connections-ui/components/drag-drop-container/template.js","connections-ui/components/drag-drop-item/component.js","connections-ui/components/drag-drop-item/template.js","connections-ui/components/drop-down/component.js","connections-ui/components/dropdown-menu/component.js","connections-ui/components/dropdown-menu/template.js","connections-ui/components/duration-format/component.js","connections-ui/components/edit-profile-picture/component.js","connections-ui/components/edit-profile-picture/template.js","connections-ui/components/ember-modal-dialog-positioned-container.js","connections-ui/components/ember-modal-dialog/-basic-dialog.js","connections-ui/components/ember-modal-dialog/-in-place-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-tether-dialog.js","connections-ui/components/ember-modal-dialog/-tether-dialog.js","connections-ui/components/ember-tether.js","connections-ui/components/ember-wormhole.js","connections-ui/components/emergency-location/component.js","connections-ui/components/emergency-location/template.js","connections-ui/components/emoji-dom/component.js","connections-ui/components/entity-contact-group-v2/component.js","connections-ui/components/entity-contact-group-v2/template.js","connections-ui/components/entity-contact-group/component.js","connections-ui/components/entity-contact-queue/component.js","connections-ui/components/entity-contact/component.js","connections-ui/components/entity-contact/template.js","connections-ui/components/entity-favorite/component.js","connections-ui/components/entity-field-section/-section-footer/template.js","connections-ui/components/entity-field-section/-section-header/template.js","connections-ui/components/entity-field-section/add-new/component.js","connections-ui/components/entity-field-section/add-new/template.js","connections-ui/components/entity-field-section/component.js","connections-ui/components/entity-field-section/entity-contact-info/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.js","connections-ui/components/entity-field-section/entity-contact-info/contact-info-group.js","connections-ui/components/entity-field-section/entity-contact-info/template.js","connections-ui/components/entity-field-section/entity-education/component.js","connections-ui/components/entity-field-section/entity-groups/component.js","connections-ui/components/entity-field-section/entity-groups/template.js","connections-ui/components/entity-field-section/entity-location/component.js","connections-ui/components/entity-field-section/entity-relationships/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-group.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-search/component.js","connections-ui/components/entity-field-section/entity-relationships/template.js","connections-ui/components/entity-field-section/template.js","connections-ui/components/entity-fields/address-field/component.js","connections-ui/components/entity-fields/address-field/template.js","connections-ui/components/entity-fields/boolean-field/component.js","connections-ui/components/entity-fields/boolean-field/template.js","connections-ui/components/entity-fields/date-field/component.js","connections-ui/components/entity-fields/date-field/template.js","connections-ui/components/entity-fields/email-field/component.js","connections-ui/components/entity-fields/email-field/template.js","connections-ui/components/entity-fields/history-field/component.js","connections-ui/components/entity-fields/history-field/template.js","connections-ui/components/entity-fields/image-field/component.js","connections-ui/components/entity-fields/location-field/component.js","connections-ui/components/entity-fields/location-field/template.js","connections-ui/components/entity-fields/multiline-text-field/component.js","connections-ui/components/entity-fields/multiline-text-field/template.js","connections-ui/components/entity-fields/person-field/component.js","connections-ui/components/entity-fields/person-field/template.js","connections-ui/components/entity-fields/phone-field/component.js","connections-ui/components/entity-fields/phone-field/template.js","connections-ui/components/entity-fields/select-field/component.js","connections-ui/components/entity-fields/select-field/template.js","connections-ui/components/entity-fields/tag-field/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/template.js","connections-ui/components/entity-fields/tag-field/tag-wrapper/component.js","connections-ui/components/entity-fields/tag-field/template.js","connections-ui/components/entity-fields/text-field/component.js","connections-ui/components/entity-fields/text-field/template.js","connections-ui/components/entity-fields/validators.js","connections-ui/components/entity-fields/validators/address.js","connections-ui/components/entity-fields/validators/boolean.js","connections-ui/components/entity-fields/validators/date.js","connections-ui/components/entity-fields/validators/email.js","connections-ui/components/entity-fields/validators/history.js","connections-ui/components/entity-fields/validators/image.js","connections-ui/components/entity-fields/validators/location.js","connections-ui/components/entity-fields/validators/multiline-text.js","connections-ui/components/entity-fields/validators/person.js","connections-ui/components/entity-fields/validators/phone.js","connections-ui/components/entity-fields/validators/select.js","connections-ui/components/entity-fields/validators/tag.js","connections-ui/components/entity-fields/validators/text.js","connections-ui/components/entity-fields/validators/weblink.js","connections-ui/components/entity-fields/weblink-field/component.js","connections-ui/components/entity-fields/weblink-field/template.js","connections-ui/components/entity-hover-card-v2/component.js","connections-ui/components/entity-hover-card-v2/template.js","connections-ui/components/entity-hover-card/component.js","connections-ui/components/entity-image-v2/component.js","connections-ui/components/entity-image-v2/template.js","connections-ui/components/entity-image/component.js","connections-ui/components/entity-location/component.js","connections-ui/components/entity-mini/component.js","connections-ui/components/entity-mini/default/component.js","connections-ui/components/entity-mini/default/template.js","connections-ui/components/entity-mini/entity-details/component.js","connections-ui/components/entity-mini/entity-details/template.js","connections-ui/components/entity-mini/external-contact/component.js","connections-ui/components/entity-mini/external-contact/template.js","connections-ui/components/entity-mini/queue/component.js","connections-ui/components/entity-mini/queue/template.js","connections-ui/components/entity-mini/template.js","connections-ui/components/entity-picture-content/component.js","connections-ui/components/entity-picture-content/delete-pictures/component.js","connections-ui/components/entity-picture-content/delete-pictures/template.js","connections-ui/components/entity-picture-content/template.js","connections-ui/components/entity-profile/add-section/component.js","connections-ui/components/entity-profile/add-section/template.js","connections-ui/components/entity-profile/component.js","connections-ui/components/entity-profile/permissions.js","connections-ui/components/entity-profile/profiles/field-data.js","connections-ui/components/entity-profile/profiles/profile.js","connections-ui/components/entity-profile/profiles/section-info.js","connections-ui/components/entity-profile/section-icon/component.js","connections-ui/components/entity-profile/section-icon/template.js","connections-ui/components/entity-profile/template.js","connections-ui/components/entity-search/component.js","connections-ui/components/entity-search/template.js","connections-ui/components/entity-status/component.js","connections-ui/components/entity-status/template.js","connections-ui/components/entity-v2/activity-indicator/component.js","connections-ui/components/entity-v2/component.js","connections-ui/components/entity-v2/contact-group/component.js","connections-ui/components/entity-v2/favorite/component.js","connections-ui/components/entity-v2/hover-card/component.js","connections-ui/components/entity-v2/image/component.js","connections-ui/components/entity-v2/location/component.js","connections-ui/components/entity-v2/presence-indicator-dot/component.js","connections-ui/components/entity-v2/presence-label/component.js","connections-ui/components/entity-v2/presence-selector-dropdown/component.js","connections-ui/components/expander-plugin/component.js","connections-ui/components/expander-plugin/template.js","connections-ui/components/field-label/component.js","connections-ui/components/field-label/template.js","connections-ui/components/fixtable-column-header.js","connections-ui/components/fixtable-column-label.js","connections-ui/components/fixtable-empty-state.js","connections-ui/components/fixtable-footer.js","connections-ui/components/fixtable-grid.js","connections-ui/components/fixtable-row-toggle.js","connections-ui/components/fixtable-row.js","connections-ui/components/flashy-webrtc-troubleshooter/component.js","connections-ui/components/floorplan-editor/component.js","connections-ui/components/floorplan-editor/template.js","connections-ui/components/floorplan-popover/component.js","connections-ui/components/floorplan-popover/template.js","connections-ui/components/font-icon/component.js","connections-ui/components/group-contact-modal/component.js","connections-ui/components/group-contact-modal/inline-number-input/component.js","connections-ui/components/group-contact-modal/inline-number-input/template.js","connections-ui/components/group-contact-modal/template.js","connections-ui/components/group-profile/component.js","connections-ui/components/group-profile/dynamic-rules/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.js","connections-ui/components/group-profile/dynamic-rules/condition-display/template.js","connections-ui/components/group-profile/dynamic-rules/template.js","connections-ui/components/group-profile/group-contact-panel/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/component.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.js","connections-ui/components/group-profile/group-contact-panel/template.js","connections-ui/components/group-profile/group-list/component.js","connections-ui/components/group-profile/group-list/list-item/component.js","connections-ui/components/group-profile/group-list/list-item/template.js","connections-ui/components/group-profile/group-list/template.js","connections-ui/components/group-profile/membership-entry/component.js","connections-ui/components/group-profile/membership-entry/template.js","connections-ui/components/group-profile/membership-listing/component.js","connections-ui/components/group-profile/membership-listing/template.js","connections-ui/components/group-profile/membership-rule-entry/component.js","connections-ui/components/group-profile/membership-rule-entry/template.js","connections-ui/components/group-profile/membership-search/component.js","connections-ui/components/group-profile/membership-search/template.js","connections-ui/components/group-profile/membership-tag-search/component.js","connections-ui/components/group-profile/membership-tag-search/template.js","connections-ui/components/group-profile/roles-edit/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/component.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/component.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/component.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/component.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.js","connections-ui/components/group-profile/roles-edit/template.js","connections-ui/components/group-profile/template.js","connections-ui/components/grouped-facet-term/component.js","connections-ui/components/grouped-facet-term/template.js","connections-ui/components/headset-status/component.js","connections-ui/components/headset-vendor-picker/component.js","connections-ui/components/horizontal-collection.js","connections-ui/components/icon-bootstrap/component.js","connections-ui/components/icon-bootstrap/template.js","connections-ui/components/in-viewport.js","connections-ui/components/infinite-scroll/component.ts","connections-ui/components/infinite-scroll/template.js","connections-ui/components/integration-badge/component.js","connections-ui/components/integration-badge/template.js","connections-ui/components/integration-badges/component.js","connections-ui/components/integration-badges/template.js","connections-ui/components/interaction-annotation/component.js","connections-ui/components/light-gallery-modal/component.js","connections-ui/components/light-gallery-modal/template.js","connections-ui/components/link-to-external.js","connections-ui/components/loading-indicator/component.js","connections-ui/components/loading-indicator/template.js","connections-ui/components/location-display/component.js","connections-ui/components/location-display/template.js","connections-ui/components/login-oauth/component.js","connections-ui/components/login-oauth/template.js","connections-ui/components/logoff-link/component.js","connections-ui/components/media-providers/video-dropdown/component.js","connections-ui/components/media-providers/video-dropdown/template.js","connections-ui/components/mini-card/component.js","connections-ui/components/mini-card/template.js","connections-ui/components/modal-component/component.js","connections-ui/components/modal-component/template.js","connections-ui/components/modal-dialog-overlay.js","connections-ui/components/modal-dialog.js","connections-ui/components/modal-dialog/component.js","connections-ui/components/navigation-sub-menu/component.js","connections-ui/components/new-group/component.js","connections-ui/components/new-group/template.js","connections-ui/components/occludable-area.js","connections-ui/components/pc-style-icon-example.js","connections-ui/components/person-card/component.js","connections-ui/components/person-card/template.js","connections-ui/components/person-graph/component.js","connections-ui/components/person-graph/template.js","connections-ui/components/person-icon/component.js","connections-ui/components/person-icon/template.js","connections-ui/components/pikaday-input.js","connections-ui/components/pikaday-inputless.js","connections-ui/components/popover-on-component.js","connections-ui/components/popover-on-element.js","connections-ui/components/power-select-multiple.js","connections-ui/components/power-select-multiple/trigger.js","connections-ui/components/power-select.js","connections-ui/components/power-select/before-options.js","connections-ui/components/power-select/options.js","connections-ui/components/power-select/placeholder.js","connections-ui/components/power-select/power-select-group.js","connections-ui/components/power-select/search-message.js","connections-ui/components/power-select/trigger.js","connections-ui/components/pre-render.js","connections-ui/components/presence-label/component.js","connections-ui/components/presence-label/person-activity/component.js","connections-ui/components/presence-selector-dropdown/component.js","connections-ui/components/profile-dropdown-menu/component.js","connections-ui/components/progress-underlay/component.js","connections-ui/components/queue-toggle-switch/component.js","connections-ui/components/radio-input/component.js","connections-ui/components/resizable-content/component.js","connections-ui/components/resizable-content/template.js","connections-ui/components/resize-detector.js","connections-ui/components/search-facet-group/component.js","connections-ui/components/search-facet-group/template.js","connections-ui/components/search-facet-term/component.js","connections-ui/components/search-facet-term/template.js","connections-ui/components/search-page/component.js","connections-ui/components/search-page/template.js","connections-ui/components/search-result-context/component.js","connections-ui/components/search-result-context/template.js","connections-ui/components/sms-message-icon/component.js","connections-ui/components/sms-message-icon/template.js","connections-ui/components/station-disassociate-link/component.js","connections-ui/components/tags-input/label/template.js","connections-ui/components/telephone-input/component.js","connections-ui/components/tether-dialog.js","connections-ui/components/tether-popover-on-component.js","connections-ui/components/tether-popover-on-element.js","connections-ui/components/tether-tooltip-on-component.js","connections-ui/components/tether-tooltip-on-element.js","connections-ui/components/time-elapsed/component.js","connections-ui/components/time-elapsed/template.js","connections-ui/components/time-machine-confirmation/component.js","connections-ui/components/time-machine-confirmation/template.js","connections-ui/components/toggle-switch/component.js","connections-ui/components/tooltip-on-component.js","connections-ui/components/tooltip-on-element.js","connections-ui/components/upload-picture/component.js","connections-ui/components/upload-picture/helpers.js","connections-ui/components/upload-picture/template.js","connections-ui/components/uploaded-image/component.js","connections-ui/components/uploaded-image/template.js","connections-ui/components/vertical-collection.js","connections-ui/components/vertical-item.js","connections-ui/components/volume-input/component.js","connections-ui/components/webrtc-debug-modal/component.js","connections-ui/components/webrtc-issues/component.js","connections-ui/components/webrtc-settings/component.js","connections-ui/components/webrtc-troubleshooter/component.js","connections-ui/components/wrap-urls.js","connections-ui/components/wrap-urls/link.js","connections-ui/components/wrap-urls/url.js","connections-ui/components/x-option.js","connections-ui/components/x-select.js","connections-ui/config/asset-manifest.js","connections-ui/controllers/admin.js","connections-ui/controllers/application.js","connections-ui/controllers/array.js","connections-ui/controllers/card/detail.js","connections-ui/controllers/card/tree.js","connections-ui/controllers/chat-room.js","connections-ui/controllers/chat/participants.js","connections-ui/controllers/contacts.js","connections-ui/controllers/engage/embedded.js","connections-ui/controllers/feedback.js","connections-ui/controllers/maintenance.ts","connections-ui/controllers/object.js","connections-ui/controllers/permissions.js","connections-ui/controllers/person/detail.js","connections-ui/controllers/region-chooser.js","connections-ui/controllers/relate/externalcontact.js","connections-ui/controllers/relate/externalorganization.js","connections-ui/controllers/relate/index.js","connections-ui/controllers/reset-password.js","connections-ui/controllers/search.js","connections-ui/controllers/time-machine.js","connections-ui/enums/plantronics-call-events.js","connections-ui/field-config/entities/external-contact.js","connections-ui/field-config/entities/group.js","connections-ui/field-config/entities/org.js","connections-ui/field-config/entities/person.js","connections-ui/field-config/field-config.js","connections-ui/field-config/field-object.js","connections-ui/field-config/field-section.js","connections-ui/field-config/field.js","connections-ui/formats.js","connections-ui/group/store-mixin.js","connections-ui/helpers/-label-for-activity.js","connections-ui/helpers/abs.js","connections-ui/helpers/acos.js","connections-ui/helpers/acosh.js","connections-ui/helpers/add.js","connections-ui/helpers/address-format.js","connections-ui/helpers/and.js","connections-ui/helpers/app-version.js","connections-ui/helpers/array-contains.js","connections-ui/helpers/asin.js","connections-ui/helpers/asinh.js","connections-ui/helpers/atan.js","connections-ui/helpers/atan2.js","connections-ui/helpers/atanh.js","connections-ui/helpers/await.js","connections-ui/helpers/can-add-group-ring-member.js","connections-ui/helpers/can-edit.js","connections-ui/helpers/cancel-all.js","connections-ui/helpers/cbrt.js","connections-ui/helpers/ceil.js","connections-ui/helpers/chat-time.js","connections-ui/helpers/clz32.js","connections-ui/helpers/cos.js","connections-ui/helpers/cosh.js","connections-ui/helpers/css-classify.js","connections-ui/helpers/dasherize.js","connections-ui/helpers/div.js","connections-ui/helpers/ember-power-select-is-group.js","connections-ui/helpers/ember-power-select-is-selected.js","connections-ui/helpers/ember-power-select-true-string-if-present.js","connections-ui/helpers/emoji-text.js","connections-ui/helpers/empty.js","connections-ui/helpers/eq.js","connections-ui/helpers/equals.js","connections-ui/helpers/escape.js","connections-ui/helpers/exp.js","connections-ui/helpers/expand-line-breaks.js","connections-ui/helpers/expm1.js","connections-ui/helpers/facet-label.js","connections-ui/helpers/facet-term-label.js","connections-ui/helpers/first.js","connections-ui/helpers/flair.js","connections-ui/helpers/floor.js","connections-ui/helpers/format-date.js","connections-ui/helpers/format-filesize.js","connections-ui/helpers/format-html-message.js","connections-ui/helpers/format-link.js","connections-ui/helpers/format-message.js","connections-ui/helpers/format-number.js","connections-ui/helpers/format-relative.js","connections-ui/helpers/format-time.js","connections-ui/helpers/fround.js","connections-ui/helpers/full-name.js","connections-ui/helpers/gcd.js","connections-ui/helpers/get-select-options.js","connections-ui/helpers/group-ring-name.js","connections-ui/helpers/gt.js","connections-ui/helpers/gte.js","connections-ui/helpers/has-group-number.js","connections-ui/helpers/help-article-icon.js","connections-ui/helpers/html-safe.js","connections-ui/helpers/hypot.js","connections-ui/helpers/icon-for-activity.js","connections-ui/helpers/ignore-children.js","connections-ui/helpers/imul.js","connections-ui/helpers/initial-letter.js","connections-ui/helpers/intl-get.js","connections-ui/helpers/is-after.js","connections-ui/helpers/is-array.js","connections-ui/helpers/is-before.js","connections-ui/helpers/is-between.js","connections-ui/helpers/is-empty.js","connections-ui/helpers/is-equal.js","connections-ui/helpers/is-favorite.js","connections-ui/helpers/is-fulfilled.js","connections-ui/helpers/is-pending.js","connections-ui/helpers/is-rejected.js","connections-ui/helpers/is-same-or-after.js","connections-ui/helpers/is-same-or-before.js","connections-ui/helpers/is-same.js","connections-ui/helpers/is-selected-call-route.js","connections-ui/helpers/join-strings.js","connections-ui/helpers/l.js","connections-ui/helpers/lcm.js","connections-ui/helpers/localize-realtime-presence.js","connections-ui/helpers/log-e.js","connections-ui/helpers/log10.js","connections-ui/helpers/log1p.js","connections-ui/helpers/log2.js","connections-ui/helpers/lt.js","connections-ui/helpers/lte.js","connections-ui/helpers/max.js","connections-ui/helpers/meeting-date.js","connections-ui/helpers/min.js","connections-ui/helpers/mod.js","connections-ui/helpers/moment-add.js","connections-ui/helpers/moment-calendar.js","connections-ui/helpers/moment-diff.js","connections-ui/helpers/moment-duration.js","connections-ui/helpers/moment-format.js","connections-ui/helpers/moment-from-now.js","connections-ui/helpers/moment-from.js","connections-ui/helpers/moment-subtract.js","connections-ui/helpers/moment-to-date.js","connections-ui/helpers/moment-to-now.js","connections-ui/helpers/moment-to.js","connections-ui/helpers/moment-unix.js","connections-ui/helpers/moment.js","connections-ui/helpers/mult.js","connections-ui/helpers/multi-line-value.js","connections-ui/helpers/not-eq.js","connections-ui/helpers/not.js","connections-ui/helpers/now.js","connections-ui/helpers/or.js","connections-ui/helpers/perform.js","connections-ui/helpers/phone-integrations.js","connections-ui/helpers/pluralize-text.js","connections-ui/helpers/pluralize.js","connections-ui/helpers/pow.js","connections-ui/helpers/promise-all.js","connections-ui/helpers/promise-hash.js","connections-ui/helpers/promise-rejected-reason.js","connections-ui/helpers/random.js","connections-ui/helpers/render-markdown.js","connections-ui/helpers/round.js","connections-ui/helpers/route-action.js","connections-ui/helpers/short-chat-time.js","connections-ui/helpers/show-emoji.js","connections-ui/helpers/sign.js","connections-ui/helpers/sin.js","connections-ui/helpers/singularize.js","connections-ui/helpers/sort-field-data.js","connections-ui/helpers/sqrt.js","connections-ui/helpers/string-or-promise.js","connections-ui/helpers/sub.js","connections-ui/helpers/sum.js","connections-ui/helpers/t.js","connections-ui/helpers/tag-lookup.js","connections-ui/helpers/tan.js","connections-ui/helpers/tanh.js","connections-ui/helpers/task.js","connections-ui/helpers/time-duration.js","connections-ui/helpers/title-for-entity-property.js","connections-ui/helpers/trunc.js","connections-ui/helpers/unix.js","connections-ui/helpers/utc.js","connections-ui/helpers/value-for-choice.js","connections-ui/helpers/xor.js","connections-ui/hosted-context/util.js","connections-ui/index.js","connections-ui/initializers/add-modals-container.js","connections-ui/initializers/app-version.js","connections-ui/initializers/application-service.js","connections-ui/initializers/authentication-setup.js","connections-ui/initializers/authenticators.js","connections-ui/initializers/chat-service.js","connections-ui/initializers/clock.js","connections-ui/initializers/component-styles.js","connections-ui/initializers/container-debug-adapter.js","connections-ui/initializers/data-adapter.js","connections-ui/initializers/device-profiles-v2-service.js","connections-ui/initializers/ember-concurrency.js","connections-ui/initializers/ember-data-change-tracker.js","connections-ui/initializers/ember-data.js","connections-ui/initializers/ember-simple-auth.js","connections-ui/initializers/engines.js","connections-ui/initializers/export-application-global.js","connections-ui/initializers/extend-ember-computed.js","connections-ui/initializers/field-config.js","connections-ui/initializers/injectStore.js","connections-ui/initializers/main.js","connections-ui/initializers/media-providers.js","connections-ui/initializers/phone-service.js","connections-ui/initializers/preferences-service.js","connections-ui/initializers/route-styles.js","connections-ui/initializers/service-discovery.js","connections-ui/initializers/session-service.js","connections-ui/initializers/set-application-theme.js","connections-ui/initializers/setup-webrtc-components.js","connections-ui/initializers/store.js","connections-ui/initializers/transforms.js","connections-ui/initializers/webrtc-sdk-service.js","connections-ui/initializers/webrtc-service.js","connections-ui/initializers/webrtc-settings-service.js","connections-ui/instance-initializers/attach-application-controller.js","connections-ui/instance-initializers/attach-application-session.js","connections-ui/instance-initializers/backburner-debug.js","connections-ui/instance-initializers/conversation-service.js","connections-ui/instance-initializers/embedded-service.js","connections-ui/instance-initializers/ember-data.js","connections-ui/instance-initializers/ember-intl.js","connections-ui/instance-initializers/ember-simple-auth.js","connections-ui/instance-initializers/ember-tooltips.js","connections-ui/instance-initializers/entity-contact-group.js","connections-ui/instance-initializers/entity-favorite.js","connections-ui/instance-initializers/entity-hover-card.js","connections-ui/instance-initializers/entity-image.js","connections-ui/instance-initializers/entity-location.js","connections-ui/instance-initializers/inject-owner.js","connections-ui/instance-initializers/load-asset-manifest.js","connections-ui/instance-initializers/presence-label.js","connections-ui/instance-initializers/recording-service.js","connections-ui/instance-initializers/reopen-component.js","connections-ui/instance-initializers/reopen-route.js","connections-ui/instance-initializers/set-application-service-values.js","connections-ui/instance-initializers/set-application-values.js","connections-ui/instance-initializers/setup-application.js","connections-ui/instance-initializers/setup-apps-api-handlers.js","connections-ui/instance-initializers/setup-error-handling.js","connections-ui/instance-initializers/webrtc.js","connections-ui/media-providers/provider.js","connections-ui/media-providers/purecloud.js","connections-ui/media-providers/teams.js","connections-ui/media-providers/utils/auth.js","connections-ui/media-providers/zoom.js","connections-ui/mixins/acd-attachment-url-mixin.js","connections-ui/mixins/acd-utilities.js","connections-ui/mixins/acd/after-call-work.js","connections-ui/mixins/acd/participants.js","connections-ui/mixins/acd/session-share.js","connections-ui/mixins/auth-controller.js","connections-ui/mixins/authenticated-authorized-route-mixin.js","connections-ui/mixins/batch-data-requests.js","connections-ui/mixins/cache-chat-rooms.js","connections-ui/mixins/change-serializer.js","connections-ui/mixins/chat-message-media.js","connections-ui/mixins/chat-message-mixin.js","connections-ui/mixins/chat-service/chat-events.js","connections-ui/mixins/chat-service/message-notifications.js","connections-ui/mixins/chat-service/message-splitting.js","connections-ui/mixins/chat-user.js","connections-ui/mixins/click-outside.js","connections-ui/mixins/conversation-analysis.js","connections-ui/mixins/conversation-uri-builder.js","connections-ui/mixins/conversation-v2/chats-service.js","connections-ui/mixins/conversation.js","connections-ui/mixins/create-group.js","connections-ui/mixins/device-enumeration.js","connections-ui/mixins/embedded-message-event-handler.js","connections-ui/mixins/entity-controller.js","connections-ui/mixins/entity-image-defaults.js","connections-ui/mixins/entity-presence.js","connections-ui/mixins/entity.js","connections-ui/mixins/evaluations.js","connections-ui/mixins/external-contacts.js","connections-ui/mixins/faxes.js","connections-ui/mixins/field-component.js","connections-ui/mixins/flag.js","connections-ui/mixins/in-viewport.js","connections-ui/mixins/interaction/session-share.js","connections-ui/mixins/interaction/tooltips.js","connections-ui/mixins/job.js","connections-ui/mixins/logger.js","connections-ui/mixins/model-route.js","connections-ui/mixins/paging.js","connections-ui/mixins/phone-service/active-call.js","connections-ui/mixins/phone-service/call-controls.js","connections-ui/mixins/phone-service/call-forward.js","connections-ui/mixins/phone-service/conversation-manager.js","connections-ui/mixins/phone-service/events.js","connections-ui/mixins/phone-service/notifications.js","connections-ui/mixins/phone-service/station.js","connections-ui/mixins/promise-loading.js","connections-ui/mixins/purecloud-model.js","connections-ui/mixins/relate/relate-features.js","connections-ui/mixins/search.js","connections-ui/mixins/searchV2.js","connections-ui/mixins/sort-chat-users.js","connections-ui/mixins/style-namespacing-extras.js","connections-ui/mixins/unprotected-route-mixin.js","connections-ui/mixins/viewport.js","connections-ui/mixins/webrtc-action-utils.js","connections-ui/models/annotation.js","connections-ui/models/app-api-call.js","connections-ui/models/app-instance.js","connections-ui/models/app-pool.js","connections-ui/models/app.js","connections-ui/models/call-communication.js","connections-ui/models/call-forwarding.js","connections-ui/models/callback-communication.js","connections-ui/models/callv2.ts","connections-ui/models/chat-communication.js","connections-ui/models/chat-message.js","connections-ui/models/chat-room.js","connections-ui/models/chat-video-participant.js","connections-ui/models/coaching-appointment.js","connections-ui/models/coded-geolocation.js","connections-ui/models/conversation-legacy.js","connections-ui/models/conversation.js","connections-ui/models/division.js","connections-ui/models/email-communication.js","connections-ui/models/ember-intl-translation.js","connections-ui/models/evaluation.js","connections-ui/models/external-contact.js","connections-ui/models/externalcontacts/channel-record.js","connections-ui/models/externalcontacts/channel.js","connections-ui/models/externalcontacts/contact.js","connections-ui/models/externalcontacts/external-organization.js","connections-ui/models/externalcontacts/facebook-id.js","connections-ui/models/externalcontacts/line-id.js","connections-ui/models/externalcontacts/twitter-id.js","connections-ui/models/externalcontacts/whatsapp-id.js","connections-ui/models/fax.js","connections-ui/models/geolocation-settings.js","connections-ui/models/geolocation.js","connections-ui/models/github-item.js","connections-ui/models/grant.js","connections-ui/models/group-policy.js","connections-ui/models/group.js","connections-ui/models/internally-hosted-app.js","connections-ui/models/library.js","connections-ui/models/location.js","connections-ui/models/meeting.js","connections-ui/models/message-communication.js","connections-ui/models/org.js","connections-ui/models/participant.js","connections-ui/models/person.js","connections-ui/models/presence.js","connections-ui/models/public-api-user.js","connections-ui/models/queue.js","connections-ui/models/recorded-call.js","connections-ui/models/recording.js","connections-ui/models/resource-article.js","connections-ui/models/response.js","connections-ui/models/role.js","connections-ui/models/screenshare-communication.js","connections-ui/models/social-communication.js","connections-ui/models/split-message.js","connections-ui/models/station.js","connections-ui/models/unrecoverable-app-failure.ts","connections-ui/models/user.js","connections-ui/models/video-communication.js","connections-ui/models/voicemail-message.js","connections-ui/models/wfm-notification.js","connections-ui/phone/template.js","connections-ui/resolver.js","connections-ui/router.js","connections-ui/routes/admin.js","connections-ui/routes/application.js","connections-ui/routes/card/detail.js","connections-ui/routes/card/tree.js","connections-ui/routes/custom-fields-contacts-redirect.js","connections-ui/routes/custom-fields-orgs-redirect.js","connections-ui/routes/group/detail.js","connections-ui/routes/index.js","connections-ui/routes/login-oauth.js","connections-ui/routes/login.js","connections-ui/routes/maintenance.ts","connections-ui/routes/no-access.js","connections-ui/routes/performance-summary-queues.js","connections-ui/routes/person/detail.js","connections-ui/routes/search.js","connections-ui/routes/third-party/app-embed.js","connections-ui/routes/time-machine.js","connections-ui/search/adapter-mixin.js","connections-ui/search/request-builder.js","connections-ui/search/service.js","connections-ui/search/store-mixin.js","connections-ui/serializers/application.js","connections-ui/serializers/call-communication.js","connections-ui/serializers/call-forwarding.js","connections-ui/serializers/callback-communication.js","connections-ui/serializers/callv2.js","connections-ui/serializers/chat-communication.js","connections-ui/serializers/coded-geolocation.js","connections-ui/serializers/conversation-v2.js","connections-ui/serializers/conversation.js","connections-ui/serializers/division.js","connections-ui/serializers/email-communication.js","connections-ui/serializers/externalcontacts/contact.js","connections-ui/serializers/externalcontacts/external-organization.js","connections-ui/serializers/externalcontacts/facebook-id.js","connections-ui/serializers/externalcontacts/line-id.js","connections-ui/serializers/externalcontacts/twitter-id.js","connections-ui/serializers/externalcontacts/whatsapp-id.js","connections-ui/serializers/geolocation-settings.js","connections-ui/serializers/geolocation.js","connections-ui/serializers/grant.js","connections-ui/serializers/group-policy.js","connections-ui/serializers/group.js","connections-ui/serializers/library.js","connections-ui/serializers/location.js","connections-ui/serializers/meeting.js","connections-ui/serializers/message-communication.js","connections-ui/serializers/participant.js","connections-ui/serializers/person.js","connections-ui/serializers/public-api-user.js","connections-ui/serializers/purecloud-user.js","connections-ui/serializers/purecloud.js","connections-ui/serializers/queue.js","connections-ui/serializers/recorded-call.js","connections-ui/serializers/recording.js","connections-ui/serializers/response.js","connections-ui/serializers/role.js","connections-ui/serializers/screenshare-communication.js","connections-ui/serializers/skillgroup.js","connections-ui/serializers/social-communication.js","connections-ui/serializers/station.js","connections-ui/serializers/user.js","connections-ui/serializers/video-communication.js","connections-ui/serializers/voicemail-message.js","connections-ui/services/addressformat.js","connections-ui/services/ajax.js","connections-ui/services/analytics.js","connections-ui/services/application.js","connections-ui/services/apps-api-handlers/directory-nav-handler.js","connections-ui/services/apps-api-handlers/toast-handler.js","connections-ui/services/apps.js","connections-ui/services/asset-loader.js","connections-ui/services/batch-data-requests.js","connections-ui/services/chat.js","connections-ui/services/clock.js","connections-ui/services/communication.js","connections-ui/services/conversation.js","connections-ui/services/cookies.js","connections-ui/services/device-profiles-v2.js","connections-ui/services/embedded.js","connections-ui/services/emergency-location.js","connections-ui/services/events.ts","connections-ui/services/external-contacts.js","connections-ui/services/favorites.js","connections-ui/services/feature.js","connections-ui/services/file-upload.js","connections-ui/services/fullscreen.js","connections-ui/services/geolocation.js","connections-ui/services/group-assigned-roles.js","connections-ui/services/headset.js","connections-ui/services/iframe-state.js","connections-ui/services/in-viewport.js","connections-ui/services/integrations-presence.js","connections-ui/services/interaction.js","connections-ui/services/interval.js","connections-ui/services/intl.js","connections-ui/services/media-providers.js","connections-ui/services/modal-dialog.js","connections-ui/services/moment.js","connections-ui/services/names.js","connections-ui/services/notification-proxy.js","connections-ui/services/notification.js","connections-ui/services/org-settings.js","connections-ui/services/permissions.js","connections-ui/services/phone-integrations.js","connections-ui/services/phone.js","connections-ui/services/pigeon.js","connections-ui/services/preferences.js","connections-ui/services/presence-subscription.js","connections-ui/services/presence.js","connections-ui/services/purecloud-oauth.js","connections-ui/services/relate.js","connections-ui/services/resize-detector.js","connections-ui/services/screen-media.ts","connections-ui/services/scroll-activity.js","connections-ui/services/session.js","connections-ui/services/settings.js","connections-ui/services/sound.js","connections-ui/services/stash-logger.js","connections-ui/services/store.js","connections-ui/services/streaming.js","connections-ui/services/text-measurer.js","connections-ui/services/user-activity.js","connections-ui/services/user-idle.js","connections-ui/services/validations.js","connections-ui/services/vendor-implementations/jabra-chrome.js","connections-ui/services/vendor-implementations/jabra-native.js","connections-ui/services/vendor-implementations/plantronics.js","connections-ui/services/vendor-implementations/sennheiser.js","connections-ui/services/video-activity.js","connections-ui/services/video-idle.js","connections-ui/services/webrtc-sdk.ts","connections-ui/services/webrtc-settings.ts","connections-ui/services/webrtc.js","connections-ui/session-stores/application.js","connections-ui/templates/agent-ui.js","connections-ui/templates/call-forwarding-partial.js","connections-ui/templates/card/detail.js","connections-ui/templates/card/tree.js","connections-ui/templates/chat-room.js","connections-ui/templates/components/document-title.js","connections-ui/templates/components/webhooks-collapsible.js","connections-ui/templates/components/webhooks.js","connections-ui/templates/components/x-select.js","connections-ui/templates/group/detail.js","connections-ui/templates/index.js","connections-ui/templates/login-oauth.js","connections-ui/templates/maintenance.js","connections-ui/templates/no-access.js","connections-ui/templates/partials/-no-station-notification.js","connections-ui/templates/person/detail.js","connections-ui/templates/purecloud/partials/conversation-controls-menu.js","connections-ui/templates/reset-password.js","connections-ui/templates/search.js","connections-ui/templates/third-party/app-embed.js","connections-ui/templates/time-machine.js","connections-ui/transforms/iso-date.js","connections-ui/transforms/json.js","connections-ui/transforms/object.js","connections-ui/types/agent-assist.type.js","connections-ui/types/conversation.type.js","connections-ui/types/index.ts","connections-ui/types/maybe.type.js","connections-ui/types/pigeon.type.js","connections-ui/types/webrtc-settings.type.js","connections-ui/utils/acd-ts.ts","connections-ui/utils/acd-v2.ts","connections-ui/utils/acd.js","connections-ui/utils/acdParticipantStatuses.js","connections-ui/utils/analytics-keys.js","connections-ui/utils/analytics-routing.ts","connections-ui/utils/app-provider.js","connections-ui/utils/apps-v2-api-handlers.ts","connections-ui/utils/apps.ts","connections-ui/utils/async.ts","connections-ui/utils/boolean-expressions.js","connections-ui/utils/browser.js","connections-ui/utils/code-utils.js","connections-ui/utils/conversation.ts","connections-ui/utils/dates.js","connections-ui/utils/debug-backburner.js","connections-ui/utils/debug-rsvp.js","connections-ui/utils/display-geolocation.js","connections-ui/utils/email-types/draft-type.js","connections-ui/utils/email-types/email-type.js","connections-ui/utils/email.js","connections-ui/utils/ember-types.js","connections-ui/utils/emergency-location-util.js","connections-ui/utils/emoji-json-helper-expanded.js","connections-ui/utils/emoji-json-helper-v1.js","connections-ui/utils/emoji-json-helper.js","connections-ui/utils/emoji.js","connections-ui/utils/entity-fields.js","connections-ui/utils/error-white-list.js","connections-ui/utils/escape.js","connections-ui/utils/exponential-interval-generator.js","connections-ui/utils/external-contact-messaging.js","connections-ui/utils/feature-toggles.ts","connections-ui/utils/file-extensions-type.ts","connections-ui/utils/focus-management.js","connections-ui/utils/geolocation.js","connections-ui/utils/giphy.js","connections-ui/utils/gsm7.js","connections-ui/utils/hosted-context.js","connections-ui/utils/instagram/instagram-properties.js","connections-ui/utils/intl/missing-message.js","connections-ui/utils/jid-helpers.js","connections-ui/utils/keystroke.ts","connections-ui/utils/logger.js","connections-ui/utils/markdown.js","connections-ui/utils/masonry.js","connections-ui/utils/message-channels.js","connections-ui/utils/names.ts","connections-ui/utils/net.js","connections-ui/utils/newrelic-legacy.js","connections-ui/utils/newrelic.ts","connections-ui/utils/objects.js","connections-ui/utils/phone-number.ts","connections-ui/utils/presence-label-util.ts","connections-ui/utils/presence-utils.js","connections-ui/utils/presence.js","connections-ui/utils/promise-array.js","connections-ui/utils/query-parser.js","connections-ui/utils/queued-processing-chain.js","connections-ui/utils/request.ts","connections-ui/utils/routing-status.js","connections-ui/utils/safeSet.js","connections-ui/utils/serial-processing-chain.ts","connections-ui/utils/simple-cache.ts","connections-ui/utils/sms/sms-properties.js","connections-ui/utils/sound-recorder.js","connections-ui/utils/supported-messaging-subtypes.ts","connections-ui/utils/testing.ts","connections-ui/utils/theme-loader.js","connections-ui/utils/timeout-promise.js","connections-ui/utils/transform-panels.ts","connections-ui/utils/ttl-cache.ts","connections-ui/utils/twitter/twitter-properties.js","connections-ui/utils/types.ts","connections-ui/utils/uri-builder.ts","connections-ui/utils/uuid-generator.js","connections-ui/utils/uuid.js","connections-ui/utils/video-frame-checker.js","connections-ui/utils/webmessaging/webmessaging-properties.js","connections-ui/validators/alias.js","connections-ui/validators/belongs-to.js","connections-ui/validators/collection.js","connections-ui/validators/confirmation.js","connections-ui/validators/date.js","connections-ui/validators/dependent.js","connections-ui/validators/ds-error.js","connections-ui/validators/exclusion.js","connections-ui/validators/format.js","connections-ui/validators/has-many.js","connections-ui/validators/inclusion.js","connections-ui/validators/length.js","connections-ui/validators/messages.js","connections-ui/validators/number.js","connections-ui/validators/presence.js","connections-ui/video-participant-v2/model.js","connections-ui/video-participant/model.js","connections-ui/views/card/tree.js","connections-ui/webrtc-conversation/model.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"names":["f","exports","_typeof","module","define","amd","g","window","global","self","this","adapter","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","SDPUtils","writeMediaSection","transceiver","caps","type","stream","dtlsRole","sdp","writeRtpDescription","kind","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","trackId","_initialTrackId","track","id","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","parseInt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","name","toLowerCase","forEach","clockRate","JSON","parse","stringify","numChannels","Math","min","push","rtcpFeedback","filter","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","signalingState","offer","setLocalDescription","setRemoteDescription","answer","indexOf","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","find","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","description","NotSupportedError","InvalidStateError","InvalidAccessError","TypeError","undefined","OperationError","edgeVersion","addTrackToStreamAndFireEvent","addTrack","dispatchEvent","MediaStreamTrackEvent","fireAddTrack","pc","receiver","streams","trackEvent","Event","setTimeout","_dispatchEvent","RTCPeerConnection","config","_eventTarget","document","createDocumentFragment","method","bind","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","iceServers","hasTurn","server","urls","url","console","warn","isString","validTurn","filterIceServers","_iceGatherers","iceCandidatePoolSize","RTCIceGatherer","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","Object","defineProperty","prototype","configurable","get","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","event","_emitGatheringStateChange","getConfiguration","getLocalStreams","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","alreadyExists","s","_maybeFireNegotiationNeeded","RTCRtpSender","addStream","getTracks","clonedStream","clone","idx","clonedTrack","addEventListener","enabled","removeTrack","sender","stop","map","splice","removeStream","getSenders","getReceivers","_createIceGatherer","sdpMLineIndex","shift","value","writable","bufferedCandidateEvents","bufferCandidates","end","keys","state","_gather","onlocalcandidate","removeEventListener","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","assign","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","receive","sessionpart","Promise","reject","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","rejected","isRejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","resolve","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","hasRtx","MediaStream","default","RTCRtpReceiver","getCapabilities","codec","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","close","newState","states","new","closed","checking","connected","completed","disconnected","failed","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","arguments","mandatory","optional","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","desc","RTCSessionDescription","createAnswer","mediaSectionsInOffer","localTrack","getAudioTracks","getVideoTracks","reducedSize","addIceCandidate","candidateString","trim","getStats","selector","MediaStreamTrack","senderOrReceiver","promises","all","then","allStats","results","Map","stats","stat","set","ortcObjectName","obj","nativeGetstats","apply","nativeStats","mapStats","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","methods","nativeMethod","args","error","2","random","toString","blob","line","parts","part","index","prefix","substring","address","relatedAddress","relatedPort","tcpType","toUpperCase","parseIceOptions","parseRtpMap","parsed","channels","writeRtpMap","parseExtmap","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","param","parseRtcpFb","writeRtcpFb","parseSsrcMedia","sp","colon","attribute","parseSsrcGroup","semantics","ssrcs","parseFingerprint","algorithm","fingerprints","setupType","fp","concat","iceParameters","password","mline","rtpmapline","fmtps","maxptime","extension","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","remoteSsrc","rsize","mux","spec","planB","msidParts","sessId","sessVer","sessUser","sessionId","version","user","parseMLine","fmt","slice","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","charAt","3","adapterFactory","./adapter_factory.js","4","utils","dependencies","opts","options","shimChrome","shimFirefox","shimEdge","shimSafari","key","hasOwnProperty","logging","log","browserDetails","detectBrowser","chromeShim","edgeShim","firefoxShim","safariShim","commonShim","extractVersion","disableLog","disableWarnings","browser","shimPeerConnection","browserShim","shimCreateObjectURL","shimGetUserMedia","shimMediaStream","shimSourceObject","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimMaxMessageSize","shimSendThrowTypeError","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimReplaceTrack","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","./chrome/chrome_shim","./common_shim","./edge/edge_shim","./firefox/firefox_shim","./safari/safari_shim","./utils","5","filterStats","result","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","walkStats","base","resultSet","has","endsWith","webkitMediaStream","_ontrack","enumerable","origSetRemoteDescription","_ontrackpoly","te","wrapPeerConnectionEvent","shimSenderWithDtmf","dtmf","_dtmf","createDTMFSender","_pc","_senders","origAddTrack","origRemoveTrack","origAddStream","origRemoveStream","origGetSenders","senders","origGetReceivers","receivers","srcElement","origGetStats","err","DOMException","URL","HTMLMediaElement","_srcObject","src","revokeObjectURL","createObjectURL","shimAddTrackRemoveTrackWithNative","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","replace","RegExp","replaceExternalStreamId","oldStream","isLegacyCall","origSetLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","webkitRTCPeerConnection","pcConfig","pcConstraints","iceTransports","generateCertificate","successCallback","errorCallback","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","names","makeMapStats","successCallbackWrapper_","promise","RTCIceCandidate","nativeAddIceCandidate","target","shimGetDisplayMedia","getSourceId","navigator","getDisplayMedia","constraints","sourceId","video","chromeMediaSource","chromeMediaSourceId","maxFrameRate","frameRate","mediaDevices","getUserMedia","../utils.js","./getusermedia","6","constraintsToChrome_","cc","ideal","exact","max","oldname_","oc","mix","advanced","shimConstraints_","func","audio","remap","b","face","facingMode","matches","getSupportedFacingModeLies","getSupportedConstraints","enumerateDevices","devices","d","dev","some","match","label","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","onSuccess","onError","webkitGetUserMedia","getUserMediaPromise_","kinds","getSources","device","groupId","echoCancellation","height","width","origGetUserMedia","cs","7","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","nativeCreateObjectURL","nativeRevokeObjectURL","newId","deprecated","delete","dsc","srcObject","nativeSetAttribute","setAttribute","RTCSctpTransport","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","origCreateDataChannel","createDataChannel","dataChannel","wrapDcSend","channel","dc","origDataChannelSend","data","size","byteLength","readyState","8","shimRTCPeerConnection","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","replaceTrack","setTrack","../utils","./filtericeservers","rtcpeerconnection-shim","9","10","catch","11","RTCTrackEvent","mozSrcObject","mozRTCPeerConnection","newIceServers","newServer","credential","mozRTCSessionDescription","mozRTCIceCandidate","modernStatsTypes","nativeGetStats","onSucc","onErr","DataChannel","RTCDataChannel","preferredMediaSource","mediaSource","12","InternalError","SecurityError","The operation is insecure.","getUserMedia_","constraintsToFF37_","mozGetUserMedia","orgEnumerateDevices","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","13","_localStreams","getStreamById","_remoteStreams","_addTrack","tracks","_onaddstream","_onaddstreampoly","failureCallback","withCallback","cb","errcb","OrigPeerConnection","RTCTransceiver","origCreateOffer","audioTransceiver","getTransceivers","setDirection","addTransceiver","videoTransceiver","14","logDisabled_","deprecationWarnings_","uastring","expr","pos","eventNameToWrap","wrapper","proto","nativeAddEventListener","nativeEventName","wrappedCallback","modifiedEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","oldMethod","newMethod","userAgent","versions","people","groups","locations","users","messages","notifications","ApplicationAdapter","DS","RESTAdapter","extend","SearchAdapterMixin","logger","Ember","inject","service","session","application","defaultSerializer","namespace","shouldReloadAll","shouldBackgroundReloadRecord","normalizeErrorResponse","status","headers","payload","errors","_super","modelFor","pathForType","modelName","String","camelize","_emberInflector","pluralize","createRecord","store","record","snapshot","_createSnapshot","serializerFor","serialize","includeId","ajax","buildURL","updateRecord","serializeIntoHash","attr","urlForUpdateRecord","_directoryUrl","findRecord","FULL_PERSON","fl","traditional","findQuery","query","entityEndpoint","path","modelEndpoint","apiVersion","host","findMultiEntity","requestType","limit","_entity","facets","returnFields","_toConsumableArray","BASE_PERSON","BASE_GROUP_FIELDS","performSearch","RSVP","findFavorites","findFavoritesPublicApiV2","_this","pcV2Uri","deferred","defer","_findFavoritesPublicApiV2","res","_handleFavorites","page","pageNumber","pageSize","cache","collection","_this2","entities","nextPage","currentCount","forwardVoicemail","voicemail","recipient","voicemailMessageId","userId","_findDirectReports","count","offset","_handleReports","_this3","findDirectReports","_this4","findSuperiors","computed","reads","serializer","adapterOptions","patch","urlForFindRecord","handleResponse","requestData","useExternalContactExpand","paging","queryDefaults","currentInterval","_dates","previousInterval","subtract","typeClass","findLatestCalls","_fetchLatestCalls","_fetchHistory","guid","interval","toISOString","add","getHistoryPath","meta","_","merge","incrementPageNumber","decrementWeek","pcUri","Geolocation","findAll","total","firstUri","lastUri","selfUri","pageCount","divisionLimit","sinceToken","snapshotRecordArray","objectCount","limitUrl","$","PurecloudAdapter","LoggerMixin","RelateFeaturesMixin","relate","addressformat","permissions","cannotViewExternalContacts","not","clearCachedAdapter","originator","urlAndModel","expand","timeout","deleteRecord","returnValue","queryParams","addressFormat","searchTerm","expandField","sortOrder","subType","hasValidSearchTerm","isValidPhoneNumber","isValidNumber","containsOnlyPhoneNumberChars","test","isExactSearch","_newrelic","addPageAction","orgId","formatAddress","useLookupService","lookupVal","term","encodeURI","q","decodeURI","bypassCache","findMatchingExternalContacts","getCachedAdapter","TIME_OUT","EXPAND","dataType","saveBulk","roleId","subjectIds","divisionIds","ajaxOptions","hash","ajaxSuccess","jqXHR","_baseUrl","groupPolicy","title","details","buildQuery","baseUrl","endpoint","urlForFindMany","urlForDeleteRecord","fields","gProfile","general","memberCount","individuals","owners","groupSerializer","group","policy","generateGroupProfilePayload","jIdNumber","getJidIdNumber","contactInfo","chat","jid","getDeletedGroup","findMany","ids","snapshots","uuids","jIds","urlWithAppendedIds","urlDeletedWithAppendedIds","activeResults","getDeletedGroups","deleteUrl","groupsResults","deletedGroups","normalizeDeletedGroup","_this5","getUrl","deletedGroup","adapterFor","findGroupMembership","ceil","json","vmPolicy","organizationId","mt","membershipDraft","needsCommit","exchangeSync","links","cleanGroupLinkIds","email","Array","isArray","groupNumber","phone","labelKey","hasGroupPhone","groupAlertType","numberInfo","hasNumber","number","hasExtension","groupType","jabberId","BASE_LOCATION_FIELDS","urlForHasMany","location","floors","init","urlForFindAll","meeting","meetingId","urlForQuery","urlForCreateRecord","ajaxService","integrationsPresenceSvc","usingIntegrationSource","integrationPresenceSource","snapshotsOrOptions","guids","jids","_findMany","superiors","mapBy","directReports","baseRequestData","_store","batchEntityIds","_defineProperty","raw","contentType","retry","_ref","_ref2","flat","integrationSource","_loadActivities","findBelongsTo","link","relationship","modelClass","snapshotOrQuery","detail","contextId","objId","_asyncToGenerator","regeneratorRuntime","mark","_callee","fetchDivisions","wrap","_context","prev","next","divisionAgnostic","myQueuesOnly","fetchDivisionsForTargetQueueSearch","sent","entity","divisionId","abrupt","getDivisionLimits","_callee2","_context2","permission","divisionAware","_exports","_recording","currentPage","currentPageSize","libraryId","head","aggregatePayload","records","_getPage","sort","roleA","roleB","UserAdapter","sortQueryParams","sortBy","_genesysSparkComponents","registerElements","iframeCoordinator","registerCustomElements","_loader","defineCustomElements","APP","LOG_RUNLOOP_STACKTRACE","run","backburner","DEBUG","LOG_BINDINGS","Application","_defineModifier","App","cookies","stashLogger","applicationService","customEvents","pageChanged","itemsPerPageChanged","favoriteEvent","contactEvent","navigateToProfileEvent","modulePrefix","podModulePrefix","Resolver","engines","emberEngineCustomFields","services","externalRoutes","personDetail","admin","entityTypes","currentRouteName","debug","initVersion","initContext","isImpersonating","proxyPersonId","read","iframed","top","libraries","register","ENV","LOG_VERSION","Logger","libs","forOwn","controllerFor","instance","lookup","serviceFor","componentFor","listAsync","resolveRegistration","logTimerQueue","logPendingPromises","promiseStackFor","lookupPromiseStack","_emberLoadInitializers","stackTraceLimit","HTMLBars","template","block","moduleName","_util","_component","oauthStoreParams","oauthStoreProps","Base","purecloudOauth","authClient","restore","accessToken","clientId","parent","access_token","_establishLocalSession","pick","Client","token_type","getToken","t0","failedStep","authenticate","scope","reason","deserializeRestoreState","finalOptions","expires_in","token_expiry_time_millis","_getCurrMillis","token_expiry_time_iso_string","Date","SESSION_BOOTSTRAP_ERROR_TYPE","authUrl","_buildAuthUrl","invalidate","allSettled","_destroyLocalSession","authorizer","getOwner","deauthorizeAllDomainRequests","extractAuthData","reduce","accumulator","currPair","tokens","currToken","decodeURIComponent","buildAuthorizeUrl","stateParam","org","buildLogoutUrl","cleanCustomBrowserStorage","clear","localSessionDeferred","authorizeAllDomainRequests","authenticateWithSession","removeAuthCookie","legacyInvalidSessionToken","ensureLogsSent","_x","ajaxGet","finally","login","stateParamValue","targetOrg","baseAuthUri","oauthParams","response_type","client_id","enableRegionSwitching","redirectUri","origin","pathname","lastIndex","redirect_uri","_this6","_callee3","_context3","immediateSaveLogs","now","DirectoryAuthenticator","SEMVER_PARSER","_authData","_ajaxPrefilters","_ajaxErrors","appContextHeaderTokens","headerTokens","semver","semverParseResult","exec","_semverParseResult","_slicedToArray","pkgVersion","buildNumber","gitBranch","gitCommit","curr","replaceAll","isHosted","Callbacks","ajaxPrefilter","fire","ajaxError","authorize","authData","fnToAuthorize","_buildHeaders","_addHeadersPrefilter","empty","original","crossDomain","_isWhitelistedUrl","_isAbsPathOfProxiedEnv","excludeAuthHeader","isFaxUpload","noAuthorizationHeader","Authorization","headerValue","headerName","setRequestHeader","_isGcPublicApiUrl","REQUEST_TELEMETRY_APP_SUBSECTIONS","subsection","subsectionTokens","remoteData","includes","pubApiBase","pubApiProxyBase","currBase","envDetails","environment","local","tgtEnvDetails","netUtils","getEnvDetails","env","unknownEnv","_handleUnauthorizedRequests","settings","thrownError","skipPurecloudUnauthorizedCheck","_sendXhrErrorDetails","unauthorized","ININ-Client-Path","_handleClientUnauthorizedError","msg","_sendErrorMessage","_errors","isUnauthorizedError","xhr","correlationId","getResponseHeader","messageData","post","beforeSend","app","appId","appVersion","traces","level","time","topic","locale","pluralRuleFunction","ord","n100","year","displayName","relative","0","-1","relativeTime","future","zero","one","two","few","many","other","past","month","day","-2","hour","minute","second","v0","parentLocale","n10","i10","i100","on","Component","classNames","notification","sendClose","sendAction","toast","notificationType","markdownToHtml","shouldShowPopup","shouldPlaySound","handleMessageEvent","sameHost","sameName","startMessageListener","elementId","stopMessageListener","off","classNameBindings","attributeBindings","intl","utcOffset","staticMoment","showSecondHand","autoIncrement","_analogSupported","Modernizr","csstransforms","_displayedMoment","_invalidTime","_currTimeLabel","_pendingTick","willRender","_cancelTimers","formatStr","invalid","isNaN","isValid","format","willDestroyElement","didRender","hourElement","minuteElement","secondAngle","minuteAngle","hourAngle","hourRule","minuteRule","secondRule","style","transform","secondElement","later","rerender","timerName","currTimer","cancel","AnchorTagComponent","tagName","httpRegex","ariaLabelledBy","decorateLabel","text","htmlSafe","Handlebars","Utils","escapeExpression","anchor","encodeURIComponent","observer","_email","isValidEmailAddress","IMG_TYPE_CFG_MAP","icon","assetBasePath","closestSizeMaxMultiplierDelta","minSupplimentalRes","maxSupplimentalRes","tile","RASTER_IMG_KEY_REG_EXP","TITLE_MODES","titleMode","assert","showTooltip","equal","appName","imgType","imgWidth","imgHeight","_sortedRasterMultipliers","cfg","allRasterImgs","rasterUrl","rasterKey","rasterMatch","currRasterWidth","currRasterMultiplier","multiplier","_vectorImgUrl","svgasimg","defaultImgUrl","vectorImgUrl","allRasters","lowestDelta","currDelta","abs","imgSrcSet","srcset","supImgs","reverse","svgSpriteHref","svgPropPath","imgClasses","classesPath","guxIcon","guxIconPropsPath","guxIconProps","Howl","Howler","clock","webrtc","attrs","source","markAsRead","playing","didEnd","loading","loadingError","registerStopVoicemailHandler","sound","playFromSelectedOutput","playbackVolume","callVolume","decimalValue","selectedOutputDevice","defaultOutputDevice","outputDeviceUpdate","restartSound","stopPlaying","newOutputDeviceId","setOutputDevice","play","actions","togglePlay","outputDeviceId","volume","pause","seek","seekSound","didReceiveAttrs","registerHandler","setupSound","paths","getAttr","sources","useHtml5","html5","duration","floor","currentTime","loadingAudio","howlOptions","defaultOptions","onload","onLoad","onplay","onPlay","onpause","onPause","onend","onEnd","_checkSoundDuration","Infinity","ontimeupdate","_duration","notifyPropertyChange","newAttrs","oldAttrs","position","left","css","click","offsetX","totalSeconds","recorder","startTime","showOptions","file","uploadImmediately","playerOptions","reset","audioFileReady","startRecording","stopRecording","hasSupport","and","audioBlob","audioSource","recording","hasMediaRecorder","MediaRecorder","showUploadButton","didInsertElement","scheduleOnce","setupRecording","destroy","didUpdateAttrs","Recorder","create","ownerInjection","_basicDropdown","_contentElement","_content","_trigger","canViewChat","person","isChild","isSuperior","toggleExpand","toggleProperty","children","PromiseArray","orderedPeople","getNextPerson","manager","getFieldValue","nextPerson","hasChildren","gt","hasSuperiors","directReportsLabel","showTotalReports","totalReportsLabel","totalReports","attachTextInputListeners","removeTextInputListeners","stopPropagation","presenceSubscription","canMove","flipster","currentPerson","currentPersonId","selfAndSiblings","currentPosition","reportTracker","setCurrentPerson","moveToManager","currentPersonManager","content","getPosition","tracker","setHierarchy","makeCoverFlow","moveToReports","currentPersonDirectReports","isEmpty","trackedReport","setPerson","attachNavigationListener","willClearRender","removeListeners","allPeople","isFulfilled","promises2","haveScrolled","peerCount","siblings","_getPosition","contents","unwrap","removeClass","startPosition","itemContainer","itemSelector","fadeIn","spacing","scrollwheel","keyboard","touch","nav","buttons","onItemSwitch","to","debounce","changeCurrentPerson","toElem","card","entityId","findBy","onKeyDownHandler","_this7","ns","_keystroke","eventToString","is","isNavigation","model","maxCount","charactersUsed","characterCount","activeRoom","check","activeJid","muted","any","toggleRoomMute","roomJid","areNotificationsDisabled","setRoomMuted","ClickOutsideComponent","showCreateGroup","canInvitePeople","canCreateGroups","canCreateLocations","showMenu","or","adminModalSrc","trap","launchCreateGroup","cancelCreateGroup","showAdminModal","closeAdminModal","showDropdownObserver","modalContainer","focusTrap","createFocusTrap","clickOutsideDeactivates","onPostDeactivate","activate","deactivate","removeClassFromBody","minViewMode","days","months","years","srOnly","placeholder","minDate","maxDate","inputMode","minView","isoLocale","monthYearLocaleFormat","moment","localeFormat","creationData","longDateFormat","datepickerValue","dateObject","date","initDatepicker","removeBehavior","datepicker","changes","setupDatepicker","localeData","_longDateFormat","L","language","orientation","todayHighlight","clearBtn","container","startDate","toDate","endDate","dates","fn","selectedLanguage","setData","picker","addClass","val","str","valueOf","clearValue","view","_placeholder","DocumentTitle","dragClass","dragLeave","preventDefault","dragOver","drop","ariaLabel","draggable","dragStart","dataTransfer","toggleMenu","handleKeyDown","parents","targetOutside","targetInput","listItem","prop","editing","canUploadPicture","canEditProfilePicture","canEditInformalPicture","canEditAgentImage","showingProfile","showingInformal","openCaption","currentInformal","upload","select","changeType","showInformalPhotos","showProfilePictures","showAgentPhotos","uploadImage","selectUploadedImage","image","active","deleteUploadedImage","removeAgentImage","imageId","overwrite","forceBrowserNotification","tag","section","saveSection","scrollActiveImageIntoView","activeImg","picturesContainer","scrollTop","parentNode","offsetTop","setupTabListeners","tabId","originalEvent","activeTab","offsetParent","activeElement","blur","focus","teardownTabListeners","emptyProfilesText","emptyInformalsText","profileInstructionText","informalInstructionText","agentImage","x200","x800","x1024","_positionedContainer","_basicDialog","_inPlaceDialog","_liquidDialog","_liquidTetherDialog","_tetherDialog","_emberTether","_emberWormhole","COUNTRY_OPTIONS","editingElocation","eLocation","showTitle","showResetButton","showTitleIcons","showTitleInEditMode","personId","primaryVoice","saving","countryOptions","A","street1","street2","city","zipcode","country","street1ReadOnly","street2ReadOnly","cityReadOnly","stateReadOnly","zipcodeReadOnly","countryReadOnly","isAddressEmpty","showNumberInTitle","notEmpty","updatedAddress","previewAddress","previewAddressIsEligible","previewAddressError","toolTipArrowId","toolTipHelpId","toolTipAlertInfoId","isEligibleForE911","eLocationInlineWarning","hasELocationInlineWarning","setField","field","updateElocationOnChange","countryTranslated","entry","perform","setUpdatedAddress","_emberConcurrency","task","eLocationCopy","waitForQueue","_cloneDeep","restartable","layout","canViewVideo","videoTooltipTitle","linkProfile","showFavorite","showImages","compact","phoneServiceEnabled","phoneAvailable","isOneToOneOfflineOrBusy","isChatEnabled","isWebrtcEnabled","isVideoButtonEnabled","onContact","callEntity","toggleFavorite","useMediaProviders","makeCall","_lodash2","groupExtension","phoneNumber","bubbleAction","actionContext","startChat","sendLove","launchWebrtc","showGallery","navigateTo","isPerson","isGroup","linkToProfileRoute","isSelf","hasImages","personHasImage","groupHasImage","hasPhone","_lodash","PromiseObject","fieldPath","mailto","tel","rel","e164","emailEnabled","phoneEnabled","showPhone","entityData","isFavorite","isInUsersUIAdmin","_updateFavoriteAttributes","element","favoriteButton","querySelector","favoriteComponent","EntityContact","FlagMixin","phoneService","layoutName","makingCall","queue","callPromise","PersonModel","flagInteraction","flagInteractionAction","EntityContactComponent","PromiseLoadingMixin","favorites","showChat","showEmail","shouldTether","contact","callId","shouldDisplayDropdown","showDropdown","callConnecting","flaggingSupportEnabled","isRedial","_closingViaEscape","tether","toggleDropdown","skipFocus","focusTimer","dropdown","firstFocusable","first","recordRecentContact","sendToProfile","isEntityFavoriteDecompEnabled","readOnly","callConnected","activeCall","activeCallId","componentCallIsActiveCall","phoneNumberDetails","formatAddressForDisplay","chatEnabled","favoriteEnabled","isExternal","isExternalContact","setExternalContactInfo","setupGroupPhoneNumber","setGroupNumber","enableFavoriteEvent","personIsDeleted","hideChat","phones","getContactFieldValuesByType","emails","displayDropdown","hasEmail","canDisplay","isContact","callTitle","attachListeners","detectOutsideClick","setupTether","Tether","attachment","targetAttachment","pin","removeTether","remove","isDestroyed","isDestroying","isOutsideComponent","isOutsideTetheredDropdown","closest","once","_this8","keyCode","toggleButton","items","primary","primaryItem","notifyError","show","hideAfter","actionHandlers","reportError","fieldValues","disableDropdown","toggleAddValue","addNewEntry","hide","attachClickListener","removeClickListener","EXCLUDE_TYPES","filterExcludedField","excludedFields","tabindex","sectionInfo","hideHeader","editingProfile","scrollOnAddNew","excludedEditingFields","removeSection","sectionName","sectionKey","editingSection","alias","showModal","cancelling","hideEmptyValues","showInstructionText","disableAddValueDropdown","showRemoveSectionModal","fallbackToEmptyLabel","hideFooterRemoveButton","timer","isEditing","toggleInstructionText","editSection","updateMasonry","readableFields","getReadableFieldPathsForSection","writeableFields","getEditableFieldPathsForSection","_focusManagement","doFocus","cancelEditElocation","animate","valueReference","pop","fieldData","FieldData","pushObject","scrollToNewField","removeEntry","removeEntryFromFieldData","removeContactSection","confirmRemoveSection","cancelRemoveSection","fieldList","_isEmpty","filterBy","getFieldPath","removeObject","_groupedFieldData","_newFields","sectionData","fullPath","setupCacheValues","setProperties","instructionTextTooltipOnInsert","isViewMode","ownProfile","profile","Profile","getProfileForModel","filteredFields","isSuper","excludedFieldsFilter","_curry","readableFieldPaths","addObjects","getFieldEntries","groupedFieldData","groupedData","_groupBy","_map","instructionText","getI18nKey","fieldValuesToAdd","fieldSectionHasData","canEditSection","hideAddNew","disableSave","validFields","_reject","showEditAction","showHeaderLock","showAddNew","onEditingChange","onValidityChange","disableModal","repeatable","values","v","handleEditingChange","reconcileNewFields","reload","info","statusCode","errorTitle","errorMessage","fieldPaths","currentValue","tempValues","tempId","_id","elem","parentTop","setupInstructionText","tooltip","placement","_updateMasonry","_masonry","rerunLayouts","currentTarget","keyForField","EntityFieldSection","updatedElocationAddress","previewAddressisEligible","_groupedContactInfo","editElocation","primaryContactSection","latestPrimaryContactInfo","reconcilePrimaryContact","errorField","saveElocation","refreshAllEmergencylocationInfo","errObject","softError","hardError","hardErrorMessage","defaultErrorMessage","removePrimaryContact","setPrimaryCallback","getEmergencyLocation","EmergencyLocationUtil","getErrorString","setEditingSection","groupedContactInfo","handleData","missingData","missingFields","difference","chain","groupBy","setOwner","ContactInfoGroup","primaryContactCollection","rejectBy","_storePrimary","setPrimaryContact","fieldDataId","equalFieldIds","fieldId","equalFieldPaths","isNewFieldValue","valueNumber","primaryNumber","ref","currentLabel","fieldChoices","keyPath","addNewLabel","emptyFields","containsRepeatable","repeatableField","isPhone","isEmail","isIm","isAddress","showHeadings","canAddNew","empties","changeGroups","toggleMore","routeType","routeId","allKeys","activeKey","showMore","flowTabsInline","fieldConfig","hasOfficialField","getFieldByKey","hasSocialField","getGroups","flatten","tabs","titleWidth","tabWidth","tab","acc","activeGroups","shouldShowMore","_cachedGroupFieldData","_cachedLocations","currentEntry","entries","locationId","viewingMore","_relationships","fieldValue","last","updatedField","relationshipGroup","fieldKey","addObject","removePerson","saveReports","clearDirectReportsCache","updatedLabel","management","assistants","defaultReports","defaultSiblings","relationships","cachedGroups","RelationshipGroup","otherRelationships","findByIds","allRelationships","otherRelationshipValues","labelkey","filteredReports","filteredSiblings","sibling","canAddMultiple","showingMore","onUpdateLabel","onUpdateField","selectPerson","addPerson","removeRelationship","shouldRemove","confirm","valuesToRemove","removeObjects","_forEachRight","toggleShowing","newLabel","oldLabel","_uniqBy","canEdit","canRemove","isManagerField","updatePeople","cachedPeople","relationshipKeyTrimAll","hasMore","haveManager","hideSection","reportsToSave","_lastPromise","lookupKey","isManagerRelationship","isReportRelationship","isAssistantsRelationship","isOtherRelationship","addManager","currentManager","removeManager","newManager","showLabelChoices","updateLabel","focusInput","selectLabel","toggleChoices","trigger","hideChoices","handleKeyDownOnDropdownArrow","handleKeyDownOnLabel","hasLabelChoices","canShowLabelChoices","labelChoices","i18nKey","labelKeys","setLabelKey","handleTooltip","input","focusOut","EntitySearch","searchLimit","selectResult","resultsLoaded","selectNext","nowSelected","nextSelected","eq","scrolling","selectPrevious","previousSelected","FieldComponentMixin","ensurePopulatedField","isFieldEmpty","setValues","complexField","complexValueFields","selectDate","getDate","getMonth","getFullYear","timers","populateFieldOnRender","isComplexFieldEmpty","copy","formattedValue","i18n","previousMonth","nextMonth","_months","weekdays","_weekdays","weekdaysShort","_weekdaysShort","dateFormat","currentTooltip","isActive","headingLevel","hasError","setPrimary","isPrimary","entryId","valid","canSetPrimary","saveHistoryEntry","cancelHistoryEntry","cancelAddNew","focusNewField","added","$input","ensureDateObjectsExist","where","calculateValidityOnInsert","validityChanged","resetData","cleanFieldForSave","useEducationLabels","isNewField","what","notes","whereLabel","datesLabel","whatLabel","notesLabel","whereErrorChanged","dateErrorChanged","TextField","parentLocation","floorLocation","googleMapsHref","showFloorplan","filterLocationsHelper","focusFieldOnInsert","selectParentLocation","selectFloorLocation","saveNewLocation","cancelNewLocation","selectLocation","coordinates","x","y","removeNewParentLocation","noop","toggleFloorplan","hideFloorplan","save","resp","responseText","parentLocationName","selectedFloor","haveParent","haveFloor","locationData","emptyPromise","locationAddress","isRichAddress","parentLocations","getRecord","canShowEdit","locationChoices","choiceText","selectedParentLocation","editText","attachmentId","setGoogleMapsLinkInfo","street","parentLocationUpdated","toggleFlash","locationIds","peekRecord","showFloorPlan","selectPersonFromPicker","requireFields","setPrimarySMS","toggleSMS","updateNumber","updateExtension","_setupData","addBehavior","setupTooltips","_setupInput","dialableNumber","isPrimarySMS","checkPrimaryForType","dialCode","initialCountry","intlTelInput","errorMsg","iso2LocaleCountry","iso2","errorCode","intlTelInputUtils","validationError","INVALID_COUNTRY_CODE","TOO_SHORT","TOO_LONG","NOT_A_NUMBER","isRequiredPhone","isRequiredError","isNumberError","errorClass","_setFieldDataValidity","hasErrorCode","countryData","toLocaleUpperCase","emptyData","acceptsSMS","orgCountryCode","countryCode","nationalMode","utilsScript","choice","setValue","defaultValue","_find","allowedValues","translatedAllowedValue","translatedValue","valueKey","addTag","tags","removeTag","showDuplicateError","navigateToSearchTag","linkable","sortedTags","recordChange","search","tagValue","currentRequest","initTagInput","$typeahead","typeahead","highlight","hint","async","displayKey","syncResults","asyncResults","addTagFromTypeahead","clearInput","request","types","suggestions","suggestion","keyDown","abort","flash","flashTag","requiredFieldPaths","embedded","onProfile","isGeneralField","saveField","notifyUserGeneralFieldUpdated","showPlaceholder","textValidator","watchValidityToDisableModal","disable","placeholderText","setMinWidth","span","append","ensurePopulatedWhenEditing","setWidth","getFieldError","maxLength","history","boolean","weblink","multiline-text","multiline","cleanFieldForEntity","isGroupField","haveStartDate","haveEndDate","isMoment","isEmptyValue","isRequired","numberMaxLength","extensionMaxLength","isValidUrl","baseKey","_s","customLabel","validator","placeholderImages","isInitialized","isNameLatin","feature","hoverParent","applicationUrlPrefix","isPlaceholderImage","useInitialsPlaceholder","enableMiniCard","microCard","showMiniCard","showQueueToggle","showPresenceDropdown","showLogOffButton","isGeolocationEnabled","imageLoadError","isHoveringCard","isHoveringImage","hoverTimer","isFirstHover","haveMediaProviders","mediaProviderComponent","useIntegrationBadges","integrationBadgesComponent","tetherConstraints","hovercardOffset","triggerShowMiniCard","_displayHoverCard","mouseEnterCard","onHoverChanged","mouseLeaveCard","_attachListeners","_removeListeners","isHovering","isOnline","chatPresence","chatPresenceClass","tetherSelector","tetherElementId","uniqueId","entityType","cardImageUrl","getProfilePicture","nameInitials","commaIndex","spaceIndex","leftInitial","rightInitial","initialsPlaceholderSupported","isPlaceholderImageAndUseInitials","showPresenceAndChatEnabled","entityIsGroup","entityDeleted","isSelfEntity","placeholderImage","baseUri","profilePicture","deviceSize","sizeForDevice","exactMatch","sizes","ratio","devicePixelRatio","mouseEnter","mouseLeave","_createPopper","el","targetEl","cardEl","_popper","Popper","modifiers","flip","behavior","arrow","preventOverflow","padding","_destroyPopper","Image","scheduleUpdate","clickedHoverCard","checkHoverState","isLinkable","subscribeToPresence","showStatusQuote","showPresence","_managePresenceSubscription","$img","_removePresenceSubscription","managePresenceSubscription","displayStatusQuote","imageUrl","_animationRun","_currentPresence","isStatusAnimating","animateOnPresenceChange","nextPresence","prevPresence","entityIsContact","modifyPlaceholderImage","autoSubscribe","showDepartment","showActions","clickToProfile","isSearchResult","geolocation","phoneTooltip","entityTypeClass","dasherize","entityIsPerson","entityIsQueue","entityIsMe","canContactEntity","isPresenceLabelToggleEnabled","useInitials","showOrganization","entityRoutePath","isClickable","_subscribePresence","subscribe","conversationSummary","socialExpression","totalMessages","contactCenter","enterprise","_presenceLabelUtil","activityCounter","totalSocialExpression","region","selfLocation","entityLocationData","presenceLabelData","showStatus","showActivity","eActivityPresenceClass","totalCalls","totalChats","totalEmails","presenceLabel","eChatStatus","isShowingActivitySummary","ViewportMixin","requiredPermission","hasRequiredPermission","perms","agentHasOnQueue","agentHasRequiredPermission","isTesting","_subscribeToPresence","didEnterViewport","didExitViewport","_unsubscribeFromPresence","externalContact","showPhones","showEmails","showAcceptsSMS","acdOutboundWhatsApp","_getEmailTypes","modelKey","_getPhoneTypes","dropdownTitle","externalContactHasNoEmailAddresses","phoneType","canUseNonE164","phoneTypeTranslated","phoneTypeId","typeName","externalContactHasNoPhoneNumbers","emailType","hasMultipleEmails","hasMultiplePhoneRecords","selectEntityWithEmail","selectEntityWithPhone","onPreventClick","queueService","isDetailsLoaded","isDetailsLoading","canViewQueueDetails","getQueueData","waitTimePromise","getQueueEstimatedWaitTime","callWaiting","callbackWaiting","chatWaiting","emailWaiting","messageWaiting","joinedData","joinedPromise","waitTimeResults","getMetricCount","array","metricName","metricData","metric","getOnQueueCounts","routingStatus","partial","datum","qualifier","property","sum","joined","queueId","mediaType","callData","callbackData","chatData","emailData","onQueueCount","idleCount","waitStr","queueData","agentData","callCount","callbackCount","chatCount","emailCount","messageCount","bestWaitTime","bestTime","formula","estimatedWaitTimeSeconds","getWaitTime","wait","hr","hours","minutes","sec","seconds","waitTime","imageMappings","informal","activeProfilePictureSection","open","askToDelete","showUploadModal","uploadPicture","confirmUpload","pictures","picture","entityJid","edit","setProfilePicture","notifyUpdateProfileImage","firstObject","updatedSection","images","newImage","profilePictureSection","cancelUploadModal","cancelDeleteModal","doneDeleting","_showing","showing","isPersonOwner","hasAccessToPicture","canEditProfiles","done","selectImage","current","selected","currentSelection","deleteImages","imageType","uploads","currentSelected","imagesToSave","addingSection","emptySections","addSection","toggleAddingSection","_this$attrs","attachHandler","EntityControllerMixin","ProfilePermissionsMixin","mediaProviders","resizeDetector","emergencyLocation","emergencyLocationOn","editEmergencyLocation","lastEntity","showCardView","compactLayout","excludedContactFields","iconHoverText","scrollToBottom","scrollHeight","toggleEditProfile","editProfilePicture","editContactInfo","setContactInfo","$section","focusTarget","toggleCardView","componentUpdated","resize","handleResize","notify","allSections","canEditStatus","isPurecloudSource","_presenceUtils","department","fieldSections","emptyWriteableSections","sectionKeys","isEditingSection","videoProviders","getVideoProviders","haveVideoMediaProviders","_mediaProviders","hasSupplementalVideoProvider","profileChanged","editingSectionChange","handleProfileChange","lastId","handleEditingSectionChange","masonryEl","_useMasonry","enableMasonry","_masonryId","_isInDOM","fieldSectionsUpdate","attachMasonry","masonry","columnWidth","fitWidth","registerLayout","rerun","throttle","detachMasonry","deregisterLayout","startMasonry","stopMasonry","Mixin","canEditProfile","canEditName","canEditTitle","canEditDepartment","canReadHR","onOwnProfile","gallery","canReadGroups","groupsFieldConfig","getSectionByKey","canEditGeneralInfo","canEditContactInfo","canViewLocations","locationsField","canViewInformals","photos","PERMISSIONED_FIELD_PATHS","POSSIBLE_INTEGRATION_FIELDS","findIndex","generateGuid","_sectionLocation","fieldPathClass","writeable","BUILTIN_SECTIONS","myOwnProfile","customKeys","_profile","customSectionKeys","removeable","removable","integrationManaged","integration","Validators","isPrimaryField","primaryFieldId","isNewValue","PROFILE_CACHE","EXCLUDED_SECTIONS","ADMIN_SECTIONS","builtins","_cache","readWritePermissions","writeableSections","readableSections","canReadProfiles","write","profileSections","SectionInfo","canEditProfilePictures","canReadSection","reopenClass","owner","customSections","adding","componentName","hasCustomComponent","emptyValues","ThenableSearchMixin","filterFunction","searchQuery","userInput","debouncedScheduleQueryUpdate","disabled","ensurePluralType","_scheduleSearchQueryUpdate","maxWait","cancelInput","chooseSelected","setUserInput","_updateSearchQuery","submit","clearSearch","entityFilter","_buildResults","wrappedSearchResults","searchResults","haveResults","noResultsKey","plural","areaScroll","entityHeight","clearInputs","chosen","each","isEnter","presence","editable","savedStatus","isLoading","debounceTime","isInvalid","changeStatus","updateStatus","changeStatusEventually","setUsersStatus","showUpdateError","ExpanderPluginComponent","expandText","collapseText","$el","expander","userCollapseText","afterExpand","afterCollapse","fallbackToEmpty","showHistoryYearRange","choices","choicesHidden","customLabelText","labelFor","toggleChoicesView","selectChoice","setupCustomLabelText","hasCustomLabelKey","labelForHistoryField","customLabels","customLabelTextChanged","clickId","pickerParent","containerParent","attachTooltip","html","keyPress","classList","contains","choiceId","hasStartDate","hasEndDate","_locale","monthYearFmt","startDateFmt","endDateFmt","mStartDate","mEndDate","endOf","diff","humanize","formattedStartDate","formattedEndDate","_fixtableColumnHeader","_fixtableColumnLabel","_fixtableEmptyState","_fixtableFooter","FixtableGrid","_fixtableRowToggle","_fixtableRow","saveLocation","coordinatesRatio","selectFloorplan","setCurrentFloor","floorplans","currentLocation","saveFloorplan","closeFloorplan","loadInitialPinLocation","img","coords","getRatioCoordinates","attachPinForXY","floorplanImageUrl","resolution","imageUri","locationFloors","parentFloors","loadFloors","updateCoordinatesRatio","updateCoordinatesOnLocation","clientX","pageXOffset","offsetY","clientY","pageYOffset","operation","naturalHeight","naturalWidth","heightDiff","widthDiff","currentPin","floorSorter","sorted","hidePopover","popoverEl","attachClickHandler","removeHandlers","AUDIO_FORMAT","BrowserUtils","getSuggestedAudioTypeFrom","GroupContactModalComponent","fileUpload","saveContactInfo","originalExtension","voicemailFile","showVoicemailOptions","resetGreeting","rotateCallSecondsError","numberOfRotationsError","saveForm","updateRotateCalls","updateRotations","toggleVoicemail","toggleEmailNotification","toggleOptions","selectVoicemailFile","triggerUpload","chooseFile","fileReader","FileReader","onloadend","arr","Uint8Array","isOpus","isWav","isAiff","readAsArrayBuffer","isOggFileType","recordingReady","resetRecording","resetFile","resetCurrentGreeting","audioPlayerError","setupInput","initNumber","numberOfRotations","rotateCallSeconds","_voicemailOn","voicemailOn","emailNotificationOn","haveExtensionError","isExtensionResourceInUse","isExtensionNotInPool","editingVoicemailDisabled","ringTimeMs","rotations","_this$getProperties","getProperties","ext","invalidExtension","invalidPhoneNumber","haveNumberAndExtension","callNotice","showGroupEmail","greetingOptions","hasGreeting","greeting","greetingAudioSource","audioFile","formatId","mediaFileUri","showEmailNotification","setConfirmDisabled","inputElem","extElem","uploadGreeting","uploadPath","uploadGreetingWithPreSigned","FormData","XMLHttpRequest","onreadystatechange","DONE","uploadComplete","_this$getProperties2","setNumberData","showExtensionErrorNotification","haveError","rotateCallsSecs","stopRingingAfterRotations","sendEmailNotifications","handler","update","disableInput","GroupProfileComponent","showContactInfo","saves","groupRoom","showMembers","showLinkDropdown","displayIndices","hasLinks","hasInformals","displayWarningModal","shouldFocusToggle","excludedFieldSections","excludedMembershipFields","toggleLoading","generalExcludedEditingFields","selectTab","toggleCallsEnabled","saveCallsEnabledState","toggleEditing","changeEditingMode","editGeneralInfo","cancelEditContactInfo","editPrivacyRules","toggleLinks","goToLink","href","confirmGeneral","closeAllModals","job","handleJob","cancelGeneral","metadataFor","deleteGroup","cancelDelete","confirmDelete","back","groupData","setHasLinks","confirmWarningModal","closeWarningModal","toggleGroupProfileEditPopover","getGrants","setupToggleAccessibility","setupKeyboardHandlers","teardownKeyboardHandlers","_handleEscapeKey","editButton","callsEnabledObserver","voicemailStateObserver","schedule","toggleInput","innerLabel","labelText","srText","prepend","labelId","toggleSelector","innerLabelSelector","mapping","toggle","setupConditionalToggleAccessibility","focusToggleAfterSwitch","callsEnabled","isShowingDeleteModal","isShowingPrivacyModal","isShowingGeneralModal","ensureCorrectLinksState","membersTabSelected","settingsTabSelected","generalFieldConfigSection","fieldSection","FieldSection","privacyFieldConfigSection","linksFieldSection","hasRules","phoneRef","groupVisibility","membershipVisible","includeOwners","groupTypeIcon","groupOwners","membershipHeader","groupRolesHeader","canEditLeftRailInfo","canEditInformation","namedPermissions","isOwner","canEditGroups","canEditGroupTelephonySettings","disableToggleCalls","canEditRoles","hasRolesView","hasPermissionAndDivision","hasGrantsEdit","hasPermission","canDeleteGroup","updateLinksChange","setHasInformals","informals","checkMembers","exclusions","inclusions","canEditMembership","disableAction","unloadRecord","_this9","setInterval","getJobData","_this10","jobId","retryJobId","clearInterval","commitRevertHandler","adapterDidCommit","showSaveModal","showCancelModal","previewValue","expressionDisplay","conditions","display","con","lastCondition","opAnd","saveDisabled","maximumExpressions","skills","numberPreview","addCondition","exp","condition","rules","skill","comparator","proficiency","lastRule","removeCondition","removeAt","conditionOperation","op","saveData","prepareExpression","success","skillConditions","put","previewUrl","preview","userCount","openCancelModal","closeCancelModal","parseExpression","closeSaveModal","output","routingSkillConditions","languageSkillConditions","rule","skillPropName","ruleType","newObj","childConditions","comparators","class","compPlace","updateConditionDisplay","addRule","removeRule","ruleOperation","skillChanged","_step","orWrap","_iterator","_createForOfIteratorHelper","skillResults","languageResults","showSearchResults","searchvalue","placeHolder","skillSelected","searchInputUpdated","updateSearchOnChange","attachOutsideHandler","removeOutsideHandler","runSearch","languageSearch","skillSearch","skl","langs","lang","LIST_TYPES","OWNERS","MEMBERS","slideInList","personSearch","orgVoicemailPolicy","listType","routeSelection","ringRotations","isSequential","isRotary","reasons","isMissing","loadOrgVoicemailPolicy","scheduleRemoveAnimation","appendSave","removeSave","rollbackAttributes","changeListType","toastTitle","toastMessage","voicemailGroupId","_state","greetingData","ringSequenceData","saveModelData","savePolicy","saveGreeting","callback","greetings","VOICEMAIL","recordingFile","orgIndividuals","addedDelta","removedDelta","addIndividuals","deleteIndividuals","individualsOperation","memberIds","_emberAjax","pigeon","originalNumber","showVoicemailGreetingOptions","pigeonEventHandler","disableReplaceOverflowBtn","disableRingInputs","forwardingOn","overflowGroup","duplicateNumberError","inputErrorClass","routeTypes","translation","routeSelectionType","routeDescription","selectedRouteType","rotateCallsDisplayText","stopRingingDisplayText","searchText","displaySpinner","enablesHipaa","disablesEmailNotifications","disablesPiiInEmailNotifications","disablesVMTranscription","disablesVoicemails","voicemails","transcriptionToggle","transcriptionDropDown","_getLanguagePreference","transcriptionLanguages","languagesObj","emailNotifications","piiInEmailNotifications","saveFunction","handlePigeonEvent","registerToPigeonTopic","_setupInputs","_setupToggleAriaLabels","previousEntity","rotationsChanged","toggleCallForwarding","selectOverflowGroup","replaceOverflowGroup","toggleVoicemails","toggleEmailNotifications","togglePiiInEmailNotifications","toggleTranscriptions","selectTranscriptionLanguage","badNumber","badExtension","editingObserver","groupTopic","registerPriorityTopic","overflowGroupId","finishedSaving","succeeded","setAriaLabel","contactInfoGroup","BatchDataRequestMixin","searchInput","sequenceContainer","resultsContainer","resizeListener","listDirty","_editing","isOwners","cachedEditing","sequenceList","individualsSequenceList","_sequenceListForPeople","ownersSequenceList","renderedList","_appendRotationListData","searchLabel","searchPlaceholder","addMemberPlaceholder","inputEntered","togglePersonSearch","handleListeners","listModified","_handleResizeEvent","listLength","listModel","beginningOutOfRange","outOfRange","endOutOfRange","popupDismissed","batchPromises","getUser","personArray","fuseOptions","shouldSort","threshold","distance","maxPatternLength","minMatchCharLength","getFn","groupList","selectedIndex","queryAvailable","Fuse","removeItem","_recalculateIndices","notifyParentOfListChange","changePosition","from","_changePosition","isInteger","groupArray","insertAt","input_value","hovercardArrowOffset","scrollIntoView","outOfRotationRange","displayRotationRangePopup","newIndex","popupTarget","indexChanged","changeIndex","dismissPopup","setIndexChanged","submitIndexChange","membership","deletePerson","handleDeleteKeyDown","isLoggedInUser","sessionPerson","cannotDeleteMember","isOwnerAndSelf","multipleOwners","canViewRules","visible","hasPermissions","memberType","isPersonIndividual","memberTypeList","isRule","isAddedIndividual","isCurrentMember","PagingMixin","JobMixin","searchService","filterChoices","string","inclusionFilter","exclusionFilter","showRules","loadedAll","ignoreScroll","rateLimited","currentlySearching","currentMembershipRequest","membershipQuery","memberListLimitSize","retryTimeout","retyTimeOutDuration","toggleRules","updateContentOnChange","selectFilter","updateSearch","searchCriteriaChanged","editMembership","selectKeyword","keyword","addKeyword","addedIndividuals","removedIndividuals","setRulesOnGroup","addJob","handleJobFinish","saveIndividuals","initMembership","loadMembershipList","loadMoreMembersOnInit","inclusionQueries","addedInclusions","exclusionQueries","addedExclusions","membershipRules","isEditingRules","expression","displayEditingFooter","rolesEnabled","isSearching","shouldShowRules","showingFilterChoices","editingFilterChoices","membershipCount","extraParams","generalQuery","queryGroup","cancelEditOnGroupChange","debouncedSearchCriteriaChanged","reloadPageOnGroupChange","loadMore","_args2","reloadPageOnGroupReload","_individualsOperation","Content-Type","loadOwners","loadPathFieldMembers","loadIndividuals","_callee4","_context4","displayClassification","isIndividual","addedRules","rels","personQuery","latestAdded","singularize","currentFilter","keypath","ruleData","loadContentOnScroll","_callee5","listing","scroll","filterKey","_context5","loadSearchMembers","newMembership","_meta","isLastPage","_this11","searchMembership","peopleIds","pushObjects","incrementProperty","_this12","member","filteredResults","isError","allMemberships","uniqBy","setObjects","_this13","updateOffset","aName","bName","loadRules","_callee6","isPending","_context6","loadAll","_callee7","_context7","builder","requestBuilder","addQuery","setPaging","performCustomSearch","listingEl","containerHeight","groupedRelationships","toggleRelationship","_$last","deleteRule","isKeyword","relationshipGroups","relationshipSelected","oid","graph","buildGraphFromRelationships","ancestors","descendants","SearchMixin","searchValue","mode","resetPersonSearch","querySelectorAll","totalItems","nextIndex","updateTabIndex","prevIndex","objectAt","isRules","iconClass","dismissed","currentIds","removeDuplicates","currentSearchRequestUpdated","resultsChanged","firstItem","previousFilter","performPersonSearch","focusIndex","resetSearch","editingStateChanged","addAggregations","aggregates","aggregate","SEARCH_FACET_KEYPATHS","groupAssignedRoles","isEditingRoles","displayRoleRemoveModal","rolesToDelete","displayRulesRolesWarningModel","unsavedGrants","roles","_hasUnsavedGrants","hasUnsavedGrants","grantId","grantModel","recalculateHasUnsavedGrants","addAllFutureDivisions","_ref3","removeAllFutureDivisions","grantMaps","grantMap","groupRolesViewColumns","nameColumn","header","cellClass","typeColumn","descriptionColumn","divisionsViewColumn","hideLabel","groupRolesEditColumns","divisionsEditColumn","assignmentColumn","editRoles","toggleRolesEnabled","_toggleRolesEnabled","_enableRoles","closeRulesRolesWarningModal","getGroupRoles","_getGroupRoles","deleteRoles","_deleteRoles","openConfirmModelSingleRole","grantRole","grantRoles","openConfirmModelMultipleRole","divisionRoles","divisionRole","rolesToUpdate","grantsToDelete","_ref4","undeletedGrant","destroyRecord","_stopEditingRoles","_isTooManyGrantsError","searchAssignedRoles","assignedRoles","filteredRoles","roleDivision","searchAllRoles","allRoles","updateUnsavedGrants","selectedDivisions","previouslySelectedDivisions","_updateUnsavedGrants","confirmHasRolesWarningModal","_disableRoles","closeHasRolesWarningModal","toggleRoleAssignment","isAssigned","addRole","removeRole","trySet","division","stillSelectedDivision","divisions","_removeRole","getRoleWithDivisions","grantRecord","previousVersion","attempt","grants","assignedRolesMap","unloadAll","grant","subjectId","normalize","setMap","turnOnRoles","_toggleRolesOn","_toggleRolesOff","hadRules","_setupAccessibility","_setupKeyboardNavigation","_removeKeyboardNavigation","contentDidChange","_setupFixtableAccessibility","allCheckboxes","checkbox","$checkbox","$headerRow","$toggleSwitch","$row","$roleNameCell","roleName","_setupButtonAccessibility","_setupTableHeaders","$removeButtons","button","$button","$otherButtons","buttonText","buttonTitle","$table","isEditMode","tableLabel","$allHeaderCells","th","$th","hasClass","headerIds","headerId","rowIndex","row","$cells","cellIndex","cell","$cell","$filterInputs","$headerCell","headerText","$fixtable","selectionIsEmpty","selectedDataRows","isFirstPage","listedPages","totalPages","neighbors","pagesToFirst","pagesToLast","shortageL","shortageR","lowerIndex","upperIndex","pages","isCurrent","firstPageListed","secondPageListed","penultimatePageListed","finalPageListed","showPaginationControls","showRangeLabel","bulkAction","showPage","showNextPage","showPreviousPage","containsRole","rowHasToggled","wasAssigned","homeDivision","peekAll","_updateDivisions","previouslySelected","allFutureDivisionsSelected","updateDivisions","previousSelection","allFutureDivision","_loadDivisions","_setSelectedDivisions","roleDivisions","allDivisions","selectedDivision","rolesEditComponent","allDivisionsSelected","optionsWithoutSpecial","allFutureDivisions","_allFutureDivisionsObserver","powerSelectAPI","_selectAll","selectAll","deselectAll","removeObserver","addObserver","divisionsDisplayList","displayString","_setupKeyboardHandler","_removeKeyboardHandler","dash","firstItemIndex","lastItemIndex","isSingleItem","disabledMessage","_isInitialized","queryChanged","triggerSearch","positionSubclass","removeSelectedTerm","terms","removeSingleTerm","facet","isSingleTerm","facetName","_horizontalCollection","bootstrapIcons","_inViewport","hideScrollbars","scrollBottomThreshold","onscroll","onScroll","scrollBottom","clientHeight","scrollThreshold","checkInfiniteScroll","infiniteScroll","isSmall","useLightIcon","iconUri","phoneIntegrations","LightGalleryModal","escaped","initGallery","caption","lightGallery","loop","speed","closable","escKey","allPhotos","_linkToExternalComponent","isAuthenticated","offerMobileApp","onMobileOfferDecline","mobileOfferDeclined","room","attachTo","_displayDropdown","selectProvider","provider","providerId","launchVideoProviderWithPersonById","_targetEl","setup","arrowElement","handleClick","handleOutsideClick","isAttachTarget","componentParents","attachTargetParents","showingVideo","showingPurecloudVideo","showingMediaProvider","providers","chatRoom","isGroupRoom","MiniCardComponent","managerCount","isManager","managerCountText","translucentOverlay","containerClassNames","overlayClassNames","confirmText","cancelText","showHeader","showFooter","wrapContent","enforceModality","extraClassNames","confirmDisabled","noCancel","sendConfirm","ret","sendCancel","backdropDismiss","setText","confirmAction","cancelAction","attachClassToBody","modalContainerElement","escapeDeactivates","allowOutsideClick","_modalDialogOverlay","_modalDialog","ModalDialog","_initEscListener","CreateGroupMixin","setHandlers","setAttr","createGroup","checkNameLength","isTooLong","_occludableArea","_pcStyleIconExample","WebrtcActionUtilsMixin","EntityImageDefaults","needsServices","checkUnusedFields","entityContactGroupData","linkToProfile","emailAddress","telephoneNumber","initialFieldsCheck","moveToPerson","setEntityContactGroupData","router","profileId","transitionTo","openChat","openVideo","PersonGraphComponent","paper","mini","trueColor","trueStrokeColor","falseColor","falseStrokeColor","disabledColor","disabledStrokeColor","disabledSegments","baseAttrForPath","segmentChanged","segName","segment","attrForSegment","disabledSegmentsChanged","segs","setupGraph","drawGraphics","destroyGraphics","triggerAction","isDisabled","Raphael","drawSegment","renderfix","safari","xform","pathForSegment","stroke-width","node","fill","stroke","cursor","ancestorsPath","parentPath","selfPath","siblingsPath","childrenPath","descendantsPath","ancestorsSmallPath","parentSmallPath","selfSmallPath","siblingsSmallPath","childrenSmallPath","descendantsSmallPath","PersonIconComponent","PikadayInputComponent","_pikadayInputless","_popoverOnComponent","_popoverOnElement","_powerSelectMultiple","_powerSelect","_beforeOptions","_options","_powerSelectGroup","_searchMessage","_preRender","checked","onClick","ariaDescribedBy","isChecked","isMouseDown","minimized","minHeight","maxHeight","toggleSize","attachCurrentHeight","minimizedChanged","_resizeDetector","parentId","selectedTerms","accordianParentId","panelId","isSelected","selectTerm","selectedTermsChanged","keypathRegex","profileSkills","hobbies","interests","certifications","languages","FacetTerm","searchField","reverseLookup","View","attachScrollListener","loadNextPage","createDebouncedLoadNextPage","loadResultsToFillPage","scrollToTopOnPageZero","Controller","integrationsPresence","_searchQuery","queryFacets","saveHistory","totalResults","lastSearchFavoritesCount","onFavoriteChanged","runSearchQuery","changeSearchType","currentActive","termObj","notifyTooManySearchFilters","updateQueryOnTermsChange","changeTabButtons","atPageLimit","remainingResults","hasMoreResults","moreResults","groupedSelectedTerms","currentGroup","isGroups","isLocations","isExternalContacts","isExternalContactsEmpty","isFavoritesEmpty","haveSelectedTerms","displayFacets","updateQueryParameters","queryParameters","newHash","lastHash","sendNavigationEvent","searchInitial","searchOnChange","startsWith","termStrings","keywordStrings","_baseSearch","_baseAggregations","order","_valueQuery","_facetQuery","_baseSearchForEntity","aggregations","MULTI_ENTITY_FIELDS","BASE_PERSON_EXPANDS","BASE_PERSON_FIELDS","_buildSearch","favoriteIds","valueQuery","chunks","chunk","operator","_normalizeSearch","models","modelResults","_processFacets","rawFacets","keyOrder","getFavoriteIds","getLoadedFavorites","favorite","isLoadMore","iterations","numberOfFavoriteToSearch","fetch","buildSelectedTerms","conn-ui-fav-nb","_ref5","userResults","alterUsersWithIntegration","searchKeywords","addSelectedTerm","keywordFacetName","directedSearchTerms","directedSearch","_directedSearch$split","_directedSearch$split2","_toArray","searchSplit","SearchResultContextComponent","searchResultContextVisible","_scrollToPreviousTop","$messagePane","$lastMessage","targetHeight","outerHeight","closeOnContextSwitch","replyToMessage","loadHistoryAfterLast","loadMoreHistoryAfter","loadHistoryBeforeFirst","loadMoreHistoryBefore","subMessageTypeClass","subMessageType","_deprecatedTetherDialog","_tetherPopoverOnComponent","_tetherPopoverOnElement","_tetherTooltipOnComponent","_tetherTooltipOnElement","timeSince","_calculateElapsedTime","durationInMs","asDays","_formatDuration","unit","cnt","msSince","HOUR","MINUTE","tickingDuration","escapedBuildTag","rawBuildTag","isPresent","updRandTime","currTime","currMinutes","currBin","nextMinutes","nextBin","hourMultiplier","_tooltipOnComponent","_didUpdateTimeoutLength","TooltipOnElement","AutoSaveDevicesMixin","currentFile","currentFileInfo","currentCoords","currentXHR","currentImageId","selectedCamera","cameraPending","cameraError","startingMedia","imageUrlData","uploadingImageUrl","autoTakePicture","uploadType","createDropZone","uploadError","x2","y2","showPictures","addIndicatorForPromise","uploadImageUrl","_helpers","displayImage","setupFileFromUrl","clearImage","startCamera","attachMediaStream","mirror","takePicture","canvas","createElement","videoWidth","videoHeight","ctx","getContext","drawImage","dataUrl","toDataURL","asBlob","dataURLtoBlob","pictureInfo","fileName","asFile","File","onTookPicture","cancelCamera","cameraStream","switchCamera","updateDefaultDevices","camera","canUseCamera","getImageDataFromXhr","initCrop","aspectRatio","Jcrop","onSelect","handleCropChange","onChange","setSelect","santizedResult","normalizeSingleResponse","attributes","dimensions","fileInfo","$image","FileAPI","imageCategory","displaywidth","cropProportion","gId","imgData","boundingBox","groupImageType","formData","Blob","uId","userImageType","dataUri","getInfo","handleFileInfo","dropzone","Dropzone","acceptedFiles","uploadMultiple","maxFiles","clickable","autoProcessQueue","addRemoveLinks","maxFilesize","dictInvalidFileType","dictRemoveFile","dictFileTooBig","dictCancelUpload","dictUploadCanceled","files","removeFile","autoplay","disableContextMenu","oncontextmenu","styleName","isSafari","processData","profilePaths","editingCaption","canAddCaption","showImage","addCaption","saveCaption","imageList","initCaption","ownImage","isGroupOwner","closeCaption","canDelete","populated","imagePath","currentImage","getReferencedField","_verticalCollection","_verticalItem","_wrapUrls","_link","_url","XOption","XSelect","metaName","nodeName","_require","rawConfig","getAttribute","unescape","isNonEmptyStringQueryParam","paramStr","isBlank","appsService","panels","initialPanel","updateCurrentRouteName","panelsOverrideObject","panelsOverride","initialPanelOverride","transitionToRoute","openPreferencesModal","_default","managePresenceSubscriptions","subscribeTo","inviteUserToRoom","isOneToOneRoom","promoteToAdhocRoom","inviteToRoom","toggleParticipants","collapseChat","oneToOneTarget","makeNewEmptyRoom","ContactsController","favoritesNameFilter","personBinding","isOnlyFavorite","canSearch","removeFavorite","addFavorite","recents","apiEndpoint","getJSON","idOnly","setLocalFavorites","favoritesFilterChanged","debouncedFavoritesFilterChanged","createDebouncedFavoritesFilterChanged","_filterChanged","filtered","setFavorites","countFavorites","list","checkSearchVisibility","EngageController","engageService","route","replaceRoute","setEngageActive","setEngageInactive","navigationEvent","navRoute","engageRouteToCollaborateRoute","redirectEvent","newRoute","MaintenanceController","hasDesc","messageKeys","titleKey","descKey","actionKey","showMobile","loadingFieldSections","showGridMode","stackedMode","gridMode","treeMode","showStackedMode","showTreeMode","toggleLeftRail","queryParamObserver","syncQueryParamsWithHost","currentLocalHash","currentHostHash","updatedHostHash","desktopRegionId","chooseRegion","context","sendRegionToDesktop","defaultDesktopRegionId","PUBLIC_ENVS","desktopId","RelateExternalContactController","IndexController","RelateExternalOrganizationController","relateService","redirectRoute","SignupController","_heading","_button","_plantronicsCallEvents","FieldConfig","ExternalContactModel","GroupModel","OrgModel","KEY_BLACKLIST","GROUP_BLACKLIST","ORG_BLACKLIST","PROFILE_BLACKLIST","_initModelWithType","blacklist","reopen","unknownProperty","splitFieldPath","splitField","getFieldListByType","getFieldsByType","getAllowedValues","isFieldRepeatable","isFieldReference","isFieldChoice","groupFieldConfig","getFieldConfig","personFieldConfig","extra","createFieldConfig","attachComputedEntries","boundTo","boundToEach","getEntriesFromEntity","getEntityType","serverKey","exists","Field","maxRepeat","i18nLabel","getI18nLabelKey","elemId","cleanForEntity","requirejs","_eak_seen","className","factory","lookupFactory","hhmmss","EUR","currency","minimumFractionDigits","maximumFractionDigits","USD","DEFAULT_PARAMETERS","normalizeArrayResponse","activityMessages","sms","voice","Helper","compute","activity","ts","_abs","_acos","acos","_acosh","acosh","_add","formatOrLookupAddressForDisplay","_and","hideSha","versionRegExp","hideVersion","shaRegExp","helper","_arrayContains","arrayContains","_asin","asin","_asinh","asinh","_atan","atan","atan2","_atanh","atanh","_await","promiseArray","permissionsService","_cancelAll","cancelAll","_cbrt","cbrt","_ceil","_clz","clz32","_cos","cos","_cosh","cosh","cssClassify","_dasherize","_div","div","_emberPowerSelectIsGroup","emberPowerSelectIsGroup","_emberPowerSelectIsSelected","emberPowerSelectIsSelected","_emberPowerSelectTrueStringIfPresent","emberPowerSelectTrueStringIfPresent","_emoji","emojifyString","_equal","_equals","equals","escape","_exp","recompute","_escape","_expm","expm1","namedArgs","splitName","fieldObj","lookupPath","_flairRegEx","hideIfText","color","emojiText","_floor","_formatDate","bytes","units","converted","pow","decimals","toFixed","_formatHtmlMessage","_formatMessage","_formatNumber","_formatRelative","_formatTime","_fround","fround","fullNameHelper","externalProfile","fullName","_gcd","gcd","_getSelectOptions","getSelectOptions","hasRecordForId","recordForId","_gt","_gte","gte","_hypot","hypot","activityIcons","_ignoreChildren","ignoreChildren","_imul","imul","_intlGet","_isAfter","_isArray","_isBefore","_isBetween","right","_isFulfilled","_isPending","_isRejected","_isSameOrAfter","_isSameOrBefore","_isSame","routes","station","routeIds","joinStrings","joinCharacter","rest","_l","_lcm","lcm","_this$get","localizePresence","_logE","logE","_log","log10","_log1p","log1p","log2","_lt","lt","_lte","lte","_max","_moment","isSame","_min","_mod","mod","_momentAdd","_momentCalendar","_momentDiff","_momentDuration","_momentFormat","_momentFromNow","_momentFrom","_momentSubtract","_momentToDate","_momentToNow","_momentTo","_unix","_mult","mult","_markdown","_notEqual","notEq","_not","_now","_or","_perform","onIntegrationConfigChange","integrationContactInfo","integrationConfigs","includeBadge","_pow","_promiseAll","promiseAll","_promiseHash","promiseHash","_promiseRejectedReason","_random","renderMarkdown","_round","round","_routeAction","emoji","isUnicode","isUnicodeLookAhead","emojifyStringUnicode","_sign","sign","_sin","sin","sortFieldData","_orderBy","_sqrt","sqrt","_sub","sub","_sum","_tan","tan","_tanh","tanh","_task","padZero","num","willDestroy","_scheduleRecompute","endTime","shouldTick","_setupObserver","titleForEntityPropertyHelper","entityPropertyType","getPhoneTitleFor","getEmailTitleFor","_trunc","trunc","_utc","utc","extLabel","_xor","xor","INCOMING_CALL","TERMINATED_CALL","MISSED_CALL","STOPPED_RINGING","PHONE_CONNECTED","WEBRTC_CONNECTION_INCOMING","WEBRTC_CONNECTION_ANSWERED","WEBRTC_CONNECTION_DECLINED","WEBRTC_CONNECTION_STARTED","WEBRTC_CONNECTION_ENDED","_emberUuid","unparse","v1","v4","initialize","_initializerFactory","after","ApplicationService","before","Route","AuthenticatedAuthorizedRouteMixin","UnauthenticatedRouteMixin","beforeModel","AuthenticatedRouteMixin","deprecateJqueryCookie","jQueryCookieDeprecation","until","cookie","deprecate","removeCookie","oauthProps","_netUtils$getEnvDetai","runtime","loadOauthProps","ChatService","singleton","Clock","StyleNamespacingExtras","ContainerDebugAdapter","WebrtcSdkService","setupContainer","registry","baseURL","rootURL","Configuration","load","_setupSession","_setupSessionService","_engines","exportApplicationGlobal","theGlobal","globalName","classify","throttled","debounced","_register","PersonFieldConfig","GroupFieldConfig","OrgFieldConfig","ExternalContactFieldConfig","MainInitializer","Orgspan","Debug","registerDeprecationHandler","Provider","ZoomProvider","PureCloudProvider","TeamsProvider","PhoneService","PreferencesService","_routeStyles","deferReadiness","authUri","instanceProperties","runtimePublicDomainName","publicDomainName","purecloudV2BaseUri","cobrowseUri","purecloudAppsUri","streamingServiceUri","advanceReadiness","SessionService","_themeLoader","setThemeClass","loadTheme","regex","packages","WebrtcService","WebrtcSettings","_backburnerDebug","_conversationService","applicationInstance","initializeStoreService","instanceInitializer","Intl","polyfill","cldrs","addLocaleData","localeSplit","localeName","addTranslations","_setupSessionRestoration","LazyRenderWrapper","enableLazyRendering","EntityContactGroupComponent","EntityFavoriteComponent","EntityHoverCard","EntityImageComponent","EntityLocationComponent","pushManifest","manifest","PresenceLabelComponent","preferences","parentView","routeTitle","updateRouteTitle","routeName","appRoute","orgName","HostedContext","_net","parseRuntimeCustom","$target","urlPrefix","initializeEmojiRendering","initializeMarkdownRendering","apiHandlers","apiHandlerKeys","currHandlerKey","logout","_logged","nrOnError","URLSearchParams","hasQueryParam","TARGET_PRESENCE","freeze","BUSY","MEETING","OFFLINE","launchVideoImage","getTargetPresence","gcPresence","chatUserPresence","loadData","showRunErrorNotification","haveAccess","canRunAction","allowMultipleMeetings","getJid","originalAction","_action","_args","openChatRoomWithVideo","showingVideoChanged","apps","useCollaborateChat","haveEmbeddedClientAccess","meetingUrl","queryParamsToObject","keyValue","_keyValue","buildAuthUrl","authConfig","cancelTimer","iframe","body","appendChild","contentWindow","removeChild","clearTimeout","INTERNAL_DL_MATCHER","embeddedUrl","isExternalDomain","personGuid","modelSet","_displayApiError","fallbackMessageKey","_displayError","messageKey","messageKeyOption","_displayNotification","conversation","conversationIsDestroyed","getInteractionTypeFromCP","interaction","isCall","isFax","isChat","isCallback","isSms","myselfAgent","findLast","participants","party","partyIsUser","partyIsAgent","purpose","callbacks","calls","chats","handleMissedTimedBoxTimer","Interaction","conversationModel","tmpInteractionModel","interactionHasMissedTimer","windowInFocus","hosted","applicationHasFocus","hasFocus","timeDiff","timeCreated","selectedWrapupCode","wrapupNotSaved","oldWrapupCode","skipAfterCallWork","isAfterCallWorkTimerExpired","isWrapupCodeSet","isNotesSet","activeCallWorkCompleted","activeCallWorkNeeded","canUseCommunicationACW","canAgentRequestACW","useCommunicationACW","isAfterCallWorkCompleted","communicationMedia","communicationObj","isCommunicationAfterCallWorkCompleted","isCommunicationAfterCallWorkRequested","isAfterCallWorkMandatory","wrapupPrompt","isAfterCallWorkForcedTimeout","prompt","isAfterCallWorkTimeout","isNonDiscretionaryCompletion","isWrapupPromptAgentRequested","hasMissedTimer","MACHINE_PARTICIPANTS","CUSTOMER_PARTICIPANTS","MEDIA_TYPES","isCustomerParticipant","participant","isMachineParticipant","isAgentParticipant","isCurrentUserOrMachineParticipant","hostParticipant","customerParticipants","agentParticipants","otherParticipants","otherConnectedParticipants","isDisconnected","isMonitored","monitoredParticipantId","isCoached","coachedParticipantId","isBarged","bargedParticipantId","allHumanConnectedParticipants","allConferenceParticipants","connectingQueue","participantForCustomer","consultParticipantId","trueCustomerParticipant","participantCaller","customer","_findLast","isCurrentUser","isExternalCustomer","isInternalCustomer","nextConnectedParticipant","customerParticipant","_acd","getTrueCustomerIfMultipleCustomersExist","activeParticipantIds","externalContactId","participantsForCurrentUser","participantUserId","getFirstStuckParticipant","currentUserParticipants","stuckParticipant","hasActivePrimary","_doesParticipantHaveActivePrimaryMedia","hasActiveSessionShare","_doesParticipantHaveActiveSessionShare","participantForCurrentUser","lastAlertingParticipant","media","lastNonDisconnectedParticipant","lastCurrentUserNeedingWrapup","wrapupRequired","wrapup","_last","participantsForACD","participantForQueue","dialerParticipant","transferringToParticipant","activeTransfer","destination","PROVIDER_MEDIATYPE","aggregateMedia","screenShares","cobrowsesessions","videos","mediaObj","allMedia","getMediaObject","mediaArray","mediaWithlatestConnectedTime","_maxBy","connectedTime","unix","mediaWithlatestDisconnectedTime","disconnectedTime","maxConnectedTime","maxDisconnectedTime","activeMedia","isAfter","sessionShareCode","isSessionCodeRequired","isSessionSharing","isRequestingEndSessionShare","sessionShareDisconnectTimer","sessionShareExplicitlyInitiated","sessionShareActiveOnLoad","isCobrowseV2Disconnected","isCobrowseV2","canScreenShareOnCall","canScreenShareOnChat","canCobrowseOnCall","canCobrowseOnChat","isRequestingScreenShareOrCoBrowse","isRequestingVideo","sessionShareState","customerShareState","hasSessionShareCode","sessionShareActive","isRequestingSessionShare","isSessionShareConnected","isSessionShareDisconnected","isCustomerInSessionShare","isCustomerDisconnectedFromSharedSession","isAgentDisconnectedFromSharedSession","isWaitingForAgentToConnect","isWaitingForCustomerToConnect","hasCustomerJoinedSessionShareRoom","hasAgentJoinedSessionShareRoom","sessionShareRoomJid","_jidHelpers","isRoomJid","mostRecentAgentSessionShare","mediaObject","mostRecentCustomerSessionShare","sessionShareType","canScreenShare","canCobrowse","mediaTypeIsScreenShare","mediaTypeIsCobrowse","mediaTypeIsVideo","isScreenShare","isCoBrowse","isVideoShare","hasScreenSharePermissionError","hasCobrowsePermissionError","hasVideoPermissionError","hasShareError","sessionShareConnectedTime","sessionShareDuration","_privacyStatement","_securityDisclaimer","transition","BatchDataRequestsMixin","batchDataRequests","refreshUser","getChatUser","getGroup","useChatBetaCleanUp","initRoomCaching","getChatRoom","objectId","getEntityObjectId","isPersonJid","passedInJidIsPerson","isSupervisorJid","closeActiveRoom","personRoom","ChatRoom","rooms","setupRoomContextV2","setupRoomContext","roomMuted","addChatTargetAsParticipant","isGroupJid","loadGroup","addParticipantToRoom","loadRoomSubject","getStreamingRoomInfo","subject","updateRoomSubject","addRoomToCache","addAllParticipantsToRoom","participantJids","cachedParticipants","cachedParticipant","cachedParticipantJid","removeParticipantFromRoom","_keepOnlyChanged","imageRegex","timeStampRegex","audioRegex","giphyRegex","imgurRegex","youtubeRegex","vimeoRegex","ghGistRegex","ghRepoRegex","twitterRegex","googleSlidesRegex","soundcloudRegex","getImageShortName","pattern","parseTimeStamp","timeStamp","mediaItems","giphies","audios","gists","repos","tweets","googleSlides","soundcloud","union","getLinks","gifv","webm","mp4","identifier","youtubeLinks","videoUrl","vimeoLinks","modelData","GithubItemModel","gist","githubRepos","repo","tweetId","tweetInfo","tweet","acdChatUser","isYou","compareJids","isAcdChatUser","chatUserId","acdChatUserId","isLastMessage","messageTime","displayDateRelativeToToday","messageDisplay","correction","isCorrection","ChatEvents","Evented","initialDataLoaded","historyDirty","handleHiddenRooms","hiddenRooms","useChatSyncFix","MessageNotificationsMixin","sendMentionNotification","shouldShowMentionNotification","roomName","getRawDisplaySubject","soundId","getNotificationVolume","notificationOutputDeviceId","getNotificationOutputDeviceId","sendNotification","shouldShowNotification","messageBody","showPopup","playSound","getNotificationTitle","widgetType","rawMessage","sendEngageNotification","clickHandler","severity","isBusyUser","isDuplicate","duplicate","targetRoomIsMuted","isSupervisorRoom","messageAlreadySeen","fromLoggedInUser","groupNotificationsEnabled","coveredByMessageNotification","chatUser","personName","sendTestNotification","messageDelayDefault","messageDelay","maxDelay","_splitOverSizedMessage","messageQueue","_convertSplitMessagesToWidgets","_uuid","stanza","sendSplitMessageQueue","_delayedMessageSender","unsentMessageQueue","_addFailedMessagesToRoom","splitWidget","_manuallyCreateStanzaForFailedMessage","ChatMessage","widget","sendError","checkForMentions","setMessageReadState","addMessage","childName","childPayload","findMessageById","messageId","messageCache","pendingMessage","pending","failedMessage","splitMessageData","splitMessageParent","splitMessageCache","sendMessageToRoom","chatService","oneToOneRoom","presenceSubscriptionCounter","chatField","chatStatus","hasChatStatus","hasMedia","mediaInfo","listener","hasMediaInActiveChatRoom","ClickOutsideMixin","_webrtcConversationAnalysis","acdNormalizedMessages","callsUri","communicationUri","createCommunicationUri","communicationsUri","participantId","mediaId","participantUri","communicationsByTypeUri","consultUri","disconnectMediaTypeUri","getConversationUri","mediaRequestUri","monitorUri","participantsUri","participantDetailsUri","participantWrapupUri","sessionShareCodeUri","expireSessionShareCodeUri","securityKey","participantWrapupCodesUri","participantCommunicationWrapupUri","communicationId","replaceUri","getQueryStr","scheduleCallbackUri","tagsUri","wrapUpUri","wrapUpCodesUri","messagesUri","sendChatMessageUri","conversationId","sendTypingUri","sendMessagingTypingUri","draftUri","draftAttachmentUri","smsUri","smsHistoryUri","smsMessageDetailUri","smsMessageBatchUri","sendSMSMessageUri","createMediaAttachmentUri","getMediaAttachmentUri","copyMediaAttachmentUri","requestACWUri","interactionId","agentCommunicationId","getSupportedContentUri","getDeploymentConfigUri","deploymentId","getSupportedContent","getIntegrationConfigUri","integrationId","getConversationSummaryFeedbackUri","summaryId","arrayParameterCollection","forIn","answerChat","defaultLogLevel","makeRequest","logRequest","correlation","logLevel","captureRequest","resolveRequest","isSuccessResponse","groupName","groupTypeDefault","groupVisibilityDefault","groupMembershipDefault","groupModal","nameLengthExceeded","creatingGroup","visibility","vis","rulesVisible","newPublicApiGroupData","canCreateGroup","isAdmin","adminGroup","groupTypeI18nLabel","newGroupTypeChoices","lookupType","groupVisibilityI18nLabel","newGroupVisibilityChoices","_deviceEnumeration","messageEvent","messageOptions","triggerMessageAction","messageHandlers","lastUploadedImage","editingPictures","viewingGallery","cancelEditProfilePicture","cancelUpload","cancelEditPictures","viewLightGallery","cancelViewLightGallery","setInitialFieldSections","excludedSections","getReadableSections","WebrtcActionUtils","getProvidersForUser","isPresence","presenceMap","definition","apiValue","presenceMapping","systemPresence","presenceService","outOfOffice","acdDivisionPresenceProfileToggle","primaryPresence","presenceList","currentPresenceSource","integrationPresence","currentPresence","existingPresence","pres","presSource","existingPresenceDate","modifiedDate","activitiesPresenceDate","isExistingPresenceLatest","isGCOffline","presenceDefinition","presenceModel","presences","canViewPresenceDefinition","outOfBandPresence","outOfBandPresences","findPresence","matchingPrimaryPresence","newPresence","Presence","endOfTime","primaryPresenceSource","integrationLabel","secondaryPresenceLabel","secondaryPresence","fallbackLocale","languageLabels","_i","_Object$entries","_Object$entries$_i","formattedLocale","primaryStatusMessage","cityExists","regionExists","countryExists","hasGeolocation","isAvailable","isOffline","isAway","isBusy","isOutOfOffice","isOnQueue","isOfflineOrBusy","activityPresence","activityPresenceClass","profilePictureFieldKey","agent","missingFieldsCache","EntityMixin","_currentSection","_missingFieldsCache","volatile","pictureKey","profilePictureSizes","_sortBy","_keys","_parseInt","uploadedImages","stateString","_self","_missingFields","recordPropertyChange","changedSinceSave","changedProperties","referencedField","referencedLookup","fieldArray","reference","isFieldValueEmpty","removeFieldValue","currentFieldValue","object","currentState","stateName","onSaveSuccess","onSaveError","_internalModal","internal","_internalModel","responseJSON","publicApiError","currentVersion","newVersion","currentField","fieldDef","getPermissableSections","getWriteableSections","getReadableFieldsForSection","getWriteableFieldsForSection","deleteField","del","EvaluationsMixin","evaluationsAjax","getEvaluations","agentEvaluations","evaluatorEvaluations","assigneeEvaluations","agentId","evaluationState","userType","isAssigneeFeatureEnabled","isDisputesFeatureEnabled","evaluatorUri","agentFinishedUri","agentInReviewUri","assigneeUri","evaluatorRequest","requestAgentFinished","requestAgentInReview","requestAssignee","_ref$entities","evaluation","changedDate","calibration","dateAssigneeChanged","assignedDate","linkContext","EvaluationModel","_ref2$entities","releaseDate","_ref3$entities","_ref4$entities","evaluationIdSet","resultData","totalResult","queryResult","readEvaluation","evaluationIsAdminContext","externalContacts","externalContactProfiles","consultAgentParticipant","consultParticipant","hasMultipleExternalContactMatches","isIncomingFromExternalContacts","isConnectedWithExternalContact","hasExternalContactProfiles","hasOneExternalContactProfile","_nameForInheritor","componentClassName","externalContactFullName","FaxesMixin","getFaxes","fax","FaxModel","readFax","changeFaxReadState","contentUri","sharingUri","contentLocationUri","markFaxesRead","faxes","markFaxesUnread","renameFax","deleteFaxes","deleteFax","downloadFax","allFieldData","showLabel","savingField","attachObserversForComplexFields","fieldTypeClass","notifyComplexPropertyChange","performNotification","didFlag","flagOperationInProcess","flaggedSelves","myParticipants","myGuid","myFlaggedParticipants","flaggedReason","allowFlagChange","minutesPassed","flagCallHistoryInteraction","customerBrowserDetails","customerDetails","isChrome","isEdgeChromium","hasChromeExtension","isStandAloneApplication","canScreenshare","cobrowseType","isCustomerConfiguredForCobrowse","isCustomerConfiguredForScreenShare","screenShareMisconfiguration","cobrowseMisconfiguration","canCobrowseChat","canCobrowseCall","isAgentAllowedToCobrowseCall","isAgentAllowedToCobrowseChat","isAgentAllowedToCobrowse","isAgentAllowedToScreenShareCall","isAgentAllowedToScreenShareChat","isAgentAllowedToScreenShare","sessionShareStartVideoTooltip","sessionShareStartTooltip","canScreenShareViaHawk","webMessagingCobrowseStartTooltip","disableShareButtonReason","isConfigured","disableVideoButton","disableShareButton","shouldShowSessionShareButton","enableAcdSessionShare","isInternalProvider","acdVoicemailTooltip","holdTooltipTitle","muteTooltipTitle","scriptToolTip","skipACWTooltipTitle","currentJobs","finishedJobs","_currentJobs","_finishedJobs","_logger","errorState","cachedTotal","loadPage","prevPage","decrementProperty","ensureCorrectProperties","currentPageDisplay","hasNextPage","hasPrevPage","haveContent","letterUpdate","letter","directory","isHeld","isMuted","isRecording","isActiveCallACD","isOutsideCall","myself","onCall","setActiveCall","cleanupActiveCall","headset","webrtcSdkService","attemptingToCall","shouldPromptForMerge","callToMergeInto","mergeData","deviceMuteEvent","mute","deviceHoldEvent","holdRequested","hold","deviceCallRejectedEvent","sendToVoicemail","enableHeadsets","changeHeadsetSource","headsetSource","callVoicemail","_handleValidationError","webrtcPhoneWithIssues","_validateCall","callingPerson","onbehalfOfQueue","noStation","_throttledHoldOtherConversations","_holdOtherActiveConversations","_makeCall","formatSipAddress","callFromQueueId","showErrorNotification","startSoftphoneSession","updateActiveConversationEntry","outgoingCall","callArgs","callPersonById","mergeCalls","conversations","callsToMerge","conferences","conversationIds","recordings","makeMergeRequest","toVoicemail","_throttledHandlePhoneStatusChange","_args3","handlePhoneStatusChange","endCall","clearMergeData","makeConferenceCall","parties","bulkAddParticipants","blindTransfer","isNumber","myselfId","participantEntity","isQueue","_handleCallTransferred","conversationsMadeByClient","placedConversation","consultTransfer","currentCallId","otherPartyId","initiateTransfer","addressee","changeSpeakerForConsult","speakTo","otherParty","endConsult","generateConversationsUrl","dialDtmfNumber","digits","_throttledAnswerWebrtc","_answerWebrtc","_throttledAnswer","_answer","_throttledAnswerSoftphoneConversation","acceptPendingSession","answerSoftphoneConversation","_findPendingSessionsByConversationId","validateActionSucceeded","checkForNonACD","_throttledMute","_mute","setMute","skipHoldAll","_held","held","otherConversations","otherConversation","_throttledHeld","_callee8","_context8","setHold","_throttledRecord","_callee9","_context9","_record","_this14","flagActiveInteraction","_this15","isFlagged","_makeFlagChange","_this16","endCallForAll","endCallById","_throttledEndCall","_callee10","_context10","_endCall","_throttledEndCallForAll","_callee11","_context11","_endCallForAll","_this17","_callee12","_context12","conversationWithError","removeConversationFromConversations","_endWebrtcCall","_this18","_callee13","_context13","conversationType","webrtcConversationTypes","SOFTPHONE","notAfter","_throttledEndWebrtcCall","_callee14","_context14","endConversation","_this19","generateConversationUrl","callbackConnected","generateCommunicationUrl","handleOtherParticipantStatusChange","_this20","callForwardingActive","callForwardingNumber","callForwardingExtension","fetchCallForwarding","getCallForwarding","_updateCallForwarding","hasPhoneNumber","_contactObservers","activeConversations","onMultipleCalls","activeAcdCalls","conv","callState","webrtcConversation","getConversation","callIsAlreadyConnnected","hasPendingSession","webrtcSessions","atLeastOneWebrtcConversation","isDefinedAndLengthGreaterThan","activeNonAcdCalls","connectedConversations","dialingOrContactingOrAlertingConversationsToProceed","thisClientMadeTheCall","waitingForSession","recentTransfers","thisBrowserIsTheOneToAnswerFrom","isDialing","isOutbound","disconnectedConversations","eligibleCallsToMerge","onConference","thisCallIsConference","_handleActiveConversationsUpdates","_throttledHandleActiveConversations","handleActiveConversationsUpdates","hasActiveCall","connectedNonAcdCalls","dialingOrIncomingConversation","newActiveCall","activeCallOngoing","dialingOutboundConversations","hasOutboundConversation","activeCallErrors","errorInfo","hasIncomingConversations","_setHasIncomingConversations","hasActiveNonAcdCalls","incomingConversations","incomingNonAcdConversations","isOnConnectedCall","mostRecentlyConnectedConferenceCalls","isConferenceCall","isConnectedCall","myTime","onlyConnectedConversations","recentDisconnectedAgentCalls","isAgentCall","recentDisconnectedNonAcdCalls","userCallSessionsWithErrors","_shouldRemoveNonAcdConversation","conversationMarker","conversationsToRemove","callErrorToRemove","conversationModelTemp","ConversationModel","_throttledRemoveDisconnectedConversations","_removeDisconnectedConversations","participantOnUpdatedConversation","conversationHasErrors","conversationMadeByClient","conversationAcceptedOnClient","conversationWasMadeOrAcceptedOnClient","participantsForUser","updatedParticipantCall","getParticipantCall","conversationWasTerminatedNotDisconnected","disconnectedCalls","timeOutToRemove","stationIsWebrtc","thereArePendingSessions","_debouncedRemoveConversationFromConversations","thereIsAConnectedConversation","updateConversationArray","conversationDetails","conversationExists","monitoredConversationsForErrors","nonAcdCalls","usersCallSessions","callSessions","participantIsUserAgent","participantIsCurrentUser","userParticipant","callsWithErrors","disconnectReasons","thereAreDisconnectReasons","re","disconnectErrors","disconnectTypeIsError","disconnectType","ERROR_WHITE_LIST","registerCPTopics","topics","_updateStationEvent","conversationData","currentCallState","participantOnExistingConversation","participantCall","participantOnCall","participantIsNotVoicemail","isActiveOnCall","newCallState","answerCall","_logConversationDetails","_updateModelForConsult","IGNORED_ERRORS","useNotificationProfileOutput","displayIncomingNotification","notificationOptions","fallbackToInBrowser","EVENTS","handleParticipantCallError","endMoment","isRecent","hasThrownError","showSipError","messageText","phrase","translateServerErrors","messageParams","messageWithParams","fetchStation","stationId","newCode","showFeedbackErrorNotification","showNoStationSelected","isAcdCall","needStation","updateStationEventTimeout","freeSeatPreference","noStationSelected","defaultStation","associatedStationNotDefault","defaultStationNamePromise","selectedStation","guidFromUri","disassociateStation","disconnectPersistentConnection","endAllSoftphoneSessions","chooseDefault","chooseStation","doLoginAssociationLogic","isFreeSeatOrg","_loginAssociationFreeSeat","_loginAssociation","doLogoutAssociationLogic","associatedStation","lastAssociatedStation","lastAssociatedUser","defaultStationUser","userStationSettings","eventBody","_debouncedUpdateStationEvent","_handleUpdateStation","metadata","newStation","newStationId","currentStationIsNewStation","stationUri","_testIsStationWebrtc","PurecloudModelMixin","hasRelateAccess","canShowCustomFields","contactRoute","queueSearchRequest","requestArray","queuePermission","relatePermission","queueSearchData","searchIntegrationKey","queueSearchQuery","userRequest","resultArray","userIds","performTagSearch","searchQueue","searchQueueOnly","searchOnEmpty","pendingSearchRequest","currentSearchRequest","TagSearchMixin","tagSearchQuery","tagSearchRequest","tagSearchResults","HelpMixin","_performHelpSearch","excerpt","performHelpSearch","TIMEOUT","PrepareResults","parsedResults","retrySearch","searchUser","searchRelate","userSearchFailed","queueSearchFailed","relateSearchFailed","userPending","queuePending","relatePending","queueResults","relateResults","debouncedSearch","performReload","searchQueues","searchUsers","userRequests","queueRequests","relateRequests","leading","trailing","presenceToRadixMapping","available","busy","away","idle","offline","on_queue","out_of_office","radixMapping","mapUserToSortable","userName","mapRoomToSortable","radix","SortChatUsersMixin","sortChatUsers","usersList","sortOneToOneRooms","_styleNamespacingExtras","getScrollParent","comp","enableViewport","enteredViewport","rect","windowHeight","windowWidth","bottom","exitedViewport","_teardown","_setup","_bindEvents","_updateBoundingClientRect","innerHeight","documentElement","innerWidth","clientWidth","scrollParent","scrollParentRef","windowRef","$scrollParent","resizeHandler","scrollHandler","getBoundingClientRect","_updateWindowSize","_scrollHandler","requestAnimationFrame","_resizeHandler","streaming","sessionService","_fixTooltips","videoTooltipTitleSr","numberOfParticipants","oneToOneChat","webrtcTarget","videoMediaProviders","haveNonPurecloudMediaProvider","videoTooltipKey","videoButtonEnabled","_annotation","eventType","_assign","customPayload","typeOf","PROTOCOL_FIELD_NAME","OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME","currMetadataFieldName","messagePayload","requireProtocol","API_ACTION_FIELD_NAME","actionDetails","PROTOCOL_AGENT_FIELD_NAME","PROTOCOL_AGENT_VERSION_FIELD_NAME","fieldToPrune","AppApiCall","protocolAgentName","protocolAgentVersion","internalPcCall","srcApp","srcAppInstance","AppState","ordinal","compareTo","anotherState","getPrototypeOf","APP_STATES","LOADING","BOOTSTRAPPING","RUNNING","STOPPING","STOPPED","LIFECYCLE_HOOKS","BOOTSTRAP","FOCUS","BLUR","STOP","APP_LIFECYCLE_CALLBACKS","BOOTSTRAPPED","APP_UPDATED","APP_DELETED","LICENSE_UNAVAILABLE","STATE_CONFIGS","_STATE_CONFIGS","lifecycleDetails","maxDurationMillis","stateOptInPropName","broadcastHookName","appCallbackEventName","LIFECYCLE_ORDERED_APP_STATES","currStateName","state1","state2","AppInstance","instanceId","currState","_currStateStartTimestamp","problem","lastUserAccessTimestamp","_stateTimeoutTimer","attentionCount","guidFor","reportStoppedInteraction","_inAppInteraction","_appendAppInteraction","_startAppInteraction","_advanceState","loaded","bootstrapped","_triggerLifecycleHookEvent","stopped","setProblem","requestedState","requestedStateConfig","nextState","_getNextState","_convertStateToLifecycleEvent","_logInactiveAppStopped","hook","_monitorTransitionalState","currStateConfig","currStateEntryTimestamp","maxDuration","timeInState","currStateIndex","_interactionStartTimestamp","_latestInteractionTimestamp","lifecycleEvent","startTimestamp","_logAppInteraction","interactionStart","interactionDetails","timeSinceInteractionStart","timeSincePrevInteraction","interactionEnd","interactionDuration","commonAttrs","pcAppTypeId","pcAppId","pcAppInstanceId","pcAppDisplayType","pcAppInternallyHosted","InternallyHostedApp","pcAppFeatureCategory","pcAppProblemName","getURLTemplateQueryParams","queryParam","appState","POOL_STATES","IDLE","APP_NOT_FOUND","ALLOCATING_SPACE","SHOWING_APP","ALLOCATION_FAILED","LOAD_FAILED","AppPool","poolName","getMaxActive","fetchAppsFn","loadRetryBaseMillis","loadRetryMaxBackoffMillis","reloadAppsIntervalMillis","reloadAppsRetryBaseMillis","stoppedInstanceRemovalInterval","renderedAppInstances","_loadAppsPromise","_showFailureRestoreAppId","_loadRetryAttempts","_loadRetryScheduled","_reloadFailureCount","skipLongRunningTasks","appAttentionCounts","counts","runningInstances","_searchInstances","maxState","currInstance","totalAttentionCount","_apps","_renderedInstances","_fetchFailureLog","abortedCount","endpointFailureCount","instances","findAllApps","_loadApps","showApp","_findApp","_this3$_searchInstanc","_this3$_searchInstanc2","existingInstance","_setState","_allocateNewInstance","hideApp","_this4$_searchInstanc","_this4$_searchInstanc2","runningInstance","stopApp","_this5$_searchInstanc","_this5$_searchInstanc2","_monitorAppLifecycles","reloadApps","_reloadApps","internalLoadRetry","__fetchApps","latestApps","mergedApps","newApp","_isEqual","APP_PROBLEMS","currNewApp","_findIndex","loadResult","restoreAppId","_logPoolEvent","forceReload","autoLoadRetry","loadRetryAttempt","autoAttempt","_scheduleAppReload","autoRetry","loadRetryScheduled","_retryInitialAppLoad","retryBase","retryAttempts","retryInterval","maxRetryDuration","_loadRetryTask","timeoutVal","abortedAttempts","endpointAttempts","_decorateLogStatement","reloadInterval","reloadWait","reloadFailureCount","_reloadTimerTask","finish","typeOfApps","isAjaxError","isAbortError","pendingInstance","_allocateSpace","renderedInstances","existingInstances","sortedInstances","instanceToEvict","evictedAppId","_ref$instanceId","_ref$appId","_ref$states","_ref$maxState","instanceState","currInstanceState","specificInstance","_removeStopped","_monitorAppLifecyclesTask","stoppedInstances","logText","poolEvent","poolEventDetails","poolState","maxPoolSize","renderedApps","primitivePoolStateDetails","_omitBy","poolStateDetails","_reduce","_merge","Copyable","LIFECYCLE_DEFAULTS","ephemeral","hooks","bootstrap","STANDALONE","WIDGET","INTERAPPTION","DIRECTORY","CONTACT_CENTER_INSIGHTS","LANG_TAG_URL_REPLACEMENT_TOKEN","PC_ENV_URL_REPLACEMENT_TOKEN","PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_LANG_TAG_URL_REPLACEMENT_TOKEN","GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN","GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN","GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_HOST_ORIGIN_REPLACEMENT_TOKEN","GC_TARGET_ENV_REPLACEMENT_TOKEN","TOKEN_REPLACEMENTS","_TOKEN_REPLACEMENTS","queryParamName","replacementProp","replacementValue","interactionType","URL_REPLACEMENTS","replacementToken","_ref2$","regExp","INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS","INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS","INTERAPPTION_COMMUNICATION_TYPE_FILTERS","typeId","urlTemplate","langTag","envTld","usePopupAuth","displayType","featureCategory","permissionsPolicy","enabledQueueIds","enabledCommunicationTypes","gcHostOrigin","gcTargetEnv","currReplacement","rawValue","appUtils","buildLogMsg","deep","ownerMixin","sandbox","cloneDeep","assets","lifecycle","_callCommunication","Model","isExternalVoicemail","_callbackCommunication","hasSipErrors","codes","sipResponseCodes","conversationParticipants","conversationParties","missedCall","wasConference","wasCallback","wasOutboundCampaign","wentToVoicemail","callStart","sentToVoicemail","reachedVoicemail","callEnd","isMultiParty","allParticipants","myParticipant","nonVoicemail","me","internalParticipants","monitoredCallId","externalParticipants","ani","stationParticipants","voicemailParticipant","ivrParticipants","queueParticipants","otherParties","partyFromConversation","callParties","dnis","initiator","outboundParticipant","external","inboundExternal","disconnectReason","disconnectTypeKey","isIvrTransfer","isOutboundCampaign","isBlindTransfer","isConsultTransfer","isPersonalVoicemail","isQueueCall","invalidNumber","groupRingParticipant","isGroupRing","groupRingId","isOutboundGroupRing","groupRingGroup","backgroundReload","groupRingCaller","loadConversation","personParticipants","_chatCommunication","ChatMessageMedia","ChatMessageMixin","corrects","hasMentionLinks","unread","startOfBlock","endOfBlock","isYourLastMessage","splitMessageIndex","determineMessageEditability","isSplitMessage","isEditable","editableEndTime","meAction","startEditing","stopEditing","originalWidgetType","isEditableTimeout","animateChatIcon","rawSubject","pendingRoom","firstMessageTime","lastMessageTime","lastMessageTimeRadix","roomClosedTimeRadix","mentions","unseen","messageActivity","userActivity","loadingHistory","moreHistoryAvailable","moreForwardHistoryAvailable","activated","acdCustomerParticipant","inputCache","isInRoster","participantsVisible","invited","joinCallImmediately","joinScreenshareImmediately","deferredParticipants","roomOwners","setupProperties","authenticatedUserIsRoomOwner","resizeNewPopout","popout","resizeTo","moveTo","videoConversation","videoRoomFull","haveId","haveName","isApiFieldConfigName","mapCanRemoveParticipant","participantList","isMember","isRoomOwner","sortedParticipants","skipGroupDataCheckEnabled","isAdhocRoom","isAcdRoom","isAcdJid","isSoftphoneRoom","isSoftphoneJid","isOneToOne","allowUserRemoval","processRoomDetails","haveGroupData","clearMessageCache","pruneMessages","removeCachedItemsCount","takeRight","reconcileMessages","addHistoryMessages","processHistoryModels","filterSeenMessages","addSelfReference","insertHistory","sortChatMessages","processCorrections","processSplitMessageHistory","markConversationBlockBoundaries","updateFirstUnread","updateMessageTimes","bumpActivityCount","historyMessages","unshiftObjects","splitMessage","processSplitMessage","correctedMessage","m","shouldGroupMessages","splitMessageParentExists","SplitMessage","splitMessageId","addSplitMessage","msgId","isSupervisor","isAcd","lastMessage","yourLast","isBefore","oldMessage","newMessage","updateMessageTimeRadix","updateClosedTimeRadix","addParticipant","removeParticipant","clearUnreadMessages","isUserInRoom","userjid","clearPending","existingMessage","setSendError","addDeferredParticipant","loadDeferredParticipants","audioMuted","videoMuted","sharingScreen","major","domId","hasConnected","inLastN","screenStream","isV1","startedVideoMuted","associatedInteraction","zeroBitrateCount","positiveBitrateCount","noVideoTrack","speaking","mediaPresence","_getInteractionAvatarDisplay","showAvatar","noVideo","avatarDisplay","hasOfflinePresence","connectionStatus","canBeMuted","markedAsRead","actionType","dateStart","lengthInMinutes","appointment","isOverdue","maybeLowerCase","ExternalContactsMixin","maxParticipants","acwNotes","conversationIsAConsult","conversationInitiator","lastPartyTalkingTo","webrtcSession","hasDisplayedDesktopNotification","acceptedByClient","dialingTime","otherPartyJid","setOtherPartyJid","isOtherPartyPerson","connectedDuration","iAmInitiatorOfConsult","otherPartyThatIsNotTheInitiator","partyId","initiatorId","otherParticipantsThatAreNotTheInitiator","aniName","otherPartyThatIsNotTheInitiatorModel","_conversation","userGuidFromParticipant","setLastPartyTalkingTo","connectedParties","lastPartyTalkingToModel","consultOtherParty","initiatorModel","initiatorCall","initiatorConnected","otherPartyThatIsNotTheInitiatorCall","otherPartyThatIsNotTheInitiatorConnected","consultOtherPartyModel","participantModels","communication","isTerminated","isNotSelf","otherPartyModel","personFromStore","otherPartyNumber","doLookup","notTerminatedOrDisconnected","isMonitor","isCoach","isBarge","disconnectedParties","sortedDisconnectedParties","lastDisconnectedPartyModel","selfIsDisconnectedOrTerminated","myState","useDisconnectedParties","allParties","connectedOnConsult","confined","firstCall","sortedParties","callStateA","callStateB","arePartiesDisconnected","recomputeParties","otherDisconnectedParty","isConsult","isOngoing","isStation","isIvr","otherPartiesNoEndTime","otherDisconnectedPartyModel","isDisconnectedQueueCall","setConsultInitiator","nonInitiatorNumber","myConsultId","consultParty","nonInitiator","hasActiveAgent","isMe","isAgent","needsWrapup","isUser","isAlerting","myselfIsMonitor","myselfIsCoach","myselfIsBarged","bargedParticipant","myselfIsMCB","monitoredParticipant","coachedParticipant","monitoredParticipantPerson","coachedParticipantPerson","bargedParticipantPerson","isSelfMCB","peerDisconnectedCall","myselfDisconnectedCall","errorInfoMessage","isIncoming","isRinging","isDialingOrContacting","isContacting","justMyselfOnCall","iAmContacting","theOtherPartyWhileContacting","isMissed","segments","howEnded","lowType","endedWithDisconnect","isConfined","voicemailParties","isConnected","onConsult","others","consultParties","found","markCallAsConsult","consult","canUpdateConsult","consultInitiator","mostRecentEndTime","groupParticipant","currentTimestamp","_groupRingCaller","actualCaller","caller","connectedToStationAndNotConference","anotherPartyIsStation","isStandaloneStation","anotherPartyIsVoicemail","connectedMedia","conversationHasActiveSessionShare","hasActiveMedia","_emailCommunication","TranslationModel","addTranslation","getValue","agentHasRead","evaluationForm","evaluator","redacted","rescore","conversationDate","assignee","declinedReview","displayThumbnail","organization","channelIdProperty","isNewChannel","changesIgnoredByAgent","agentRespondedToPrompt","screenName","channelId","PreferredPhoneContactOrder","PreferredEmailContactOrder","schemaService","schemaType","externalDataSources","externalOrganizationId","createDate","modifyDate","firstName","middleName","lastName","workPhone","cellPhone","homePhone","otherPhone","workEmail","personalEmail","otherEmail","twitterId","lineId","facebookId","whatsAppId","surveyOptOut","schema","customFields","contactType","mergedTo","mergedFrom","canonicalContact","mergeSet","isCurated","isIdentified","canonicalId","divisionName","isCanonical","externalOrganization","belongsTo","externalSystemUrl","createdDate","lastUpdated","hasEmailAddresses","address1","address2","postalCode","twitter","isSalesForce","phoneName","featureKey","featureKeyExt","featureKeyAcceptsSMS","initials","bestEmailAddress","preferredEmailType","_bestEmailType","bestEmailType","bestPhoneNumber","_bestPhoneType","bestPhoneNumberDisplay","bestPhoneType","bestPhoneTypeKey","hasEmailAddress","externalDataSourcesAlert","externalDataSource","platform","salesforceLink","expandedSchema","getSchema","schemaTitle","schemaData","getSetter","websites","isOrganization","companyType","industry","primaryContactId","faxNumber","employeeCount","revenue","tickers","hasMany","website1","website2","Channel","dateCreated","dateModified","workspace","createdBy","contentLength","filename","thumbnails","callerAddress","receiverAddress","isDefaultName","faxName","faxFrom","faxFile","longitude","latitude","ISSUE_REGEX","showEmbedConfirmation","getPreference","showEmbed","isRepo","isGist","isIssue","issueNumber","issue","embedString","shouldEmbed","onSettingsChange","setEmbedPreference","pref","embed","setPreference","disableEmailPii","includeEmailTranscriptions","languagePreference","BASE_GROUP","COMPARATORS","EqualTo","NotEqualTo","GreaterThan","GreaterThanOrEqualTo","LessThan","LessThanOrEqualTo","PROFICIENCIES","acdSkills","lastSavedExpression","isDynamicGroup","_expression","groupTypeValue","actualType","profilePictureURL","activeProfilePicture","x128","placeholderImageForSize","uploadedProfilePictures","uploadedInformalPhotos","areOwnersIncluded","groupEmailAddress","membershipSearchQuery","compiledQuery","generalSearchQuery","isDeleted","allowPermissionGroup","uniqueRoleCount","grantVersion","rolesMap","emailNotificationEnabled","voicemailEnabled","membershipChange","guidOwner","setIdForGroupEntity","existingId","idParts","individual","guidIndividual","ownerIds","profileImageSection","profileImage","deleteGrant","conOp","newCondition","newSkill","languageSkill","routingSkill","subdomain","getPcApplicationsSubdomain","currentDomainName","LibraryModel","responses","BASE_LOCATION","LocationModel","imageHistory","contactPersonId","sublocationOrder","floorplanImage","floorplanImageHistory","profileImages","imagex48","imagex96","imagex128","imagex200","x48","x96","floorCount","subs","isFloor","deleted","hasContactPerson","contactPerson","floorplan","_parent","containsRichAddress","setFloor","roomId","organizer","attendees","notifyAttendees","recurringType","meetingAttendees","_messageCommunication","shortName","hasUnifiedCommunications","comms","hasChatEnabled","hasHipaaEnabled","hipaa","_orgDetails","orgDefaultCountryCode","sessionUserOrgCountryCodeValue","orgDetails","defaultCountryCode","orgPreferences","parsedPreferences","_participant","permissionRoutes","updates","sectionValue","clearProperties","changedKeys","originalKeys","fieldKeys","pathKey","contactCenterCount","enterpriseCount","Internal","InternalModel","setupData","hasRecord","_changedKeys","_data","isReloading","pushedData","_notifyProperties","didInitializeData","ChatUserMixin","EntityPresenceMixin","_readWritePermissions","_directReports","_siblings","_superiors","roleIds","expands","_activities","activities","_activityCall","_activityCallback","_activityChat","_activityWebChat","_activityEmail","showConversationSummaryIndicator","onProfilePage","totalCallbacks","totalWebChats","activityValues","email_main","integrationPhone","otherPhones","agentName","socialGroups","getGroupsByType","officialGroups","distributionGroups","ownedGroups","managerId","managerSiblings","groupedOtherRelationships","persons","personEntry","adminAssistants","cachedData","cachedIds","sameIds","_loadingSuperiors","directReportCount","cachedReports","attemptedToLoad","dataDiscrepancy","noDirectReports","doNotLoad","cachedIsSame","isEqual","isContentUser","isContentAdmin","isNotBusy","isCommunicateUser","updatePermissionsOnRouteChange","personDetailController","setPicture","setAgentPicture","imageSection","membershipIds","memberships","getFieldPathForFieldValue","actual","fieldType","filteredEntries","uniq","filteredPaths","_presence","primaryContactInfo","addresses","authorization","fieldConfigs","token","isTrustee","isCloned","userState","inviteLastSent","QueueModel","outboundMessagingAddresses","outboundEmailAddress","directRouting","cannedResponseLibraries","recordingRetryCountMap","callerName","durationMilliseconds","userRecordingDownload","mediaUri","fetchAudio","callRecordingUri","resultUri","resolver","pollingTimeout","apiName","userRecRetryCountKey","userRecRetryCurrent","recordingUri","_type","ResponseModel","texts","substitutions","responseType","messagingTemplate","isOpen","libraryName","isWhatsAppResponse","permissionPolicies","_screenshareCommunication","_socialCommunication","messageArray","mentionRegex","mention","failedMessages","StationModel","webrtcMediaDscp","webrtcForceTurn","persistentConnection","webRtcUserId","webRtcCallAppearances","webRtcRequireMediaHelper","isWebrtc","isRemoteStation","toCheck","isGeneralUnrecoverableAppFailure","isSessionBootstrapFailure","GeneralUnrecoverableAppFailureTypes","SessionBootstrapSteps","_types","hasKey","UserModel","welcomeSent","lastLogin","clientVersions","passwordSaved","_videoCommunication","_loadEPCConversation","VoicemailMessageModel","audioRecordingDurationSeconds","audioRecordingSizeBytes","callerUser","parentIds","note","copiedTo","copiedFrom","useVoicemailApp","loadParticipants","dateFromNow","fromNow","isGroupVoicemail","groupEntity","loadEPCConversation","_userId","fetchCallerName","mutableGroupId","shiftTrade","alternativeShift","timeOffRequest","agentNotification","otherNotificationIdsInGroup","adherenceExplanation","Router","locationType","titleDivider","isAborted","resetNamespace","intent","replaceWith","didTransition","gotoRoute","UnprotectedRouteMixin","ApplicationRouteMixin","onSessionInvalidationFailure","willTransition","postMessageRouteChange","transitionToEntityDetail","linkTo","targetName","performRecentSearch","recent","togglePanel","openPanel","closePanel","toggleCommunicationSidebarExpanded","ensureRouteVisibility","openChatRoom","startChatByJid","_arguments","launchVideoWithPersonById","startCallPersonById","startCallByNumber","originRoute","sessionAuthenticated","stateRestore","popRestoreState","sessionInvalidated","recordLogoutTime","CardDetailRoute","getUserId","person_id","isGuid","afterModel","sendPageData","helpPath","GroupDetailRoute","ModelRouteMixin","updateParentRoute","controller","group_id","currentModel","include","setupController","sidebar","IndexRoute","OAuth2LoginRoute","controllerName","authenticator","_authenticate","loadTranslations","resolvedModel","serializeRestoreState","rejectionDetails","authFailureReason","sensitive","LoginRoute","MaintenanceRoute","_unrecoverableAppFailure","_analytics","buildCommonTelemetryContext","intlService","reloadApp","_reloadApplication","EngageSupervisor","initialIntent","routing","generateURL","appsProblem","unknownApp","currAppName","appPool","app_id","buildStandaloneAppLogMsg","initPoolState","rejectionPoolState","routeAppId","targetRoute","refreshModel","redirectUrl","hashRoute","buildTag","currModel","DEFAULT_PARAMS","performSimpleKeywordSearch","suggest","queries","SEARCH_QUERY_OPERATORS","SEARCH_QUERY_TYPES","addQueries","addTagQuery","addAggregation","SEARCH_AGGREGATE_TYPES","aggregation","setTypes","setReturnFields","Service","resourceTypes","suggestEndpoint","_searchUrl","_suggestUrl","_docUrl","searchDocumentation","normObj","_this$requestBuilder$","defaultAggregations","entityRequest","facetsRequest","aggregateResults","processFacets","performSuggestSearch","orderKeys","RequestBuilder","_extractData","included","toRemove","OUR_COOL_REQUEST_TYPES","ApplicationSerializer","RESTSerializer","isNewSerializerAPI","primaryKey","isPrimaryType","primaryTypeClass","primaryModelClass","groupKey","finalData","PurecloudSerializer","serialized","attrsToSerialize","changed","changedAttributes","JSONSerializer","convo","EMPTY_MODEL_OBJECTS","EmbeddedRecordsMixin","_normalizeContact","_getPojo","jsonProfile","normalizeDeleteRecordResponse","normalizedPayload","_fillEmptyPropertiesWithModelObjects","normalizeQueryResponse","filledEntities","contacts","externalcontacts/contacts","pageOffset","emptyModel","emptyOrgModel","EMPTY_ORGANIZATION_MODEL","getOwnPropertyNames","_fillPropertyIfNecessary","_step2","_iterator2","defaultData","payloadValue","Set","externalcontacts/external-organizations","_messageChannels","modelKeyFor","normalizeFindRecordResponse","jsonapiPayload","extractId","resourceHash","getJabberId","generateGroupLinkIds","jId","orgGuid","search_key","groupLinks","uuid","generate","cleanFields","extractSectionData","_application","filterMissingFields","normalized","requireMediaHelper","extractMeta","payloadKeyFromModelName","serializeAttribute","wordCharsRegex","nonDigitRegex","removeLeadingPlusRegex","itemToFormat","formatFieldConfigEntry","subMsgType","getExtension","formatNumber","numberFormat","E164","addressParts","lookupAddressFormatResultId","fallback","displayText","existingRecord","resolveAddressFormatResult","isEntity","_addressFormat","formatSipAddressForDisplay","strict","formatRawNumber","RateLimitPromise","ObjectProxy","PromiseProxyMixin","isRateLimited","rateLimitResetTime","Symbol","shouldRetryRequest","retryStringToNumber","retryResetTime","headerRateLimit","AjaxService","_timers","enableRetryHeaderParsing","enableAPIDomainRewrites","trustedHosts","purecloudV2Host","_scheduleRequest","retryTime","scheduleTime","reqUrl","addApiDomainIfMissing","isRootAPIRequest","apiDomain","hostname","canParseHeaders","retryDisabled","promiseProxy","shouldRetry","_logPossibleRetryEvent","errorResponse","getAllResponseHeaders","generateDetailedMessage","urlObject","headerCorrelationId","foundKey","getHeader","payloadCorrelationId","commonCtxt","applicationVersion","uiLanguage","envName","isPopout","webDirAgent","platformJsBrowserName","PlatformJS","platformJsBrowserVersion","platformJsProduct","product","platformJsManufacturer","manufacturer","platformJsLayout","platformJsOperatingSystem","os","platformJsDescription","desktopOS","desktopVersion","BRIDGE_CONFIGURATION","deprecation","COOKIES","dragging","browserHidden","iframeFocused","urlprefix","orgspanBaseUri","purecloudBaseUri","realtimeScriptUri","hostedContext","isMobile","mobileQueryParameter","belowMobileThreshold","showLoader","trialSupportDisplayed","debugSettings","offerMobilePreference","offerMobilePreferenceRetreived","currentYear","orgShortName","checkForDebugMode","gatherEnvDetails","initIframeFocusListener","setVisibilityListener","sendEventToDesktop","hasRecentlyLostSubscriptions","_registerTopics","currentRouteClass","deprecatingAlias","systemLocale","setLocale","hidden","visibilityChange","mozHidden","msHidden","webkitHidden","pigeonUserSubscribed","loadStreamingService","authenticated","features","scriptUri","streamingService","getFeatureToggles","runAsMediaHelper","testMediaHelperMode","setupConnection","webrtcRelayOnly","signalIceConnected","disableEOCShortCircuit","referenceStanza","originAppName","APP_NAME","originAppVersion","originAppId","splitHawkAndRealtime","useServerSidePings","customHeaders","Genesys-App","streamingServiceConnect","adminUIContext","systemTopicType","notified","connect","csEnabled","csRunLater","checkContentSquare","csLoaderScript","crossOrigin","syncStreamingConnectionToAuthState","syncVideoChatStateToAdminContext","clearActiveRoomMessagesOnAppFocus","_delayedRefocusChatRoom","delay","refocusActiveRoom","displayTrialSupport","dismissTrialSupport","uvOptions","feedback_tab_name","primary_color","link_color","default_mode","forum_id","searchParams","publishMessage","postMessage","localGCBAUri","changePreferredLanguage","sendDiagnostics","_sendDiagnostics","sendFeedback","checkForMobile","isMobilePhone","showTinyNavMenu","showContextualHelp","isScreenRecordingPopout","isPef","isInteractionPopout","isAdminRoute","cast","setBridgeConfiguration","getQueryParams","debugCookie","buildDebugSettings","orgNameCookie","readOnlyCookie","masonryCookie","DirectoryNavHandler","routerService","canHandle","appApiCall","handle","_handleShowProfile","_handleShowGroup","_appApiCall$get","_appApiCall$get2","TOAST_MSG_PROPS","internalPropName","required","markdownMessage","showCloseButton","showNotificationEverywhere","TOAST_MSG_PROP_NAMES","REQUIRED_TOAST_MSG_PROP_NAMES","apiActionDetails","_this$_processToastPa","_processToastPayload","invalidProps","ignoredProps","validatedToastData","ignored","props","fullTag","requiredCount","filteredPickData","_pick","filteredData","_pickBy","_checkPropValid","_omit","_mapDataToInternalProperties","_mapKeys","isFinite","PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES","SHOW_PROFILE_APP_API_ACTION_NAME","SHOW_TOAST_APP_API_ACTION_NAME","APP_PROTOCOL_CHECK_REG_EXG","ALLOWED_SANDBOX_VALUES","ALLOWED_PERMISSION_VALUES","LIFECYCLE_HOOK_KEYS","LIFECYCLE_KEYS","INTERAPPTION_PROP_MAPPING_CONFIG","destPath","convert","valueIn","typeIn","lifecycleObj","valueType","trustedOnly","APP_ASSET_CATEGORIES","currCategory","standaloneAppPool","standaloneAppPoolVisible","widgetAppPool","externalUrlExemptIntegrationTypeIds","standaloneMaxActivePoolSize","widgetMaxActivePoolSize","_bypassAppCache","globalApiHandlers","REMOTE_APPS_CACHE_TTL_MILLIS","localMsgListener","appsSupported","handleAppApiCall","apiCall","contextualApiHandlers","_handleApiCall","isTrustedApp","appInstance","buildValidInterapption","trustedProvider","buildInterapptionsLogMsg","normalizedConfig","properties","APP_DISPLAY_TYPES","propError","configKeys","currKey","currValue","currPropConfig","_buildApp","_isValidApp","_handleLocalMsg","_isLocalMsg","_appApiCall","parseMessage","parseError","buildApiLogMsg","msgSource","asyncHandlerPromise","availHandler","currHandler","_instrumentApiCall","msgFailureDetails","ApiCall","pcAppProtocol","APPS_API_PROTOCOL","pcAppProtocolAgentName","pcAppProtocolAgentVersion","_addPageAction","apiAction","currPool","_findAllStandaloneApps","_fetchAppsByType","_findAllWidgetApps","findAllInterapptions","_fetchAppsByTypeRemote","_remoteAppPromise","_remoteAppRequestTimestamp","allAppsPromise","lastRequestTs","_accumulateApps","app1","app2","localeCompare","currApp","appsUrl","primaryLocale","_getPrimaryLocale","validAppObjs","currIntegration","internallyHosted","_isInternallyHostedApp","integrationType","effective","intlLocale","intlIsoLocale","appProps","_parseLangTagProp","_parseMultiValueProp","_parseProp","APP_FEATURE_CATEGORIES","ucIntegrationKey","pbxPermission","getCurrentWindowOrigin","isNone","NO_SUPPORTED_COMMUNICATION_TYPE_FILTER","currAssetCategory","currAssetCategoryCfg","currVector","vector","currRasters","_extractRasterImgs","raster","assetCategory","basePath","imgs","currImgKey","parseResult","appType","_validateApp","logMessage","logMessageAppType","fullLogMsg","appUrl","internalAppPath","internalAppSubdomain","subdomainType","internalAppQuery","externalUrl","invalidUrl","integrationTypeId","validItems","propVal","_parseBooleanProp","separator","validatedItems","_langTagRegExps","baseProp","langTagRelProp","baseObj","lenientLangTag","langTagRegExp","langKey","_assetLoader","isJid","peopleQueue","groupQueue","checkCacheForEntity","queueEntity","cachedModel","possibleCache","possibleJid","isDirectoryId","scheduleQueues","_scheduleQueues","_handleQueues","clearQueue","processQueue","FL","resolveResults","missingIds","keyId","respondingTimeout","preferencePaths","mixins","BatchDataRequests","CacheChatRoomsMixin","MessageSplitting","supportedChatWidgets","_Ember$Service","applicationController","widgets","firstRoomChosen","responding","popoutRoom","activeEmpty","messagesPerHistoryRequest","maxHistoryRequestSize","dashboardRooms","mutedRooms","roomHistoryStack","replyMessage","collabChatShowChatSplat","canCorrectMessages","initializePreferences","mutedRoomsValue","preference","roomHistoryStackValue","_chatNotificationVolume","chatNotificationVolume","_interactionNotificationVolume","interactionNotificationVolume","_initNotificationVolumes","_setupRateLimitListener","_startWatchVideoParticipantCount","setMessageReply","_handleRateLimit","requestingJids","_notifyRosterRateLimit","saveMutedRooms","saveRoomHistoryStack","addResponder","respondingTimeoutId","removeResponder","sendChatState","toggleRoomMuted","getRecents","clearRoomUnreadMessages","addRoomToDashboard","messageFailedToSend","_d","sendMessageProxy","setActive","timeoutIdentifier","sendCallback","sendMessage","sendVideoProviderNotification","removeAttachment","fileDescriptor","joinScreenShareRoomViaHawk","rejoiningRoom","_timeoutPromise","checkJid","joinRoom","joinRoomEvent","syncPendingRoomWithStreamingService","changeActiveRoom","joinAcdRoom","leaveAcdRoom","leaveRoom","newRoom","addEmptyRoomObserver","len","roomIsDirty","addPersonToRoom","requestHistory","historyOptions","getMessages","markAsHistory","loadUsersForHistory","setRoomSubject","setPresence","setOrganizationPresenceId","presenceId","setStatus","openRoom","oldOpenRoom","openChatRoomWithVideoForPersonById","openChatRoomForPersonById","loadChatRoom","syncUserChatData","roster","syncAllRoomsLastMessageTime","getAllBadgeCounts","loadRoomHistory","getActiveChatsFromRealtime","_this21","getActiveChats","activeRooms","_this22","activeChatsFromRealtime","checkActiveRoomAgainstHistory","historyStack","lastActiveRoom","mostRecent","selectHighestAppearingActiveRoom","_this23","_args6","clearRoomNotificationCounts","newActive","previousActiveRoom","_this24","attemptRoomChange","removeRoomFromHistoryStack","addRoomToHistoryStack","setRoomDetails","closeRoomAndClearCounts","_this25","_this26","deactivateRoom","setRoomInactive","replacementRoomJid","selectRoomPromise","_this27","getNextRoomFromActiveSection","selectedRoom","updateVolumes","deviceVolumes","_this28","activeRoomJid","newRoomJid","activateRoom","trackRoomChange","focusRoom","setFocused","loadRecentHistoryForAllActiveRooms","loadRecentRoomHistory","loadRoomHistoryWithOptions","loadMoreRoomHistory","loadMoreRoomHistoryAfter","loadContextualRoomHistory","afterDate","_this29","beforePromise","requestRoomHistory","afterPromise","combinedMessages","_addHistoryMessages","_this30","_updateRoomStatus","_this31","_processHistoryResults","_this32","_resolveRealtimeDependentCalls","_this33","deleteParticipantFromChatRoom","_this34","_this35","getRoomInfo","getTargetRoomJid","arg","loadRoomAndUser","userJid","processNewChatMessage","_this36","parseMessageBody","messageModel","parseWidgetData","_this37","child","isActiveRoom","isActiveRoomJid","isRoomVisible","isChatVisible","popoutChatRoom","handleXMPPReferenceMention","_this38","personJid","referenceChildren","handleMentionEvent","_this39","handleCollaborateChatMessage","_this40","isMention","incrementUnreadGroupMessage","_clock","INTERACTION_TYPE","UriBuilder","ConversationMixin","validationWaitTime","getAllActiveConversations","getAllActive","communicationType","addCall","phoneColumn","callNumber","scheduleCallback","callbackUserName","routingData","postData","participantStatus","CONNECTED","disconnectParticipant","DISCONNECTED","unhold","recordingState","unpause","requestAcw","afterCallWorkRequired","skipAcw","disconnect","isDialerCampaign","isSkippingPreviewCampaign","hasPlacedCallsInCallback","communicationWrapupSkipped","park","PARKED","disconnectCall","getWrapUpCodes","getProvisionalACWNotes","provisional","loadParticipantPerson","getParticipantNotes","getAllHistoricalACWNotes","currentParticipantId","_x2","saveProvisionalACW","monitor","transfer","transferType","TERMINATED","cancelTransfer","attributeToMonitor","expectedValue","requestUri","VALIDATION_INTERVAL","VALIDATION_TIMEOUT","interactions","newInteraction","actionHasSucceeded","actualValue","valResolve","destroyObserver","checkForSuccessUpdate","formattedExpectedValues","lowercaseValues","formatExpectedValue","actionSucceeded","createObserver","initiateConsult","customerId","consultBoth","consultConference","consultDestination","consultObject","cancelConsult","initiateSessionShare","sessionCodeUrl","sourceCommunicationId","addCommunicationCode","toId","fromId","mediaRequestOptions","toCommunicationId","fromCommunicationId","expireSessionShareCode","disconnectMediaType","createEmail","toAddress","initializeDraft","emailId","discardDraft","autoFill","discard","loadSMSHistory","messageIds","sendSMSMessage","normalizedMessage","mime","stickerIds","mediaIds","textBody","stickers","createMediaAttachment","createMessage","useExistingConversation","requestOptions","toAddressMessengerType","useUserFromAddress","getMediaAttachment","getSMSDetails","smsIds","getMessageSupportedContent","integrationUri","getDeploymentConfig","deploymentConfigUri","getMessagingSettings","integrationIdConfigUri","createConversationSummaryFeedback","CookiesService","arrayComparerByDeviceId","otherArray","itemInOtherArray","diffListsByDeviceId","existingList","newList","itemsRemoved","itemsAdded","removed","sanitizeDeviceLabel","deviceLabel","sanitizedLabel","webrtcSettings","selectedProfileId","vanillaProfiles","profiles","microphone","outputDevice","notificationDevice","incomingInvitations","deviceUpdateDelay","deviceChanges","recentlyConnectedDevices","allowDisableProfileNotifications","profileSettingsPromise","allowDefaultProfiles","initProfiles","_fetchProfiles","currentMediaState","_handleMediaStateChange","_updateVolumes","selectedProfile","defaultProfileId","defaultExists","directorySettings","mediaState","camerasDiff","microphonesDiff","outputDevicesDiff","isInitialUpdate","hasMicPermissions","videoDevices","audioDevices","outputDevices","cameras","microphones","_updateProfileAvailability","_maybeFixSelectedProfile","_updateRecentlyConnectedDevices","_conditionallyShowToastForAddedDevices","canBeSelected","matchingCamera","matchingOutputDevice","matchingMicrophone","matchingNotificationDevice","_findMatchingDevice","profileCameraIsNotDefault","validWithoutCamera","setProfile","mic","currentProfile","hasOutputDeviceSupport","profileCamera","profileMic","profileOutputDevice","profileNotificationDevice","cameraValid","outputValid","notificationsValid","profileValid","cameraMatches","micMatches","outputDeviceMatches","notificationDeviceMatches","newDevices","_showNotificationForCurrentProfileNoLongerValid","setDevices","outputDeviceVolumes","notificationDeviceVolumes","_getVolumesForDevice","setCallVolume","defaults","volumes","ringerVolume","volumeSettings","_getActionHandler","profileToSet","createProfile","_openPhoneSettingsTab","deviceList","foundDevice","deviceA","_deviceMatches","deviceB","hasSameId","formattedNameA","formattedNameB","hasSameName","addedDevices","filteredSelectableProfiles","disableProfileNotifications","cur","yes","openPreference","no","hasNonDefaultDevices","selectableProfiles","deviceConfig","skipProfileSave","updateSetting","deleteProfile","profileObj","settingsService","saveAndSelectProfile","_callee15","savedProfile","_context15","updateSettings","clearRecentlyConnectedDevices","embeddedStatus","urlSearchParams","isLocallyIntegrated","integrationContext","EmbeddedEvents","ENVIRONMENTAL_DATA","NOTIFICATION","DISMISS_NOTIFICATION","SHOW_NOTIFICATION","PAGE_DATA","LAUNCH_VIDEO_WITH_PERSON_BY_ID","LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID","START_CHAT_WITH_PERSON_BY_ID","UPDATE_PROFILE_IMAGE","START_CHAT_BY_JID","FAVORITE_ENTITY_BY_ID","START_CALL_PERSON_BY_ID","START_CALL_BY_NUMBER","USER_GENERAL_FIELD_UPDATED","EMERGENCY_ADDR_UPDATED","STREAMING_TOPIC_SUBSCRIBE","STREAMING_TOPIC_UNSUBSCRIBE","LISTENERS","NOTIFICATION_ACTION","ENTITY_FAVORITE_ACTION","STREAMING_TOPIC_MESSAGE","STREAMING_TOPIC_SUBSCRIBE_ERROR","IframeClientTimeoutError","_classCallCheck","isEmbedded","getHostOrigin","_newrelicLegacy","setCustomAttribute","checkForHostRedirect","initializeFrame","initializeClient","client","environmentalDataListener","hostOrigin","addListener","hostRootUrl","custom","registerEventHandlers","messaging","toastAction","_event$payload","handleNotificationAction","entityFavoriteAction","handleEntityFavoriteAction","streamingTopicMessage","onMessage","streamingTopicSubscribeError","onSubscriptionError","requestNotification","publish","dismissNotification","showNotification","notifyAcdCount","ACDCOUNT_EVENT","sendSidebarEvent","panel","SIDEBAR_EVENT","requestNavigation","startChatWithPersonById","notifyEmergencyAddrUpdated","favoriteEntityById","entityGeneralFieldUpdated","emergencyAdrUpdated","emergencyAdr","EMERGENCY_ADR_UPDATED","streamingTopicSubscribe","streamingTopicUnsubscribe","emergencyLocationData","loadUserPrimaryNumber","primaryPhoneObject","loadELocationEligibility","supported","clearElocation","did","refreshEmergencyLocation","defaultMessage","startPolling","pollingIntervalInMinutes","pollCounter","pollingIntervalId","_refreshAllEmergencylocationInfo","setElocation","newAddress","eventsService","triggerEvent","EventsService","EXPANDED_PARTICIPANT_PURPOSES","_trackedContacts","oneWay","_handleContactChanged","interactionModel","participantsToExpand","_loop","_ret","currParticipant","rawParticipant","_getContact","delegateYield","generalMessage","errorData","getCanonicalExternalContact","_arguments2","getCanonicalContactSync","contactId","addContactChangeListenersForInteraction","ModelBuilder","prevRaw","currInteraction","prevInteraction","previousContactId","removeContactChangeListener","addContactChangeListener","removeContactChangeListenersForInteraction","contactData","cause","validateDonutPermission","createContactPojo","_watchContactForChanges","contactCallbackData","_updateTrackedContactsAndTopics","_unwatchContactForChanges","unRegisterPriorityTopic","_invokeCallbacks","trackedContactIds","trackedContacts","_trackedContacts$obje","trackedIds","staleContact","staleCanonicalId","freshContact","freshCanonicalId","freshCanonicalContact","eventData","_callbacks","flatMap","_ref6","initialized","_favorites","favoritePromise","loadFavoritesForSessionPerson","initFavorites","getFavorites","peopleAndGroups","_handleHiddenGroups","favoriteStatus","favoriteEntity","unfavoriteEntity","loadedIds","_payload","_feature","urlPath","presignedUrl","presignedUrlResponse","ownerType","ownerId","greetingType","faxUploadWithHeaders","isFullScreen","handleFullScreenChange","fullScreen","webkitIsFullScreen","mozFullScreen","msFullscreenElement","endFullScreen","startFullScreen","requestingElem","messengerElement","orgspanApp","appendTo","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","geoUtil","isEnabled","isSwitchedOn","intervalReference","isStarted","setContext","_lastReport","lastReport","isGeolocationAvailable","_desktopStart","prefs","requestDesktopPromise","cmd","permission_geolocation","t1","_reportCurrentPosition","resultPosition","fetchCurrentPostion","refreshPublicApiUser","_isPrimary","_onPositionSaved","_onErrorSavingPosition","changeCount","roleWithDivisions","incrementChangeCount","_headset","_iframeState","newRelicNamespace","presencePollIntervalSec","presenceIntervalTimers","presenceErrors","presencePollInterval","reducePresencePolling","getFeatureToggle","useIntegrationPresenceDirectorySearch","alreadyTriggeredPresenceInterval","triggerPresenceInterval","presenceUpdateInterval","pollingEnabled","_managePolling","removeAllPresenceIntervals","pollIntervalSec","presenceTimer","_handlePresenceInterval","hasSession","intervals","timerKey","removePresenceInterval","updateSessionData","sessionData","fetchedSession","currentDate","filteredUsers","integrationUsers","integrationUsersIds","batchedIds","authError","_isPresenceStale","_handleBatchPresenceRequest","_handleAuthError","idParams","ucIntegrationId","requestLatest","presenceUserList","presenceResponse","_handleIndividualPresenceResponse","hasShownError","groupedUsers","presenceSources","_groupUsersByIntegration","presenceSource","phoneIntegration","usersGroupedByIntegration","integrationKey","integrationConfig","getIntegration","sendNewRelicAction","diffInMS","_isGCOffline","_entityPresence","_interval","addServerPrefix","safeString","rtlLangs","INTL_LANGUAGES","localeCookieOptions","expires","IntlService","loadedPromise","baseLocale","supportedLocales","_window$navigator","userLanguage","navLocale","isRTL","intlTelInputGlobals","getCountryData","isoRegionalLocale","_this$get$split","_this$get$split2","noEscape","_initialLocale","authLocale","_normalizeLocale","localeRootFallback","rootLocale","getWithServerKey","replacements","suppressError","_missingMessage","locales","validLocales","l","setPreferredLanguage","safeLocale","dynamicCookieOptions","domain","getEnvCookieDomain","secure","_shouldSendSameSiteNone","isSameSiteNoneCompatible","sameSite","isLocale12Hour","_loadedResolve","loadLanguage","translations","cached","setupServerTranslations","defaultRequest","localeRequest","defaultTranslationsResult","localeTranslationsResult","defaultTranslations","localeTranslations","server_translations","currProvider","INTERNAL_VIDEO_PROVIDER_ID","defaultVideoProviders","activeProvider","getProvider","usingVideoProvider","zoomMeetingsEnabled","teamsEnabled","handleLogout","blockLogoutCb","providerName","userHasVideoMediaProviders","computedFromConfig","hasEmberTether","hasLiquidWormhole","hasLiquidTether","destinationElementId","MomentService","defaultFormat","_getNamePart","namePart","_getNames","familyName","givenName","_this$_getNames","givenNameInitial","familyNameInitial","_this$_getNames2","optionalMiddleName","_notificationId","_actionHandles","_clickHandlers","nextNotificationId","currentNotificationId","_cleanUpHandlers","handles","clickHandlers","generatedIdentifier","clickHandlerFunction","handlers","_this$get2","_this$get3","dismiss","_notification","fetchOrgSettings","orgSettings","freeSeating","popoutAuthForIframes","isPermissionInList","targetList","inList","listItems","checkDonutPermission","permissionValue","allowedOrgPermissions","targetDivision","isAllowed","permissionsToValidate","targetDomain","targetEntity","targetAction","domainPermissionMap","isAllowedOrgPermission","actionSet","matchesEntity","matchesAction","matchesDivision","shouldAllowBasedOnDivision","rolePermissions","trusteeOrg","directoryPermissions","donutPermissions","validateAllPermissions","permissionsList","validateAnyPermissions","permissionsSet","hasDirectoryPermissions","hasDonutPermission","canDeleteGroups","canViewQueue","canViewQueueObservations","canViewAcdScreenShare","canViewAcdCoBrowseForCall","canViewAcdCoBrowseForChat","canViewBusinessChat","canViewCollaborateVideo","hasVoicemailAccess","canViewAnAgentsSchedule","hasAgentSupervisorAccess","hasExternalContactsViewContactAccess","legacyUnifiedCommunicationsPermission","canCall","conferenceEnabled","canCallForward","canRecord","isBusinessUserOrSupervisor","hasEngageAccess","hasContactCenter","canViewUsers","canViewGroups","canDeleteParticipantFromGroup","canViewZoomMeetings","canViewTeamsMeetings","canTargetUserSearchOutsideOfDivision","canTargetQueueSearchOutsideOfDivision","canViewIntegrationPresence","canViewUCIntegrations","canViewSummary","GENESYS_SEARCH_TAB","integrations","allApps","_isValidIntegrationTab","onAuthenticated","_fetchConfigs","configs","getIntegrationTabs","canViewThirdPartyPresence","getIntegrationFromSource","getIntegrationTransferTarget","addressObj","allConfigsPromise","_accumulateConfigs","configsUrl","_configs","validConfigObjs","_isValidIntegrationConfig","_mapIntegrationConfig","i10n","badgeIcons","light","dark","clientApp","hasUcIntegrationKey","permissionService","canViewPbxTab","AcdUtilitiesMixin","ActiveCallMixin","CallControlsMixin","CallForwardMixin","ConversationManagerMixin","EventsMixin","PhoneNotificationsMixin","StationMixin","UriBuilderMixin","_processingChain","_initializeProcessingChain","_process2","_process","interactionProcessingChain","QueuedProcessingChain","lifecycleContainer","setProcessingChain","process","eventSource","_getCallState","shouldUpdate","participantState","modelsToDestroy","buildModel","contactObserver","rawData","_onMyConversationEvent","enqueueEvent","_onPigeonConnect","fetchActiveCallConversations","convAPIVersion","onQueue","carrierPigeonConnected","phoneDisabled","phoneDisabledMessage","audioCallCapable","hasMicrophone","stationHasPersistentConnection","persistentConnectionActive","toggleBrowserAnswer","lastConversationError","lastIndexOf","logObject","table","isInteractionViewOpen","isShowCallControlsViewOpen","showFloatingCalls","showNavbarAlert","activeAcdCallState","hasIncomingNonAcdCalls","alertingCall","isAlertingCallACD","bootstrapPurecloudApiOnAuth","delayedNotification","handleMuteParticipants","muteAudio","unmuteAudio","transferToVoicemail","selectedUserUserId","voicemailPolicy","vmAdressString","topicPriority","conversationsummary","outofoffice","eventFromTopic","priorityTopics","customTopicNames","registerTopicsDebouncePeriod","prioritizedTopics","sortedTopics","topicA","topicB","getTopicPriority","priorities","publicApiUser","subscribeUrl","customName","customNames","registerTopic","unshiftObject","unRegisterTopic","_observeTopics","topicKeepAlive","triggerTopicEvent","eventName","carrierPigeonTopic","_emberCopy","topicName","namespaces","syncEnabled","deferredPersistRequests","settingsPath","registerNamespaces","localforage","storeName","getItem","_initializeNamespace","ready","_waitForAccessToken","_enableService","_disableService","_getPreference","persist","_setPreference","namespaceDelimiter","previousSet","setting","setItem","currentNamespaceObject","pendingSet","_safeSet","enableServicePromise","_isNotDead","_enableSync","settingsUrl","preferencesToSync","_saveSettingsFromServer","profileSyncSupport","userPreferences","allLocalPreferences","eventMap","trackedGuids","integrationpresence","events","subscribeToMyself","subscribeToConnection","_getPresenceDefinition","getPresence","getPresenceDefinition","testValue","_getTopicsForUser","_guidFromTopicName","StreamingService","streamingEvent","refreshPeopleActivityState","watchAuthForSubscribe","bulkSubscribeToPresence","callbackKey","previousCallback","newCallback","_alertDeletedPresence","removeDeletedPresence","changeRoutingStatus","doUserPresenceStatusChanged","statusUpdate","isSourceOnUsableList","existingPresenceIndex","existingPresenceObj","presenceListStored","doUserPrimaryPresenceSourceChanged","newSource","isThirdPartySource","handleIntegrationPresenceEvent","presenceEvent","startOfTime","rightAboutMeow","handleRoutingStatusError","conversationSummaryEvent","outOfOfficeEvent","outOfOfficeDef","routingStatusEvent","primaryPresenceEvent","geolocationEvent","_mapping","presenceDefinitions","outOfBandPresenceDefinitions","allPresences","secondary","allActivePresences","primaryPresences","secondaryPresences","allSecondaryPresences","secondaryPresenceDefinitions","loadPresences","definitions","loadAllPresenceDefinitions","definitionIds","currentId","loadPresenceDefinitions","handlePresenceData","presenceTimeout","testing","localizePresenceString","online","not_responding","meal","training","break","getPresenceMappings","presenceString","mapPresence","rawPresence","mapHasPresence","mapHasSystemPresence","getPresenceFallback","_intl","formatPresenceLanguageLabelLocale","languageLabel","presenceDef","_restoreState","inLogoutBounce","_isInLogoutBounce","_clearLogoutTime","baseLocation","searchString","internalRoute","prunedStateParamValue","firstChar","s3SafePathname","parsedStateParam","finalSearch","finalHash","cookieOptions","lastLogout","DEFAULT_ROUTE_MAP","relate-engine","organizations","VERIFICATION_RELEVANT_DATA_MESSAGE","command","adapterCache","isRelateActive","navigationRoute","navTree","helpURL","relateFrameOrigin","profileVerificationEventName","showProfileEventName","contactAssociationMap","contactDisassociationMap","registerSidebarState","getEngineHelp","contextHelpUrls","handleNavigation","navEvent","handleRedirect","propertyWillChange","propertyDidChange","registerNavEntries","navEntries","associateConversationWithInteraction","profileVerified","verificationInteractionData","displayNotification","shouldNotify","processFrameVerificationEvent","closeRelateFrame","isClosedInteraction","relateIframe","postVerificationRelevantDataV2","associatedContacts","hasActiveAssociation","verified","wasAutoVerified","verificationRelevantData","isVerified","activeProfileIsVerified","queryData","siz","errorType","interactionEnded","BrowserScreenRecordingError","ScreenMediaService","_getHostedContext","_isHosted","_stream","_track$getSettings","screens","metadatas","screen","_track","_debugScreenRecordingInBrowser","screenId","originX","originY","resolutionX","resolutionY","getShareableScreens","createMediaStream","getVideoTrackForScreenId","shareid","createTrackMetadata","attemptsRemaining","getHostedScreenMedia","screenInfo","isWindows","main","isMain","_scrollActivity","EsaSessionService","featureService","dataStore","roleNames","readWritePermissionsDeferred","enabledFeatures","products","authInProgress","logoutInProgress","singleSignOutInProgress","blockers","_timeAuthenticated","hasAppAccess","hasDirectoryUserViewPermission","perm","hasTrusteeAccess","hasDivision","hasDivisions","regEx","isPermission","isPermissionWithDivisions","permissionDivisions","foundPermission","useEmailDraftEvent","rewriteRootAPIRequests","createFieldConfigs","_Object$values","createPresences","loadAllowedOrgPermissions","loadOrgProducts","getOrganizationTranscriptSettings","transcriptSettings","settingsUri","forceDirectory","bootstrapStartTime","performance","_serialProcessingChain","executeChain","stepDesc","getFeatures","processSync","setThemeCookie","trusteeBootstrap","establishSession","setupCarrierPigeon","updateAppSession","hasAssistantsQueueViewPermission","loggingConfig","logMsgPrefix","bootstrapDuration","isChainStepFailure","origReason","legacyErrorCode","telemetryContext","loggableRequestFailureDetails","_request","getLoggableRequestFailureDetails","requestFailureDetails","setServerTimeOffset","setupStoreData","serverError","onLegacySessionInvalidation","LOGOUT_PROMISE_PROP_NAME","logoutPromise","addRemoveBlockers","blocker","proxyLogin","retrieveProxyLoginInfo","isFeatureEnabled","featureName","redirect","cookieProxyPerson","shouldReload","superPerson","hashIndex","forceUpdate","localFeatures","featureToggles","serverDate","t2","t3","clientSystemTimeSuspect","serverTimet1","clientTimet3","clientTimet0","offsetCalculated","subscription","xhrFields","withCredentials","baseExpands","resetPassword","newPassword","resetToken","currentPassword","oldPassword","verifyPassword","publicApiUserObserver","_setupSessionInvalidationFailed","_forwardSessionInvalidationFailedEvent","_teardownSessionInvalidationFailed","_isDesktop","_isDesktopUnifiedPreferences","supportsUnifiedPreferences","canShowChatPreference","canShowAgentGreeting","canShowGeneralPreference","canShowPasswordPreference","canShowNotificationsPreference","isIE","isDesktop","isUnified","canShowVoiceMailPinPreference","canShowDirectRoutingPreference","_commonPreferenceComponents","theme","direct_routing","agent_greeting","commonPreferences","components","canShow","getThemeList","commonPreferencesSortOrder","customPreferences","addPreference","existingPreference","newPreference","removePreference","otherPreferences","canOpenPreference","preferenceKey","openChatPreference","openGeneralPreference","openLanguagePreference","openNotificationsPreference","openPasswordPreference","openSoundPreference","openVideoPreference","openVoiceMailPinPreference","getUserVoicemailEmailNotification","_yield$_this2$get$aja","setUserVoicemailEmailNotification","_sound","GLOBAL_ERROR","SILENCED_ERRORS","statusText","lengthInUtf8Bytes","MAX_INTERNAL_LOG_ITEMS","internalLogs","logCounts","failureCount","_originalLogger","ExponentialIntervalGenerator","LOG_LEVELS","bindLogMethods","resetLogLimit","loggingOptions","serverLevel","localLevel","propertyToMatch","bufferLog","getOriginalLogger","restrictedTypeConverter","stack","currentRoute","timeSinceLogin","fullTypeConverter","createTrace","logItem","itemToLog","_restrictTraceData","clientTime","clientSessionId","allowedKeys","_itemToLog","keyFilter","_objects","extractRawData","maxDepth","_augmentSensitiveData","finalLogItem","wrappedSensitive","checkItemsAgainstOptions","logOption","itemsToLog","defaultAnswer","itemLogIndex","logResult","_len","_key","checkForSilence","SILENCED","silencedByStringMatch","silencedByRegex","silencedByMatcher","skipSumoSend","serverLogLevelIndex","logServer","logLocal","trace","shiftObject","decreaseLogLimit","currentLimit","maxTracesByteLength","getTracesToLog","logs","toLog","totalLogSize","logSize","saveLogs","_saveLogsTask","toSend","sendLogTraces","_resetLogsOnSuccessfulSave","fail","keepLatest","maxConcurrency","backOffTask","getInterval","batches","ApplicationStore","Store","GroupStoreMixin","SearchStoreMixin","applicationAdapter","promiseLabel","personResult","groupResult","latestCalls","batchLimit","batch","successfulRequests","failedRequests","mapLimit","bulkResults","didSaveRecord","internalModel","recordInfo","isSaving","updateGroup","connection","connectedV2","v2Deferred","v2Promise","connectionPromise","_textMeasurer","_userActivity","_userIdle","_jabraChrome","_jabraNative","_plantronics","_sennheiser","eventTypes","UserIdleService","IDLE_TIMEOUT","activeEvents","setListening","enableEvent","disableEvent","pendingSessions","conversationsToAutoAnswer","_instrumentSdkUsage","sdkFunction","pageActionName","_startParams","_devices","_volume","ensureVideoPermissions","ensureAudioPermissions","_params","rejectPendingSession","findRemainingSessionsBasedOnParams","_conversationId","_sessionType","endSession","_endSessionParams","_muteOptions","_heldOptions","getAllActiveSessions","defaultGeneralSettings","ringtoneSelection","advancedMicSettings","autoGain","noiseSuppression","defaultDirectorySettings","alwaysPopoutVideo","userSettingsPromise","failedSettingsFetch","_fetchSettingsPromise","_updatePromise","_fetchSettings","_checkAndFixSettings","_updateSettings","reallyWaitForToken","forceRefresh","retryOnFail","_settings","existingPromise","_this5$get","generalSettings","settingPath","pieces","topLevelKey","piece","_handleSettingsChanged","updatedSettings","_webrtc","BaseStore","LocalStorageStore","storageKey","currEnvDetails","storeProps","_xSelect","Transform","deserialize","deserialized","_json","_object","_maybe","_pigeon","assertNever","actionName","contactJSON","derived","hasMultipleCustomers","isCallOrCallback","communications","customerEndTime","lastParticipantEndTime","callsError","interactionMetadata","metadataClone","__interaction_metadata__","ALERTING","CONNECTING","CONTACTING","DIALING","OFFERING","TRANSMITTING","CHAT","EMAIL","VOICE","ABANDONED","ACW","ANSWERED","CUSTOMERS_WAITING","HANDLE","HELD","INTERACTING","IVR","OFFERED","OVERSLA","SERVICE_LEVEL","SERVICE_TARGET","TALK","TIME_IN_STATUS","TRANSFERRED","WAIT_TIME","ACTIVE_MEMBERS","queryParamSegments","keyValuePair","queryParamString","urlParams","interactionDetailPath","adminAgentSegment","_buildAppProviderComputed","providerConfig","_Ember","validProviders","validProvider","boolExpr","oldProvider","providerInstance","_booleanExpressions","buildSymbolMap","ft","keyName","evaluateProviderExpression","_buildProviderConfig","providerConfigMap","_boonJs","getEvaluator","currDependencies","_curr$value$split","_curr$value$split2","valueTag","portToValidate","defaultPort","portInt","isTrusted","renderedInstance","appDef","trustedDataPassing","isVisible","userVisible","_serviceDiscoveryWebInternal","isKnown","validationChecks","invalidReason","invalidReasons","validations","_validations","validation","validationConfig","SDK_REPO_URL","LOG_STANDALONE_APP_NAMESPACE","LOG_INTERAPPTIONS_NAMESPACE","LOG_ROOT_NAMESPACE","LOG_API_NAMESPACE","subNamespaces","currNamespace","_len2","_key2","_len3","_key3","buildStashLoggerDetails","logDetails","_objectSpread","remote","mask","buildViewId","isAppDefV2","isAppContext","buildV1IconAsset","asset","fromEntries","decorative","buildV2IconAsset","RASTER_PROP_PATTERN","rasterEntries","currProp","currRasterProp","currRasterValue","_images$","rej","symbolEvaluator","symbolMap","identifiers","currIdentifier","variable","nsSymbolEvaluator","expressionBuilder","_browser","_codeUtils","parseFloat","userUri","_debugBackburner","_debugRsvp","_displayGeolocation","API_ERROR_MESSAGES","messageType","smiles","defaultSkinTone","lightSkinTone","mediumLightSkinTone","mediumSkinTone","mediumDarkSkinTone","darkSkinTone","nature","objects","places","symbols","escapedString","k","isHTMLSafe","theString","HTMLChars","char","literal_string","maxInterval","baselineInterval","_failures","_baselineInterval","_maxAdditionalInterval","expInterval","generatedMaxInterval","KNOWN_INBOUND_MESSAGE_SUBTYPES","getMessengerType","messengerType","messagingChannelType","messagingChannelTypes","mct","isNewId","getIdsFromExternalContact","freshContactSnapshot","channelRecord","_getChannelRecordInfo","interactionChannel","getInteractionChannel","getMessageChannelType","interactionChannelProperties","idAttribute","idOrIDs","getChannelRecordInfo","CHANNEL_MODEL_TYPE","numberOfChanges","idPropertyName","setNewValuesInChannelRecord","channelRecordData","messagingChannelTypeFor","modelProperties","getIdFrom","contactChannelIds","notExcluded","CHANNEL_RECORD_PROPERTIES","updateChannelInfoPrompt","updateChannelInfoPromptPlural","updateAllChannelInfoPrompt","newChannelPrompt","pleaseWaitForFullContactInfo","propertyChanged","IDS","getIdentifier","getReverseWhitepagesLookupValue","getDisplayableName","displayOrScreenName","getDisplayOrScreenName","contactChannelIdValues","interactionIdValues","addedIds","newIdValues","idVal","addOrReplaceIdsInChannelRecord","acdHybridToastNoActiveQueue","acdSecurePause","acdTransferPermissions","ACT-1205","AGORA-137_connections-ui-contentsquare","ATLAS-536_EnableContentSquare","auraACWGadgets","comui-disable-legacy-api-url","conversationSummary3256","digitalFirstPURE2942","EC-760","enableUIAjaxRetryHeader","epcDecompPresenceLabel","gcucc-ui-PCUCC-3734","gcucc.ui.useIntegrationPresenceSourceDirectorySearch","groupProileNoIndividualsSave","hawkClientScreenShare","interactionNameQueueCallingQueue","notificationOutputPicker","PAUI-80.PeopleUiDecomposition","playRecordingFromSelectedOutput","PURE-3256_useConversationDetails","PURE-5421_CannedResponse_Gadget","PURE-6186_Scripter_Gadget_GCUI","PURE-7064_search_favorites","PURE3301-dynamicGroups","qm.release.evaluation.assignee","qm.release.evaluation.disputes","relateDynamicSchema","showVideoInThumbnail","webrtcClientNetworkProbeAutoAdjust","webrtcDefaultDeviceProfile","webrtcDisableDeviceProfileNotifications","webrtcMMSDnsCheck","webrtcTrackBasedActions","webUiDarkTheme","_isSafeToFocus","currentSelectedElement","isSafe","GeolocationUtil","requiresNativeGeolocation","getCurrentPosition","watchPosition","onPositionChangedFn","onErrorFn","clearWatch","watcher","failure","Giphy","apiKey","api_key","rating","gsm7Chars","gsm7CharsExt","_applicationHasFocus","_hostType","_operatingSystem","_version","_hostRegion","_supportsRegions","_supportsUnifiedPreferences","_supportsJabra","_additionalPreferences","_requiresNativeGeolocation","previousPresence","isScreenLockedOrSleep","hasUserAlreadyReturn","desktopSleptAt","isHostedProp","getRegion","supportsRegions","supportsJabra","isMac","getAdditionalPreferences","doTerminateApplication","completion","_HostedContextFunctions","doesAppHaveFocus","showNativeNotification","setUnreadMessageCount","sendJabraEventToDesktop","deviceID","JABRA_EVENT","requestJabraDevices","getScreenMedia","matchedRegion","sCmd","cefQuery","persistent","onFailure","FILE_SIZE","MESSAGE_TYPE","CHARACTER_LIMIT","WHITE_SPACE_KEYCODES","TAB","ENTER","SPACE","WHITE_SPACE_KEYS","CAP_ALPHA_KEYCODES","LOW_ALPHA_KEYCODES","NUM_KEYCODES","NAV_KEYCODES","LEFT_ARROW","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","keyForKeyCode","isAlphabet","isWhitespace","isEscape","isTab","fromCharCode","isApplicationRoute","defaultRender","md","renderer","link_open","renderToken","targetIndex","attrIndex","attrGet","isMailTo","attrPush","attrSet","markdown","render","hljs","configure","markdownit","linkify","typographer","highlightAuto","layoutId","LAYOUTS","getRawAddress","_externalContactMessaging","getNameFrom","getModelProperties","idProperties","getDisplayablePhoneNumberFrom","INTERNATIONAL","_getChannelPropertiesFromInteraction","channelType","displayableName","twitterHandle","getChannelPropertiesFromExternalContact","getChannelPropertiesFromInteraction","present","hasCrucialChannelInfo","displayNameFrom","getTwitterDisplayNameFrom","svgIconKey","scopedId","nestedIdProperty","oldIdValue","newIdValue","initialsSupported","OnlyLatinChars","VALID_LOCAL_HOSTNAMES","ENV_TRANSITIONS","prod","DEPLOYMENT_ID_MAP","prod-apne1","prod-apne2","prod-aps1","prod-apse2","prod-cac1","prod-euc1","prod-euw1","prod-euw2","prod-usw2","REGION_TRANSLATION_KEY_MAP","getEnv","getDeploymentId","getRegionTranslationKey","getDesktopId","serviceDiscovery","getEnvironments","translationKey","envStatus","STABLE_PUBLIC_ENVS","parseRuntimeFromLocalPath","parseDeployedRuntime","_window","newrelic","actionNameType","attrType","reservedKeys","attrKey","keyType","persistType","ALLOWED_VALUE_TYPES","safeOptions","MAX_SAFE_INTEGER","excludeUnderscoreKeys","excludeEmberServices","excludeEmberApplications","valueFilter","inputType","myTypeOf","_extractRawDataHelper","contextStack","currStackItem","currLevel","currItem","currIndex","currStack","buildNewContextStack","customJsonValue","propertyName","wrappedJsonError","baseError","newStackItem","PHONE_NUMBER_REGEX","proxy","tap","MSG_NAMESPACE","_defaultLabel","_chain","_processingQueueMap","_buildErrorMessage","isValidProcessor","appendToChain","processor","_isLifecycleValid","workQueue","unshift","_checkForWork","emptyQueueIds","currQueueId","currQueue","activeWorkItem","_processEventThroughChain","_buildLoggerMessage","chainLabel","chainIndex","_chainHelper","processorResult","processorResultType","processorLabel","_safeLabel","AdapterError","adapterError","payloadDetails","statusInt","isUuid","getLoggableRequestFailureDetailsPartial","getAdapterErrorLoggableDetails","getAjaxErrorLoggableDetails","rawErrorResponse","UUID_REGEXP","_routingStatus","isSyncPromiseChainStep","chainLength","currChainStep","stepIndex","stepProgress","logPayload","SimpleCache","ttlMinutes","expirationTime","cachedItem","setupRecorder","clearStream","audioContext","suspend","mimeType","isTypeSupported","blobURL","getBlobUrl","loadEncoder","encoderPath","resume","_streamReady","_stoppedRecording","_onDataAvailable","initStream","resumeRecording","pauseRecording","createHowlFromBlob","blobUrl","_loadSoundRecorder","_loadWorker","getScript","currentTheme","_cookie$split","_cookie$split2","DEFAULT_THEME","_ref3$theme","THEME_CLASSES","LIGHT","_ref3$duration","_ref3$path","_ref3$protocol","_getCurrProtocol","_ref3$domain","_ref3$setCookie","setCookie","_setCookie","_ref3$userAgent","_getCurrUserAgent","cookieStmt","DARK","BASE","BASE_THEME_LIST","extraThemes","_ref2$theme","_ref2$element","NATIVE_PANELS","deprecatedConversationSummaryPanelIds","currPanelId","CONVERSATION_DETAILS_GADGET_PANEL_ID","WRAPUP_GADGET_PANEL_ID","transformationMaps","shouldTransformPanelSetting","panelSetting","transformPanelSetting","shouldTransformAppDefId","appDefId","addNativeProvider","transformAppDefId","dependentFeatureToggles","reverseDetails","reverseNotes","reverseWrapup","reverseResponses","reverseScheduleCallback","scripts","transformationDependentFeatureToggles","buildTransformationFtComputedDepKey","injectionPrefix","standardTransformationFtComputedDepKey","requiredTransform","srcNativePanelMatch","findNativePanel","toSearch","nativePanel","currNativePanel","includedNativeProvider","TtlCache","defaultTtl","normalizeTtl","cacheData","tearingDown","expiryCheck","_this$cacheData$key","ttl","currTimeMillis","effectiveTtl","expirationTimestamp","scheduleEviction","_this$cacheData$key2","removedExpirationTimestamp","nextExpirationTimestamp","clearEvictionTimer","timerRef","requestedTimestamp","getEarliestExpirationTimestamp","evictExpiredItems","cacheEntry","earliestExpiration","haystack","needle","_haystack","paramReplace","getAppsDownloadUri","downloadId","_uuidGenerator","_videoFrameChecker","_alias","_belongsTo","_collection","_confirmation","_date","_dependent","_dsError","_exclusion","_format","_hasMany","_inclusion","_length","_messages","_number","_videoParticipantV","_videoParticipant","templateName","_webrtcConversation","runningTests","@purecloud/ember-purecloud-components","@purecloud/ember-softphone-integration","ar","da","de","en-us","es","fi","fr-ca","fr","he","hi","it","ja","ko","nl","pl","pt-br","pt-pt","ru","sv","tr","uk","zh-cn","zh-tw"],"mappings":"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OAAOA;;AC3BX,MAAuB,CACnB44N,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ1sQ,OAAQ,CACJ2sQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;ACvgCR,MAAuB,CACnBptQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,IACA,MAEJitQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;ACxnBR,MAAuB,CACnBV,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ1sQ,OAAQ,CACJ2sQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,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AhzL,EAAA5gG,SAAQxJ,EAAK,CAAEujB,KAAAA,IAAQ3W,MAAK,SAAAmhB,GAAG,OAAIA,GAAOA,EAAIxK,gDAI9C,IAAI45Q,EAAM;;AClCzB,MAmIe,CAAEI,UAnIC,CACd,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAIwBC,aAFP,CAAC,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK;;ACpHrE,IAAIj6I,EAAgB15H,MAAM5oB,OAAOyoB,OAAOG,MAAM8uI,QAAS,CACnDr5H,mBAAoBzV,MAAMC,OAAOC,QAAQ,eACzCH,OAAQC,MAAMC,OAAOC,QAAQ,gBAC7B6nN,sBAAuB,KAEvB6rD,sBAAsB,EACtBC,UAAW,KACXC,iBAAkB,GAClBC,SAAU,YAEVC,YAAa,KACbC,kBAAkB,EAClBC,6BAA6B,EAC7BC,gBAAgB,EAChBC,uBAAwB,GACxBC,4BAA4B,EAC5Bh9D,kBAAkB,EAClBi9D,iBAAkB,KAClBC,uBAAuB,EACvBC,sBAAsB,EACtBC,eAAgB,KAEhB1kQ,KAAM,WACFnjC,KAAK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","file":"connections-ui.js","sourcesContent":["\"use strict\";\n\n\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.adapter = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n  return {\n    inboundrtp: 'inbound-rtp',\n    outboundrtp: 'outbound-rtp',\n    candidatepair: 'candidate-pair',\n    localcandidate: 'local-candidate',\n    remotecandidate: 'remote-candidate'\n  }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    var trackId = transceiver.rtpSender._initialTrackId ||\n        transceiver.rtpSender.track.id;\n    transceiver.rtpSender._initialTrackId = trackId;\n    // spec.\n    var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n        trackId + '\\r\\n';\n    sdp += 'a=' + msid;\n    // for Chrome. Legacy should no longer be required.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n\n    // RTX\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n  var commonCapabilities = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: []\n  };\n\n  var findCodecByPayloadType = function(pt, codecs) {\n    pt = parseInt(pt, 10);\n    for (var i = 0; i < codecs.length; i++) {\n      if (codecs[i].payloadType === pt ||\n          codecs[i].preferredPayloadType === pt) {\n        return codecs[i];\n      }\n    }\n  };\n\n  var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n    var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n    var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n    return lCodec && rCodec &&\n        lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n  };\n\n  localCapabilities.codecs.forEach(function(lCodec) {\n    for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n      var rCodec = remoteCapabilities.codecs[i];\n      if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n          lCodec.clockRate === rCodec.clockRate) {\n        if (lCodec.name.toLowerCase() === 'rtx' &&\n            lCodec.parameters && rCodec.parameters.apt) {\n          // for RTX we need to find the local rtx that has a apt\n          // which points to the same local codec as the remote one.\n          if (!rtxCapabilityMatches(lCodec, rCodec,\n              localCapabilities.codecs, remoteCapabilities.codecs)) {\n            continue;\n          }\n        }\n        rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n        // number of channels is the highest common number of channels\n        rCodec.numChannels = Math.min(lCodec.numChannels,\n            rCodec.numChannels);\n        // push rCodec so we reply with offerer payload type\n        commonCapabilities.codecs.push(rCodec);\n\n        // determine common feedback mechanisms\n        rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n          for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n            if (lCodec.rtcpFeedback[j].type === fb.type &&\n                lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n              return true;\n            }\n          }\n          return false;\n        });\n        // FIXME: also need to determine .parameters\n        //  see https://github.com/openpeer/ortc/issues/569\n        break;\n      }\n    }\n  });\n\n  localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n    for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n         i++) {\n      var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n      if (lHeaderExtension.uri === rHeaderExtension.uri) {\n        commonCapabilities.headerExtensions.push(rHeaderExtension);\n        break;\n      }\n    }\n  });\n\n  // FIXME: fecMechanisms\n  return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n  return {\n    offer: {\n      setLocalDescription: ['stable', 'have-local-offer'],\n      setRemoteDescription: ['stable', 'have-remote-offer']\n    },\n    answer: {\n      setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n      setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n    }\n  }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n  // Edge's internal representation adds some fields therefore\n  // not all fieldѕ are taken into account.\n  var alreadyAdded = iceTransport.getRemoteCandidates()\n      .find(function(remoteCandidate) {\n        return candidate.foundation === remoteCandidate.foundation &&\n            candidate.ip === remoteCandidate.ip &&\n            candidate.port === remoteCandidate.port &&\n            candidate.priority === remoteCandidate.priority &&\n            candidate.protocol === remoteCandidate.protocol &&\n            candidate.type === remoteCandidate.type;\n      });\n  if (!alreadyAdded) {\n    iceTransport.addRemoteCandidate(candidate);\n  }\n  return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n  var e = new Error(description);\n  e.name = name;\n  // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n  e.code = {\n    NotSupportedError: 9,\n    InvalidStateError: 11,\n    InvalidAccessError: 15,\n    TypeError: undefined,\n    OperationError: undefined\n  }[name];\n  return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n  // https://w3c.github.io/mediacapture-main/#mediastream\n  // Helper function to add the track to the stream and\n  // dispatch the event ourselves.\n  function addTrackToStreamAndFireEvent(track, stream) {\n    stream.addTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n        {track: track}));\n  }\n\n  function removeTrackFromStreamAndFireEvent(track, stream) {\n    stream.removeTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n        {track: track}));\n  }\n\n  function fireAddTrack(pc, track, receiver, streams) {\n    var trackEvent = new Event('track');\n    trackEvent.track = track;\n    trackEvent.receiver = receiver;\n    trackEvent.transceiver = {receiver: receiver};\n    trackEvent.streams = streams;\n    window.setTimeout(function() {\n      pc._dispatchEvent('track', trackEvent);\n    });\n  }\n\n  var RTCPeerConnection = function(config) {\n    var pc = this;\n\n    var _eventTarget = document.createDocumentFragment();\n    ['addEventListener', 'removeEventListener', 'dispatchEvent']\n        .forEach(function(method) {\n          pc[method] = _eventTarget[method].bind(_eventTarget);\n        });\n\n    this.canTrickleIceCandidates = null;\n\n    this.needNegotiation = false;\n\n    this.localStreams = [];\n    this.remoteStreams = [];\n\n    this._localDescription = null;\n    this._remoteDescription = null;\n\n    this.signalingState = 'stable';\n    this.iceConnectionState = 'new';\n    this.connectionState = 'new';\n    this.iceGatheringState = 'new';\n\n    config = JSON.parse(JSON.stringify(config || {}));\n\n    this.usingBundle = config.bundlePolicy === 'max-bundle';\n    if (config.rtcpMuxPolicy === 'negotiate') {\n      throw(makeError('NotSupportedError',\n          'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n    } else if (!config.rtcpMuxPolicy) {\n      config.rtcpMuxPolicy = 'require';\n    }\n\n    switch (config.iceTransportPolicy) {\n      case 'all':\n      case 'relay':\n        break;\n      default:\n        config.iceTransportPolicy = 'all';\n        break;\n    }\n\n    switch (config.bundlePolicy) {\n      case 'balanced':\n      case 'max-compat':\n      case 'max-bundle':\n        break;\n      default:\n        config.bundlePolicy = 'balanced';\n        break;\n    }\n\n    config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n    this._iceGatherers = [];\n    if (config.iceCandidatePoolSize) {\n      for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n        this._iceGatherers.push(new window.RTCIceGatherer({\n          iceServers: config.iceServers,\n          gatherPolicy: config.iceTransportPolicy\n        }));\n      }\n    } else {\n      config.iceCandidatePoolSize = 0;\n    }\n\n    this._config = config;\n\n    // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n    // everything that is needed to describe a SDP m-line.\n    this.transceivers = [];\n\n    this._sdpSessionId = SDPUtils.generateSessionId();\n    this._sdpSessionVersion = 0;\n\n    this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n    this._isClosed = false;\n  };\n\n  Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n    configurable: true,\n    get: function() {\n      return this._localDescription;\n    }\n  });\n  Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n    configurable: true,\n    get: function() {\n      return this._remoteDescription;\n    }\n  });\n\n  // set up event handlers on prototype\n  RTCPeerConnection.prototype.onicecandidate = null;\n  RTCPeerConnection.prototype.onaddstream = null;\n  RTCPeerConnection.prototype.ontrack = null;\n  RTCPeerConnection.prototype.onremovestream = null;\n  RTCPeerConnection.prototype.onsignalingstatechange = null;\n  RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n  RTCPeerConnection.prototype.onconnectionstatechange = null;\n  RTCPeerConnection.prototype.onicegatheringstatechange = null;\n  RTCPeerConnection.prototype.onnegotiationneeded = null;\n  RTCPeerConnection.prototype.ondatachannel = null;\n\n  RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n    if (this._isClosed) {\n      return;\n    }\n    this.dispatchEvent(event);\n    if (typeof this['on' + name] === 'function') {\n      this['on' + name](event);\n    }\n  };\n\n  RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n    var event = new Event('icegatheringstatechange');\n    this._dispatchEvent('icegatheringstatechange', event);\n  };\n\n  RTCPeerConnection.prototype.getConfiguration = function() {\n    return this._config;\n  };\n\n  RTCPeerConnection.prototype.getLocalStreams = function() {\n    return this.localStreams;\n  };\n\n  RTCPeerConnection.prototype.getRemoteStreams = function() {\n    return this.remoteStreams;\n  };\n\n  // internal helper to create a transceiver object.\n  // (which is not yet the same as the WebRTC 1.0 transceiver)\n  RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n    var hasBundleTransport = this.transceivers.length > 0;\n    var transceiver = {\n      track: null,\n      iceGatherer: null,\n      iceTransport: null,\n      dtlsTransport: null,\n      localCapabilities: null,\n      remoteCapabilities: null,\n      rtpSender: null,\n      rtpReceiver: null,\n      kind: kind,\n      mid: null,\n      sendEncodingParameters: null,\n      recvEncodingParameters: null,\n      stream: null,\n      associatedRemoteMediaStreams: [],\n      wantReceive: true\n    };\n    if (this.usingBundle && hasBundleTransport) {\n      transceiver.iceTransport = this.transceivers[0].iceTransport;\n      transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n    } else {\n      var transports = this._createIceAndDtlsTransports();\n      transceiver.iceTransport = transports.iceTransport;\n      transceiver.dtlsTransport = transports.dtlsTransport;\n    }\n    if (!doNotAdd) {\n      this.transceivers.push(transceiver);\n    }\n    return transceiver;\n  };\n\n  RTCPeerConnection.prototype.addTrack = function(track, stream) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call addTrack on a closed peerconnection.');\n    }\n\n    var alreadyExists = this.transceivers.find(function(s) {\n      return s.track === track;\n    });\n\n    if (alreadyExists) {\n      throw makeError('InvalidAccessError', 'Track already exists.');\n    }\n\n    var transceiver;\n    for (var i = 0; i < this.transceivers.length; i++) {\n      if (!this.transceivers[i].track &&\n          this.transceivers[i].kind === track.kind) {\n        transceiver = this.transceivers[i];\n      }\n    }\n    if (!transceiver) {\n      transceiver = this._createTransceiver(track.kind);\n    }\n\n    this._maybeFireNegotiationNeeded();\n\n    if (this.localStreams.indexOf(stream) === -1) {\n      this.localStreams.push(stream);\n    }\n\n    transceiver.track = track;\n    transceiver.stream = stream;\n    transceiver.rtpSender = new window.RTCRtpSender(track,\n        transceiver.dtlsTransport);\n    return transceiver.rtpSender;\n  };\n\n  RTCPeerConnection.prototype.addStream = function(stream) {\n    var pc = this;\n    if (edgeVersion >= 15025) {\n      stream.getTracks().forEach(function(track) {\n        pc.addTrack(track, stream);\n      });\n    } else {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      // Fixed in 15025 (or earlier)\n      var clonedStream = stream.clone();\n      stream.getTracks().forEach(function(track, idx) {\n        var clonedTrack = clonedStream.getTracks()[idx];\n        track.addEventListener('enabled', function(event) {\n          clonedTrack.enabled = event.enabled;\n        });\n      });\n      clonedStream.getTracks().forEach(function(track) {\n        pc.addTrack(track, clonedStream);\n      });\n    }\n  };\n\n  RTCPeerConnection.prototype.removeTrack = function(sender) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call removeTrack on a closed peerconnection.');\n    }\n\n    if (!(sender instanceof window.RTCRtpSender)) {\n      throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n          'does not implement interface RTCRtpSender.');\n    }\n\n    var transceiver = this.transceivers.find(function(t) {\n      return t.rtpSender === sender;\n    });\n\n    if (!transceiver) {\n      throw makeError('InvalidAccessError',\n          'Sender was not created by this connection.');\n    }\n    var stream = transceiver.stream;\n\n    transceiver.rtpSender.stop();\n    transceiver.rtpSender = null;\n    transceiver.track = null;\n    transceiver.stream = null;\n\n    // remove the stream from the set of local streams\n    var localStreams = this.transceivers.map(function(t) {\n      return t.stream;\n    });\n    if (localStreams.indexOf(stream) === -1 &&\n        this.localStreams.indexOf(stream) > -1) {\n      this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n    }\n\n    this._maybeFireNegotiationNeeded();\n  };\n\n  RTCPeerConnection.prototype.removeStream = function(stream) {\n    var pc = this;\n    stream.getTracks().forEach(function(track) {\n      var sender = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (sender) {\n        pc.removeTrack(sender);\n      }\n    });\n  };\n\n  RTCPeerConnection.prototype.getSenders = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpSender;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpSender;\n    });\n  };\n\n  RTCPeerConnection.prototype.getReceivers = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpReceiver;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpReceiver;\n    });\n  };\n\n\n  RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n      usingBundle) {\n    var pc = this;\n    if (usingBundle && sdpMLineIndex > 0) {\n      return this.transceivers[0].iceGatherer;\n    } else if (this._iceGatherers.length) {\n      return this._iceGatherers.shift();\n    }\n    var iceGatherer = new window.RTCIceGatherer({\n      iceServers: this._config.iceServers,\n      gatherPolicy: this._config.iceTransportPolicy\n    });\n    Object.defineProperty(iceGatherer, 'state',\n        {value: 'new', writable: true}\n    );\n\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n    this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n      var end = !event.candidate || Object.keys(event.candidate).length === 0;\n      // polyfill since RTCIceGatherer.state is not implemented in\n      // Edge 10547 yet.\n      iceGatherer.state = end ? 'completed' : 'gathering';\n      if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n        pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n      }\n    };\n    iceGatherer.addEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    return iceGatherer;\n  };\n\n  // start gathering from an RTCIceGatherer.\n  RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n    var pc = this;\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer.onlocalcandidate) {\n      return;\n    }\n    var bufferedCandidateEvents =\n      this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n    iceGatherer.removeEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    iceGatherer.onlocalcandidate = function(evt) {\n      if (pc.usingBundle && sdpMLineIndex > 0) {\n        // if we know that we use bundle we can drop candidates with\n        // ѕdpMLineIndex > 0. If we don't do this then our state gets\n        // confused since we dispose the extra ice gatherer.\n        return;\n      }\n      var event = new Event('icecandidate');\n      event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n      var cand = evt.candidate;\n      // Edge emits an empty object for RTCIceCandidateComplete‥\n      var end = !cand || Object.keys(cand).length === 0;\n      if (end) {\n        // polyfill since RTCIceGatherer.state is not implemented in\n        // Edge 10547 yet.\n        if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n          iceGatherer.state = 'completed';\n        }\n      } else {\n        if (iceGatherer.state === 'new') {\n          iceGatherer.state = 'gathering';\n        }\n        // RTCIceCandidate doesn't have a component, needs to be added\n        cand.component = 1;\n        // also the usernameFragment. TODO: update SDP to take both variants.\n        cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n        var serializedCandidate = SDPUtils.writeCandidate(cand);\n        event.candidate = Object.assign(event.candidate,\n            SDPUtils.parseCandidate(serializedCandidate));\n\n        event.candidate.candidate = serializedCandidate;\n        event.candidate.toJSON = function() {\n          return {\n            candidate: event.candidate.candidate,\n            sdpMid: event.candidate.sdpMid,\n            sdpMLineIndex: event.candidate.sdpMLineIndex,\n            usernameFragment: event.candidate.usernameFragment\n          };\n        };\n      }\n\n      // update local description.\n      var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n      if (!end) {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=' + event.candidate.candidate + '\\r\\n';\n      } else {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=end-of-candidates\\r\\n';\n      }\n      pc._localDescription.sdp =\n          SDPUtils.getDescription(pc._localDescription.sdp) +\n          sections.join('');\n      var complete = pc.transceivers.every(function(transceiver) {\n        return transceiver.iceGatherer &&\n            transceiver.iceGatherer.state === 'completed';\n      });\n\n      if (pc.iceGatheringState !== 'gathering') {\n        pc.iceGatheringState = 'gathering';\n        pc._emitGatheringStateChange();\n      }\n\n      // Emit candidate. Also emit null candidate when all gatherers are\n      // complete.\n      if (!end) {\n        pc._dispatchEvent('icecandidate', event);\n      }\n      if (complete) {\n        pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n        pc.iceGatheringState = 'complete';\n        pc._emitGatheringStateChange();\n      }\n    };\n\n    // emit already gathered candidates.\n    window.setTimeout(function() {\n      bufferedCandidateEvents.forEach(function(e) {\n        iceGatherer.onlocalcandidate(e);\n      });\n    }, 0);\n  };\n\n  // Create ICE transport and DTLS transport.\n  RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n    var pc = this;\n    var iceTransport = new window.RTCIceTransport(null);\n    iceTransport.onicestatechange = function() {\n      pc._updateIceConnectionState();\n      pc._updateConnectionState();\n    };\n\n    var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n    dtlsTransport.ondtlsstatechange = function() {\n      pc._updateConnectionState();\n    };\n    dtlsTransport.onerror = function() {\n      // onerror does not set state to failed by itself.\n      Object.defineProperty(dtlsTransport, 'state',\n          {value: 'failed', writable: true});\n      pc._updateConnectionState();\n    };\n\n    return {\n      iceTransport: iceTransport,\n      dtlsTransport: dtlsTransport\n    };\n  };\n\n  // Destroy ICE gatherer, ICE transport and DTLS transport.\n  // Without triggering the callbacks.\n  RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n      sdpMLineIndex) {\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer) {\n      delete iceGatherer.onlocalcandidate;\n      delete this.transceivers[sdpMLineIndex].iceGatherer;\n    }\n    var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n    if (iceTransport) {\n      delete iceTransport.onicestatechange;\n      delete this.transceivers[sdpMLineIndex].iceTransport;\n    }\n    var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n    if (dtlsTransport) {\n      delete dtlsTransport.ondtlsstatechange;\n      delete dtlsTransport.onerror;\n      delete this.transceivers[sdpMLineIndex].dtlsTransport;\n    }\n  };\n\n  // Start the RTP Sender and Receiver for a transceiver.\n  RTCPeerConnection.prototype._transceive = function(transceiver,\n      send, recv) {\n    var params = getCommonCapabilities(transceiver.localCapabilities,\n        transceiver.remoteCapabilities);\n    if (send && transceiver.rtpSender) {\n      params.encodings = transceiver.sendEncodingParameters;\n      params.rtcp = {\n        cname: SDPUtils.localCName,\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.recvEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpSender.send(params);\n    }\n    if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n      // remove RTX field in Edge 14942\n      if (transceiver.kind === 'video'\n          && transceiver.recvEncodingParameters\n          && edgeVersion < 15019) {\n        transceiver.recvEncodingParameters.forEach(function(p) {\n          delete p.rtx;\n        });\n      }\n      if (transceiver.recvEncodingParameters.length) {\n        params.encodings = transceiver.recvEncodingParameters;\n      } else {\n        params.encodings = [{}];\n      }\n      params.rtcp = {\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.rtcpParameters.cname) {\n        params.rtcp.cname = transceiver.rtcpParameters.cname;\n      }\n      if (transceiver.sendEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpReceiver.receive(params);\n    }\n  };\n\n  RTCPeerConnection.prototype.setLocalDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setLocalDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set local ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var sections;\n    var sessionpart;\n    if (description.type === 'offer') {\n      // VERY limited support for SDP munging. Limited to:\n      // * changing the order of codecs\n      sections = SDPUtils.splitSections(description.sdp);\n      sessionpart = sections.shift();\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var caps = SDPUtils.parseRtpParameters(mediaSection);\n        pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n      });\n\n      pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n        pc._gather(transceiver.mid, sdpMLineIndex);\n      });\n    } else if (description.type === 'answer') {\n      sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n      sessionpart = sections.shift();\n      var isIceLite = SDPUtils.matchPrefix(sessionpart,\n          'a=ice-lite').length > 0;\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        var iceGatherer = transceiver.iceGatherer;\n        var iceTransport = transceiver.iceTransport;\n        var dtlsTransport = transceiver.dtlsTransport;\n        var localCapabilities = transceiver.localCapabilities;\n        var remoteCapabilities = transceiver.remoteCapabilities;\n\n        // treat bundle-only as not-rejected.\n        var rejected = SDPUtils.isRejected(mediaSection) &&\n            SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n        if (!rejected && !transceiver.rejected) {\n          var remoteIceParameters = SDPUtils.getIceParameters(\n              mediaSection, sessionpart);\n          var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n              mediaSection, sessionpart);\n          if (isIceLite) {\n            remoteDtlsParameters.role = 'server';\n          }\n\n          if (!pc.usingBundle || sdpMLineIndex === 0) {\n            pc._gather(transceiver.mid, sdpMLineIndex);\n            if (iceTransport.state === 'new') {\n              iceTransport.start(iceGatherer, remoteIceParameters,\n                  isIceLite ? 'controlling' : 'controlled');\n            }\n            if (dtlsTransport.state === 'new') {\n              dtlsTransport.start(remoteDtlsParameters);\n            }\n          }\n\n          // Calculate intersection of capabilities.\n          var params = getCommonCapabilities(localCapabilities,\n              remoteCapabilities);\n\n          // Start the RTCRtpSender. The RTCRtpReceiver for this\n          // transceiver has already been started in setRemoteDescription.\n          pc._transceive(transceiver,\n              params.codecs.length > 0,\n              false);\n        }\n      });\n    }\n\n    pc._localDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-local-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setRemoteDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set remote ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var streams = {};\n    pc.remoteStreams.forEach(function(stream) {\n      streams[stream.id] = stream;\n    });\n    var receiverList = [];\n    var sections = SDPUtils.splitSections(description.sdp);\n    var sessionpart = sections.shift();\n    var isIceLite = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-lite').length > 0;\n    var usingBundle = SDPUtils.matchPrefix(sessionpart,\n        'a=group:BUNDLE ').length > 0;\n    pc.usingBundle = usingBundle;\n    var iceOptions = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-options:')[0];\n    if (iceOptions) {\n      pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n          .indexOf('trickle') >= 0;\n    } else {\n      pc.canTrickleIceCandidates = false;\n    }\n\n    sections.forEach(function(mediaSection, sdpMLineIndex) {\n      var lines = SDPUtils.splitLines(mediaSection);\n      var kind = SDPUtils.getKind(mediaSection);\n      // treat bundle-only as not-rejected.\n      var rejected = SDPUtils.isRejected(mediaSection) &&\n          SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n      var protocol = lines[0].substr(2).split(' ')[2];\n\n      var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n      var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n      var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n      // Reject datachannels which are not implemented yet.\n      if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n          protocol === 'UDP/DTLS/SCTP'))) {\n        // TODO: this is dangerous in the case where a non-rejected m-line\n        //     becomes rejected.\n        pc.transceivers[sdpMLineIndex] = {\n          mid: mid,\n          kind: kind,\n          protocol: protocol,\n          rejected: true\n        };\n        return;\n      }\n\n      if (!rejected && pc.transceivers[sdpMLineIndex] &&\n          pc.transceivers[sdpMLineIndex].rejected) {\n        // recycle a rejected transceiver.\n        pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n      }\n\n      var transceiver;\n      var iceGatherer;\n      var iceTransport;\n      var dtlsTransport;\n      var rtpReceiver;\n      var sendEncodingParameters;\n      var recvEncodingParameters;\n      var localCapabilities;\n\n      var track;\n      // FIXME: ensure the mediaSection has rtcp-mux set.\n      var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n      var remoteIceParameters;\n      var remoteDtlsParameters;\n      if (!rejected) {\n        remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters.role = 'client';\n      }\n      recvEncodingParameters =\n          SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n      var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n      var isComplete = SDPUtils.matchPrefix(mediaSection,\n          'a=end-of-candidates', sessionpart).length > 0;\n      var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n          .map(function(cand) {\n            return SDPUtils.parseCandidate(cand);\n          })\n          .filter(function(cand) {\n            return cand.component === 1;\n          });\n\n      // Check if we can use BUNDLE and dispose transports.\n      if ((description.type === 'offer' || description.type === 'answer') &&\n          !rejected && usingBundle && sdpMLineIndex > 0 &&\n          pc.transceivers[sdpMLineIndex]) {\n        pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n        pc.transceivers[sdpMLineIndex].iceGatherer =\n            pc.transceivers[0].iceGatherer;\n        pc.transceivers[sdpMLineIndex].iceTransport =\n            pc.transceivers[0].iceTransport;\n        pc.transceivers[sdpMLineIndex].dtlsTransport =\n            pc.transceivers[0].dtlsTransport;\n        if (pc.transceivers[sdpMLineIndex].rtpSender) {\n          pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n        if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n          pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n      }\n      if (description.type === 'offer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex] ||\n            pc._createTransceiver(kind);\n        transceiver.mid = mid;\n\n        if (!transceiver.iceGatherer) {\n          transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n              usingBundle);\n        }\n\n        if (cands.length && transceiver.iceTransport.state === 'new') {\n          if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n            transceiver.iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n        // filter RTX until additional stuff needed for RTX is implemented\n        // in adapter.js\n        if (edgeVersion < 15019) {\n          localCapabilities.codecs = localCapabilities.codecs.filter(\n              function(codec) {\n                return codec.name !== 'rtx';\n              });\n        }\n\n        sendEncodingParameters = transceiver.sendEncodingParameters || [{\n          ssrc: (2 * sdpMLineIndex + 2) * 1001\n        }];\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        var isNewTrack = false;\n        if (direction === 'sendrecv' || direction === 'sendonly') {\n          isNewTrack = !transceiver.rtpReceiver;\n          rtpReceiver = transceiver.rtpReceiver ||\n              new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n          if (isNewTrack) {\n            var stream;\n            track = rtpReceiver.track;\n            // FIXME: does not work with Plan B.\n            if (remoteMsid && remoteMsid.stream === '-') {\n              // no-op. a stream id of '-' means: no associated stream.\n            } else if (remoteMsid) {\n              if (!streams[remoteMsid.stream]) {\n                streams[remoteMsid.stream] = new window.MediaStream();\n                Object.defineProperty(streams[remoteMsid.stream], 'id', {\n                  get: function() {\n                    return remoteMsid.stream;\n                  }\n                });\n              }\n              Object.defineProperty(track, 'id', {\n                get: function() {\n                  return remoteMsid.track;\n                }\n              });\n              stream = streams[remoteMsid.stream];\n            } else {\n              if (!streams.default) {\n                streams.default = new window.MediaStream();\n              }\n              stream = streams.default;\n            }\n            if (stream) {\n              addTrackToStreamAndFireEvent(track, stream);\n              transceiver.associatedRemoteMediaStreams.push(stream);\n            }\n            receiverList.push([track, rtpReceiver, stream]);\n          }\n        } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n          transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n            var nativeTrack = s.getTracks().find(function(t) {\n              return t.id === transceiver.rtpReceiver.track.id;\n            });\n            if (nativeTrack) {\n              removeTrackFromStreamAndFireEvent(nativeTrack, s);\n            }\n          });\n          transceiver.associatedRemoteMediaStreams = [];\n        }\n\n        transceiver.localCapabilities = localCapabilities;\n        transceiver.remoteCapabilities = remoteCapabilities;\n        transceiver.rtpReceiver = rtpReceiver;\n        transceiver.rtcpParameters = rtcpParameters;\n        transceiver.sendEncodingParameters = sendEncodingParameters;\n        transceiver.recvEncodingParameters = recvEncodingParameters;\n\n        // Start the RTCRtpReceiver now. The RTPSender is started in\n        // setLocalDescription.\n        pc._transceive(pc.transceivers[sdpMLineIndex],\n            false,\n            isNewTrack);\n      } else if (description.type === 'answer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex];\n        iceGatherer = transceiver.iceGatherer;\n        iceTransport = transceiver.iceTransport;\n        dtlsTransport = transceiver.dtlsTransport;\n        rtpReceiver = transceiver.rtpReceiver;\n        sendEncodingParameters = transceiver.sendEncodingParameters;\n        localCapabilities = transceiver.localCapabilities;\n\n        pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n            recvEncodingParameters;\n        pc.transceivers[sdpMLineIndex].remoteCapabilities =\n            remoteCapabilities;\n        pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n        if (cands.length && iceTransport.state === 'new') {\n          if ((isIceLite || isComplete) &&\n              (!usingBundle || sdpMLineIndex === 0)) {\n            iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        if (!usingBundle || sdpMLineIndex === 0) {\n          if (iceTransport.state === 'new') {\n            iceTransport.start(iceGatherer, remoteIceParameters,\n                'controlling');\n          }\n          if (dtlsTransport.state === 'new') {\n            dtlsTransport.start(remoteDtlsParameters);\n          }\n        }\n\n        // If the offer contained RTX but the answer did not,\n        // remove RTX from sendEncodingParameters.\n        var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n        var hasRtx = commonCapabilities.codecs.filter(function(c) {\n          return c.name.toLowerCase() === 'rtx';\n        }).length;\n        if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n          delete transceiver.sendEncodingParameters[0].rtx;\n        }\n\n        pc._transceive(transceiver,\n            direction === 'sendrecv' || direction === 'recvonly',\n            direction === 'sendrecv' || direction === 'sendonly');\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        if (rtpReceiver &&\n            (direction === 'sendrecv' || direction === 'sendonly')) {\n          track = rtpReceiver.track;\n          if (remoteMsid) {\n            if (!streams[remoteMsid.stream]) {\n              streams[remoteMsid.stream] = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n            receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n          } else {\n            if (!streams.default) {\n              streams.default = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams.default);\n            receiverList.push([track, rtpReceiver, streams.default]);\n          }\n        } else {\n          // FIXME: actually the receiver should be created later.\n          delete transceiver.rtpReceiver;\n        }\n      }\n    });\n\n    if (pc._dtlsRole === undefined) {\n      pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n    }\n\n    pc._remoteDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-remote-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n    Object.keys(streams).forEach(function(sid) {\n      var stream = streams[sid];\n      if (stream.getTracks().length) {\n        if (pc.remoteStreams.indexOf(stream) === -1) {\n          pc.remoteStreams.push(stream);\n          var event = new Event('addstream');\n          event.stream = stream;\n          window.setTimeout(function() {\n            pc._dispatchEvent('addstream', event);\n          });\n        }\n\n        receiverList.forEach(function(item) {\n          var track = item[0];\n          var receiver = item[1];\n          if (stream.id !== item[2].id) {\n            return;\n          }\n          fireAddTrack(pc, track, receiver, [stream]);\n        });\n      }\n    });\n    receiverList.forEach(function(item) {\n      if (item[2]) {\n        return;\n      }\n      fireAddTrack(pc, item[0], item[1], []);\n    });\n\n    // check whether addIceCandidate({}) was called within four seconds after\n    // setRemoteDescription.\n    window.setTimeout(function() {\n      if (!(pc && pc.transceivers)) {\n        return;\n      }\n      pc.transceivers.forEach(function(transceiver) {\n        if (transceiver.iceTransport &&\n            transceiver.iceTransport.state === 'new' &&\n            transceiver.iceTransport.getRemoteCandidates().length > 0) {\n          console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n              'an end-of-candidates notification');\n          transceiver.iceTransport.addRemoteCandidate({});\n        }\n      });\n    }, 4000);\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.close = function() {\n    this.transceivers.forEach(function(transceiver) {\n      /* not yet\n      if (transceiver.iceGatherer) {\n        transceiver.iceGatherer.close();\n      }\n      */\n      if (transceiver.iceTransport) {\n        transceiver.iceTransport.stop();\n      }\n      if (transceiver.dtlsTransport) {\n        transceiver.dtlsTransport.stop();\n      }\n      if (transceiver.rtpSender) {\n        transceiver.rtpSender.stop();\n      }\n      if (transceiver.rtpReceiver) {\n        transceiver.rtpReceiver.stop();\n      }\n    });\n    // FIXME: clean up tracks, local streams, remote streams, etc\n    this._isClosed = true;\n    this._updateSignalingState('closed');\n  };\n\n  // Update the signaling state.\n  RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n    this.signalingState = newState;\n    var event = new Event('signalingstatechange');\n    this._dispatchEvent('signalingstatechange', event);\n  };\n\n  // Determine whether to fire the negotiationneeded event.\n  RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n    var pc = this;\n    if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n      return;\n    }\n    this.needNegotiation = true;\n    window.setTimeout(function() {\n      if (pc.needNegotiation) {\n        pc.needNegotiation = false;\n        var event = new Event('negotiationneeded');\n        pc._dispatchEvent('negotiationneeded', event);\n      }\n    }, 0);\n  };\n\n  // Update the ice connection state.\n  RTCPeerConnection.prototype._updateIceConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      checking: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n    });\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.checking > 0) {\n      newState = 'checking';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    } else if (states.completed > 0) {\n      newState = 'completed';\n    }\n\n    if (newState !== this.iceConnectionState) {\n      this.iceConnectionState = newState;\n      var event = new Event('iceconnectionstatechange');\n      this._dispatchEvent('iceconnectionstatechange', event);\n    }\n  };\n\n  // Update the connection state.\n  RTCPeerConnection.prototype._updateConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      connecting: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n      states[transceiver.dtlsTransport.state]++;\n    });\n    // ICETransport.completed and connected are the same for this purpose.\n    states.connected += states.completed;\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.connecting > 0) {\n      newState = 'connecting';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    }\n\n    if (newState !== this.connectionState) {\n      this.connectionState = newState;\n      var event = new Event('connectionstatechange');\n      this._dispatchEvent('connectionstatechange', event);\n    }\n  };\n\n  RTCPeerConnection.prototype.createOffer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createOffer after close'));\n    }\n\n    var numAudioTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'audio';\n    }).length;\n    var numVideoTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'video';\n    }).length;\n\n    // Determine number of audio and video tracks we need to send/recv.\n    var offerOptions = arguments[0];\n    if (offerOptions) {\n      // Reject Chrome legacy constraints.\n      if (offerOptions.mandatory || offerOptions.optional) {\n        throw new TypeError(\n            'Legacy mandatory/optional constraints not supported.');\n      }\n      if (offerOptions.offerToReceiveAudio !== undefined) {\n        if (offerOptions.offerToReceiveAudio === true) {\n          numAudioTracks = 1;\n        } else if (offerOptions.offerToReceiveAudio === false) {\n          numAudioTracks = 0;\n        } else {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n      }\n      if (offerOptions.offerToReceiveVideo !== undefined) {\n        if (offerOptions.offerToReceiveVideo === true) {\n          numVideoTracks = 1;\n        } else if (offerOptions.offerToReceiveVideo === false) {\n          numVideoTracks = 0;\n        } else {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n    }\n\n    pc.transceivers.forEach(function(transceiver) {\n      if (transceiver.kind === 'audio') {\n        numAudioTracks--;\n        if (numAudioTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      } else if (transceiver.kind === 'video') {\n        numVideoTracks--;\n        if (numVideoTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      }\n    });\n\n    // Create M-lines for recvonly streams.\n    while (numAudioTracks > 0 || numVideoTracks > 0) {\n      if (numAudioTracks > 0) {\n        pc._createTransceiver('audio');\n        numAudioTracks--;\n      }\n      if (numVideoTracks > 0) {\n        pc._createTransceiver('video');\n        numVideoTracks--;\n      }\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      // For each track, create an ice gatherer, ice transport,\n      // dtls transport, potentially rtpsender and rtpreceiver.\n      var track = transceiver.track;\n      var kind = transceiver.kind;\n      var mid = transceiver.mid || SDPUtils.generateIdentifier();\n      transceiver.mid = mid;\n\n      if (!transceiver.iceGatherer) {\n        transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n            pc.usingBundle);\n      }\n\n      var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n      // filter RTX until additional stuff needed for RTX is implemented\n      // in adapter.js\n      if (edgeVersion < 15019) {\n        localCapabilities.codecs = localCapabilities.codecs.filter(\n            function(codec) {\n              return codec.name !== 'rtx';\n            });\n      }\n      localCapabilities.codecs.forEach(function(codec) {\n        // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n        // by adding level-asymmetry-allowed=1\n        if (codec.name === 'H264' &&\n            codec.parameters['level-asymmetry-allowed'] === undefined) {\n          codec.parameters['level-asymmetry-allowed'] = '1';\n        }\n\n        // for subsequent offers, we might have to re-use the payload\n        // type of the last offer.\n        if (transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.codecs) {\n          transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n            if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n                codec.clockRate === remoteCodec.clockRate) {\n              codec.preferredPayloadType = remoteCodec.payloadType;\n            }\n          });\n        }\n      });\n      localCapabilities.headerExtensions.forEach(function(hdrExt) {\n        var remoteExtensions = transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.headerExtensions || [];\n        remoteExtensions.forEach(function(rHdrExt) {\n          if (hdrExt.uri === rHdrExt.uri) {\n            hdrExt.id = rHdrExt.id;\n          }\n        });\n      });\n\n      // generate an ssrc now, to be used later in rtpSender.send\n      var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n        ssrc: (2 * sdpMLineIndex + 1) * 1001\n      }];\n      if (track) {\n        // add RTX\n        if (edgeVersion >= 15019 && kind === 'video' &&\n            !sendEncodingParameters[0].rtx) {\n          sendEncodingParameters[0].rtx = {\n            ssrc: sendEncodingParameters[0].ssrc + 1\n          };\n        }\n      }\n\n      if (transceiver.wantReceive) {\n        transceiver.rtpReceiver = new window.RTCRtpReceiver(\n            transceiver.dtlsTransport, kind);\n      }\n\n      transceiver.localCapabilities = localCapabilities;\n      transceiver.sendEncodingParameters = sendEncodingParameters;\n    });\n\n    // always offer BUNDLE and dispose on return if not supported.\n    if (pc._config.bundlePolicy !== 'max-compat') {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n          'offer', transceiver.stream, pc._dtlsRole);\n      sdp += 'a=rtcp-rsize\\r\\n';\n\n      if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n          (sdpMLineIndex === 0 || !pc.usingBundle)) {\n        transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n          cand.component = 1;\n          sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n        });\n\n        if (transceiver.iceGatherer.state === 'completed') {\n          sdp += 'a=end-of-candidates\\r\\n';\n        }\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'offer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.createAnswer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer after close'));\n    }\n\n    if (!(pc.signalingState === 'have-remote-offer' ||\n        pc.signalingState === 'have-local-pranswer')) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer in signalingState ' + pc.signalingState));\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    if (pc.usingBundle) {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    var mediaSectionsInOffer = SDPUtils.getMediaSections(\n        pc._remoteDescription.sdp).length;\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n        return;\n      }\n      if (transceiver.rejected) {\n        if (transceiver.kind === 'application') {\n          if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n            sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n          } else {\n            sdp += 'm=application 0 ' + transceiver.protocol +\n                ' webrtc-datachannel\\r\\n';\n          }\n        } else if (transceiver.kind === 'audio') {\n          sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n              'a=rtpmap:0 PCMU/8000\\r\\n';\n        } else if (transceiver.kind === 'video') {\n          sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n              'a=rtpmap:120 VP8/90000\\r\\n';\n        }\n        sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n            'a=inactive\\r\\n' +\n            'a=mid:' + transceiver.mid + '\\r\\n';\n        return;\n      }\n\n      // FIXME: look at direction.\n      if (transceiver.stream) {\n        var localTrack;\n        if (transceiver.kind === 'audio') {\n          localTrack = transceiver.stream.getAudioTracks()[0];\n        } else if (transceiver.kind === 'video') {\n          localTrack = transceiver.stream.getVideoTracks()[0];\n        }\n        if (localTrack) {\n          // add RTX\n          if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n              !transceiver.sendEncodingParameters[0].rtx) {\n            transceiver.sendEncodingParameters[0].rtx = {\n              ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n            };\n          }\n        }\n      }\n\n      // Calculate intersection of capabilities.\n      var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n      var hasRtx = commonCapabilities.codecs.filter(function(c) {\n        return c.name.toLowerCase() === 'rtx';\n      }).length;\n      if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n        delete transceiver.sendEncodingParameters[0].rtx;\n      }\n\n      sdp += writeMediaSection(transceiver, commonCapabilities,\n          'answer', transceiver.stream, pc._dtlsRole);\n      if (transceiver.rtcpParameters &&\n          transceiver.rtcpParameters.reducedSize) {\n        sdp += 'a=rtcp-rsize\\r\\n';\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'answer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n    var pc = this;\n    var sections;\n    if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n        candidate.sdpMid)) {\n      return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n    }\n\n    // TODO: needs to go into ops queue.\n    return new Promise(function(resolve, reject) {\n      if (!pc._remoteDescription) {\n        return reject(makeError('InvalidStateError',\n            'Can not add ICE candidate without a remote description'));\n      } else if (!candidate || candidate.candidate === '') {\n        for (var j = 0; j < pc.transceivers.length; j++) {\n          if (pc.transceivers[j].rejected) {\n            continue;\n          }\n          pc.transceivers[j].iceTransport.addRemoteCandidate({});\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[j] += 'a=end-of-candidates\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n          if (pc.usingBundle) {\n            break;\n          }\n        }\n      } else {\n        var sdpMLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < pc.transceivers.length; i++) {\n            if (pc.transceivers[i].mid === candidate.sdpMid) {\n              sdpMLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        if (transceiver) {\n          if (transceiver.rejected) {\n            return resolve();\n          }\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n            return resolve();\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component && cand.component !== 1) {\n            return resolve();\n          }\n          // when using bundle, avoid adding candidates to the wrong\n          // ice transport. And avoid adding candidates added in the SDP.\n          if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n              transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n            if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n              return reject(makeError('OperationError',\n                  'Can not add ICE candidate'));\n            }\n          }\n\n          // update the remoteDescription.\n          var candidateString = candidate.candidate.trim();\n          if (candidateString.indexOf('a=') === 0) {\n            candidateString = candidateString.substr(2);\n          }\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[sdpMLineIndex] += 'a=' +\n              (cand.type ? candidateString : 'end-of-candidates')\n              + '\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n        } else {\n          return reject(makeError('OperationError',\n              'Can not add ICE candidate'));\n        }\n      }\n      resolve();\n    });\n  };\n\n  RTCPeerConnection.prototype.getStats = function(selector) {\n    if (selector && selector instanceof window.MediaStreamTrack) {\n      var senderOrReceiver = null;\n      this.transceivers.forEach(function(transceiver) {\n        if (transceiver.rtpSender &&\n            transceiver.rtpSender.track === selector) {\n          senderOrReceiver = transceiver.rtpSender;\n        } else if (transceiver.rtpReceiver &&\n            transceiver.rtpReceiver.track === selector) {\n          senderOrReceiver = transceiver.rtpReceiver;\n        }\n      });\n      if (!senderOrReceiver) {\n        throw makeError('InvalidAccessError', 'Invalid selector.');\n      }\n      return senderOrReceiver.getStats();\n    }\n\n    var promises = [];\n    this.transceivers.forEach(function(transceiver) {\n      ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n          'dtlsTransport'].forEach(function(method) {\n            if (transceiver[method]) {\n              promises.push(transceiver[method].getStats());\n            }\n          });\n    });\n    return Promise.all(promises).then(function(allStats) {\n      var results = new Map();\n      allStats.forEach(function(stats) {\n        stats.forEach(function(stat) {\n          results.set(stat.id, stat);\n        });\n      });\n      return results;\n    });\n  };\n\n  // fix low-level stat names and return Map instead of object.\n  var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n    'RTCIceTransport', 'RTCDtlsTransport'];\n  ortcObjects.forEach(function(ortcObjectName) {\n    var obj = window[ortcObjectName];\n    if (obj && obj.prototype && obj.prototype.getStats) {\n      var nativeGetstats = obj.prototype.getStats;\n      obj.prototype.getStats = function() {\n        return nativeGetstats.apply(this)\n        .then(function(nativeStats) {\n          var mapStats = new Map();\n          Object.keys(nativeStats).forEach(function(id) {\n            nativeStats[id].type = fixStatsType(nativeStats[id]);\n            mapStats.set(id, nativeStats[id]);\n          });\n          return mapStats;\n        });\n      };\n    }\n  });\n\n  // legacy callback shims. Should be moved to adapter.js some days.\n  var methods = ['createOffer', 'createAnswer'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[0] === 'function' ||\n          typeof args[1] === 'function') { // legacy\n        return nativeMethod.apply(this, [arguments[2]])\n        .then(function(description) {\n          if (typeof args[0] === 'function') {\n            args[0].apply(null, [description]);\n          }\n        }, function(error) {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function' ||\n          typeof args[2] === 'function') { // legacy\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        }, function(error) {\n          if (typeof args[2] === 'function') {\n            args[2].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  // getStats is special. It doesn't have a spec legacy method yet we support\n  // getStats(something, cb) without error callbacks.\n  ['getStats'].forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function') {\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  return RTCPeerConnection;\n};\n\n},{\"sdp\":2}],2:[function(require,module,exports){\n /* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n  return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n  return blob.trim().split('\\n').map(function(line) {\n    return line.trim();\n  });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n  var parts = blob.split('\\nm=');\n  return parts.map(function(part, index) {\n    return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n  });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  sections.shift();\n  return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n  return SDPUtils.splitLines(blob).filter(function(line) {\n    return line.indexOf(prefix) === 0;\n  });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n  var parts;\n  // Parse both variants.\n  if (line.indexOf('a=candidate:') === 0) {\n    parts = line.substring(12).split(' ');\n  } else {\n    parts = line.substring(10).split(' ');\n  }\n\n  var candidate = {\n    foundation: parts[0],\n    component: parseInt(parts[1], 10),\n    protocol: parts[2].toLowerCase(),\n    priority: parseInt(parts[3], 10),\n    ip: parts[4],\n    address: parts[4], // address is an alias for ip.\n    port: parseInt(parts[5], 10),\n    // skip parts[6] == 'typ'\n    type: parts[7]\n  };\n\n  for (var i = 8; i < parts.length; i += 2) {\n    switch (parts[i]) {\n      case 'raddr':\n        candidate.relatedAddress = parts[i + 1];\n        break;\n      case 'rport':\n        candidate.relatedPort = parseInt(parts[i + 1], 10);\n        break;\n      case 'tcptype':\n        candidate.tcpType = parts[i + 1];\n        break;\n      case 'ufrag':\n        candidate.ufrag = parts[i + 1]; // for backward compability.\n        candidate.usernameFragment = parts[i + 1];\n        break;\n      default: // extension handling, in particular ufrag\n        candidate[parts[i]] = parts[i + 1];\n        break;\n    }\n  }\n  return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n  var sdp = [];\n  sdp.push(candidate.foundation);\n  sdp.push(candidate.component);\n  sdp.push(candidate.protocol.toUpperCase());\n  sdp.push(candidate.priority);\n  sdp.push(candidate.address || candidate.ip);\n  sdp.push(candidate.port);\n\n  var type = candidate.type;\n  sdp.push('typ');\n  sdp.push(type);\n  if (type !== 'host' && candidate.relatedAddress &&\n      candidate.relatedPort) {\n    sdp.push('raddr');\n    sdp.push(candidate.relatedAddress);\n    sdp.push('rport');\n    sdp.push(candidate.relatedPort);\n  }\n  if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n    sdp.push('tcptype');\n    sdp.push(candidate.tcpType);\n  }\n  if (candidate.usernameFragment || candidate.ufrag) {\n    sdp.push('ufrag');\n    sdp.push(candidate.usernameFragment || candidate.ufrag);\n  }\n  return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n  return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n  var parts = line.substr(9).split(' ');\n  var parsed = {\n    payloadType: parseInt(parts.shift(), 10) // was: id\n  };\n\n  parts = parts[0].split('/');\n\n  parsed.name = parts[0];\n  parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n  parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n  // legacy alias, got renamed back to channels in ORTC.\n  parsed.numChannels = parsed.channels;\n  return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  var channels = codec.channels || codec.numChannels || 1;\n  return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n      (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n  var parts = line.substr(9).split(' ');\n  return {\n    id: parseInt(parts[0], 10),\n    direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n    uri: parts[1]\n  };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n  return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n      (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n          ? '/' + headerExtension.direction\n          : '') +\n      ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n  var parsed = {};\n  var kv;\n  var parts = line.substr(line.indexOf(' ') + 1).split(';');\n  for (var j = 0; j < parts.length; j++) {\n    kv = parts[j].trim().split('=');\n    parsed[kv[0].trim()] = kv[1];\n  }\n  return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n  var line = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.parameters && Object.keys(codec.parameters).length) {\n    var params = [];\n    Object.keys(codec.parameters).forEach(function(param) {\n      if (codec.parameters[param]) {\n        params.push(param + '=' + codec.parameters[param]);\n      } else {\n        params.push(param);\n      }\n    });\n    line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n  }\n  return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n  var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n  return {\n    type: parts.shift(),\n    parameter: parts.join(' ')\n  };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n  var lines = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n    // FIXME: special handling for trr-int?\n    codec.rtcpFeedback.forEach(function(fb) {\n      lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n      (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n          '\\r\\n';\n    });\n  }\n  return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n  var sp = line.indexOf(' ');\n  var parts = {\n    ssrc: parseInt(line.substr(7, sp - 7), 10)\n  };\n  var colon = line.indexOf(':', sp);\n  if (colon > -1) {\n    parts.attribute = line.substr(sp + 1, colon - sp - 1);\n    parts.value = line.substr(colon + 1);\n  } else {\n    parts.attribute = line.substr(sp + 1);\n  }\n  return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n  var parts = line.substr(13).split(' ');\n  return {\n    semantics: parts.shift(),\n    ssrcs: parts.map(function(ssrc) {\n      return parseInt(ssrc, 10);\n    })\n  };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n  var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n  if (mid) {\n    return mid.substr(6);\n  }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n  var parts = line.substr(14).split(' ');\n  return {\n    algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n    value: parts[1]\n  };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n      'a=fingerprint:');\n  // Note: a=setup line is ignored since we use the 'auto' role.\n  // Note2: 'algorithm' is not case sensitive except in Edge.\n  return {\n    role: 'auto',\n    fingerprints: lines.map(SDPUtils.parseFingerprint)\n  };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n  var sdp = 'a=setup:' + setupType + '\\r\\n';\n  params.fingerprints.forEach(function(fp) {\n    sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n  });\n  return sdp;\n};\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  // Search in session part, too.\n  lines = lines.concat(SDPUtils.splitLines(sessionpart));\n  var iceParameters = {\n    usernameFragment: lines.filter(function(line) {\n      return line.indexOf('a=ice-ufrag:') === 0;\n    })[0].substr(12),\n    password: lines.filter(function(line) {\n      return line.indexOf('a=ice-pwd:') === 0;\n    })[0].substr(10)\n  };\n  return iceParameters;\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n  return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n      'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n  var description = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: [],\n    rtcp: []\n  };\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n    var pt = mline[i];\n    var rtpmapline = SDPUtils.matchPrefix(\n        mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n    if (rtpmapline) {\n      var codec = SDPUtils.parseRtpMap(rtpmapline);\n      var fmtps = SDPUtils.matchPrefix(\n          mediaSection, 'a=fmtp:' + pt + ' ');\n      // Only the first a=fmtp:<pt> is considered.\n      codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n      codec.rtcpFeedback = SDPUtils.matchPrefix(\n          mediaSection, 'a=rtcp-fb:' + pt + ' ')\n        .map(SDPUtils.parseRtcpFb);\n      description.codecs.push(codec);\n      // parse FEC mechanisms from rtpmap lines.\n      switch (codec.name.toUpperCase()) {\n        case 'RED':\n        case 'ULPFEC':\n          description.fecMechanisms.push(codec.name.toUpperCase());\n          break;\n        default: // only RED and ULPFEC are recognized as FEC mechanisms.\n          break;\n      }\n    }\n  }\n  SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n    description.headerExtensions.push(SDPUtils.parseExtmap(line));\n  });\n  // FIXME: parse rtcp.\n  return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n  var sdp = '';\n\n  // Build the mline.\n  sdp += 'm=' + kind + ' ';\n  sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n  sdp += ' UDP/TLS/RTP/SAVPF ';\n  sdp += caps.codecs.map(function(codec) {\n    if (codec.preferredPayloadType !== undefined) {\n      return codec.preferredPayloadType;\n    }\n    return codec.payloadType;\n  }).join(' ') + '\\r\\n';\n\n  sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n  sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n  // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n  caps.codecs.forEach(function(codec) {\n    sdp += SDPUtils.writeRtpMap(codec);\n    sdp += SDPUtils.writeFmtp(codec);\n    sdp += SDPUtils.writeRtcpFb(codec);\n  });\n  var maxptime = 0;\n  caps.codecs.forEach(function(codec) {\n    if (codec.maxptime > maxptime) {\n      maxptime = codec.maxptime;\n    }\n  });\n  if (maxptime > 0) {\n    sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n  }\n  sdp += 'a=rtcp-mux\\r\\n';\n\n  if (caps.headerExtensions) {\n    caps.headerExtensions.forEach(function(extension) {\n      sdp += SDPUtils.writeExtmap(extension);\n    });\n  }\n  // FIXME: write fecMechanisms.\n  return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n  var encodingParameters = [];\n  var description = SDPUtils.parseRtpParameters(mediaSection);\n  var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n  var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n  // filter a=ssrc:... cname:, ignore PlanB-msid\n  var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(parts) {\n    return parts.attribute === 'cname';\n  });\n  var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n  var secondarySsrc;\n\n  var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n  .map(function(line) {\n    var parts = line.substr(17).split(' ');\n    return parts.map(function(part) {\n      return parseInt(part, 10);\n    });\n  });\n  if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n    secondarySsrc = flows[0][1];\n  }\n\n  description.codecs.forEach(function(codec) {\n    if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n      var encParam = {\n        ssrc: primarySsrc,\n        codecPayloadType: parseInt(codec.parameters.apt, 10)\n      };\n      if (primarySsrc && secondarySsrc) {\n        encParam.rtx = {ssrc: secondarySsrc};\n      }\n      encodingParameters.push(encParam);\n      if (hasRed) {\n        encParam = JSON.parse(JSON.stringify(encParam));\n        encParam.fec = {\n          ssrc: primarySsrc,\n          mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n        };\n        encodingParameters.push(encParam);\n      }\n    }\n  });\n  if (encodingParameters.length === 0 && primarySsrc) {\n    encodingParameters.push({\n      ssrc: primarySsrc\n    });\n  }\n\n  // we support both b=AS and b=TIAS but interpret AS as TIAS.\n  var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n  if (bandwidth.length) {\n    if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substr(7), 10);\n    } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n      // use formula from JSEP to convert b=AS to TIAS value.\n      bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n          - (50 * 40 * 8);\n    } else {\n      bandwidth = undefined;\n    }\n    encodingParameters.forEach(function(params) {\n      params.maxBitrate = bandwidth;\n    });\n  }\n  return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n  var rtcpParameters = {};\n\n  // Gets the first SSRC. Note tha with RTX there might be multiple\n  // SSRCs.\n  var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n      .map(function(line) {\n        return SDPUtils.parseSsrcMedia(line);\n      })\n      .filter(function(obj) {\n        return obj.attribute === 'cname';\n      })[0];\n  if (remoteSsrc) {\n    rtcpParameters.cname = remoteSsrc.value;\n    rtcpParameters.ssrc = remoteSsrc.ssrc;\n  }\n\n  // Edge uses the compound attribute instead of reducedSize\n  // compound is !reducedSize\n  var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n  rtcpParameters.reducedSize = rsize.length > 0;\n  rtcpParameters.compound = rsize.length === 0;\n\n  // parses the rtcp-mux attrіbute.\n  // Note that Edge does not support unmuxed RTCP.\n  var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n  rtcpParameters.mux = mux.length > 0;\n\n  return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n  var parts;\n  var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n  if (spec.length === 1) {\n    parts = spec[0].substr(7).split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n  var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(msidParts) {\n    return msidParts.attribute === 'msid';\n  });\n  if (planB.length > 0) {\n    parts = planB[0].value.split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n  return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n  var sessionId;\n  var version = sessVer !== undefined ? sessVer : 2;\n  if (sessId) {\n    sessionId = sessId;\n  } else {\n    sessionId = SDPUtils.generateSessionId();\n  }\n  var user = sessUser || 'thisisadapterortc';\n  // FIXME: sess-id should be an NTP timestamp.\n  return 'v=0\\r\\n' +\n      'o=' + user + ' ' + sessionId + ' ' + version +\n        ' IN IP4 127.0.0.1\\r\\n' +\n      's=-\\r\\n' +\n      't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.direction) {\n    sdp += 'a=' + transceiver.direction + '\\r\\n';\n  } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    // spec.\n    var msid = 'msid:' + stream.id + ' ' +\n        transceiver.rtpSender.track.id + '\\r\\n';\n    sdp += 'a=' + msid;\n\n    // for Chrome.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n  // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n  var lines = SDPUtils.splitLines(mediaSection);\n  for (var i = 0; i < lines.length; i++) {\n    switch (lines[i]) {\n      case 'a=sendrecv':\n      case 'a=sendonly':\n      case 'a=recvonly':\n      case 'a=inactive':\n        return lines[i].substr(2);\n      default:\n        // FIXME: What should happen here?\n    }\n  }\n  if (sessionpart) {\n    return SDPUtils.getDirection(sessionpart);\n  }\n  return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n  return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var parts = lines[0].substr(2).split(' ');\n  return {\n    kind: parts[0],\n    port: parseInt(parts[1], 10),\n    protocol: parts[2],\n    fmt: parts.slice(3).join(' ')\n  };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n  var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n  var parts = line.substr(2).split(' ');\n  return {\n    username: parts[0],\n    sessionId: parts[1],\n    sessionVersion: parseInt(parts[2], 10),\n    netType: parts[3],\n    addressType: parts[4],\n    address: parts[5]\n  };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n  if (typeof blob !== 'string' || blob.length === 0) {\n    return false;\n  }\n  var lines = SDPUtils.splitLines(blob);\n  for (var i = 0; i < lines.length; i++) {\n    if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n      return false;\n    }\n    // TODO: check the modifier a bit more.\n  }\n  return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n  module.exports = SDPUtils;\n}\n\n},{}],3:[function(require,module,exports){\n(function (global){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar adapterFactory = require('./adapter_factory.js');\nmodule.exports = adapterFactory({window: global.window});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./adapter_factory.js\":4}],4:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar utils = require('./utils');\n// Shimming starts here.\nmodule.exports = function(dependencies, opts) {\n  var window = dependencies && dependencies.window;\n\n  var options = {\n    shimChrome: true,\n    shimFirefox: true,\n    shimEdge: true,\n    shimSafari: true,\n  };\n\n  for (var key in opts) {\n    if (hasOwnProperty.call(opts, key)) {\n      options[key] = opts[key];\n    }\n  }\n\n  // Utils.\n  var logging = utils.log;\n  var browserDetails = utils.detectBrowser(window);\n\n  // Uncomment the line below if you want logging to occur, including logging\n  // for the switch statement below. Can also be turned on in the browser via\n  // adapter.disableLog(false), but then logging from the switch statement below\n  // will not appear.\n  // require('./utils').disableLog(false);\n\n  // Browser shims.\n  var chromeShim = require('./chrome/chrome_shim') || null;\n  var edgeShim = require('./edge/edge_shim') || null;\n  var firefoxShim = require('./firefox/firefox_shim') || null;\n  var safariShim = require('./safari/safari_shim') || null;\n  var commonShim = require('./common_shim') || null;\n\n  // Export to the adapter global object visible in the browser.\n  var adapter = {\n    browserDetails: browserDetails,\n    commonShim: commonShim,\n    extractVersion: utils.extractVersion,\n    disableLog: utils.disableLog,\n    disableWarnings: utils.disableWarnings\n  };\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection ||\n          !options.shimChrome) {\n        logging('Chrome shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = chromeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      chromeShim.shimGetUserMedia(window);\n      chromeShim.shimMediaStream(window);\n      chromeShim.shimSourceObject(window);\n      chromeShim.shimPeerConnection(window);\n      chromeShim.shimOnTrack(window);\n      chromeShim.shimAddTrackRemoveTrack(window);\n      chromeShim.shimGetSendersWithDtmf(window);\n      chromeShim.shimSenderReceiverGetStats(window);\n      chromeShim.fixNegotiationNeeded(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n          !options.shimFirefox) {\n        logging('Firefox shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = firefoxShim;\n      commonShim.shimCreateObjectURL(window);\n\n      firefoxShim.shimGetUserMedia(window);\n      firefoxShim.shimSourceObject(window);\n      firefoxShim.shimPeerConnection(window);\n      firefoxShim.shimOnTrack(window);\n      firefoxShim.shimRemoveStream(window);\n      firefoxShim.shimSenderGetStats(window);\n      firefoxShim.shimReceiverGetStats(window);\n      firefoxShim.shimRTCDataChannel(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n        logging('MS edge shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = edgeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      edgeShim.shimGetUserMedia(window);\n      edgeShim.shimPeerConnection(window);\n      edgeShim.shimReplaceTrack(window);\n\n      // the edge shim implements the full RTCIceCandidate object.\n\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'safari':\n      if (!safariShim || !options.shimSafari) {\n        logging('Safari shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = safariShim;\n      commonShim.shimCreateObjectURL(window);\n\n      safariShim.shimRTCIceServerUrls(window);\n      safariShim.shimCreateOfferLegacy(window);\n      safariShim.shimCallbacksAPI(window);\n      safariShim.shimLocalStreamsAPI(window);\n      safariShim.shimRemoteStreamsAPI(window);\n      safariShim.shimTrackEventTransceiver(window);\n      safariShim.shimGetUserMedia(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    default:\n      logging('Unsupported browser!');\n      break;\n  }\n\n  return adapter;\n};\n\n},{\"./chrome/chrome_shim\":5,\"./common_shim\":7,\"./edge/edge_shim\":8,\"./firefox/firefox_shim\":11,\"./safari/safari_shim\":13,\"./utils\":14}],5:[function(require,module,exports){\n\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n/* iterates the stats graph recursively. */\nfunction walkStats(stats, base, resultSet) {\n  if (!base || resultSet.has(base.id)) {\n    return;\n  }\n  resultSet.set(base.id, base);\n  Object.keys(base).forEach(function(name) {\n    if (name.endsWith('Id')) {\n      walkStats(stats, stats.get(base[name]), resultSet);\n    } else if (name.endsWith('Ids')) {\n      base[name].forEach(function(id) {\n        walkStats(stats, stats.get(id), resultSet);\n      });\n    }\n  });\n}\n\n/* filter getStats for a sender/receiver track. */\nfunction filterStats(result, track, outbound) {\n  var streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n  var filteredResult = new Map();\n  if (track === null) {\n    return filteredResult;\n  }\n  var trackStats = [];\n  result.forEach(function(value) {\n    if (value.type === 'track' &&\n        value.trackIdentifier === track.id) {\n      trackStats.push(value);\n    }\n  });\n  trackStats.forEach(function(trackStat) {\n    result.forEach(function(stats) {\n      if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n        walkStats(result, stats, filteredResult);\n      }\n    });\n  });\n  return filteredResult;\n}\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimMediaStream: function(window) {\n    window.MediaStream = window.MediaStream || window.webkitMediaStream;\n  },\n\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n          }\n          this.addEventListener('track', this._ontrack = f);\n        },\n        enumerable: true,\n        configurable: true\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!pc._ontrackpoly) {\n          pc._ontrackpoly = function(e) {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', function(te) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === te.track.id;\n                });\n              } else {\n                receiver = {track: te.track};\n              }\n\n              var event = new Event('track');\n              event.track = te.track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(function(track) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === track.id;\n                });\n              } else {\n                receiver = {track: track};\n              }\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n          };\n          pc.addEventListener('addstream', pc._ontrackpoly);\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    } else {\n      // even if RTCRtpTransceiver is in window, it is only used and\n      // emitted in unified-plan. Unfortunately this means we need\n      // to unconditionally wrap the event.\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        if (!e.transceiver) {\n          Object.defineProperty(e, 'transceiver',\n            {value: {receiver: e.receiver}});\n        }\n        return e;\n      });\n    }\n  },\n\n  shimGetSendersWithDtmf: function(window) {\n    // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        !('getSenders' in window.RTCPeerConnection.prototype) &&\n        'createDTMFSender' in window.RTCPeerConnection.prototype) {\n      var shimSenderWithDtmf = function(pc, track) {\n        return {\n          track: track,\n          get dtmf() {\n            if (this._dtmf === undefined) {\n              if (track.kind === 'audio') {\n                this._dtmf = pc.createDTMFSender(track);\n              } else {\n                this._dtmf = null;\n              }\n            }\n            return this._dtmf;\n          },\n          _pc: pc\n        };\n      };\n\n      // augment addTrack when getSenders is not available.\n      if (!window.RTCPeerConnection.prototype.getSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          this._senders = this._senders || [];\n          return this._senders.slice(); // return a copy of the internal state.\n        };\n        var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n        window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n          var pc = this;\n          var sender = origAddTrack.apply(pc, arguments);\n          if (!sender) {\n            sender = shimSenderWithDtmf(pc, track);\n            pc._senders.push(sender);\n          }\n          return sender;\n        };\n\n        var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n        window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n          var pc = this;\n          origRemoveTrack.apply(pc, arguments);\n          var idx = pc._senders.indexOf(sender);\n          if (idx !== -1) {\n            pc._senders.splice(idx, 1);\n          }\n        };\n      }\n      var origAddStream = window.RTCPeerConnection.prototype.addStream;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origAddStream.apply(pc, [stream]);\n        stream.getTracks().forEach(function(track) {\n          pc._senders.push(shimSenderWithDtmf(pc, track));\n        });\n      };\n\n      var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origRemoveStream.apply(pc, [stream]);\n\n        stream.getTracks().forEach(function(track) {\n          var sender = pc._senders.find(function(s) {\n            return s.track === track;\n          });\n          if (sender) {\n            pc._senders.splice(pc._senders.indexOf(sender), 1); // remove sender\n          }\n        });\n      };\n    } else if (typeof window === 'object' && window.RTCPeerConnection &&\n               'getSenders' in window.RTCPeerConnection.prototype &&\n               'createDTMFSender' in window.RTCPeerConnection.prototype &&\n               window.RTCRtpSender &&\n               !('dtmf' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = this._pc.createDTMFSender(this.track);\n            } else {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n  },\n\n  shimSenderReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender && window.RTCRtpReceiver)) {\n      return;\n    }\n\n    // shim sender stats.\n    if (!('getStats' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      if (origGetSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          var pc = this;\n          var senders = origGetSenders.apply(pc, []);\n          senders.forEach(function(sender) {\n            sender._pc = pc;\n          });\n          return senders;\n        };\n      }\n\n      var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n      if (origAddTrack) {\n        window.RTCPeerConnection.prototype.addTrack = function() {\n          var sender = origAddTrack.apply(this, arguments);\n          sender._pc = this;\n          return sender;\n        };\n      }\n      window.RTCRtpSender.prototype.getStats = function() {\n        var sender = this;\n        return this._pc.getStats().then(function(result) {\n          /* Note: this will include stats of all senders that\n           *   send a track with the same id as sender.track as\n           *   it is not possible to identify the RTCRtpSender.\n           */\n          return filterStats(result, sender.track, true);\n        });\n      };\n    }\n\n    // shim receiver stats.\n    if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n      var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n      if (origGetReceivers) {\n        window.RTCPeerConnection.prototype.getReceivers = function() {\n          var pc = this;\n          var receivers = origGetReceivers.apply(pc, []);\n          receivers.forEach(function(receiver) {\n            receiver._pc = pc;\n          });\n          return receivers;\n        };\n      }\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        e.receiver._pc = e.srcElement;\n        return e;\n      });\n      window.RTCRtpReceiver.prototype.getStats = function() {\n        var receiver = this;\n        return this._pc.getStats().then(function(result) {\n          return filterStats(result, receiver.track, false);\n        });\n      };\n    }\n\n    if (!('getStats' in window.RTCRtpSender.prototype &&\n        'getStats' in window.RTCRtpReceiver.prototype)) {\n      return;\n    }\n\n    // shim RTCPeerConnection.getStats(track).\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function() {\n      var pc = this;\n      if (arguments.length > 0 &&\n          arguments[0] instanceof window.MediaStreamTrack) {\n        var track = arguments[0];\n        var sender;\n        var receiver;\n        var err;\n        pc.getSenders().forEach(function(s) {\n          if (s.track === track) {\n            if (sender) {\n              err = true;\n            } else {\n              sender = s;\n            }\n          }\n        });\n        pc.getReceivers().forEach(function(r) {\n          if (r.track === track) {\n            if (receiver) {\n              err = true;\n            } else {\n              receiver = r;\n            }\n          }\n          return r.track === track;\n        });\n        if (err || (sender && receiver)) {\n          return Promise.reject(new DOMException(\n            'There are more than one sender or receiver for the track.',\n            'InvalidAccessError'));\n        } else if (sender) {\n          return sender.getStats();\n        } else if (receiver) {\n          return receiver.getStats();\n        }\n        return Promise.reject(new DOMException(\n          'There is no sender or receiver for the track.',\n          'InvalidAccessError'));\n      }\n      return origGetStats.apply(pc, arguments);\n    };\n  },\n\n  shimSourceObject: function(window) {\n    var URL = window && window.URL;\n\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this._srcObject;\n          },\n          set: function(stream) {\n            var self = this;\n            // Use _srcObject as a private property for this shim\n            this._srcObject = stream;\n            if (this.src) {\n              URL.revokeObjectURL(this.src);\n            }\n\n            if (!stream) {\n              this.src = '';\n              return undefined;\n            }\n            this.src = URL.createObjectURL(stream);\n            // We need to recreate the blob url when a track is added or\n            // removed. Doing it manually since we want to avoid a recursion.\n            stream.addEventListener('addtrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n            stream.addEventListener('removetrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n          }\n        });\n      }\n    }\n  },\n\n  shimAddTrackRemoveTrackWithNative: function(window) {\n    // shim addTrack/removeTrack with native variants in order to make\n    // the interactions with legacy getLocalStreams behave as in other browsers.\n    // Keeps a mapping stream.id => [stream, rtpsenders...]\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      return Object.keys(this._shimmedLocalStreams).map(function(streamId) {\n        return pc._shimmedLocalStreams[streamId][0];\n      });\n    };\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      if (!stream) {\n        return origAddTrack.apply(this, arguments);\n      }\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      var sender = origAddTrack.apply(this, arguments);\n      if (!this._shimmedLocalStreams[stream.id]) {\n        this._shimmedLocalStreams[stream.id] = [stream, sender];\n      } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n        this._shimmedLocalStreams[stream.id].push(sender);\n      }\n      return sender;\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      var existingSenders = pc.getSenders();\n      origAddStream.apply(this, arguments);\n      var newSenders = pc.getSenders().filter(function(newSender) {\n        return existingSenders.indexOf(newSender) === -1;\n      });\n      this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      delete this._shimmedLocalStreams[stream.id];\n      return origRemoveStream.apply(this, arguments);\n    };\n\n    var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      if (sender) {\n        Object.keys(this._shimmedLocalStreams).forEach(function(streamId) {\n          var idx = pc._shimmedLocalStreams[streamId].indexOf(sender);\n          if (idx !== -1) {\n            pc._shimmedLocalStreams[streamId].splice(idx, 1);\n          }\n          if (pc._shimmedLocalStreams[streamId].length === 1) {\n            delete pc._shimmedLocalStreams[streamId];\n          }\n        });\n      }\n      return origRemoveTrack.apply(this, arguments);\n    };\n  },\n\n  shimAddTrackRemoveTrack: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n    // shim addTrack and removeTrack.\n    if (window.RTCPeerConnection.prototype.addTrack &&\n        browserDetails.version >= 65) {\n      return this.shimAddTrackRemoveTrackWithNative(window);\n    }\n\n    // also shim pc.getLocalStreams when addTrack is shimmed\n    // to return the original streams.\n    var origGetLocalStreams = window.RTCPeerConnection.prototype\n        .getLocalStreams;\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      var nativeStreams = origGetLocalStreams.apply(this);\n      pc._reverseStreams = pc._reverseStreams || {};\n      return nativeStreams.map(function(stream) {\n        return pc._reverseStreams[stream.id];\n      });\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      // Add identity mapping for consistency with addTrack.\n      // Unless this is being used with a stream from addTrack.\n      if (!pc._reverseStreams[stream.id]) {\n        var newStream = new window.MediaStream(stream.getTracks());\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        stream = newStream;\n      }\n      origAddStream.apply(pc, [stream]);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);\n      delete pc._reverseStreams[(pc._streams[stream.id] ?\n          pc._streams[stream.id].id : stream.id)];\n      delete pc._streams[stream.id];\n    };\n\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      var streams = [].slice.call(arguments, 1);\n      if (streams.length !== 1 ||\n          !streams[0].getTracks().find(function(t) {\n            return t === track;\n          })) {\n        // this is not fully correct but all we can manage without\n        // [[associated MediaStreams]] internal slot.\n        throw new DOMException(\n          'The adapter.js addTrack polyfill only supports a single ' +\n          ' stream which is associated with the specified track.',\n          'NotSupportedError');\n      }\n\n      var alreadyExists = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n            'InvalidAccessError');\n      }\n\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n      var oldStream = pc._streams[stream.id];\n      if (oldStream) {\n        // this is using odd Chrome behaviour, use with caution:\n        // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n        // Note: we rely on the high-level addTrack/dtmf shim to\n        // create the sender with a dtmf sender.\n        oldStream.addTrack(track);\n\n        // Trigger ONN async.\n        Promise.resolve().then(function() {\n          pc.dispatchEvent(new Event('negotiationneeded'));\n        });\n      } else {\n        var newStream = new window.MediaStream([track]);\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        pc.addStream(newStream);\n      }\n      return pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n    };\n\n    // replace the internal stream id with the external one and\n    // vice versa.\n    function replaceInternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n            externalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    function replaceExternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n            internalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    ['createOffer', 'createAnswer'].forEach(function(method) {\n      var nativeMethod = window.RTCPeerConnection.prototype[method];\n      window.RTCPeerConnection.prototype[method] = function() {\n        var pc = this;\n        var args = arguments;\n        var isLegacyCall = arguments.length &&\n            typeof arguments[0] === 'function';\n        if (isLegacyCall) {\n          return nativeMethod.apply(pc, [\n            function(description) {\n              var desc = replaceInternalStreamId(pc, description);\n              args[0].apply(null, [desc]);\n            },\n            function(err) {\n              if (args[1]) {\n                args[1].apply(null, err);\n              }\n            }, arguments[2]\n          ]);\n        }\n        return nativeMethod.apply(pc, arguments)\n        .then(function(description) {\n          return replaceInternalStreamId(pc, description);\n        });\n      };\n    });\n\n    var origSetLocalDescription =\n        window.RTCPeerConnection.prototype.setLocalDescription;\n    window.RTCPeerConnection.prototype.setLocalDescription = function() {\n      var pc = this;\n      if (!arguments.length || !arguments[0].type) {\n        return origSetLocalDescription.apply(pc, arguments);\n      }\n      arguments[0] = replaceExternalStreamId(pc, arguments[0]);\n      return origSetLocalDescription.apply(pc, arguments);\n    };\n\n    // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n    var origLocalDescription = Object.getOwnPropertyDescriptor(\n        window.RTCPeerConnection.prototype, 'localDescription');\n    Object.defineProperty(window.RTCPeerConnection.prototype,\n        'localDescription', {\n          get: function() {\n            var pc = this;\n            var description = origLocalDescription.get.apply(this);\n            if (description.type === '') {\n              return description;\n            }\n            return replaceInternalStreamId(pc, description);\n          }\n        });\n\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      // We can not yet check for sender instanceof RTCRtpSender\n      // since we shim RTPSender. So we check if sender._pc is set.\n      if (!sender._pc) {\n        throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n            'does not implement interface RTCRtpSender.', 'TypeError');\n      }\n      var isLocal = sender._pc === pc;\n      if (!isLocal) {\n        throw new DOMException('Sender was not created by this connection.',\n            'InvalidAccessError');\n      }\n\n      // Search for the native stream the senders track belongs to.\n      pc._streams = pc._streams || {};\n      var stream;\n      Object.keys(pc._streams).forEach(function(streamid) {\n        var hasTrack = pc._streams[streamid].getTracks().find(function(track) {\n          return sender.track === track;\n        });\n        if (hasTrack) {\n          stream = pc._streams[streamid];\n        }\n      });\n\n      if (stream) {\n        if (stream.getTracks().length === 1) {\n          // if this is the last track of the stream, remove the stream. This\n          // takes care of any shimmed _senders.\n          pc.removeStream(pc._reverseStreams[stream.id]);\n        } else {\n          // relying on the same odd chrome behaviour as above.\n          stream.removeTrack(sender.track);\n        }\n        pc.dispatchEvent(new Event('negotiationneeded'));\n      }\n    };\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        // Translate iceTransportPolicy to iceTransports,\n        // see https://code.google.com/p/webrtc/issues/detail?id=4869\n        // this was fixed in M56 along with unprefixing RTCPeerConnection.\n        logging('PeerConnection');\n        if (pcConfig && pcConfig.iceTransportPolicy) {\n          pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n        }\n\n        return new window.webkitRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.webkitRTCPeerConnection.prototype;\n      // wrap static methods. Currently just generateCertificate.\n      if (window.webkitRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.webkitRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n    }\n\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(selector,\n        successCallback, errorCallback) {\n      var pc = this;\n      var args = arguments;\n\n      // If selector is a function then we are in the old style stats so just\n      // pass back the original getStats format to avoid breaking old users.\n      if (arguments.length > 0 && typeof selector === 'function') {\n        return origGetStats.apply(this, arguments);\n      }\n\n      // When spec-style getStats is supported, return those when called with\n      // either no arguments or the selector argument is null.\n      if (origGetStats.length === 0 && (arguments.length === 0 ||\n          typeof arguments[0] !== 'function')) {\n        return origGetStats.apply(this, []);\n      }\n\n      var fixChromeStats_ = function(response) {\n        var standardReport = {};\n        var reports = response.result();\n        reports.forEach(function(report) {\n          var standardStats = {\n            id: report.id,\n            timestamp: report.timestamp,\n            type: {\n              localcandidate: 'local-candidate',\n              remotecandidate: 'remote-candidate'\n            }[report.type] || report.type\n          };\n          report.names().forEach(function(name) {\n            standardStats[name] = report.stat(name);\n          });\n          standardReport[standardStats.id] = standardStats;\n        });\n\n        return standardReport;\n      };\n\n      // shim getStats with maplike support\n      var makeMapStats = function(stats) {\n        return new Map(Object.keys(stats).map(function(key) {\n          return [key, stats[key]];\n        }));\n      };\n\n      if (arguments.length >= 2) {\n        var successCallbackWrapper_ = function(response) {\n          args[1](makeMapStats(fixChromeStats_(response)));\n        };\n\n        return origGetStats.apply(this, [successCallbackWrapper_,\n          arguments[0]]);\n      }\n\n      // promise-support\n      return new Promise(function(resolve, reject) {\n        origGetStats.apply(pc, [\n          function(response) {\n            resolve(makeMapStats(fixChromeStats_(response)));\n          }, reject]);\n      }).then(successCallback, errorCallback);\n    };\n\n    // add promise support -- natively available in Chrome 51\n    if (browserDetails.version < 51) {\n      ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n          .forEach(function(method) {\n            var nativeMethod = window.RTCPeerConnection.prototype[method];\n            window.RTCPeerConnection.prototype[method] = function() {\n              var args = arguments;\n              var pc = this;\n              var promise = new Promise(function(resolve, reject) {\n                nativeMethod.apply(pc, [args[0], resolve, reject]);\n              });\n              if (args.length < 2) {\n                return promise;\n              }\n              return promise.then(function() {\n                args[1].apply(null, []);\n              },\n              function(err) {\n                if (args.length >= 3) {\n                  args[2].apply(null, [err]);\n                }\n              });\n            };\n          });\n    }\n\n    // promise support for createOffer and createAnswer. Available (without\n    // bugs) since M52: crbug/619289\n    if (browserDetails.version < 52) {\n      ['createOffer', 'createAnswer'].forEach(function(method) {\n        var nativeMethod = window.RTCPeerConnection.prototype[method];\n        window.RTCPeerConnection.prototype[method] = function() {\n          var pc = this;\n          if (arguments.length < 1 || (arguments.length === 1 &&\n              typeof arguments[0] === 'object')) {\n            var opts = arguments.length === 1 ? arguments[0] : undefined;\n            return new Promise(function(resolve, reject) {\n              nativeMethod.apply(pc, [resolve, reject, opts]);\n            });\n          }\n          return nativeMethod.apply(this, arguments);\n        };\n      });\n    }\n\n    // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n  },\n\n  fixNegotiationNeeded: function(window) {\n    utils.wrapPeerConnectionEvent(window, 'negotiationneeded', function(e) {\n      var pc = e.target;\n      if (pc.signalingState !== 'stable') {\n        return;\n      }\n      return e;\n    });\n  },\n\n  shimGetDisplayMedia: function(window, getSourceId) {\n    if ('getDisplayMedia' in window.navigator) {\n      return;\n    }\n    // getSourceId is a function that returns a promise resolving with\n    // the sourceId of the screen/window/tab to be shared.\n    if (typeof getSourceId !== 'function') {\n      console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n          'a function');\n      return;\n    }\n    navigator.getDisplayMedia = function(constraints) {\n      return getSourceId(constraints)\n        .then(function(sourceId) {\n          constraints.video = {\n            mandatory: {\n              chromeMediaSource: 'desktop',\n              chromeMediaSourceId: sourceId,\n              maxFrameRate: constraints.video.frameRate || 3\n            }\n          };\n          return navigator.mediaDevices.getUserMedia(constraints);\n        });\n    };\n  }\n};\n\n},{\"../utils.js\":14,\"./getusermedia\":6}],6:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n\n  var constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    var cc = {};\n    Object.keys(c).forEach(function(key) {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      var oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        var oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(function(mix) {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  var shimConstraints_ = function(constraints, func) {\n    if (browserDetails.version >= 61) {\n      return func(constraints);\n    }\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && typeof constraints.audio === 'object') {\n      var remap = function(obj, a, b) {\n        if (a in obj && !(b in obj)) {\n          obj[b] = obj[a];\n          delete obj[a];\n        }\n      };\n      constraints = JSON.parse(JSON.stringify(constraints));\n      remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n      remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile & surface pro.\n      var face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n      var getSupportedFacingModeLies = browserDetails.version < 66;\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode &&\n            !getSupportedFacingModeLies)) {\n        delete constraints.video.facingMode;\n        var matches;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          matches = ['back', 'rear'];\n        } else if (face.exact === 'user' || face.ideal === 'user') {\n          matches = ['front'];\n        }\n        if (matches) {\n          // Look for matches in label, or use last cam for back (typical).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(function(devices) {\n            devices = devices.filter(function(d) {\n              return d.kind === 'videoinput';\n            });\n            var dev = devices.find(function(d) {\n              return matches.some(function(match) {\n                return d.label.toLowerCase().indexOf(match) !== -1;\n              });\n            });\n            if (!dev && devices.length && matches.indexOf('back') !== -1) {\n              dev = devices[devices.length - 1]; // more likely the back cam\n            }\n            if (dev) {\n              constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n                                                        {ideal: dev.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  var shimError_ = function(e) {\n    if (browserDetails.version >= 64) {\n      return e;\n    }\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        PermissionDismissedError: 'NotAllowedError',\n        InvalidStateError: 'NotAllowedError',\n        DevicesNotFoundError: 'NotFoundError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError',\n        TrackStartError: 'NotReadableError',\n        MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n        MediaDeviceKillSwitchOn: 'NotAllowedError',\n        TabCaptureError: 'AbortError',\n        ScreenCaptureError: 'AbortError',\n        DeviceCaptureError: 'AbortError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint || e.constraintName,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, function(c) {\n      navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n        if (onError) {\n          onError(shimError_(e));\n        }\n      });\n    });\n  };\n\n  navigator.getUserMedia = getUserMedia_;\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      navigator.getUserMedia(constraints, resolve, reject);\n    });\n  };\n\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {\n      getUserMedia: getUserMediaPromise_,\n      enumerateDevices: function() {\n        return new Promise(function(resolve) {\n          var kinds = {audio: 'audioinput', video: 'videoinput'};\n          return window.MediaStreamTrack.getSources(function(devices) {\n            resolve(devices.map(function(device) {\n              return {label: device.label,\n                kind: kinds[device.kind],\n                deviceId: device.id,\n                groupId: ''};\n            }));\n          });\n        });\n      },\n      getSupportedConstraints: function() {\n        return {\n          deviceId: true, echoCancellation: true, facingMode: true,\n          frameRate: true, height: true, width: true\n        };\n      }\n    };\n  }\n\n  // A shim for getUserMedia method on the mediaDevices object.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (!navigator.mediaDevices.getUserMedia) {\n    navigator.mediaDevices.getUserMedia = function(constraints) {\n      return getUserMediaPromise_(constraints);\n    };\n  } else {\n    // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n    // function which returns a Promise, it does not accept spec-style\n    // constraints.\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, function(c) {\n        return origGetUserMedia(c).then(function(stream) {\n          if (c.audio && !stream.getAudioTracks().length ||\n              c.video && !stream.getVideoTracks().length) {\n            stream.getTracks().forEach(function(track) {\n              track.stop();\n            });\n            throw new DOMException('', 'NotFoundError');\n          }\n          return stream;\n        }, function(e) {\n          return Promise.reject(shimError_(e));\n        });\n      });\n    };\n  }\n\n  // Dummy devicechange event methods.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n    navigator.mediaDevices.addEventListener = function() {\n      logging('Dummy mediaDevices.addEventListener called.');\n    };\n  }\n  if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n    navigator.mediaDevices.removeEventListener = function() {\n      logging('Dummy mediaDevices.removeEventListener called.');\n    };\n  }\n};\n\n},{\"../utils.js\":14}],7:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\nvar utils = require('./utils');\n\nmodule.exports = {\n  shimRTCIceCandidate: function(window) {\n    // foundation is arbitrarily chosen as an indicator for full support for\n    // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n    if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n        window.RTCIceCandidate.prototype)) {\n      return;\n    }\n\n    var NativeRTCIceCandidate = window.RTCIceCandidate;\n    window.RTCIceCandidate = function(args) {\n      // Remove the a= which shouldn't be part of the candidate string.\n      if (typeof args === 'object' && args.candidate &&\n          args.candidate.indexOf('a=') === 0) {\n        args = JSON.parse(JSON.stringify(args));\n        args.candidate = args.candidate.substr(2);\n      }\n\n      if (args.candidate && args.candidate.length) {\n        // Augment the native candidate with the parsed fields.\n        var nativeCandidate = new NativeRTCIceCandidate(args);\n        var parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n        var augmentedCandidate = Object.assign(nativeCandidate,\n            parsedCandidate);\n\n        // Add a serializer that does not serialize the extra attributes.\n        augmentedCandidate.toJSON = function() {\n          return {\n            candidate: augmentedCandidate.candidate,\n            sdpMid: augmentedCandidate.sdpMid,\n            sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n            usernameFragment: augmentedCandidate.usernameFragment,\n          };\n        };\n        return augmentedCandidate;\n      }\n      return new NativeRTCIceCandidate(args);\n    };\n    window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n    // Hook up the augmented candidate in onicecandidate and\n    // addEventListener('icecandidate', ...)\n    utils.wrapPeerConnectionEvent(window, 'icecandidate', function(e) {\n      if (e.candidate) {\n        Object.defineProperty(e, 'candidate', {\n          value: new window.RTCIceCandidate(e.candidate),\n          writable: 'false'\n        });\n      }\n      return e;\n    });\n  },\n\n  // shimCreateObjectURL must be called before shimSourceObject to avoid loop.\n\n  shimCreateObjectURL: function(window) {\n    var URL = window && window.URL;\n\n    if (!(typeof window === 'object' && window.HTMLMediaElement &&\n          'srcObject' in window.HTMLMediaElement.prototype &&\n        URL.createObjectURL && URL.revokeObjectURL)) {\n      // Only shim CreateObjectURL using srcObject if srcObject exists.\n      return undefined;\n    }\n\n    var nativeCreateObjectURL = URL.createObjectURL.bind(URL);\n    var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);\n    var streams = new Map(), newId = 0;\n\n    URL.createObjectURL = function(stream) {\n      if ('getTracks' in stream) {\n        var url = 'polyblob:' + (++newId);\n        streams.set(url, stream);\n        utils.deprecated('URL.createObjectURL(stream)',\n            'elem.srcObject = stream');\n        return url;\n      }\n      return nativeCreateObjectURL(stream);\n    };\n    URL.revokeObjectURL = function(url) {\n      nativeRevokeObjectURL(url);\n      streams.delete(url);\n    };\n\n    var dsc = Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,\n                                              'src');\n    Object.defineProperty(window.HTMLMediaElement.prototype, 'src', {\n      get: function() {\n        return dsc.get.apply(this);\n      },\n      set: function(url) {\n        this.srcObject = streams.get(url) || null;\n        return dsc.set.apply(this, [url]);\n      }\n    });\n\n    var nativeSetAttribute = window.HTMLMediaElement.prototype.setAttribute;\n    window.HTMLMediaElement.prototype.setAttribute = function() {\n      if (arguments.length === 2 &&\n          ('' + arguments[0]).toLowerCase() === 'src') {\n        this.srcObject = streams.get(arguments[1]) || null;\n      }\n      return nativeSetAttribute.apply(this, arguments);\n    };\n  },\n\n  shimMaxMessageSize: function(window) {\n    if (window.RTCSctpTransport || !window.RTCPeerConnection) {\n      return;\n    }\n    var browserDetails = utils.detectBrowser(window);\n\n    if (!('sctp' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n        get: function() {\n          return typeof this._sctp === 'undefined' ? null : this._sctp;\n        }\n      });\n    }\n\n    var sctpInDescription = function(description) {\n      var sections = SDPUtils.splitSections(description.sdp);\n      sections.shift();\n      return sections.some(function(mediaSection) {\n        var mLine = SDPUtils.parseMLine(mediaSection);\n        return mLine && mLine.kind === 'application'\n            && mLine.protocol.indexOf('SCTP') !== -1;\n      });\n    };\n\n    var getRemoteFirefoxVersion = function(description) {\n      // TODO: Is there a better solution for detecting Firefox?\n      var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n      if (match === null || match.length < 2) {\n        return -1;\n      }\n      var version = parseInt(match[1], 10);\n      // Test for NaN (yes, this is ugly)\n      return version !== version ? -1 : version;\n    };\n\n    var getCanSendMaxMessageSize = function(remoteIsFirefox) {\n      // Every implementation we know can send at least 64 KiB.\n      // Note: Although Chrome is technically able to send up to 256 KiB, the\n      //       data does not reach the other peer reliably.\n      //       See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n      var canSendMaxMessageSize = 65536;\n      if (browserDetails.browser === 'firefox') {\n        if (browserDetails.version < 57) {\n          if (remoteIsFirefox === -1) {\n            // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n            // fragmentation.\n            canSendMaxMessageSize = 16384;\n          } else {\n            // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n            // messages. Thus, supporting ~2 GiB when sending.\n            canSendMaxMessageSize = 2147483637;\n          }\n        } else if (browserDetails.version < 60) {\n          // Currently, all FF >= 57 will reset the remote maximum message size\n          // to the default value when a data channel is created at a later\n          // stage. :(\n          // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n          canSendMaxMessageSize =\n            browserDetails.version === 57 ? 65535 : 65536;\n        } else {\n          // FF >= 60 supports sending ~2 GiB\n          canSendMaxMessageSize = 2147483637;\n        }\n      }\n      return canSendMaxMessageSize;\n    };\n\n    var getMaxMessageSize = function(description, remoteIsFirefox) {\n      // Note: 65536 bytes is the default value from the SDP spec. Also,\n      //       every implementation we know supports receiving 65536 bytes.\n      var maxMessageSize = 65536;\n\n      // FF 57 has a slightly incorrect default remote max message size, so\n      // we need to adjust it here to avoid a failure when sending.\n      // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n      if (browserDetails.browser === 'firefox'\n           && browserDetails.version === 57) {\n        maxMessageSize = 65535;\n      }\n\n      var match = SDPUtils.matchPrefix(description.sdp, 'a=max-message-size:');\n      if (match.length > 0) {\n        maxMessageSize = parseInt(match[0].substr(19), 10);\n      } else if (browserDetails.browser === 'firefox' &&\n                  remoteIsFirefox !== -1) {\n        // If the maximum message size is not present in the remote SDP and\n        // both local and remote are Firefox, the remote peer can receive\n        // ~2 GiB.\n        maxMessageSize = 2147483637;\n      }\n      return maxMessageSize;\n    };\n\n    var origSetRemoteDescription =\n        window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n      var pc = this;\n      pc._sctp = null;\n\n      if (sctpInDescription(arguments[0])) {\n        // Check if the remote is FF.\n        var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n        // Get the maximum message size the local peer is capable of sending\n        var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n        // Get the maximum message size of the remote peer.\n        var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n        // Determine final maximum message size\n        var maxMessageSize;\n        if (canSendMMS === 0 && remoteMMS === 0) {\n          maxMessageSize = Number.POSITIVE_INFINITY;\n        } else if (canSendMMS === 0 || remoteMMS === 0) {\n          maxMessageSize = Math.max(canSendMMS, remoteMMS);\n        } else {\n          maxMessageSize = Math.min(canSendMMS, remoteMMS);\n        }\n\n        // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n        // attribute.\n        var sctp = {};\n        Object.defineProperty(sctp, 'maxMessageSize', {\n          get: function() {\n            return maxMessageSize;\n          }\n        });\n        pc._sctp = sctp;\n      }\n\n      return origSetRemoteDescription.apply(pc, arguments);\n    };\n  },\n\n  shimSendThrowTypeError: function(window) {\n    if (!(window.RTCPeerConnection &&\n        'createDataChannel' in window.RTCPeerConnection.prototype)) {\n      return;\n    }\n\n    // Note: Although Firefox >= 57 has a native implementation, the maximum\n    //       message size can be reset for all data channels at a later stage.\n    //       See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n    function wrapDcSend(dc, pc) {\n      var origDataChannelSend = dc.send;\n      dc.send = function() {\n        var data = arguments[0];\n        var length = data.length || data.size || data.byteLength;\n        if (dc.readyState === 'open' &&\n            pc.sctp && length > pc.sctp.maxMessageSize) {\n          throw new TypeError('Message too large (can send a maximum of ' +\n            pc.sctp.maxMessageSize + ' bytes)');\n        }\n        return origDataChannelSend.apply(dc, arguments);\n      };\n    }\n    var origCreateDataChannel =\n      window.RTCPeerConnection.prototype.createDataChannel;\n    window.RTCPeerConnection.prototype.createDataChannel = function() {\n      var pc = this;\n      var dataChannel = origCreateDataChannel.apply(pc, arguments);\n      wrapDcSend(dataChannel, pc);\n      return dataChannel;\n    };\n    utils.wrapPeerConnectionEvent(window, 'datachannel', function(e) {\n      wrapDcSend(e.channel, e.target);\n      return e;\n    });\n  }\n};\n\n},{\"./utils\":14,\"sdp\":2}],8:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar filterIceServers = require('./filtericeservers');\nvar shimRTCPeerConnection = require('rtcpeerconnection-shim');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (window.RTCIceGatherer) {\n      if (!window.RTCIceCandidate) {\n        window.RTCIceCandidate = function(args) {\n          return args;\n        };\n      }\n      if (!window.RTCSessionDescription) {\n        window.RTCSessionDescription = function(args) {\n          return args;\n        };\n      }\n      // this adds an additional event listener to MediaStrackTrack that signals\n      // when a tracks enabled property was changed. Workaround for a bug in\n      // addStream, see below. No longer required in 15025+\n      if (browserDetails.version < 15025) {\n        var origMSTEnabled = Object.getOwnPropertyDescriptor(\n            window.MediaStreamTrack.prototype, 'enabled');\n        Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n          set: function(value) {\n            origMSTEnabled.set.call(this, value);\n            var ev = new Event('enabled');\n            ev.enabled = value;\n            this.dispatchEvent(ev);\n          }\n        });\n      }\n    }\n\n    // ORTC defines the DTMF sender a bit different.\n    // https://github.com/w3c/ortc/issues/714\n    if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = new window.RTCDtmfSender(this);\n            } else if (this.track.kind === 'video') {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n    // Edge currently only implements the RTCDtmfSender, not the\n    // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n    if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n      window.RTCDTMFSender = window.RTCDtmfSender;\n    }\n\n    var RTCPeerConnectionShim = shimRTCPeerConnection(window,\n        browserDetails.version);\n    window.RTCPeerConnection = function(config) {\n      if (config && config.iceServers) {\n        config.iceServers = filterIceServers(config.iceServers);\n      }\n      return new RTCPeerConnectionShim(config);\n    };\n    window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n  },\n  shimReplaceTrack: function(window) {\n    // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n    if (window.RTCRtpSender &&\n        !('replaceTrack' in window.RTCRtpSender.prototype)) {\n      window.RTCRtpSender.prototype.replaceTrack =\n          window.RTCRtpSender.prototype.setTrack;\n    }\n  }\n};\n\n},{\"../utils\":14,\"./filtericeservers\":9,\"./getusermedia\":10,\"rtcpeerconnection-shim\":1}],9:[function(require,module,exports){\n/*\n *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nmodule.exports = function(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n};\n\n},{\"../utils\":14}],10:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var navigator = window && window.navigator;\n\n  var shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(function(e) {\n      return Promise.reject(shimError_(e));\n    });\n  };\n};\n\n},{}],11:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.transceiver = {receiver: event.receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        },\n        enumerable: true,\n        configurable: true\n      });\n    }\n    if (typeof window === 'object' && window.RTCTrackEvent &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        !('transceiver' in window.RTCTrackEvent.prototype)) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function(window) {\n    // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this.mozSrcObject;\n          },\n          set: function(stream) {\n            this.mozSrcObject = stream;\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n        window.mozRTCPeerConnection)) {\n      return; // probably media.peerconnection.enabled=false in about:config\n    }\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        if (browserDetails.version < 38) {\n          // .urls is not supported in FF < 38.\n          // create RTCIceServers with a single url.\n          if (pcConfig && pcConfig.iceServers) {\n            var newIceServers = [];\n            for (var i = 0; i < pcConfig.iceServers.length; i++) {\n              var server = pcConfig.iceServers[i];\n              if (server.hasOwnProperty('urls')) {\n                for (var j = 0; j < server.urls.length; j++) {\n                  var newServer = {\n                    url: server.urls[j]\n                  };\n                  if (server.urls[j].indexOf('turn') === 0) {\n                    newServer.username = server.username;\n                    newServer.credential = server.credential;\n                  }\n                  newIceServers.push(newServer);\n                }\n              } else {\n                newIceServers.push(pcConfig.iceServers[i]);\n              }\n            }\n            pcConfig.iceServers = newIceServers;\n          }\n        }\n        return new window.mozRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.mozRTCPeerConnection.prototype;\n\n      // wrap static methods. Currently just generateCertificate.\n      if (window.mozRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.mozRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n\n      window.RTCSessionDescription = window.mozRTCSessionDescription;\n      window.RTCIceCandidate = window.mozRTCIceCandidate;\n    }\n\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim getStats with maplike support\n    var makeMapStats = function(stats) {\n      var map = new Map();\n      Object.keys(stats).forEach(function(key) {\n        map.set(key, stats[key]);\n        map[key] = stats[key];\n      });\n      return map;\n    };\n\n    var modernStatsTypes = {\n      inboundrtp: 'inbound-rtp',\n      outboundrtp: 'outbound-rtp',\n      candidatepair: 'candidate-pair',\n      localcandidate: 'local-candidate',\n      remotecandidate: 'remote-candidate'\n    };\n\n    var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(\n      selector,\n      onSucc,\n      onErr\n    ) {\n      return nativeGetStats.apply(this, [selector || null])\n        .then(function(stats) {\n          if (browserDetails.version < 48) {\n            stats = makeMapStats(stats);\n          }\n          if (browserDetails.version < 53 && !onSucc) {\n            // Shim only promise getStats with spec-hyphens in type names\n            // Leave callback version alone; misc old uses of forEach before Map\n            try {\n              stats.forEach(function(stat) {\n                stat.type = modernStatsTypes[stat.type] || stat.type;\n              });\n            } catch (e) {\n              if (e.name !== 'TypeError') {\n                throw e;\n              }\n              // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n              stats.forEach(function(stat, i) {\n                stats.set(i, Object.assign({}, stat, {\n                  type: modernStatsTypes[stat.type] || stat.type\n                }));\n              });\n            }\n          }\n          return stats;\n        })\n        .then(onSucc, onErr);\n    };\n  },\n\n  shimSenderGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n      return;\n    }\n    var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    if (origGetSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n    }\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    if (origAddTrack) {\n      window.RTCPeerConnection.prototype.addTrack = function() {\n        var sender = origAddTrack.apply(this, arguments);\n        sender._pc = this;\n        return sender;\n      };\n    }\n    window.RTCRtpSender.prototype.getStats = function() {\n      return this.track ? this._pc.getStats(this.track) :\n          Promise.resolve(new Map());\n    };\n  },\n\n  shimReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n      return;\n    }\n    var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n    if (origGetReceivers) {\n      window.RTCPeerConnection.prototype.getReceivers = function() {\n        var pc = this;\n        var receivers = origGetReceivers.apply(pc, []);\n        receivers.forEach(function(receiver) {\n          receiver._pc = pc;\n        });\n        return receivers;\n      };\n    }\n    utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n      e.receiver._pc = e.srcElement;\n      return e;\n    });\n    window.RTCRtpReceiver.prototype.getStats = function() {\n      return this._pc.getStats(this.track);\n    };\n  },\n\n  shimRemoveStream: function(window) {\n    if (!window.RTCPeerConnection ||\n        'removeStream' in window.RTCPeerConnection.prototype) {\n      return;\n    }\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      utils.deprecated('removeStream', 'removeTrack');\n      this.getSenders().forEach(function(sender) {\n        if (sender.track && stream.getTracks().indexOf(sender.track) !== -1) {\n          pc.removeTrack(sender);\n        }\n      });\n    };\n  },\n\n  shimRTCDataChannel: function(window) {\n    // rename DataChannel to RTCDataChannel (native fix in FF60):\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n    if (window.DataChannel && !window.RTCDataChannel) {\n      window.RTCDataChannel = window.DataChannel;\n    }\n  },\n\n  shimGetDisplayMedia: function(window, preferredMediaSource) {\n    if ('getDisplayMedia' in window.navigator) {\n      return;\n    }\n    navigator.getDisplayMedia = function(constraints) {\n      if (!(constraints && constraints.video)) {\n        var err = new DOMException('getDisplayMedia without video ' +\n            'constraints is undefined');\n        err.name = 'NotFoundError';\n        // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n        err.code = 8;\n        return Promise.reject(err);\n      }\n      if (constraints.video === true) {\n        constraints.video = {mediaSource: preferredMediaSource};\n      } else {\n        constraints.video.mediaSource = preferredMediaSource;\n      }\n      return navigator.mediaDevices.getUserMedia(constraints);\n    };\n  }\n};\n\n},{\"../utils\":14,\"./getusermedia\":12}],12:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n  var MediaStreamTrack = window && window.MediaStreamTrack;\n\n  var shimError_ = function(e) {\n    return {\n      name: {\n        InternalError: 'NotReadableError',\n        NotSupportedError: 'TypeError',\n        PermissionDeniedError: 'NotAllowedError',\n        SecurityError: 'NotAllowedError'\n      }[e.name] || e.name,\n      message: {\n        'The operation is insecure.': 'The request is not allowed by the ' +\n        'user agent or the platform in the current context.'\n      }[e.message] || e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  // getUserMedia constraints shim.\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    var constraintsToFF37_ = function(c) {\n      if (typeof c !== 'object' || c.require) {\n        return c;\n      }\n      var require = [];\n      Object.keys(c).forEach(function(key) {\n        if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n          return;\n        }\n        var r = c[key] = (typeof c[key] === 'object') ?\n            c[key] : {ideal: c[key]};\n        if (r.min !== undefined ||\n            r.max !== undefined || r.exact !== undefined) {\n          require.push(key);\n        }\n        if (r.exact !== undefined) {\n          if (typeof r.exact === 'number') {\n            r. min = r.max = r.exact;\n          } else {\n            c[key] = r.exact;\n          }\n          delete r.exact;\n        }\n        if (r.ideal !== undefined) {\n          c.advanced = c.advanced || [];\n          var oc = {};\n          if (typeof r.ideal === 'number') {\n            oc[key] = {min: r.ideal, max: r.ideal};\n          } else {\n            oc[key] = r.ideal;\n          }\n          c.advanced.push(oc);\n          delete r.ideal;\n          if (!Object.keys(r).length) {\n            delete c[key];\n          }\n        }\n      });\n      if (require.length) {\n        c.require = require;\n      }\n      return c;\n    };\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (browserDetails.version < 38) {\n      logging('spec: ' + JSON.stringify(constraints));\n      if (constraints.audio) {\n        constraints.audio = constraintsToFF37_(constraints.audio);\n      }\n      if (constraints.video) {\n        constraints.video = constraintsToFF37_(constraints.video);\n      }\n      logging('ff37: ' + JSON.stringify(constraints));\n    }\n    return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n      onError(shimError_(e));\n    });\n  };\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      getUserMedia_(constraints, resolve, reject);\n    });\n  };\n\n  // Shim for mediaDevices on older versions.\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n      addEventListener: function() { },\n      removeEventListener: function() { }\n    };\n  }\n  navigator.mediaDevices.enumerateDevices =\n      navigator.mediaDevices.enumerateDevices || function() {\n        return new Promise(function(resolve) {\n          var infos = [\n            {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n            {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n          ];\n          resolve(infos);\n        });\n      };\n\n  if (browserDetails.version < 41) {\n    // Work around http://bugzil.la/1169665\n    var orgEnumerateDevices =\n        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n    navigator.mediaDevices.enumerateDevices = function() {\n      return orgEnumerateDevices().then(undefined, function(e) {\n        if (e.name === 'NotFoundError') {\n          return [];\n        }\n        throw e;\n      });\n    };\n  }\n  if (browserDetails.version < 49) {\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      return origGetUserMedia(c).then(function(stream) {\n        // Work around https://bugzil.la/802326\n        if (c.audio && !stream.getAudioTracks().length ||\n            c.video && !stream.getVideoTracks().length) {\n          stream.getTracks().forEach(function(track) {\n            track.stop();\n          });\n          throw new DOMException('The object can not be found here.',\n                                 'NotFoundError');\n        }\n        return stream;\n      }, function(e) {\n        return Promise.reject(shimError_(e));\n      });\n    };\n  }\n  if (!(browserDetails.version > 55 &&\n      'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n    var remap = function(obj, a, b) {\n      if (a in obj && !(b in obj)) {\n        obj[b] = obj[a];\n        delete obj[a];\n      }\n    };\n\n    var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      if (typeof c === 'object' && typeof c.audio === 'object') {\n        c = JSON.parse(JSON.stringify(c));\n        remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n        remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n      }\n      return nativeGetUserMedia(c);\n    };\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n      var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n      MediaStreamTrack.prototype.getSettings = function() {\n        var obj = nativeGetSettings.apply(this, arguments);\n        remap(obj, 'mozAutoGainControl', 'autoGainControl');\n        remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n        return obj;\n      };\n    }\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n      var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n      MediaStreamTrack.prototype.applyConstraints = function(c) {\n        if (this.kind === 'audio' && typeof c === 'object') {\n          c = JSON.parse(JSON.stringify(c));\n          remap(c, 'autoGainControl', 'mozAutoGainControl');\n          remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n        }\n        return nativeApplyConstraints.apply(this, [c]);\n      };\n    }\n  }\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    if (browserDetails.version < 44) {\n      return getUserMedia_(constraints, onSuccess, onError);\n    }\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    utils.deprecated('navigator.getUserMedia',\n        'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n};\n\n},{\"../utils\":14}],13:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimLocalStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getLocalStreams = function() {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        return this._localStreams;\n      };\n    }\n    if (!('getStreamById' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getStreamById = function(id) {\n        var result = null;\n        if (this._localStreams) {\n          this._localStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        if (this._remoteStreams) {\n          this._remoteStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        return result;\n      };\n    }\n    if (!('addStream' in window.RTCPeerConnection.prototype)) {\n      var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        if (this._localStreams.indexOf(stream) === -1) {\n          this._localStreams.push(stream);\n        }\n        var pc = this;\n        stream.getTracks().forEach(function(track) {\n          _addTrack.call(pc, track, stream);\n        });\n      };\n\n      window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n        if (stream) {\n          if (!this._localStreams) {\n            this._localStreams = [stream];\n          } else if (this._localStreams.indexOf(stream) === -1) {\n            this._localStreams.push(stream);\n          }\n        }\n        return _addTrack.call(this, track, stream);\n      };\n    }\n    if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        var index = this._localStreams.indexOf(stream);\n        if (index === -1) {\n          return;\n        }\n        this._localStreams.splice(index, 1);\n        var pc = this;\n        var tracks = stream.getTracks();\n        this.getSenders().forEach(function(sender) {\n          if (tracks.indexOf(sender.track) !== -1) {\n            pc.removeTrack(sender);\n          }\n        });\n      };\n    }\n  },\n  shimRemoteStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getRemoteStreams = function() {\n        return this._remoteStreams ? this._remoteStreams : [];\n      };\n    }\n    if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n        get: function() {\n          return this._onaddstream;\n        },\n        set: function(f) {\n          if (this._onaddstream) {\n            this.removeEventListener('addstream', this._onaddstream);\n          }\n          this.addEventListener('addstream', this._onaddstream = f);\n        }\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!this._onaddstreampoly) {\n          this.addEventListener('track', this._onaddstreampoly = function(e) {\n            e.streams.forEach(function(stream) {\n              if (!pc._remoteStreams) {\n                pc._remoteStreams = [];\n              }\n              if (pc._remoteStreams.indexOf(stream) >= 0) {\n                return;\n              }\n              pc._remoteStreams.push(stream);\n              var event = new Event('addstream');\n              event.stream = stream;\n              pc.dispatchEvent(event);\n            });\n          });\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    }\n  },\n  shimCallbacksAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    var prototype = window.RTCPeerConnection.prototype;\n    var createOffer = prototype.createOffer;\n    var createAnswer = prototype.createAnswer;\n    var setLocalDescription = prototype.setLocalDescription;\n    var setRemoteDescription = prototype.setRemoteDescription;\n    var addIceCandidate = prototype.addIceCandidate;\n\n    prototype.createOffer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createOffer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    prototype.createAnswer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createAnswer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    var withCallback = function(description, successCallback, failureCallback) {\n      var promise = setLocalDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setLocalDescription = withCallback;\n\n    withCallback = function(description, successCallback, failureCallback) {\n      var promise = setRemoteDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setRemoteDescription = withCallback;\n\n    withCallback = function(candidate, successCallback, failureCallback) {\n      var promise = addIceCandidate.apply(this, [candidate]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.addIceCandidate = withCallback;\n  },\n  shimGetUserMedia: function(window) {\n    var navigator = window && window.navigator;\n\n    if (!navigator.getUserMedia) {\n      if (navigator.webkitGetUserMedia) {\n        navigator.getUserMedia = navigator.webkitGetUserMedia.bind(navigator);\n      } else if (navigator.mediaDevices &&\n          navigator.mediaDevices.getUserMedia) {\n        navigator.getUserMedia = function(constraints, cb, errcb) {\n          navigator.mediaDevices.getUserMedia(constraints)\n          .then(cb, errcb);\n        }.bind(navigator);\n      }\n    }\n  },\n  shimRTCIceServerUrls: function(window) {\n    // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n    var OrigPeerConnection = window.RTCPeerConnection;\n    window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n      if (pcConfig && pcConfig.iceServers) {\n        var newIceServers = [];\n        for (var i = 0; i < pcConfig.iceServers.length; i++) {\n          var server = pcConfig.iceServers[i];\n          if (!server.hasOwnProperty('urls') &&\n              server.hasOwnProperty('url')) {\n            utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n            server = JSON.parse(JSON.stringify(server));\n            server.urls = server.url;\n            delete server.url;\n            newIceServers.push(server);\n          } else {\n            newIceServers.push(pcConfig.iceServers[i]);\n          }\n        }\n        pcConfig.iceServers = newIceServers;\n      }\n      return new OrigPeerConnection(pcConfig, pcConstraints);\n    };\n    window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n    // wrap static methods. Currently just generateCertificate.\n    if ('generateCertificate' in window.RTCPeerConnection) {\n      Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n        get: function() {\n          return OrigPeerConnection.generateCertificate;\n        }\n      });\n    }\n  },\n  shimTrackEventTransceiver: function(window) {\n    // Add event.transceiver member over deprecated event.receiver\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        // can't check 'transceiver' in window.RTCTrackEvent.prototype, as it is\n        // defined for some reason even when window.RTCTransceiver is not.\n        !window.RTCTransceiver) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimCreateOfferLegacy: function(window) {\n    var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n    window.RTCPeerConnection.prototype.createOffer = function(offerOptions) {\n      var pc = this;\n      if (offerOptions) {\n        if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n        }\n        var audioTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'audio';\n        });\n        if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n          if (audioTransceiver.direction === 'sendrecv') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly');\n            } else {\n              audioTransceiver.direction = 'sendonly';\n            }\n          } else if (audioTransceiver.direction === 'recvonly') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive');\n            } else {\n              audioTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveAudio === true &&\n            !audioTransceiver) {\n          pc.addTransceiver('audio');\n        }\n\n\n        if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n        }\n        var videoTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'video';\n        });\n        if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n          if (videoTransceiver.direction === 'sendrecv') {\n            videoTransceiver.setDirection('sendonly');\n          } else if (videoTransceiver.direction === 'recvonly') {\n            videoTransceiver.setDirection('inactive');\n          }\n        } else if (offerOptions.offerToReceiveVideo === true &&\n            !videoTransceiver) {\n          pc.addTransceiver('video');\n        }\n      }\n      return origCreateOffer.apply(pc, arguments);\n    };\n  }\n};\n\n},{\"../utils\":14}],14:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\nvar deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n  var match = uastring.match(expr);\n  return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  var proto = window.RTCPeerConnection.prototype;\n  var nativeAddEventListener = proto.addEventListener;\n  proto.addEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap) {\n      return nativeAddEventListener.apply(this, arguments);\n    }\n    var wrappedCallback = function(e) {\n      var modifiedEvent = wrapper(e);\n      if (modifiedEvent) {\n        cb(modifiedEvent);\n      }\n    };\n    this._eventMap = this._eventMap || {};\n    this._eventMap[cb] = wrappedCallback;\n    return nativeAddEventListener.apply(this, [nativeEventName,\n      wrappedCallback]);\n  };\n\n  var nativeRemoveEventListener = proto.removeEventListener;\n  proto.removeEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap || !this._eventMap\n        || !this._eventMap[cb]) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    var unwrappedCb = this._eventMap[cb];\n    delete this._eventMap[cb];\n    return nativeRemoveEventListener.apply(this, [nativeEventName,\n      unwrappedCb]);\n  };\n\n  Object.defineProperty(proto, 'on' + eventNameToWrap, {\n    get: function() {\n      return this['_on' + eventNameToWrap];\n    },\n    set: function(cb) {\n      if (this['_on' + eventNameToWrap]) {\n        this.removeEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap]);\n        delete this['_on' + eventNameToWrap];\n      }\n      if (cb) {\n        this.addEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap] = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n}\n\n// Utility methods.\nmodule.exports = {\n  extractVersion: extractVersion,\n  wrapPeerConnectionEvent: wrapPeerConnectionEvent,\n  disableLog: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    logDisabled_ = bool;\n    return (bool) ? 'adapter.js logging disabled' :\n        'adapter.js logging enabled';\n  },\n\n  /**\n   * Disable or enable deprecation warnings\n   * @param {!boolean} bool set to true to disable warnings.\n   */\n  disableWarnings: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    deprecationWarnings_ = !bool;\n    return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n  },\n\n  log: function() {\n    if (typeof window === 'object') {\n      if (logDisabled_) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console.log === 'function') {\n        console.log.apply(console, arguments);\n      }\n    }\n  },\n\n  /**\n   * Shows a deprecation warning suggesting the modern and spec-compatible API.\n   */\n  deprecated: function(oldMethod, newMethod) {\n    if (!deprecationWarnings_) {\n      return;\n    }\n    console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n        ' instead.');\n  },\n\n  /**\n   * Browser detector.\n   *\n   * @return {object} result containing browser and version\n   *     properties.\n   */\n  detectBrowser: function(window) {\n    var navigator = window && window.navigator;\n\n    // Returned result object.\n    var result = {};\n    result.browser = null;\n    result.version = null;\n\n    // Fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n      result.browser = 'Not a browser.';\n      return result;\n    }\n\n    if (navigator.mozGetUserMedia) { // Firefox.\n      result.browser = 'firefox';\n      result.version = extractVersion(navigator.userAgent,\n          /Firefox\\/(\\d+)\\./, 1);\n    } else if (navigator.webkitGetUserMedia) {\n      // Chrome, Chromium, Webview, Opera.\n      // Version matches Chrome/WebRTC version.\n      result.browser = 'chrome';\n      result.version = extractVersion(navigator.userAgent,\n          /Chrom(e|ium)\\/(\\d+)\\./, 2);\n    } else if (navigator.mediaDevices &&\n        navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n      result.browser = 'edge';\n      result.version = extractVersion(navigator.userAgent,\n          /Edge\\/(\\d+).(\\d+)$/, 2);\n    } else if (window.RTCPeerConnection &&\n        navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n      result.browser = 'safari';\n      result.version = extractVersion(navigator.userAgent,\n          /AppleWebKit\\/(\\d+)\\./, 1);\n    } else { // Default fallthrough: not supported.\n      result.browser = 'Not a supported browser.';\n      return result;\n    }\n\n    return result;\n  }\n};\n\n},{}]},{},[3])(3)\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport { BASE_GROUP_FIELDS } from '../models/group';\nimport { BASE_PERSON, FULL_PERSON } from '../models/person';\nimport SearchAdapterMixin from '../search/adapter-mixin';\n\nconst versions = {\n    people: 'v2',\n    groups: 'v2',\n    locations: 'v1',\n    users: 'v1',\n    messages: 'v1',\n    notifications: 'v1'\n};\n\nconst ApplicationAdapter = DS.RESTAdapter.extend(SearchAdapterMixin, {\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    defaultSerializer: 'application',\n\n    namespace: 'api',\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\n        return this._super(status, headers, data);\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    pathForType(type) {\n        if (type.modelName) {\n            type = type.modelName;\n        }\n\n        type = Ember.String.camelize(type);\n        return pluralize(type);\n    },\n\n    createRecord(store, type, record) {\n        var snapshot = record._createSnapshot();\n        var data = store.serializerFor(type.modelName).serialize(snapshot, { includeId: true });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'POST', { data: data });\n    },\n\n    buildURL(type, id) {\n        return this._directoryUrl(type, id);\n    },\n\n    findRecord(store, type, id, snapshot) {\n        let data = {};\n        const traditional = true;\n\n        if (type.modelName === 'person') {\n            data = Object.assign({}, data, FULL_PERSON);\n        } else {\n            data = Object.assign({}, data, { fl: '*' });\n        }\n\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET', { data, traditional });\n    },\n\n    findQuery() {\n        return this.query(...arguments);\n    },\n\n    entityEndpoint(path, type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let host = !!this.host ? this.host : '';\n        if (type === 'person') {\n            return `${host}/platform/directory/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n        }\n\n        return `${host}/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n    },\n\n    findMultiEntity(store, params, requestType) {\n        if (!params) {\n            params = { limit: 25, fl: '*', _entity: 'all', facets: '*' };\n        }\n\n        if (requestType === 'search') {\n            // new style search instead of query\n            params = Object.assign({}, params, {\n                returnFields: [...BASE_PERSON.fl.split(','), ...BASE_GROUP_FIELDS]\n            });\n            return this.performSearch(params);\n        }\n\n        return Ember.RSVP.reject(new Error('old style search has been removed. Please update to new search'));\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2();\n    },\n\n    findFavoritesPublicApiV2() {\n        const url = this.get('application').pcV2Uri('api/v2/users/favorites');\n        const deferred = Ember.RSVP.defer();\n        this._findFavoritesPublicApiV2(url)\n            .then(res => {\n                this._handleFavorites(res, [], deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error trying to find favorites:', error);\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    _findFavoritesPublicApiV2(url, page = 1) {\n        return this.ajax(url, 'GET', {\n            data: {\n                pageNumber: page,\n                pageSize: 25\n            },\n            cache: false\n        });\n    },\n\n    _handleFavorites(data, collection, deferred, url) {\n        const results = data.entities;\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = collection.concat(results);\n\n        const nextPage = data.page + 1;\n        return this._findFavoritesPublicApiV2(url, nextPage)\n            .then(data => {\n                return this._handleFavorites(data, collection, deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while loading favorites:', {\n                    error,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    forwardVoicemail(voicemail, recipient, type, params = {}) {\n        let host = !!this.host ? this.host : '';\n        const url = `${host}/platform/${this.namespace}/v2/voicemail/messages`;\n        params = Object.assign({}, params, {\n            voicemailMessageId: voicemail,\n            userId: type === 'person' ? recipient : null,\n            groupId: type === 'group' ? recipient : null\n        });\n        return this.ajax(url, 'POST', { data: params, cache: false });\n    },\n\n    _findDirectReports(url, page = 1) {\n        const count = 25;\n        const offset = count * (page - 1);\n        return this.ajax(url, 'GET', {\n            data: { count, offset, fl: BASE_PERSON.fl }\n        });\n    },\n\n    _handleReports(data, collection, deferred, url, page) {\n        const results = data.res;\n\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = [].concat(collection, results);\n\n        const nextPage = page + 1;\n        return this._findDirectReports(url, nextPage)\n            .then(data => {\n                return this._handleReports(data, collection, deferred, url, nextPage);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while loading directs report page', {\n                    error,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    findDirectReports(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        const deferred = Ember.RSVP.defer();\n        const url = this.entityEndpoint('directReports', type, id);\n        this._findDirectReports(url, 1)\n            .then(data => {\n                return this._handleReports(data, [], deferred, url, 1);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while attempting to find reports', {\n                    error,\n                    id\n                });\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    findSuperiors(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        var url = this.entityEndpoint('superiors', type, id);\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    urlForUpdateRecord(id, type) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    },\n\n    _directoryUrl(type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (type === 'person') {\n            url = `/platform/directory${url}`;\n        }\n\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    }\n});\n\nexport default ApplicationAdapter;\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    updateRecord(store, type, snapshot) {\n        const data = {};\n        const serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        let method = 'PUT';\n        if (snapshot.adapterOptions && snapshot.adapterOptions.patch) {\n            method = 'PATCH';\n        }\n\n        return this.ajax(url, method, { data: data });\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.get('host')}/${this.get('namespace')}/users/${id}/callforwarding`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.urlForFindRecord(id);\n    },\n\n    // Typically we wouldnt rewrite this private function, but we need to modify how errors are extracted\n    // See: https://github.com/emberjs/data/issues/4934\n    handleResponse(status, headers, payload, requestData) {\n        let data = {};\n        if (payload && status !== 200) {\n            data.errors = [payload];\n        } else {\n            data = payload;\n        }\n        return this._super(status, headers, data, requestData);\n    }\n});\n","import Ember from 'ember';\nimport ApplicationAdapter from './application';\nimport moment from '../utils/dates';\nimport _ from 'lodash';\n\nconst {\n    inject: { service }\n} = Ember;\n\nexport default ApplicationAdapter.extend({\n    session: service(),\n    application: service(),\n\n    useExternalContactExpand: true,\n\n    paging: {\n        pageSize: 25,\n        pageNumber: 1\n    },\n    queryDefaults: {\n        currentInterval: moment(),\n        previousInterval: moment().subtract(1, 'week')\n    },\n\n    query(store, typeClass, query) {\n        if (query.findLatestCalls) {\n            return this._fetchLatestCalls(...arguments);\n        }\n        return this._fetchHistory(...arguments);\n    },\n\n    /**\n     * _fetchLatestCalls - Fetch the latest calls\n     * @return Promise\n     */\n    _fetchLatestCalls() {\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return Ember.RSVP.resolve([]);\n        }\n        const data = {\n            interval: `${moment().subtract(2, 'hours').toISOString()}/${moment().add(2, 'hours').toISOString()}`\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data });\n    },\n\n    /**\n     * _fetchHistory - Fetch the history in a given interval. This method handles paging and adjusting the interval parameter\n     * depending on how many entities are returned so that subsequent calls will fetch previous conversations.\n     * @param  {Object}  query     The default query passed in.\n     * @return {Promise}\n     */\n    _fetchHistory(...params) {\n        let query = params[2];\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return Ember.RSVP.resolve([]);\n        }\n        const queryDefaults = this.get('queryDefaults');\n        const meta = _.merge(queryDefaults, query);\n        const paging = this.get('paging');\n        const data = {\n            interval: `${meta.previousInterval.toISOString()}/${meta.currentInterval.toISOString()}`,\n            pageSize: paging.pageSize,\n            pageNumber: paging.pageNumber\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data }).then(data => {\n            if (data.entities && data.entities.length === this.get('paging.pageSize')) {\n                this.incrementPageNumber();\n            } else {\n                this.decrementWeek();\n            }\n            return data;\n        });\n    },\n\n    /**\n     * incrementPageNumber - Increments the page number\n     */\n    incrementPageNumber() {\n        this.set('paging.pageNumber', this.get('paging.pageNumber') + 1);\n    },\n\n    /**\n     * decrementWeek - Modifies interval to previous week\n     */\n    decrementWeek() {\n        this.set('paging.pageNumber', 1);\n        let currentInterval = this.get('queryDefaults.currentInterval');\n        let previousInterval = this.get('queryDefaults.previousInterval');\n        this.set('queryDefaults.currentInterval', currentInterval.subtract(1, 'week'));\n        this.set('queryDefaults.previousInterval', previousInterval.subtract(1, 'week'));\n    },\n\n    /**\n     * getHistoryPath - Generates history uri for xhr\n     */\n    getHistoryPath() {\n        if (this.get('useExternalContactExpand')) {\n            return this.get('application').pcUri('api/v2/conversations/calls/history?expand=externalcontact');\n        }\n        return this.get('application').pcUri('api/v2/conversations/calls/history');\n    }\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import ApplicationAdapter from './application';\nimport Ember from 'ember';\n\nexport default ApplicationAdapter.extend({\n    findAll() {\n        return Ember.RSVP.resolve({\n            entities: [],\n            pageSize: 0,\n            pageNumber: 1,\n            total: 0,\n            firstUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            lastUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            selfUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            pageCount: 0\n        });\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    namespace: 'api/v2/authorization',\n    host: computed.reads('application.purecloudV2BaseUri'),\n    divisionLimit: null,\n\n    pathForType(modelName) {\n        return pluralize(modelName);\n    },\n\n    // custom findAll method sets pageSize equal to division limit\n    findAll(store, type, sinceToken, snapshotRecordArray) {\n        let objectCount = Ember.get(snapshotRecordArray, 'adapterOptions.objectCount');\n        let url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');\n        const limitPath = 'api/v2/authorization/divisions/limit';\n        const limitUrl = this.get('application').pcV2Uri(limitPath);\n        return Ember.RSVP.resolve(\n            this.get('divisionLimit') ||\n                Ember.$.ajax({\n                    type: 'GET',\n                    url: limitUrl\n                })\n        ).then(divisionLimit => {\n            this.set('divisionLimit', divisionLimit);\n            return this.ajax(url, 'GET', {\n                data: {\n                    pageSize: divisionLimit,\n                    objectCount: objectCount ? true : false\n                }\n            });\n        });\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nimport { addPageAction } from 'connections-ui/utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nconst { computed, inject } = Ember;\n\nconst STRICT = true;\nconst EXPAND = 'externalOrganization,externalDataSources,division';\nconst PHONE_LOOKUP_EXPAND = 'contacts.externalOrganization,externalDataSources';\nconst TIME_OUT = 15000; // public API takes 10 seconds to time out - but adding a little more than 10 as fudge factor\nconst QUERY_MAX_LENGTH = 256;\nconst ORIGINATOR = 'connections-ui';\n\nexport default PurecloudAdapter.extend(LoggerMixin, RelateFeaturesMixin, {\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    relate: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n\n    namespace: 'api/v2',\n\n    defaultSerializer: 'externalcontacts/contact',\n\n    pathForType: function () {\n        return 'externalcontacts/contacts';\n    },\n\n    cannotViewExternalContacts: computed.not('permissions.hasExternalContactsViewContactAccess'),\n\n    createRecord(store, type, record) {\n        this.get('relate').clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${Ember.$.param({ expand: EXPAND })}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.get('relate').clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const addressFormat = this.get('addressformat');\n\n        let { searchTerm, pageNumber, pageSize, expandField, sortOrder, originator, subType } = queryParams;\n        const hasValidSearchTerm = searchTerm && typeof searchTerm === 'string';\n        const isValidPhoneNumber = addressFormat.isValidNumber(searchTerm, null, STRICT);\n\n        // only attempt to phone format search strings that look like phone numbers and contain only phone number like characters\n        const containsOnlyPhoneNumberChars = /^(\\+|\\d|\\)|\\(|\\.|-|\\s)+$/gim.test(searchTerm);\n\n        // only mutate search if not wrapped in \"\"\n        const isExactSearch = /^\"(.*)\"$/.test(searchTerm);\n        if (isExactSearch) {\n            // Log exact search occurrences for tracking usage\n            addPageAction('externalContactExactSearch', {\n                userId: this.get('session.user.id'),\n                orgId: this.get('session.org.guid')\n            });\n        } else if (containsOnlyPhoneNumberChars && isValidPhoneNumber) {\n            searchTerm = addressFormat.formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        if (subType) {\n            data.subType = subType;\n        }\n        let url = this.buildURL(type.modelName);\n\n        if (this.get('cannotViewExternalContacts')) {\n            // Logging a failure of the permissions check here is unnecessary because this is merely the ultimate\n            // backstop to catch unpermitted external contaxts service calls. It's the responsibility of the caller\n            // to handle the response and either log and/or alert the user.  See RELATE-1776\n            return Ember.RSVP.resolve({});\n        }\n\n        if (queryParams.useLookupService) {\n            // Use the \"reverse whitepages\" search endpoint\n            url = this.get('application').pcUri(`api/v2/externalcontacts/reversewhitepageslookup`);\n\n            data.lookupVal = searchTerm;\n            if (expandField) {\n                data.expand = PHONE_LOOKUP_EXPAND;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        } else {\n            if (hasValidSearchTerm) {\n                const term = encodeURI(searchTerm.replace('tel:', ''));\n\n                try {\n                    if (term.length > QUERY_MAX_LENGTH) {\n                        throw new Error('Query length limit encountered');\n                    }\n                } catch (error) {\n                    this.get('logger').error(\n                        `ACD: Attempted to send query larger than limit. From: ${originator} `,\n                        error\n                    );\n                }\n\n                data.q = decodeURI(term.substr(0, QUERY_MAX_LENGTH)); // remove characters beyond limit\n            }\n            if (pageNumber) {\n                data.pageNumber = pageNumber;\n            }\n            if (pageSize) {\n                data.pageSize = pageSize;\n            }\n            if (sortOrder) {\n                data.sortOrder = sortOrder;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        }\n        if (queryParams.bypassCache) {\n            return this.get('relate').findMatchingExternalContacts(\n                searchTerm,\n                pageNumber,\n                pageSize,\n                expandField,\n                originator\n            );\n        }\n        return this.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nconst EXPAND = 'externalDataSources';\n\nconst TIME_OUT = 10000;\nconst ORIGINATOR = 'connections-ui';\n\nexport default PurecloudAdapter.extend({\n    relate: Ember.inject.service(),\n\n    namespace: 'api/v2',\n    defaultSerializer: 'externalcontacts/organizations',\n\n    pathForType: function () {\n        return 'externalcontacts/organizations';\n    },\n\n    createRecord(store, type, record) {\n        this.get('relate').clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${Ember.$.param({ expand: EXPAND })}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT }); // msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n    },\n\n    updateRecord(store, type, snapshot) {\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName) + '/' + id;\n        const dataType = 'json';\n        const data = Object.assign(this.serialize(snapshot, { includeId: true }), { originator: ORIGINATOR });\n\n        return this.ajax(url, 'PUT', { dataType, data });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.get('relate').clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const url = this.buildURL(type.modelName);\n        let searchTerm = queryParams.searchTerm;\n        let pageNumber = queryParams.pageNumber;\n        let pageSize = queryParams.pageSize;\n        let originator = queryParams.originator;\n\n        let data = {};\n        data.expand = EXPAND;\n\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageNumber) {\n            data.pageNumber = pageNumber;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        return this.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n\n    urlForFindRecord() {\n        return this.get('application').pcV2Uri(`api/v2/geolocations/settings`);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    updateRecord(store, type, snapshot) {\n        var data = {};\n        var serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        var id = snapshot.id;\n        var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        if (url.indexOf('undefined') !== -1 || !this.get('session.person.guid')) {\n            // ignore this by resolving undefined. something trying to save geolocation when not authenticated\n            return Ember.RSVP.resolve();\n        }\n\n        return this.ajax(url, 'PATCH', { data: data });\n    },\n\n    urlForUpdateRecord(id) {\n        return this.get('application').pcV2Uri(`api/v2/users/${this.get('session.person.guid')}/geolocations/${id}`);\n    },\n\n    handleResponse(status) {\n        let response = this._super(...arguments);\n        if (response && response.name && response.name === 'Error') {\n            response.code = status;\n        }\n        return response;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    createRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            dataType: 'text'\n        });\n    },\n\n    deleteRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'DELETE');\n    },\n\n    saveBulk(roleId, subjectIds, divisionIds) {\n        const path = `api/v2/authorization/roles/${roleId}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            data: {\n                subjectIds,\n                divisionIds\n            }\n        });\n    },\n\n    ajaxOptions(url, type, options) {\n        // get the default RESTAdapter 'ajaxOptions'\n        let hash = this._super(url, type, options);\n        if (type === 'DELETE' || type === 'POST') {\n            hash.dataType = 'text';\n        }\n        return hash;\n    },\n\n    ajaxSuccess(jqXHR, data) {\n        if (typeof data === 'string') {\n            // return an empty object so the Serializer\n            // handles it correctly\n            return {};\n        } else {\n            return data;\n        }\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\n        return this._super(status, headers, data);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: `api/v2`,\n\n    urlForFindRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    urlForUpdateRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        let serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        let id = snapshot.id;\n        let url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        return this.ajax(url, 'PATCH', { data: data.groupPolicy });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    },\n\n    _baseUrl(guid) {\n        return `${this.get('host')}/${this.get('namespace')}/voicemail/groups/${guid}/policy`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n    store: Ember.inject.service(),\n\n    buildQuery() {\n        return {\n            fl: '*'\n        };\n    },\n\n    baseUrl() {\n        return this.get('application').pcV2Uri('api/v2/groups');\n    },\n\n    urlForFindRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    entityEndpoint(endpoint, type, id) {\n        return `${this.baseUrl()}/${id}/${endpoint}`;\n    },\n\n    urlForFindMany() {\n        return this.get('application').pcV2Uri('api/v2/profiles/groups');\n    },\n\n    urlForDeleteRecord(id) {\n        return `${this.baseUrl()}/${id}`;\n    },\n\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const traditional = true;\n        const data = Object.assign({}, data, { fields: '*' });\n        return this.ajax(url, 'GET', { data, traditional }).then(gProfile => {\n            if (snapshot.record.get('version') && gProfile.version !== snapshot.attr('version')) {\n                snapshot.record.set('version', gProfile.version);\n            }\n\n            /*\n                Is this a new Group?\n                When creating a group by default there is only one owner so\n                the member count will always be 1 on a create.  The bevy service\n                is eventually consistent so we may have a member count of 0\n                after our next GET.  Therefore we set the memberCount to 1\n                by default.\n            */\n            if (\n                gProfile.general.memberCount[0].value === 0 &&\n                gProfile.individuals.individuals.length === 0 &&\n                gProfile.owners.owners.length === 1\n            ) {\n                gProfile.general.memberCount[0].value = 1;\n            }\n\n            return gProfile;\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isn't key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        const groupSerializer = store.serializerFor(type.modelName);\n        groupSerializer.serializeIntoHash(data, type, snapshot);\n\n        if (this.get('session.features.groupProileNoIndividualsSave') && data.group.individuals) {\n            return this.get('store')\n                .findRecord('group-policy', data.group.guid)\n                .then(policy => {\n                    data = this.generateGroupProfilePayload(groupSerializer, data, policy);\n\n                    if (data[type.modelName]) {\n                        data = data[type.modelName];\n                    }\n                    return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n                });\n        } else {\n            data = this.generateGroupProfilePayload(groupSerializer, data);\n\n            if (data[type.modelName]) {\n                data = data[type.modelName];\n            }\n            return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n        }\n    },\n\n    deleteRecord(store, type, snapshot) {\n        let id = snapshot.id;\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), 'DELETE', {\n            dataType: 'text'\n        }).then(() => {\n            // After a delete using the public API we need to go get that deleted group\n            // to keep ember-data happy.\n            const jIdNumber = this.getJidIdNumber(snapshot.record.data.contactInfo.chat[0].value.jid);\n            return this.getDeletedGroup(jIdNumber);\n        });\n    },\n\n    ajaxOptions(url, type) {\n        const hash = this._super(...arguments);\n        // Our apis are silly...\n        if (type && type.toLowerCase() === 'delete') {\n            hash.dataType = 'text';\n        }\n        return hash;\n    },\n\n    findMany(store, type, ids, snapshots) {\n        const url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n\n        let uuids = '';\n        let jIds = '';\n        let urlWithAppendedIds = '';\n        let urlDeletedWithAppendedIds = `${this.baseUrl()}/bulk/deleted?jabberId=`;\n\n        ids.forEach(id => {\n            // accepts jIds or ids\n            if (id.indexOf('-') > -1) {\n                uuids = uuids.concat(id, ',');\n            } else {\n                id = this.getJidIdNumber(id);\n                jIds = jIds.concat(id, ',');\n            }\n        });\n\n        if (uuids.length > 0) {\n            uuids = uuids.substring(0, uuids.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('id=', uuids);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n        } else if (jIds.length > 0) {\n            jIds = jIds.substring(0, jIds.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('jabberId=', jIds);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n            urlDeletedWithAppendedIds = urlDeletedWithAppendedIds.concat(jIds);\n        } else {\n            urlWithAppendedIds = `${url}`;\n        }\n\n        /*\n            When using public API / bevy deleted groups are not returned yet they are needed.\n            We need to make speical request to get those deleted groups.  WebRtc provides a list\n            that is used to fill out is roster...in the form of jabberIds.  As part of this\n            we need to evaluate the jabberIds that are missing in the initial GET request,\n            find the missing deleted ones and make a request to get those deleted groups.\n        */\n        if (jIds.length > 0) {\n            return this.ajax(urlWithAppendedIds, 'GET').then(activeResults => {\n                return this.getDeletedGroups(urlDeletedWithAppendedIds, activeResults);\n            });\n        }\n\n        return this.ajax(urlWithAppendedIds, 'GET');\n    },\n\n    getDeletedGroups(deleteUrl, groupsResults) {\n        return new Ember.RSVP.Promise(resolve => {\n            this.ajax(deleteUrl, 'GET').then(deletedGroups => {\n                deletedGroups.entities.forEach(g => {\n                    groupsResults.entities.push(this.normalizeDeletedGroup(g));\n                });\n                return resolve(groupsResults);\n            });\n        });\n    },\n\n    getDeletedGroup(id) {\n        const getUrl = `${this.baseUrl()}/bulk/deleted?jabberId=${id}`;\n        return new Ember.RSVP.Promise(resolve => {\n            this.ajax(getUrl, 'GET').then(deletedGroup => {\n                return resolve(deletedGroup);\n            });\n        });\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findGroupMembership(id, params) {\n        const query = params;\n\n        if (typeof params.offset === 'number' && params.limit) {\n            query.pageNumber = 1 + Math.ceil(params.offset / params.limit);\n            query.pageSize = params.limit;\n        }\n        const url = `${this.baseUrl()}/${id}/members`;\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    generateGroupProfilePayload(groupSerializer, json, vmPolicy) {\n        let gProfile = json.group;\n\n        gProfile.organizationId = this.get('session.org.guid');\n        gProfile.id = gProfile.guid;\n        delete gProfile.guid;\n\n        if (gProfile.mt) {\n            delete gProfile.mt;\n        }\n\n        if (gProfile.meta) {\n            delete gProfile.meta;\n        }\n\n        delete gProfile.membershipDraft;\n\n        if (gProfile.general.needsCommit) {\n            delete gProfile.general.needsCommit;\n        }\n\n        if (gProfile.general.exchangeSync) {\n            delete gProfile.general.exchangeSync;\n        }\n\n        if (gProfile.general.links && gProfile.general.links.length > 0) {\n            groupSerializer.cleanGroupLinkIds(gProfile.general.links);\n        }\n\n        if (\n            gProfile.contactInfo.email &&\n            gProfile.contactInfo.email.length > 0 &&\n            gProfile.contactInfo.email[0].value == ''\n        ) {\n            delete gProfile.contactInfo.email;\n        }\n\n        if (!Array.isArray(gProfile.contactInfo.groupNumber)) {\n            delete gProfile.contactInfo.groupNumber;\n        }\n\n        if (gProfile.contactInfo.phone) {\n            delete gProfile.contactInfo.phone;\n        }\n\n        if (gProfile.contactInfo.groupNumber && gProfile.contactInfo.groupNumber.length > 0) {\n            if (gProfile.contactInfo.groupNumber[0].labelKey) {\n                delete gProfile.contactInfo.groupNumber[0].labelKey;\n            }\n\n            if (!this.hasGroupPhone(gProfile.contactInfo.groupNumber[0])) {\n                delete gProfile.contactInfo.groupNumber;\n            }\n        }\n\n        // The members API already adds individuals to groups,  we\n        // do not send the individuals to keep the request size down.\n        if (this.get('session.features.groupProileNoIndividualsSave') && gProfile.individuals) {\n            // The exception is when a voicemail policy of SEQUENTIAL is in place,\n            // then the individuals must be sent to maintain the order of individuals.\n            if (!vmPolicy || vmPolicy.data.groupAlertType !== 'SEQUENTIAL') {\n                delete gProfile.individuals;\n            }\n        }\n\n        return gProfile;\n    },\n\n    hasGroupPhone(numberInfo) {\n        const hasNumber = numberInfo.value && numberInfo.value.number && numberInfo.value.number !== '';\n        const hasExtension = numberInfo.value && numberInfo.value.extension && numberInfo.value.extension !== '';\n\n        if (hasNumber || hasExtension) {\n            return true;\n        }\n\n        return false;\n    },\n\n    getJidIdNumber(jid) {\n        return jid.indexOf('@') > -1 ? jid.split('@')[0] : jid;\n    },\n\n    normalizeDeletedGroup(deletedGroup) {\n        deletedGroup.general = {\n            name: [\n                {\n                    value: deletedGroup.name,\n                    labelKey: 'name'\n                }\n            ],\n            groupType: [\n                {\n                    value: deletedGroup.type === 'offical' ? 'groups.offical' : deletedGroup.type,\n                    labelKey: 'groupType'\n                }\n            ],\n            memberCount: [\n                {\n                    value: deletedGroup.memberCount,\n                    labelKey: 'memberCount'\n                }\n            ]\n        };\n        deletedGroup.contactInfo = {\n            chat: [\n                {\n                    value: {\n                        jid: deletedGroup.chat.jabberId\n                    },\n                    labelKey: 'chat'\n                }\n            ]\n        };\n        delete deletedGroup.name;\n        delete deletedGroup.chat;\n        delete deletedGroup.groupType;\n        delete deletedGroup.memberCount;\n\n        return deletedGroup;\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/responsemanagement/libraries';\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { BASE_LOCATION_FIELDS } from '../models/location';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            expand: BASE_LOCATION_FIELDS.join(',')\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('namespace')}/locations/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.baseUrl(id);\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return this.baseUrl(id);\n    },\n\n    urlForHasMany(id) {\n        return `${this.baseUrl(id)}/sublocations`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const query = this.buildQuery(snapshot);\n        return Ember.RSVP.hash({\n            location: this.ajax(url, 'GET', { data: query }),\n            floors: this.ajax(this.urlForHasMany(id), 'GET', { data: query }).catch(() => Ember.RSVP.resolve({}))\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    init() {\n        this._super(...arguments);\n    },\n\n    urlForFindAll() {\n        const userId = this.get('session.person.guid');\n        return `${this.get('host')}/${this.get('namespace')}/users/${userId}/meetings`;\n    },\n\n    urlForFindRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (meeting) {\n            const meetingId = meeting.id;\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n    },\n\n    urlForQuery() {\n        return this.urlForFindAll();\n    },\n\n    urlForUpdateRecord(id, modelName, snapshot) {\n        if (!!Ember.get(snapshot, 'adapterOptions.updateSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n        const meetingId = snapshot.attr('meeting').id;\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    },\n\n    urlForCreateRecord() {\n        return `${this.get('host')}/${this.get('namespace')}/meetings`;\n    },\n\n    urlForDeleteRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (!meeting) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n\n        const meetingId = meeting.id;\n        if (!!Ember.get(snapshot, 'adapterOptions.deleteSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nimport { batchEntityIds } from '../services/store';\nimport { BASE_PERSON } from '../models/person';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    ajaxService: inject.service('ajax'),\n    session: inject.service(),\n    application: inject.service(),\n    integrationsPresenceSvc: inject.service('integrations-presence'),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('namespace')}/users/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindMany() {\n        return `${this.get('host')}/${this.get('namespace')}/profiles/users`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, options) {\n        const url = this.buildURL(type.modelName, id, options, 'findRecord');\n        const query = this.buildQuery(options);\n\n        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            query.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            query.expand = `${query.expand},integrationPresence`;\n        }\n\n        return this.ajax(url, 'GET', { data: query });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    // allows looking up by jid or by guid, but not both\n    findMany(store, type, ids, snapshotsOrOptions) {\n        const url = this.buildURL(type.modelName, ids, snapshotsOrOptions, 'findMany');\n\n        const guids = ids.filter(id => id.indexOf('@') === -1);\n        const jids = ids.filter(id => id.indexOf('@') > -1);\n\n        if (jids.length > 0 && guids.length > 0) {\n            return Ember.RSVP.reject(new Error('Mixed jid and guid person lookup'));\n        }\n        if (jids.length > 0) {\n            return this._findMany(url, jids, 'jids', snapshotsOrOptions);\n        }\n        if (guids.length > 0) {\n            return this._findMany(url, guids, 'guids', snapshotsOrOptions);\n        }\n\n        return Ember.RSVP.reject(new Error('findMany person without ids'));\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findSuperiors(store, id, params) {\n        const url = `${this.baseUrl(id)}/superiors`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(superiors => {\n            if (!superiors || !superiors.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', superiors.mapBy('id'));\n        });\n    },\n\n    findDirectReports(store, id, params) {\n        const url = `${this.baseUrl(id)}/directreports`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(directReports => {\n            if (!directReports || !directReports.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', directReports.mapBy('id'));\n        });\n    },\n\n    _findMany(url, ids, type, options) {\n        let key = 'id';\n        if (type === 'jids') {\n            key = 'jid';\n        }\n        let baseRequestData = {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n        let batchAmount = 25;\n        // use the provided presence source\n        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            baseRequestData.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            baseRequestData.expand = `${baseRequestData.expand},integrationPresence`;\n        }\n        const promises = batchEntityIds(ids, batchAmount).map(ids => {\n            const requestData = Object.assign({}, baseRequestData, {\n                [key]: ids.join(',')\n            });\n            if (this.get('session.features.enableUIAjaxRetryHeader')) {\n                let promise = this.get('ajaxService').raw(url, {\n                    method: 'GET',\n                    contentType: 'application/json',\n                    data: requestData,\n                    dataType: 'json',\n                    retry: true\n                });\n                return promise\n                    .then(({ response }) => Ember.RSVP.resolve(response))\n                    .catch(({ response }) => Ember.RSVP.reject(response));\n            } else {\n                return this.ajax(url, 'GET', {\n                    data: requestData\n                });\n            }\n        });\n        return Ember.RSVP.all(promises).then(res => {\n            let data = {\n                entities: res.map(d => d.entities).flat()\n            };\n            if (usingIntegrationSource) {\n                data.meta = {\n                    integrationSource:\n                        options && options.adapterOptions && options.adapterOptions.integrationPresenceSource,\n                    usingIntegrationSource: true\n                };\n            }\n            return data;\n        });\n    },\n\n    _loadActivities(id) {\n        const url = `${this.get('host')}/${this.get('namespace')}/users/${id}`;\n        return this.ajax(url, 'GET', {\n            data: {\n                expand: BASE_PERSON.expand\n            }\n        });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from './purecloud';\nconst { computed, inject } = Ember;\n\nexport default PurecloudAdapter.extend({\n    session: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery(snapshot) {\n        let query = {\n            state: 'deleted'\n        };\n\n        if (snapshot.adapterOptions && snapshot.adapterOptions.expand) {\n            query.expand = snapshot.adapterOptions.expand;\n        }\n\n        return query;\n    },\n\n    urlForQuery() {\n        if (this.get('permissions.canTargetUserSearchOutsideOfDivision')) {\n            return `${this.get('host')}/${this.namespace}/users/search/conversation/target`;\n        } else {\n            return `${this.get('host')}/${this.namespace}/users/search`;\n        }\n    },\n\n    findBelongsTo(store, snapshot, link, relationship) {\n        // We only support person belongsTo relationship for profiles\n        const adapter = this.store.adapterFor(relationship.type);\n        return adapter.findRecord(store, store.modelFor('person'), snapshot.id, snapshot);\n    },\n\n    buildURL(modelName, id, modelClass, requestType, snapshotOrQuery) {\n        if (requestType === 'query') {\n            return this.urlForQuery(id, 'public-api-user', snapshotOrQuery);\n        }\n        const host = this.get('host') ? this.get('host') : '';\n        return `${host}/${this.namespace}/${this.pathForType('users')}/${id}`;\n    },\n\n    /**\n     * Overridden to support our custom seach API\n     * This is copied directly from the ember-data codebase:\n     * https://github.com/emberjs/data/blob/v2.16.0/addon/adapters/rest.js#L541\n     */\n    query(store, type, query) {\n        let url = this.buildURL(type.modelName, null, null, 'query', query);\n        return this.ajax(url, 'POST', { data: query });\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    defaultSerializer: 'purecloud',\n\n    host: '/platform',\n    namespace: 'api',\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        if (payload && typeof payload === 'object') {\n            return [\n                {\n                    status: `${status}`,\n                    title: payload.code,\n                    detail: {\n                        message: payload.message,\n                        contextId: payload.contextId\n                    }\n                }\n            ];\n        }\n\n        return [{ status, payload }];\n    },\n\n    ajaxOptions(url, type, hash) {\n        // https://github.com/emberjs/data/issues/1398\n        // https://github.com/emberjs/data/blob/v2.7.0/addon/adapters/rest.js#L1065\n        hash = this._super(url, type, hash);\n\n        if (type === 'DELETE') {\n            hash.dataType = 'text';\n        }\n\n        return hash;\n    },\n\n    // TODO: replace this private function with request type hooks\n    buildURL(modelName, id, snapshot, requestType) {\n        if (requestType === 'query' && modelName === 'voicemail-message') {\n            return this._super(...arguments);\n        }\n\n        const objId = id ? `/${id}` : '';\n        const path = `${this.get('namespace')}/${this.pathForType(modelName)}${objId}`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return url;\n    },\n\n    updateRecord(store, type, record) {\n        var data = this.serialize(record, {\n            includeId: true\n        });\n        var id = Ember.get(record, 'id');\n\n        if (type.modelName === 'voicemail-message') {\n            return this.ajax(this.buildURL(type.modelName, id), 'PATCH', { data: data });\n        }\n        return this.ajax(this.buildURL(type.modelName, id), 'PUT', { data: data });\n    },\n\n    deleteRecord(store, type, record) {\n        const id = Ember.get(record, 'id');\n        const url = this.buildURL(type.modelName, id);\n        return this.ajax(url, 'DELETE', { dataType: 'text' });\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from './purecloud';\n\nconst TARGET_QUEUE_SEARCH_PERMISSION = 'conversation:communication:target';\nconst DIVISION_PERMITTED_URL = 'api/v2/authorization/divisionspermitted/paged/me';\nconst DIVISION_LIMIT_URL = 'api/v2/authorization/divisions/limit';\n\nconst { inject, computed, RSVP } = Ember;\n\nexport default PurecloudAdapter.extend({\n    application: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    divisionLimit: null,\n\n    pathForType: function (type) {\n        switch (type) {\n            case 'divisionAgnostic':\n                return 'routing/queues/divisionviews';\n            case 'myQueues':\n                return 'routing/queues/me';\n            default:\n                return 'routing/queues';\n        }\n    },\n\n    async query(store, type, query) {\n        let fetchDivisions = false;\n        let path = this.buildURL(type);\n        query.name = query.name ? query.name.toLowerCase() : '';\n\n        if (query.divisionAgnostic) {\n            path = this.buildURL('divisionAgnostic');\n            delete query.divisionAgnostic;\n            if (this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n                fetchDivisions = true;\n            }\n        } else if (!this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n            // Handle case where permission is actually false\n            // When permission is false revert back to fetching across all divisions\n            path = this.buildURL('divisionAgnostic');\n            delete query.divisionAgnostic;\n        }\n\n        if (query.myQueuesOnly) {\n            path = `${this.buildURL('myQueues')}`;\n            fetchDivisions = false;\n        }\n\n        if (fetchDivisions) {\n            const response = await this.fetchDivisionsForTargetQueueSearch();\n            const results = response && response.entities ? response.entities : [];\n            const divisionIds = results.map(entity => entity.id);\n            if (divisionIds.length > 0) {\n                query.divisionId = divisionIds.join(',');\n            }\n        }\n\n        return this.ajax(path, 'GET', { data: query });\n    },\n\n    getDivisionLimits() {\n        const url = this.get('application').pcV2Uri(DIVISION_LIMIT_URL);\n        return RSVP.resolve(this.get('divisionLimit') || this.ajax(url, 'GET'));\n    },\n\n    async fetchDivisionsForTargetQueueSearch() {\n        const divisionLimit = await this.getDivisionLimits();\n        const pageSize = divisionLimit || 25;\n        this.set('divisionLimit', pageSize);\n        const url = this.get('application').pcV2Uri(DIVISION_PERMITTED_URL);\n        return this.ajax(url, 'GET', {\n            data: {\n                pageSize,\n                permission: TARGET_QUEUE_SEARCH_PERMISSION\n            }\n        });\n    },\n\n    findRecord(store, type, id, snapshot) {\n        if (snapshot.adapterOptions && snapshot.adapterOptions.divisionAware) {\n            const path = this.buildURL('divisionAgnostic');\n            return this.ajax(path, 'GET', { data: { id } });\n        }\n        return this._super(...arguments);\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/userrecordings';\n    },\n\n    findAll: function (store, type) {\n        return this.ajax(this.buildURL(type.modelName) + '?expand=conversation', 'GET');\n    }\n});\n","define(\"connections-ui/adapters/recording\", [\"exports\", \"ember-purecloud-components/adapters/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import PurecloudAdapter from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudAdapter.extend({\n    defaultSerializer: 'response',\n\n    pathForType: function () {\n        return 'v2/responsemanagement/responses';\n    },\n\n    query: function (store, type, query) {\n        return this.ajax(`${this.buildURL(type)}/query`, 'POST', { data: query });\n    },\n\n    findMany: function (store, type, ids, pageNumber, pageSize) {\n        const currentPage = pageNumber || 1,\n            currentPageSize = pageSize || 25;\n\n        const query = {\n            pageSize: currentPageSize,\n            pageNumber: currentPage,\n            libraryId: _.head(ids)\n        };\n\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n","import ApplicationAdapter from './application';\nimport Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default ApplicationAdapter.extend({\n    application: inject.service(),\n\n    buildURL(type, id) {\n        const modelEndpoint = this.pathForType(type);\n        const path = `api/v2/authorization/${modelEndpoint}` + id ? `/${id}` : '';\n        return this.get('application').pcV2Uri(path);\n    },\n\n    findAll() {\n        const initialPage = 1;\n        const pageSize = 100;\n        let records = [];\n        let aggregatePayload;\n        return this._getPage(initialPage, pageSize)\n            .then(result => {\n                aggregatePayload = result;\n                records.concat(result.entities);\n                let promises = [];\n                for (let page = 2; page <= result.pageCount; page++) {\n                    promises.push(this._getPage(page, pageSize));\n                }\n                return Ember.RSVP.all(promises);\n            })\n            .then(results => {\n                results.forEach(result => {\n                    aggregatePayload.entities = aggregatePayload.entities.concat(result.entities);\n                });\n                aggregatePayload.entities.sort(function (roleA, roleB) {\n                    if (roleA.name < roleB.name) {\n                        return -1;\n                    } else if (roleA.name > roleB.name) {\n                        return 1;\n                    } else {\n                        return 0;\n                    }\n                });\n                return aggregatePayload;\n            });\n    },\n\n    _getPage(pageNumber, pageSize) {\n        const path = `api/v2/authorization/roles?pageSize=${pageSize}&pageNumber=${pageNumber}&userCount=false`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'GET');\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/stations';\n    }\n});\n","import ApplicationAdapter from './application';\n\nvar UserAdapter = ApplicationAdapter.extend({\n    findQuery: function (store, type, query) {\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n\nexport default UserAdapter;\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType() {\n        return 'v2/voicemail/messages';\n    },\n\n    urlForQuery() {\n        return `${this.host}/${this.namespace}/v2/voicemail/search`;\n    },\n\n    updateRecord() {\n        return this._super(...arguments);\n    },\n\n    // Override private function (copying default impl)\n    // so we can 'POST' to the API\n    // TODO: Remove ds-improved-ajax lands\n    query(store, type, query) {\n        const url = this.buildURL(type.modelName, null, null, 'query', query);\n\n        if (this.sortQueryParams) {\n            query = this.sortQueryParams(query);\n        }\n\n        return this.ajax(url, 'POST', { data: query });\n    },\n\n    // Use this in place of:\n    //   methodForRequest\n    //   dataForRequest\n    // TODO: Remove ds-improved-ajax lands\n    sortQueryParams(query) {\n        return {\n            pageSize: query.pageSize || 15,\n            pageNumber: query.pageNumber || 1,\n            sortOrder: 'DESC',\n            sortBy: 'createdTime',\n            query: [\n                {\n                    type: 'EXACT',\n                    fields: ['owner'],\n                    value: 'ALL'\n                },\n                {\n                    type: 'EXACT',\n                    fields: ['deleted'],\n                    value: 'false'\n                }\n            ]\n        };\n    }\n});\n","import Ember from 'ember';\nimport Resolver from './resolver';\nimport defineModifier from 'ember-concurrency-test-waiter/define-modifier';\nimport loadInitializers from 'ember-load-initializers';\nimport config from './config/environment';\nimport _ from 'lodash';\n\nimport { registerElements } from 'genesys-spark-components';\nregisterElements();\n\n// Polyfills for iframe-coordinator\nimport 'custom-event-polyfill/polyfill';\n/* eslint-disable no-unused-vars */\n// These imports shouldn't need to be assigned to variables, but without\n// importing this way, babel 6 will load them in after the iframe-coordinator\n// module, defeating the point of the polyfills.\nimport shim from '@webcomponents/custom-elements/src/native-shim';\nimport elements from '@webcomponents/custom-elements';\n/* eslint-enable no-unused-vars */\nimport iframeCoordinator from 'iframe-coordinator';\n\n// Enable the iframe-coordinator custom elements\niframeCoordinator.registerCustomElements();\n\nimport { defineCustomElements } from '@genesys/genesys-cloud-webcomponents/dist/loader';\ndefineCustomElements();\n\n/* eslint-disable */\n\nimport HostedContext from './utils/hosted-context';\n\n/* eslint-enable */\n\nif (config.APP && config.APP.LOG_RUNLOOP_STACKTRACE) {\n    Ember.run.backburner.DEBUG = true;\n}\n\nif (config.APP && config.APP.LOG_BINDINGS) {\n    Ember.LOG_BINDINGS = true;\n}\n\nconst { inject, Application } = Ember;\n\n// allows ember concurrency tasks to use withTestWaiter()\ndefineModifier();\n\nconst App = Application.extend(config.APP, {\n    cookies: inject.service('cookies'),\n    stashLogger: inject.service('stash-logger'),\n    applicationService: inject.service('application'),\n    customEvents: {\n        // Pagination events from inbox-v2\n        pageChanged: 'pageChanged',\n        itemsPerPageChanged: 'itemsPerPageChanged',\n        // GCW Events\n        favoriteEvent: 'favoriteEvent',\n        contactEvent: 'contactEvent',\n        navigateToProfileEvent: 'navigateToProfileEvent'\n    },\n\n    modulePrefix: config.modulePrefix,\n    podModulePrefix: config.podModulePrefix,\n    Resolver,\n\n    engines: {\n        emberEngineCustomFields: {\n            dependencies: {\n                services: [\n                    'application',\n                    'intl',\n                    'session',\n                    'stash-logger',\n                    'ajax',\n                    'store',\n                    'notification',\n                    'permissions',\n                    'schema'\n                ],\n                externalRoutes: {\n                    personDetail: 'person.detail',\n                    admin: 'admin'\n                }\n            }\n        }\n    },\n\n    entityTypes: ['person', 'group'], //TODO - 10/12/14 - Is this used anymore?\n\n    currentRouteName: null, // Set by ApplicationController\n\n    debug: false,\n\n    init() {\n        this.initVersion();\n        this.initContext();\n        return this._super(...arguments);\n    },\n\n    isImpersonating: Ember.computed('session.person.id', function () {\n        var proxyPersonId = this.get('cookies').read('proxyPerson');\n\n        if (proxyPersonId) {\n            return proxyPersonId === this.get('session.person.id');\n        }\n\n        return false;\n    }),\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (e) {\n            return true;\n        }\n    },\n\n    initVersion() {\n        Ember.libraries.register('PureCloud Collaborate', this.get('semver'));\n\n        if (!Ember.ENV.LOG_VERSION) {\n            Ember.Logger.debug('PureCloud Collaborate', this.get('semver'));\n        }\n\n        const libs = this.libs || {};\n        _.forOwn(libs, (version, key) => {\n            Ember.libraries.register(key, version);\n            if (!Ember.ENV.LOG_VERSION) {\n                Ember.Logger.debug(key, version);\n            }\n        });\n    },\n\n    initContext() {\n        this.set('context', 'directory');\n    },\n\n    // Debugging utility functions...not for use in app logic\n    controllerFor(name) {\n        return this.instance.lookup(`controller:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    serviceFor(name) {\n        return this.instance.lookup(`service:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    componentFor(id) {\n        return this.instance.lookup('-view-registry:main')[id];\n    },\n\n    listAsync() {\n        this.resolveRegistration('util:debug-backburner').logTimerQueue();\n        this.resolveRegistration('util:debug-rsvp').logPendingPromises();\n    },\n\n    promiseStackFor(id) {\n        this.resolveRegistration('util:debug-rsvp').lookupPromiseStack(id);\n    }\n});\n\nloadInitializers(App, config.modulePrefix);\n\nError.stackTraceLimit = 100;\n\nexport default App;\n","export default Ember.HTMLBars.template({\"id\":\"d+F87FRd\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"application-loading\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/application-loading/template.hbs\"}});","define(\"connections-ui/attach-media-stream/util\", [\"exports\", \"ember-webrtc-components/attach-media-stream/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _util.default;\n    }\n  });\n});\n","define(\"connections-ui/audio-visualizer/component\", [\"exports\", \"ember-audio-visualizer/components/audio-visualizer/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Base from 'ember-simple-auth/authenticators/base';\nimport _ from 'lodash';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from '../services/session';\nimport { Client } from '@genesys/gc-mfe-auth';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { RSVP } = Ember;\n\nconst authLoginPath = '/oauth/authorize';\nconst oauthStoreParams = ['access_token', 'token_type', 'expires_in'];\nconst oauthStoreProps = [...oauthStoreParams, 'token_expiry_time_millis', 'token_expiry_time_iso_string'];\nconst authLogoutPath = '/logout';\n\nconst AUTH_COOKIE_NAME = 'ININ-Auth-Api';\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    cookies: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    purecloudOauth: Ember.inject.service(),\n    applicationService: Ember.inject.service('application'),\n\n    authClient: null,\n\n    // Check existing authentication\n    async restore(data) {\n        if (window === window.parent) {\n            // Not in an iframe. For the standalone mode for development.\n            var accessToken = null;\n            if (data && typeof data === 'object') {\n                accessToken = data.access_token;\n            }\n\n            if (!accessToken) {\n                throw new Error('No token');\n            } else {\n                await this._establishLocalSession(accessToken);\n                await _.pick(data, oauthStoreProps);\n            }\n        } else {\n            // In an iframe, in WebDirectory?\n            if (!this.authClient) {\n                const clientId = this.get('oauthProps.clientId');\n                this.authClient = new Client(clientId);\n            }\n\n            data.token_type = 'bearer';\n            try {\n                data.access_token = await this.authClient.getToken(); // Get the token from the host.\n            } catch (error) {\n                this.get('stashLogger').error(\n                    `Unable to get token from host iframe: ${error && error.message ? error.message : '?'}`\n                );\n                addPageAction('sessionBootstrapFailure', {\n                    failedStep: 'getTokenFailure'\n                });\n                throw error;\n            }\n            await this._establishLocalSession(data.access_token);\n            await _.pick(data, oauthStoreProps);\n        }\n    },\n\n    // Attempt user authentication\n    authenticate(options) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (options && (options.error === 'access_denied' || options.scope)) {\n                // Rejecting if the user didn't grant access\n                // Also rejecting if the user granted limited states (for now)\n\n                // No need to redirect to oauth; action will handle\n                reject({ reason: 'noAccess' });\n            } else if (options && options.access_token) {\n                this._establishLocalSession(options.access_token)\n                    .then(() => {\n                        // Internal OAuth2 Auth Successful\n\n                        if (options.state) {\n                            this.get('purecloudOauth').deserializeRestoreState(options.state);\n                        }\n\n                        /* pick oauth props from the url */\n                        const finalOptions = _.pick(options, oauthStoreParams);\n\n                        /* add expiry time before persisting to storage */\n                        if (finalOptions && finalOptions.expires_in) {\n                            finalOptions.token_expiry_time_millis =\n                                this._getCurrMillis() + finalOptions.expires_in * 1000;\n                            finalOptions.token_expiry_time_iso_string = new Date(\n                                finalOptions.token_expiry_time_millis\n                            ).toISOString();\n                        }\n\n                        resolve(finalOptions);\n                    })\n                    .catch(reason => {\n                        if (reason && reason.type === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                            reject({\n                                reason: reason.type,\n                                failedStep: reason.failedStep,\n                                status: reason.status\n                            });\n                            return;\n                        }\n\n                        reject({ reason: 'localSessionFailure' });\n                    });\n            } else {\n                // Initiate OAuth2 Authentication\n                try {\n                    let authUrl = this._buildAuthUrl(true, options ? options.state : undefined);\n\n                    reject({\n                        authUrl,\n                        reason: 'noToken'\n                    });\n                } catch (err) {\n                    reject({\n                        reason: err && err.message ? err.message : 'invalidAuthEndpoint'\n                    });\n                }\n            }\n        });\n    },\n\n    // Logout\n    invalidate() {\n        // If and when the returned promise is resolved, the token store will be cleaned automatically by ESA\n        return new RSVP.Promise(resolve => {\n            RSVP.allSettled([this._destroyLocalSession(), this._super()]).then(() => {\n                const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n                if (authorizer) {\n                    authorizer.deauthorizeAllDomainRequests();\n                }\n\n                resolve();\n            });\n        });\n    },\n\n    /**\n     * Extracts the authData from the provided string (or defaults to window.location.hash)\n     *\n     * @returns an object containing the decoded values from the escaped, encoded,\n     * query string style hash params returned by the PC OAuth endpoint.\n     */\n    extractAuthData(hash) {\n        if (typeof hash === 'undefined' && window && window.location) {\n            hash = window.location.hash;\n        }\n\n        if (!hash) {\n            return {};\n        }\n\n        hash = decodeURI(hash.trim());\n        if (hash.indexOf('#') === 0) {\n            hash = hash.slice(1);\n        }\n\n        return hash.split('&').reduce((accumulator, currPair) => {\n            let tokens = currPair.split('=').map(currToken => window.decodeURIComponent(currToken));\n\n            if (tokens[0] && tokens[0].trim().length > 0) {\n                accumulator[tokens[0]] = tokens.length > 1 ? tokens[1] : undefined;\n            }\n\n            return accumulator;\n        }, {});\n    },\n\n    buildAuthorizeUrl(stateParam, org) {\n        return this._buildAuthUrl(true, stateParam, org);\n    },\n\n    buildLogoutUrl() {\n        return this._buildAuthUrl(false);\n    },\n\n    /**\n     * Clean any browser storage (cookies, localStorage, etc) that is not\n     * managed by ESA.\n     */\n    cleanCustomBrowserStorage() {\n        // TECHDEBT: Clear any legacy, pre-oauth, pre-PC cookies\n        this.get('cookies').clear(this.get('application.cookies.session'));\n    },\n\n    _establishLocalSession(accessToken) {\n        if (this.localSessionDeferred) {\n            return this.localSessionDeferred.promise;\n        }\n\n        this.localSessionDeferred = RSVP.defer();\n\n        const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n        if (authorizer) {\n            authorizer.authorizeAllDomainRequests({ access_token: accessToken });\n        } else {\n            Ember.Logger.error('Failed to locate authorizer in container');\n            this.localSessionDeferred.reject('missingAuthorizer');\n        }\n\n        this.set('session.accessToken', accessToken);\n        this.get('session')\n            .authenticateWithSession()\n            .then(() => {\n                return this.get('session.publicApiUser') ? true : RSVP.reject('unknownSessionId');\n            })\n            .catch(details => {\n                if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                    Ember.Logger.warn('Session Bootstrap failed for superuser.  Granting access but please diagnose.');\n                    return true;\n                }\n\n                return RSVP.reject(details);\n            })\n            .then(() => {\n                // Remove them all for good measure\n                this.removeAuthCookie();\n                this.localSessionDeferred.resolve();\n            })\n            .catch(async details => {\n                // Attempt to log the error immediately; unless we know the access token is invalid\n                if (\n                    !details ||\n                    details.type !== SESSION_BOOTSTRAP_ERROR_TYPE ||\n                    (!details.legacyInvalidSessionToken && details.status !== 403)\n                ) {\n                    await this.ensureLogsSent();\n                }\n\n                this.set('session.hasAppAccess', false);\n                this.set('session.accessToken', null);\n                this.cleanCustomBrowserStorage();\n\n                authorizer.deauthorizeAllDomainRequests();\n                this.localSessionDeferred.reject(details);\n            });\n\n        return this.localSessionDeferred.promise;\n    },\n\n    _destroyLocalSession() {\n        return RSVP.resolve()\n            .then(() => {\n                if (!this.get('session.features.disassociate-redux')) {\n                    return this.get('ajax').ajaxGet('/api/v1/logout', { dataType: 'text' });\n                }\n            })\n            .finally(() => {\n                this.set('session.accessToken', null);\n                this.cleanCustomBrowserStorage();\n            });\n    },\n\n    _buildAuthUrl(login, stateParamValue, targetOrg) {\n        const baseAuthUri = this.get('applicationService.authUri');\n        const clientId = this.get('oauthProps.clientId');\n\n        if (!baseAuthUri || baseAuthUri.trim().length === 0) {\n            throw new Error('missingAuthUri');\n        }\n\n        if (!clientId || clientId.trim().length === 0) {\n            throw new Error('unknownClientId');\n        }\n\n        var oauthParams = {\n            response_type: 'token',\n            client_id: clientId,\n            enableRegionSwitching: true\n        };\n\n        // redirect_uri param\n        let redirectUri = window.location.origin;\n        if (!redirectUri) {\n            redirectUri = `${window.location.protocol}//${window.location.host}`;\n        }\n\n        /*\n         * Force pathname to include a trailing slash.  If not, safari will not\n         * recognize the hash params in the redirect.\n         *\n         * Good:                                   Bad:\n         * https://foo.com/#access_token=...       https://foo.com#access_token=...\n         * https://foo.com/bar/#access_token=...   https://foo.com/bar#access_token=...\n         *\n         * http://stackoverflow.com/questions/18663410/safari-ignoring-removing-hashatags-when-clicking-hyperlinks\n         * https://bugs.webkit.org/show_bug.cgi?id=24175\n         */\n        let pathname = window.location.pathname;\n        const lastIndex = pathname.length - 1;\n\n        if (lastIndex >= 0 && pathname.charAt(lastIndex) !== '/') {\n            pathname += '/';\n        }\n        redirectUri += pathname;\n        oauthParams.redirect_uri = redirectUri;\n\n        // state param\n        if (login && stateParamValue) {\n            oauthParams.state = stateParamValue;\n        }\n\n        // target used for proxy login\n        if (targetOrg) {\n            oauthParams.target = targetOrg;\n        }\n\n        // Build Auth URL\n        let authUrl = baseAuthUri;\n        authUrl += login === true ? authLoginPath : authLogoutPath;\n\n        if (authUrl.indexOf('?') === -1) {\n            authUrl += '?';\n        } else {\n            authUrl += '&';\n        }\n\n        authUrl += Ember.$.param(oauthParams, true);\n\n        return authUrl;\n    },\n\n    /**\n     * These cookies are extremely legacy and pre-date even oauth.\n     * Our backend services \"should not\" still be honoring them but we'll continue to force delete them in case a legacy client logs in.\n     * If/When ININ-Auth-Api support is fully removed, we should be safe to finally kill this off\n     */\n    removeAuthCookie() {\n        const cookies = this.get('cookies');\n        // Clean up any previously-set, now invalid cookies\n        cookies.clear(AUTH_COOKIE_NAME);\n        cookies.clear(AUTH_COOKIE_NAME, { path: '/' });\n        cookies.clear(AUTH_COOKIE_NAME, { path: '/realtime' });\n    },\n\n    /*\n     * Attempt to immediately flush all queued logs\n     */\n    async ensureLogsSent() {\n        // Logs need to go out when the session screws up, before anything else\n        // happens, but ignore errors from this itself\n        // As long as its not an invalid sesson...\n        try {\n            await this.get('stashLogger').immediateSaveLogs();\n        } catch (_e) {\n            // We are ignoring this, continue with rejection\n        }\n    },\n\n    // exposed for test mocking\n    _getCurrMillis() {\n        return Date.now();\n    }\n});\n","import Ember from 'ember';\nimport DirectoryAuthenticator from './directory';\n\nconst { RSVP } = Ember;\n\nexport default DirectoryAuthenticator.extend({\n    restore(data) {\n        return RSVP.resolve(data);\n    },\n\n    // Fake out user authentication\n    authenticate(options) {\n        return this._super(options);\n    }\n});\n","import Ember from 'ember';\nimport netUtils from '../utils/net';\nimport config from '../config/environment';\nimport Base from 'ember-simple-auth/authorizers/base';\nimport _ from 'lodash';\nimport { isUnauthorizedError } from 'ember-ajax/errors';\nimport { REQUEST_TELEMETRY_APP_SUBSECTIONS } from 'connections-ui/services/ajax';\n\nconst HASH_LENGTH_LIMIT = 4976;\n\nconst SEMVER_PARSER = /^([^\\+]+)\\+(\\d+)-(.+)-([a-zA-Z0-9]+)$/;\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _authData: null,\n    _ajaxPrefilters: null,\n    _ajaxErrors: null,\n\n    appContextHeaderTokens: Ember.computed(\n        'application.semver',\n        'application.hostedContext.isHostedProp',\n        'application.isPopout',\n        function () {\n            // This is similar to our service name, directory-webui, with the `-`\n            // replaced by `_` since PAPI enums use java identifiers and can't include dashes.\n            const headerTokens = ['connections-ui-webui'];\n\n            // web-dir version\n            const semver = this.get('application.semver');\n            if (typeof semver === 'string') {\n                const semverParseResult = SEMVER_PARSER.exec(semver.trim());\n                if (semverParseResult && semverParseResult.length === 5) {\n                    // Production build semver format\n                    const [, pkgVersion, buildNumber, gitBranch, gitCommit] = semverParseResult;\n                    // Reduce the size of the release details to keep the overall header length down\n                    // packageVersion-gitBranch[0,24)-buildNumber-gitCommit[0,8)\n                    // 25 branch chars accounts for our standard branch prefixes, jira teams/numbers, and a bit of desc\n                    // 8 chars of git sha should be more than sufficient\n                    headerTokens.push(\n                        [pkgVersion, gitBranch.slice(0, 25), buildNumber, gitCommit.slice(0, 8)]\n                            .map(curr => curr.trim().replaceAll('-', '_'))\n                            .filter(curr => curr)\n                            .join('-')\n                    );\n                } else {\n                    // Dev/Unparsable semver - just use it as is and truncated to 25 chars\n                    headerTokens.push(semver.trim().slice(0, 25));\n                }\n            }\n\n            // Desktop vs Browser\n            const isHosted = this.get('application.hostedContext.isHostedProp');\n            headerTokens.push(isHosted ? 'desktop' : 'browser');\n\n            // Popout (PEF, chat, etc)\n            // Popout is not a 1:1 mapping to PEF, but, it is one of the cases that manifests as isPopout\n            if (this.get('application.isPopout')) {\n                headerTokens.push('popout');\n            }\n\n            return headerTokens;\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this._ajaxPrefilters = $.Callbacks();\n        Ember.$.ajaxPrefilter('+*', this._ajaxPrefilters.fire);\n        this._ajaxErrors = $.Callbacks();\n        Ember.$(document).ajaxError(this._ajaxErrors.fire);\n    },\n\n    authorize: function (authData, fnToAuthorize) {\n        if (authData && authData.access_token) {\n            fnToAuthorize(this._buildHeaders(authData));\n        }\n    },\n\n    authorizeAllDomainRequests: function (authData) {\n        this.set('_authData', authData);\n\n        this._ajaxPrefilters.add(this._addHeadersPrefilter.bind(this));\n        this._ajaxErrors.add(Ember.run.bind(this, '_handleUnauthorizedRequests'));\n    },\n\n    deauthorizeAllDomainRequests: function () {\n        this.set('_authData', null);\n\n        this._ajaxPrefilters.empty();\n        this._ajaxErrors.empty();\n    },\n\n    _addHeadersPrefilter(options, original, jqXHR) {\n        if (!options.crossDomain || this._isWhitelistedUrl(options.url) || this._isAbsPathOfProxiedEnv(options.url)) {\n            const excludeAuthHeader = this.isFaxUpload(options.url) || options.noAuthorizationHeader;\n            const headers = this._buildHeaders(this.get('_authData'));\n\n            if (excludeAuthHeader && headers.Authorization) {\n                // fax or others upload using Darth service has its own authentication headers\n                delete headers.Authorization;\n            }\n\n            _.forEach(headers, (headerValue, headerName) => {\n                jqXHR.setRequestHeader(headerName, headerValue);\n            });\n        }\n\n        if (this._isGcPublicApiUrl(options.url)) {\n            const headerTokens = [...this.get('appContextHeaderTokens')];\n\n            // App Subsection\n            // Read the `original` options param which are the unmodified options from the caller\n            if (\n                original &&\n                typeof original === 'object' &&\n                Object.prototype.hasOwnProperty.call(original, REQUEST_TELEMETRY_APP_SUBSECTIONS)\n            ) {\n                const subsection = original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n                // Delete this prop so it doesn't get sent with the request\n                delete original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n\n                let subsectionTokens = Array.isArray(subsection)\n                    ? subsection\n                    : typeof subsection === 'string'\n                    ? [subsection]\n                    : null;\n\n                if (!subsectionTokens || subsectionTokens.some(curr => typeof curr !== 'string')) {\n                    // log and ignore when encountering any invalid subsection types\n                    this.get('logger').error('Received invalid subsection for Genesys-App header', {\n                        remoteData: {\n                            type: typeof subsection,\n                            subsection\n                        }\n                    });\n                } else {\n                    // This check is strictly for dev logging\n                    // We drop slashes when building the final header value\n                    if (subsectionTokens.some(currToken => currToken.includes('/'))) {\n                        this.get('logger').warn('Dropping invalid \"/\" char found in Genesys-App header subsection', {\n                            remoteData: {\n                                type: typeof subsection,\n                                subsection\n                            }\n                        });\n                    }\n                    headerTokens.push(...subsectionTokens);\n                }\n            }\n\n            // Escape `/` with `_` as slashes are our token separators\n            jqXHR.setRequestHeader('Genesys-App', headerTokens.map(curr => curr.trim().replaceAll('/', '_')).join('/'));\n        }\n    },\n\n    _isWhitelistedUrl(url) {\n        return !!url && url.indexOf(this.get('application.purecloudV2BaseUri')) === 0;\n    },\n\n    _isGcPublicApiUrl(url) {\n        if (!url) {\n            return false;\n        }\n\n        const pubApiBase = this.get('application.purecloudV2BaseUri');\n        const pubApiProxyBase = this.get('application.purecloudBaseUri');\n        return [pubApiBase, pubApiProxyBase].some(currBase => {\n            return currBase && typeof currBase === 'string' && url.indexOf(currBase) === 0;\n        });\n    },\n\n    isFaxUpload(url) {\n        return !!url && url.indexOf('fax-uploads') > -1;\n    },\n\n    /**\n     * Returns true if:\n     * The current environment is development\n     * The current environment is proxied to a PC deployed env\n     * The provided url is on or a sub-domain of the PC TLD.\n     *\n     * Currently, this utility doesn't require that the provided url be remote.\n     * This allows you to be serving locally off of `localhost.mypurcloud.com:4300`\n     * and append the auth token to a `localhost:4300/sca` url.\n     */\n    _isAbsPathOfProxiedEnv(url) {\n        if (!url) {\n            return false;\n        }\n\n        let result = false;\n\n        let envDetails = this.get('application.envDetails');\n        if (config.environment === 'development' && envDetails && envDetails.local) {\n            // Currently proxying.  Test if url is our tgt env\n            try {\n                let tgtEnvDetails = netUtils.getEnvDetails(url);\n\n                result = envDetails.env === tgtEnvDetails.env;\n            } catch (unknownEnv) {\n                result = false;\n            }\n        }\n\n        return result;\n    },\n\n    _handleUnauthorizedRequests(event, jqXHR, settings, thrownError) {\n        /*\n         * isAuthenticated/logoutInProgress checks avoid handling expected 401s and logging false positives in sumo.\n         *\n         * Ex:\n         *   Attempting restore with an expired token\n         *   Ajax request failing after logout requested\n         */\n        if (\n            jqXHR.status === 401 &&\n            !jqXHR.skipPurecloudUnauthorizedCheck &&\n            !!this.get('session.isAuthenticated') &&\n            !this.get('session.logoutInProgress') &&\n            (settings.crossDomain === false ||\n                this._isWhitelistedUrl(settings.url) ||\n                this._isAbsPathOfProxiedEnv(settings.url))\n        ) {\n            /*\n             * Attempt to log this 401 immediately.  If it succeeds, we have a service that is throwing a\n             * 401 that is out of sync with public-api wrt authentication.  The log will make it to\n             * sumo and will not be a false positive.  If it fails due to rate limiting, we're reloading\n             * unconditionally at the moment, so no need to buffer it.\n             */\n            this._sendXhrErrorDetails(settings, thrownError, jqXHR).finally(() => {\n                // Request a new token (remember me) or logout\n                this.get('session').invalidate({\n                    unauthorized: true\n                });\n            });\n        }\n    },\n\n    _buildHeaders(authData) {\n        /* eslint-disable dot-notation */\n        let hash = window.location.hash;\n\n        hash = hash.length > HASH_LENGTH_LIMIT ? hash.slice(0, HASH_LENGTH_LIMIT) : hash;\n\n        const headers = {\n            'ININ-Client-Path': hash\n        };\n\n        if (authData && authData.access_token) {\n            headers['Authorization'] = `bearer ${authData.access_token}`;\n        }\n\n        /* eslint-enable dot-notation */\n        return headers;\n    },\n\n    _handleClientUnauthorizedError(clientId) {\n        let msg = `${clientId} reported invalid 401 event. Not logout will be triggered.`;\n        return this._sendErrorMessage({ message: msg }).catch(error => {\n            // Checking if the session is actually invalid.\n            if (isUnauthorizedError(error)) {\n                this.get('session').invalidate({\n                    unauthorized: true\n                });\n            }\n        });\n    },\n\n    _sendXhrErrorDetails(settings, thrownError = '', xhr = {}) {\n        const message =\n            '401 encountered while trying to access URL. Automatically requesting new token for user. Check local machine logs.';\n\n        // eslint-disable-next-line no-console\n        console.error(message, {\n            settings,\n            thrownError\n        });\n\n        // Don't log to sumo in dev mode\n        if (this.get('application.runtime.local')) {\n            return Ember.RSVP.resolve();\n        }\n\n        const correlationId = xhr.getResponseHeader('inin-correlation-id');\n\n        const data = JSON.stringify({\n            message,\n            correlationId\n        });\n\n        return this._sendErrorMessage(data);\n    },\n\n    _sendErrorMessage(messageData) {\n        const url = this.get('application').pcV2Uri('api/v2/diagnostics/trace');\n        return this.get('ajax').post(url, {\n            beforeSend: jqXHR => {\n                // Add a flag to this request to bypass infinite 401 checking\n                jqXHR.skipPurecloudUnauthorizedCheck = true;\n            },\n            dataType: 'text',\n            data: JSON.stringify({\n                app: {\n                    appId: 'connections-ui-webui',\n                    appVersion: this.get('version')\n                },\n                traces: [\n                    {\n                        level: 'ERROR',\n                        time: new Date().toString(),\n                        message: messageData,\n                        topic: 'connections-ui.service:session'\n                    }\n                ]\n            })\n        });\n    }\n});\n","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ar\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n,n100=t0&&s[0].slice(-2);if(ord)return\"other\";return n==0?\"zero\":n==1?\"one\":n==2?\"two\":n100>=3&&n100<=10?\"few\":n100>=11&&n100<=99?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"السنة\",\"relative\":{\"0\":\"السنة الحالية\",\"1\":\"السنة التالية\",\"-1\":\"السنة الماضية\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} سنة\",\"one\":\"خلال سنة واحدة\",\"two\":\"خلال سنتين\",\"few\":\"خلال {0} سنوات\",\"many\":\"خلال {0} سنة\",\"other\":\"خلال {0} سنة\"},\"past\":{\"zero\":\"قبل {0} سنة\",\"one\":\"قبل سنة واحدة\",\"two\":\"قبل سنتين\",\"few\":\"قبل {0} سنوات\",\"many\":\"قبل {0} سنة\",\"other\":\"قبل {0} سنة\"}}},\"month\":{\"displayName\":\"الشهر\",\"relative\":{\"0\":\"هذا الشهر\",\"1\":\"الشهر التالي\",\"-1\":\"الشهر الماضي\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} شهر\",\"one\":\"خلال شهر واحد\",\"two\":\"خلال شهرين\",\"few\":\"خلال {0} أشهر\",\"many\":\"خلال {0} شهرًا\",\"other\":\"خلال {0} شهر\"},\"past\":{\"zero\":\"قبل {0} شهر\",\"one\":\"قبل شهر واحد\",\"two\":\"قبل شهرين\",\"few\":\"قبل {0} أشهر\",\"many\":\"قبل {0} شهرًا\",\"other\":\"قبل {0} شهر\"}}},\"day\":{\"displayName\":\"يوم\",\"relative\":{\"0\":\"اليوم\",\"1\":\"غدًا\",\"2\":\"بعد الغد\",\"-2\":\"أول أمس\",\"-1\":\"أمس\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} يوم\",\"one\":\"خلال يوم واحد\",\"two\":\"خلال يومين\",\"few\":\"خلال {0} أيام\",\"many\":\"خلال {0} يومًا\",\"other\":\"خلال {0} يوم\"},\"past\":{\"zero\":\"قبل {0} يوم\",\"one\":\"قبل يوم واحد\",\"two\":\"قبل يومين\",\"few\":\"قبل {0} أيام\",\"many\":\"قبل {0} يومًا\",\"other\":\"قبل {0} يوم\"}}},\"hour\":{\"displayName\":\"الساعات\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ساعة\",\"one\":\"خلال ساعة واحدة\",\"two\":\"خلال ساعتين\",\"few\":\"خلال {0} ساعات\",\"many\":\"خلال {0} ساعة\",\"other\":\"خلال {0} ساعة\"},\"past\":{\"zero\":\"قبل {0} ساعة\",\"one\":\"قبل ساعة واحدة\",\"two\":\"قبل ساعتين\",\"few\":\"قبل {0} ساعات\",\"many\":\"قبل {0} ساعة\",\"other\":\"قبل {0} ساعة\"}}},\"minute\":{\"displayName\":\"الدقائق\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} دقيقة\",\"one\":\"خلال دقيقة واحدة\",\"two\":\"خلال دقيقتين\",\"few\":\"خلال {0} دقائق\",\"many\":\"خلال {0} دقيقة\",\"other\":\"خلال {0} دقيقة\"},\"past\":{\"zero\":\"قبل {0} دقيقة\",\"one\":\"قبل دقيقة واحدة\",\"two\":\"قبل دقيقتين\",\"few\":\"قبل {0} دقائق\",\"many\":\"قبل {0} دقيقة\",\"other\":\"قبل {0} دقيقة\"}}},\"second\":{\"displayName\":\"الثواني\",\"relative\":{\"0\":\"الآن\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ثانية\",\"one\":\"خلال ثانية واحدة\",\"two\":\"خلال ثانيتين\",\"few\":\"خلال {0} ثوانِ\",\"many\":\"خلال {0} ثانية\",\"other\":\"خلال {0} ثانية\"},\"past\":{\"zero\":\"قبل {0} ثانية\",\"one\":\"قبل ثانية واحدة\",\"two\":\"قبل ثانيتين\",\"few\":\"قبل {0} ثوانِ\",\"many\":\"قبل {0} ثانية\",\"other\":\"قبل {0} ثانية\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"cs\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":i>=2&&i<=4&&v0?\"few\":!v0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"tento rok\",\"1\":\"příští rok\",\"-1\":\"minulý rok\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} roky\",\"many\":\"za {0} roku\",\"other\":\"za {0} let\"},\"past\":{\"one\":\"před {0} rokem\",\"few\":\"před {0} lety\",\"many\":\"před {0} rokem\",\"other\":\"před {0} lety\"}}},\"month\":{\"displayName\":\"měsíc\",\"relative\":{\"0\":\"tento měsíc\",\"1\":\"příští měsíc\",\"-1\":\"minulý měsíc\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} měsíc\",\"few\":\"za {0} měsíce\",\"many\":\"za {0} měsíce\",\"other\":\"za {0} měsíců\"},\"past\":{\"one\":\"před {0} měsícem\",\"few\":\"před {0} měsíci\",\"many\":\"před {0} měsícem\",\"other\":\"před {0} měsíci\"}}},\"day\":{\"displayName\":\"den\",\"relative\":{\"0\":\"dnes\",\"1\":\"zítra\",\"2\":\"pozítří\",\"-2\":\"předevčírem\",\"-1\":\"včera\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} den\",\"few\":\"za {0} dny\",\"many\":\"za {0} dne\",\"other\":\"za {0} dní\"},\"past\":{\"one\":\"před {0} dnem\",\"few\":\"před {0} dny\",\"many\":\"před {0} dnem\",\"other\":\"před {0} dny\"}}},\"hour\":{\"displayName\":\"hodina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} hodinu\",\"few\":\"za {0} hodiny\",\"many\":\"za {0} hodiny\",\"other\":\"za {0} hodin\"},\"past\":{\"one\":\"před {0} hodinou\",\"few\":\"před {0} hodinami\",\"many\":\"před {0} hodinou\",\"other\":\"před {0} hodinami\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutu\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minuty\",\"other\":\"za {0} minut\"},\"past\":{\"one\":\"před {0} minutou\",\"few\":\"před {0} minutami\",\"many\":\"před {0} minutou\",\"other\":\"před {0} minutami\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"nyní\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundu\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekundy\",\"other\":\"za {0} sekund\"},\"past\":{\"one\":\"před {0} sekundou\",\"few\":\"před {0} sekundami\",\"many\":\"před {0} sekundou\",\"other\":\"před {0} sekundami\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"da\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],t0=Number(s[0])==n;if(ord)return\"other\";return n==1||!t0&&(i==0||i==1)?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"næste år\",\"-1\":\"sidste år\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"for {0} år siden\",\"other\":\"for {0} år siden\"}}},\"month\":{\"displayName\":\"måned\",\"relative\":{\"0\":\"denne måned\",\"1\":\"næste måned\",\"-1\":\"sidste måned\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} måned\",\"other\":\"om {0} måneder\"},\"past\":{\"one\":\"for {0} måned siden\",\"other\":\"for {0} måneder siden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgen\",\"2\":\"i overmorgen\",\"-2\":\"i forgårs\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dage\"},\"past\":{\"one\":\"for {0} dag siden\",\"other\":\"for {0} dage siden\"}}},\"hour\":{\"displayName\":\"time\",\"relativeTime\":{\"future\":{\"one\":\"om {0} time\",\"other\":\"om {0} timer\"},\"past\":{\"one\":\"for {0} time siden\",\"other\":\"for {0} timer siden\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minutter\"},\"past\":{\"one\":\"for {0} minut siden\",\"other\":\"for {0} minutter siden\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"for {0} sekund siden\",\"other\":\"for {0} sekunder siden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"de\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Jahr\",\"relative\":{\"0\":\"dieses Jahr\",\"1\":\"nächstes Jahr\",\"-1\":\"letztes Jahr\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Jahr\",\"other\":\"in {0} Jahren\"},\"past\":{\"one\":\"vor {0} Jahr\",\"other\":\"vor {0} Jahren\"}}},\"month\":{\"displayName\":\"Monat\",\"relative\":{\"0\":\"diesen Monat\",\"1\":\"nächsten Monat\",\"-1\":\"letzten Monat\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Monat\",\"other\":\"in {0} Monaten\"},\"past\":{\"one\":\"vor {0} Monat\",\"other\":\"vor {0} Monaten\"}}},\"day\":{\"displayName\":\"Tag\",\"relative\":{\"0\":\"heute\",\"1\":\"morgen\",\"2\":\"übermorgen\",\"-2\":\"vorgestern\",\"-1\":\"gestern\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Tag\",\"other\":\"in {0} Tagen\"},\"past\":{\"one\":\"vor {0} Tag\",\"other\":\"vor {0} Tagen\"}}},\"hour\":{\"displayName\":\"Stunde\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Stunde\",\"other\":\"in {0} Stunden\"},\"past\":{\"one\":\"vor {0} Stunde\",\"other\":\"vor {0} Stunden\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Minute\",\"other\":\"in {0} Minuten\"},\"past\":{\"one\":\"vor {0} Minute\",\"other\":\"vor {0} Minuten\"}}},\"second\":{\"displayName\":\"Sekunde\",\"relative\":{\"0\":\"jetzt\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Sekunde\",\"other\":\"in {0} Sekunden\"},\"past\":{\"one\":\"vor {0} Sekunde\",\"other\":\"vor {0} Sekunden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"en-US\",\"parentLocale\":\"en\"},{\"locale\":\"en\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?\"one\":n10==2&&n100!=12?\"two\":n10==3&&n100!=13?\"few\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} year\",\"other\":\"in {0} years\"},\"past\":{\"one\":\"{0} year ago\",\"other\":\"{0} years ago\"}}},\"month\":{\"displayName\":\"month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} month\",\"other\":\"in {0} months\"},\"past\":{\"one\":\"{0} month ago\",\"other\":\"{0} months ago\"}}},\"day\":{\"displayName\":\"day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} day\",\"other\":\"in {0} days\"},\"past\":{\"one\":\"{0} day ago\",\"other\":\"{0} days ago\"}}},\"hour\":{\"displayName\":\"hour\",\"relativeTime\":{\"future\":{\"one\":\"in {0} hour\",\"other\":\"in {0} hours\"},\"past\":{\"one\":\"{0} hour ago\",\"other\":\"{0} hours ago\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} minute\",\"other\":\"in {0} minutes\"},\"past\":{\"one\":\"{0} minute ago\",\"other\":\"{0} minutes ago\"}}},\"second\":{\"displayName\":\"second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} second\",\"other\":\"in {0} seconds\"},\"past\":{\"one\":\"{0} second ago\",\"other\":\"{0} seconds ago\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"es\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"año\",\"relative\":{\"0\":\"este año\",\"1\":\"el próximo año\",\"-1\":\"el año pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} año\",\"other\":\"dentro de {0} años\"},\"past\":{\"one\":\"hace {0} año\",\"other\":\"hace {0} años\"}}},\"month\":{\"displayName\":\"mes\",\"relative\":{\"0\":\"este mes\",\"1\":\"el próximo mes\",\"-1\":\"el mes pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mes\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"hace {0} mes\",\"other\":\"hace {0} meses\"}}},\"day\":{\"displayName\":\"día\",\"relative\":{\"0\":\"hoy\",\"1\":\"mañana\",\"2\":\"pasado mañana\",\"-2\":\"anteayer\",\"-1\":\"ayer\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} día\",\"other\":\"dentro de {0} días\"},\"past\":{\"one\":\"hace {0} día\",\"other\":\"hace {0} días\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"hace {0} hora\",\"other\":\"hace {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"hace {0} minuto\",\"other\":\"hace {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"ahora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"hace {0} segundo\",\"other\":\"hace {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fi\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"vuosi\",\"relative\":{\"0\":\"tänä vuonna\",\"1\":\"ensi vuonna\",\"-1\":\"viime vuonna\"},\"relativeTime\":{\"future\":{\"one\":\"{0} vuoden päästä\",\"other\":\"{0} vuoden päästä\"},\"past\":{\"one\":\"{0} vuosi sitten\",\"other\":\"{0} vuotta sitten\"}}},\"month\":{\"displayName\":\"kuukausi\",\"relative\":{\"0\":\"tässä kuussa\",\"1\":\"ensi kuussa\",\"-1\":\"viime kuussa\"},\"relativeTime\":{\"future\":{\"one\":\"{0} kuukauden päästä\",\"other\":\"{0} kuukauden päästä\"},\"past\":{\"one\":\"{0} kuukausi sitten\",\"other\":\"{0} kuukautta sitten\"}}},\"day\":{\"displayName\":\"päivä\",\"relative\":{\"0\":\"tänään\",\"1\":\"huomenna\",\"2\":\"ylihuomenna\",\"-2\":\"toissa päivänä\",\"-1\":\"eilen\"},\"relativeTime\":{\"future\":{\"one\":\"{0} päivän päästä\",\"other\":\"{0} päivän päästä\"},\"past\":{\"one\":\"{0} päivä sitten\",\"other\":\"{0} päivää sitten\"}}},\"hour\":{\"displayName\":\"tunti\",\"relativeTime\":{\"future\":{\"one\":\"{0} tunnin päästä\",\"other\":\"{0} tunnin päästä\"},\"past\":{\"one\":\"{0} tunti sitten\",\"other\":\"{0} tuntia sitten\"}}},\"minute\":{\"displayName\":\"minuutti\",\"relativeTime\":{\"future\":{\"one\":\"{0} minuutin päästä\",\"other\":\"{0} minuutin päästä\"},\"past\":{\"one\":\"{0} minuutti sitten\",\"other\":\"{0} minuuttia sitten\"}}},\"second\":{\"displayName\":\"sekunti\",\"relative\":{\"0\":\"nyt\"},\"relativeTime\":{\"future\":{\"one\":\"{0} sekunnin päästä\",\"other\":\"{0} sekunnin päästä\"},\"past\":{\"one\":\"{0} sekunti sitten\",\"other\":\"{0} sekuntia sitten\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fr-CA\",\"parentLocale\":\"fr\",\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"Dans {0} an\",\"other\":\"Dans {0} ans\"},\"past\":{\"one\":\"Il y a {0} an\",\"other\":\"Il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"Dans {0} minute\",\"other\":\"Dans {0} minutes\"},\"past\":{\"one\":\"Il y a {0} minute\",\"other\":\"Il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}},{\"locale\":\"fr\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":\"other\";return n>=0&&n<2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} an\",\"other\":\"dans {0} ans\"},\"past\":{\"one\":\"il y a {0} an\",\"other\":\"il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} minute\",\"other\":\"dans {0} minutes\"},\"past\":{\"one\":\"il y a {0} minute\",\"other\":\"il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"he\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1);if(ord)return\"other\";return n==1&&v0?\"one\":i==2&&v0?\"two\":v0&&(n<0||n>10)&&t0&&n10==0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"שנה\",\"relative\":{\"0\":\"השנה\",\"1\":\"השנה הבאה\",\"-1\":\"השנה שעברה\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנה\",\"two\":\"בעוד שנתיים\",\"many\":\"בעוד {0} שנה\",\"other\":\"בעוד {0} שנים\"},\"past\":{\"one\":\"לפני שנה\",\"two\":\"לפני שנתיים\",\"many\":\"לפני {0} שנה\",\"other\":\"לפני {0} שנים\"}}},\"month\":{\"displayName\":\"חודש\",\"relative\":{\"0\":\"החודש\",\"1\":\"החודש הבא\",\"-1\":\"החודש שעבר\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד חודש\",\"two\":\"בעוד חודשיים\",\"many\":\"בעוד {0} חודשים\",\"other\":\"בעוד {0} חודשים\"},\"past\":{\"one\":\"לפני חודש\",\"two\":\"לפני חודשיים\",\"many\":\"לפני {0} חודשים\",\"other\":\"לפני {0} חודשים\"}}},\"day\":{\"displayName\":\"יום\",\"relative\":{\"0\":\"היום\",\"1\":\"מחר\",\"2\":\"מחרתיים\",\"-2\":\"שלשום\",\"-1\":\"אתמול\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד יום {0}\",\"two\":\"בעוד יומיים\",\"many\":\"בעוד {0} ימים\",\"other\":\"בעוד {0} ימים\"},\"past\":{\"one\":\"לפני יום {0}\",\"two\":\"לפני יומיים\",\"many\":\"לפני {0} ימים\",\"other\":\"לפני {0} ימים\"}}},\"hour\":{\"displayName\":\"שעה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד שעה\",\"two\":\"בעוד שעתיים\",\"many\":\"בעוד {0} שעות\",\"other\":\"בעוד {0} שעות\"},\"past\":{\"one\":\"לפני שעה\",\"two\":\"לפני שעתיים\",\"many\":\"לפני {0} שעות\",\"other\":\"לפני {0} שעות\"}}},\"minute\":{\"displayName\":\"דקה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד דקה\",\"two\":\"בעוד שתי דקות\",\"many\":\"בעוד {0} דקות\",\"other\":\"בעוד {0} דקות\"},\"past\":{\"one\":\"לפני דקה\",\"two\":\"לפני שתי דקות\",\"many\":\"לפני {0} דקות\",\"other\":\"לפני {0} דקות\"}}},\"second\":{\"displayName\":\"שנייה\",\"relative\":{\"0\":\"עכשיו\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנייה\",\"two\":\"בעוד שתי שניות\",\"many\":\"בעוד {0} שניות\",\"other\":\"בעוד {0} שניות\"},\"past\":{\"one\":\"לפני שנייה\",\"two\":\"לפני שתי שניות\",\"many\":\"לפני {0} שניות\",\"other\":\"לפני {0} שניות\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"hi\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":n==2||n==3?\"two\":n==4?\"few\":n==6?\"many\":\"other\";return n>=0&&n<=1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"वर्ष\",\"relative\":{\"0\":\"इस वर्ष\",\"1\":\"अगला वर्ष\",\"-1\":\"पिछला वर्ष\"},\"relativeTime\":{\"future\":{\"one\":\"{0} वर्ष में\",\"other\":\"{0} वर्ष में\"},\"past\":{\"one\":\"{0} वर्ष पहले\",\"other\":\"{0} वर्ष पहले\"}}},\"month\":{\"displayName\":\"माह\",\"relative\":{\"0\":\"इस माह\",\"1\":\"अगला माह\",\"-1\":\"पिछला माह\"},\"relativeTime\":{\"future\":{\"one\":\"{0} माह में\",\"other\":\"{0} माह में\"},\"past\":{\"one\":\"{0} माह पहले\",\"other\":\"{0} माह पहले\"}}},\"day\":{\"displayName\":\"दिन\",\"relative\":{\"0\":\"आज\",\"1\":\"कल\",\"2\":\"परसों\",\"-2\":\"बीता परसों\",\"-1\":\"कल\"},\"relativeTime\":{\"future\":{\"one\":\"{0} दिन में\",\"other\":\"{0} दिन में\"},\"past\":{\"one\":\"{0} दिन पहले\",\"other\":\"{0} दिन पहले\"}}},\"hour\":{\"displayName\":\"घंटा\",\"relativeTime\":{\"future\":{\"one\":\"{0} घंटे में\",\"other\":\"{0} घंटे में\"},\"past\":{\"one\":\"{0} घंटे पहले\",\"other\":\"{0} घंटे पहले\"}}},\"minute\":{\"displayName\":\"मिनट\",\"relativeTime\":{\"future\":{\"one\":\"{0} मिनट में\",\"other\":\"{0} मिनट में\"},\"past\":{\"one\":\"{0} मिनट पहले\",\"other\":\"{0} मिनट पहले\"}}},\"second\":{\"displayName\":\"सेकंड\",\"relative\":{\"0\":\"अब\"},\"relativeTime\":{\"future\":{\"one\":\"{0} सेकंड में\",\"other\":\"{0} सेकंड में\"},\"past\":{\"one\":\"{0} सेकंड पहले\",\"other\":\"{0} सेकंड पहले\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"it\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return n==11||n==8||n==80||n==800?\"many\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"anno\",\"relative\":{\"0\":\"quest’anno\",\"1\":\"anno prossimo\",\"-1\":\"anno scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} anno\",\"other\":\"tra {0} anni\"},\"past\":{\"one\":\"{0} anno fa\",\"other\":\"{0} anni fa\"}}},\"month\":{\"displayName\":\"mese\",\"relative\":{\"0\":\"questo mese\",\"1\":\"mese prossimo\",\"-1\":\"mese scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} mese\",\"other\":\"tra {0} mesi\"},\"past\":{\"one\":\"{0} mese fa\",\"other\":\"{0} mesi fa\"}}},\"day\":{\"displayName\":\"giorno\",\"relative\":{\"0\":\"oggi\",\"1\":\"domani\",\"2\":\"dopodomani\",\"-2\":\"l’altro ieri\",\"-1\":\"ieri\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} giorno\",\"other\":\"tra {0} giorni\"},\"past\":{\"one\":\"{0} giorno fa\",\"other\":\"{0} giorni fa\"}}},\"hour\":{\"displayName\":\"ora\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} ora\",\"other\":\"tra {0} ore\"},\"past\":{\"one\":\"{0} ora fa\",\"other\":\"{0} ore fa\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} minuto\",\"other\":\"tra {0} minuti\"},\"past\":{\"one\":\"{0} minuto fa\",\"other\":\"{0} minuti fa\"}}},\"second\":{\"displayName\":\"Secondo\",\"relative\":{\"0\":\"ora\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} secondo\",\"other\":\"tra {0} secondi\"},\"past\":{\"one\":\"{0} secondo fa\",\"other\":\"{0} secondi fa\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ja\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"翌年\",\"-1\":\"昨年\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 年後\"},\"past\":{\"other\":\"{0} 年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"今月\",\"1\":\"翌月\",\"-1\":\"先月\"},\"relativeTime\":{\"future\":{\"other\":\"{0} か月後\"},\"past\":{\"other\":\"{0} か月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今日\",\"1\":\"明日\",\"2\":\"明後日\",\"-2\":\"一昨日\",\"-1\":\"昨日\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 日後\"},\"past\":{\"other\":\"{0} 日前\"}}},\"hour\":{\"displayName\":\"時\",\"relativeTime\":{\"future\":{\"other\":\"{0} 時間後\"},\"past\":{\"other\":\"{0} 時間前\"}}},\"minute\":{\"displayName\":\"分\",\"relativeTime\":{\"future\":{\"other\":\"{0} 分後\"},\"past\":{\"other\":\"{0} 分前\"}}},\"second\":{\"displayName\":\"秒\",\"relative\":{\"0\":\"今すぐ\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 秒後\"},\"past\":{\"other\":\"{0} 秒前\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ko\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"년\",\"relative\":{\"0\":\"올해\",\"1\":\"내년\",\"-1\":\"작년\"},\"relativeTime\":{\"future\":{\"other\":\"{0}년 후\"},\"past\":{\"other\":\"{0}년 전\"}}},\"month\":{\"displayName\":\"월\",\"relative\":{\"0\":\"이번 달\",\"1\":\"다음 달\",\"-1\":\"지난달\"},\"relativeTime\":{\"future\":{\"other\":\"{0}개월 후\"},\"past\":{\"other\":\"{0}개월 전\"}}},\"day\":{\"displayName\":\"일\",\"relative\":{\"0\":\"오늘\",\"1\":\"내일\",\"2\":\"모레\",\"-2\":\"그저께\",\"-1\":\"어제\"},\"relativeTime\":{\"future\":{\"other\":\"{0}일 후\"},\"past\":{\"other\":\"{0}일 전\"}}},\"hour\":{\"displayName\":\"시\",\"relativeTime\":{\"future\":{\"other\":\"{0}시간 후\"},\"past\":{\"other\":\"{0}시간 전\"}}},\"minute\":{\"displayName\":\"분\",\"relativeTime\":{\"future\":{\"other\":\"{0}분 후\"},\"past\":{\"other\":\"{0}분 전\"}}},\"second\":{\"displayName\":\"초\",\"relative\":{\"0\":\"지금\"},\"relativeTime\":{\"future\":{\"other\":\"{0}초 후\"},\"past\":{\"other\":\"{0}초 전\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"nl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"jaar\",\"relative\":{\"0\":\"dit jaar\",\"1\":\"volgend jaar\",\"-1\":\"vorig jaar\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} jaar\",\"other\":\"over {0} jaar\"},\"past\":{\"one\":\"{0} jaar geleden\",\"other\":\"{0} jaar geleden\"}}},\"month\":{\"displayName\":\"maand\",\"relative\":{\"0\":\"deze maand\",\"1\":\"volgende maand\",\"-1\":\"vorige maand\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} maand\",\"other\":\"over {0} maanden\"},\"past\":{\"one\":\"{0} maand geleden\",\"other\":\"{0} maanden geleden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"vandaag\",\"1\":\"morgen\",\"2\":\"overmorgen\",\"-2\":\"eergisteren\",\"-1\":\"gisteren\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} dag\",\"other\":\"over {0} dagen\"},\"past\":{\"one\":\"{0} dag geleden\",\"other\":\"{0} dagen geleden\"}}},\"hour\":{\"displayName\":\"Uur\",\"relativeTime\":{\"future\":{\"one\":\"over {0} uur\",\"other\":\"over {0} uur\"},\"past\":{\"one\":\"{0} uur geleden\",\"other\":\"{0} uur geleden\"}}},\"minute\":{\"displayName\":\"minuut\",\"relativeTime\":{\"future\":{\"one\":\"over {0} minuut\",\"other\":\"over {0} minuten\"},\"past\":{\"one\":\"{0} minuut geleden\",\"other\":\"{0} minuten geleden\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} seconde\",\"other\":\"over {0} seconden\"},\"past\":{\"one\":\"{0} seconde geleden\",\"other\":\"{0} seconden geleden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"no\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} y\"},\"past\":{\"other\":\"-{0} y\"}}},\"month\":{\"displayName\":\"Month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} m\"},\"past\":{\"other\":\"-{0} m\"}}},\"day\":{\"displayName\":\"Day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} d\"},\"past\":{\"other\":\"-{0} d\"}}},\"hour\":{\"displayName\":\"Hour\",\"relativeTime\":{\"future\":{\"other\":\"+{0} h\"},\"past\":{\"other\":\"-{0} h\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"other\":\"+{0} min\"},\"past\":{\"other\":\"-{0} min\"}}},\"second\":{\"displayName\":\"Second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} s\"},\"past\":{\"other\":\"-{0} s\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return n==1&&v0?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i!=1&&(i10==0||i10==1)||v0&&(i10>=5&&i10<=9)||v0&&(i100>=12&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"w tym roku\",\"1\":\"w przyszłym roku\",\"-1\":\"w zeszłym roku\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} lata\",\"many\":\"za {0} lat\",\"other\":\"za {0} roku\"},\"past\":{\"one\":\"{0} rok temu\",\"few\":\"{0} lata temu\",\"many\":\"{0} lat temu\",\"other\":\"{0} roku temu\"}}},\"month\":{\"displayName\":\"miesiąc\",\"relative\":{\"0\":\"w tym miesiącu\",\"1\":\"w przyszłym miesiącu\",\"-1\":\"w zeszłym miesiącu\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} miesiąc\",\"few\":\"za {0} miesiące\",\"many\":\"za {0} miesięcy\",\"other\":\"za {0} miesiąca\"},\"past\":{\"one\":\"{0} miesiąc temu\",\"few\":\"{0} miesiące temu\",\"many\":\"{0} miesięcy temu\",\"other\":\"{0} miesiąca temu\"}}},\"day\":{\"displayName\":\"dzień\",\"relative\":{\"0\":\"dzisiaj\",\"1\":\"jutro\",\"2\":\"pojutrze\",\"-2\":\"przedwczoraj\",\"-1\":\"wczoraj\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} dzień\",\"few\":\"za {0} dni\",\"many\":\"za {0} dni\",\"other\":\"za {0} dnia\"},\"past\":{\"one\":\"{0} dzień temu\",\"few\":\"{0} dni temu\",\"many\":\"{0} dni temu\",\"other\":\"{0} dnia temu\"}}},\"hour\":{\"displayName\":\"godzina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} godzinę\",\"few\":\"za {0} godziny\",\"many\":\"za {0} godzin\",\"other\":\"za {0} godziny\"},\"past\":{\"one\":\"{0} godzinę temu\",\"few\":\"{0} godziny temu\",\"many\":\"{0} godzin temu\",\"other\":\"{0} godziny temu\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutę\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minut\",\"other\":\"za {0} minuty\"},\"past\":{\"one\":\"{0} minutę temu\",\"few\":\"{0} minuty temu\",\"many\":\"{0} minut temu\",\"other\":\"{0} minuty temu\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"teraz\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundę\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekund\",\"other\":\"za {0} sekundy\"},\"past\":{\"one\":\"{0} sekundę temu\",\"few\":\"{0} sekundy temu\",\"many\":\"{0} sekund temu\",\"other\":\"{0} sekundy temu\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pt-br\",\"parentLocale\":\"pt\"},{\"locale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n;if(ord)return\"other\";return t0&&n>=0&&n<=2&&n!=2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} ano\",\"other\":\"em {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} mês\",\"other\":\"em {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} dia\",\"other\":\"em {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"em {0} hora\",\"other\":\"em {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"em {0} minuto\",\"other\":\"em {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} segundo\",\"other\":\"em {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}},{\"locale\":\"pt-PT\",\"parentLocale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} ano\",\"other\":\"dentro de {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mês\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} dia\",\"other\":\"dentro de {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ru\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"год\",\"relative\":{\"0\":\"в этом году\",\"1\":\"в следующем году\",\"-1\":\"в прошлом году\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} год\",\"few\":\"через {0} года\",\"many\":\"через {0} лет\",\"other\":\"через {0} года\"},\"past\":{\"one\":\"{0} год назад\",\"few\":\"{0} года назад\",\"many\":\"{0} лет назад\",\"other\":\"{0} года назад\"}}},\"month\":{\"displayName\":\"месяц\",\"relative\":{\"0\":\"в этом месяце\",\"1\":\"в следующем месяце\",\"-1\":\"в прошлом месяце\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} месяц\",\"few\":\"через {0} месяца\",\"many\":\"через {0} месяцев\",\"other\":\"через {0} месяца\"},\"past\":{\"one\":\"{0} месяц назад\",\"few\":\"{0} месяца назад\",\"many\":\"{0} месяцев назад\",\"other\":\"{0} месяца назад\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сегодня\",\"1\":\"завтра\",\"2\":\"послезавтра\",\"-2\":\"позавчера\",\"-1\":\"вчера\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дня\",\"many\":\"через {0} дней\",\"other\":\"через {0} дней\"},\"past\":{\"one\":\"{0} день назад\",\"few\":\"{0} дня назад\",\"many\":\"{0} дней назад\",\"other\":\"{0} дня назад\"}}},\"hour\":{\"displayName\":\"час\",\"relativeTime\":{\"future\":{\"one\":\"через {0} час\",\"few\":\"через {0} часа\",\"many\":\"через {0} часов\",\"other\":\"через {0} часа\"},\"past\":{\"one\":\"{0} час назад\",\"few\":\"{0} часа назад\",\"many\":\"{0} часов назад\",\"other\":\"{0} часа назад\"}}},\"minute\":{\"displayName\":\"минута\",\"relativeTime\":{\"future\":{\"one\":\"через {0} минуту\",\"few\":\"через {0} минуты\",\"many\":\"через {0} минут\",\"other\":\"через {0} минуты\"},\"past\":{\"one\":\"{0} минуту назад\",\"few\":\"{0} минуты назад\",\"many\":\"{0} минут назад\",\"other\":\"{0} минуты назад\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"сейчас\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунды\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунды\"},\"past\":{\"one\":\"{0} секунду назад\",\"few\":\"{0} секунды назад\",\"many\":\"{0} секунд назад\",\"other\":\"{0} секунды назад\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"sv\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return(n10==1||n10==2)&&n100!=11&&n100!=12?\"one\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"nästa år\",\"-1\":\"i fjol\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"för {0} år sedan\",\"other\":\"för {0} år sedan\"}}},\"month\":{\"displayName\":\"månad\",\"relative\":{\"0\":\"denna månad\",\"1\":\"nästa månad\",\"-1\":\"förra månaden\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} månad\",\"other\":\"om {0} månader\"},\"past\":{\"one\":\"för {0} månad sedan\",\"other\":\"för {0} månader sedan\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgon\",\"2\":\"i övermorgon\",\"-2\":\"i förrgår\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dagar\"},\"past\":{\"one\":\"för {0} dag sedan\",\"other\":\"för {0} dagar sedan\"}}},\"hour\":{\"displayName\":\"timme\",\"relativeTime\":{\"future\":{\"one\":\"om {0} timme\",\"other\":\"om {0} timmar\"},\"past\":{\"one\":\"för {0} timme sedan\",\"other\":\"för {0} timmar sedan\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minuter\"},\"past\":{\"one\":\"för {0} minut sedan\",\"other\":\"för {0} minuter sedan\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"för {0} sekund sedan\",\"other\":\"för {0} sekunder sedan\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"th\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"ปี\",\"relative\":{\"0\":\"ปีนี้\",\"1\":\"ปีหน้า\",\"-1\":\"ปีที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ปี\"},\"past\":{\"other\":\"{0} ปีที่แล้ว\"}}},\"month\":{\"displayName\":\"เดือน\",\"relative\":{\"0\":\"เดือนนี้\",\"1\":\"เดือนหน้า\",\"-1\":\"เดือนที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} เดือน\"},\"past\":{\"other\":\"{0} เดือนที่ผ่านมา\"}}},\"day\":{\"displayName\":\"วัน\",\"relative\":{\"0\":\"วันนี้\",\"1\":\"พรุ่งนี้\",\"2\":\"มะรืนนี้\",\"-2\":\"เมื่อวานซืน\",\"-1\":\"เมื่อวาน\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วัน\"},\"past\":{\"other\":\"{0} วันที่ผ่านมา\"}}},\"hour\":{\"displayName\":\"ชั่วโมง\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ชั่วโมง\"},\"past\":{\"other\":\"{0} ชั่วโมงที่ผ่านมา\"}}},\"minute\":{\"displayName\":\"นาที\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} นาที\"},\"past\":{\"other\":\"{0} นาทีที่ผ่านมา\"}}},\"second\":{\"displayName\":\"วินาที\",\"relative\":{\"0\":\"ขณะนี้\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วินาที\"},\"past\":{\"other\":\"{0} วินาทีที่ผ่านมา\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"tr\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Yıl\",\"relative\":{\"0\":\"bu yıl\",\"1\":\"gelecek yıl\",\"-1\":\"geçen yıl\"},\"relativeTime\":{\"future\":{\"one\":\"{0} yıl sonra\",\"other\":\"{0} yıl sonra\"},\"past\":{\"one\":\"{0} yıl önce\",\"other\":\"{0} yıl önce\"}}},\"month\":{\"displayName\":\"Ay\",\"relative\":{\"0\":\"bu ay\",\"1\":\"gelecek ay\",\"-1\":\"geçen ay\"},\"relativeTime\":{\"future\":{\"one\":\"{0} ay sonra\",\"other\":\"{0} ay sonra\"},\"past\":{\"one\":\"{0} ay önce\",\"other\":\"{0} ay önce\"}}},\"day\":{\"displayName\":\"Gün\",\"relative\":{\"0\":\"bugün\",\"1\":\"yarın\",\"2\":\"öbür gün\",\"-2\":\"evvelsi gün\",\"-1\":\"dün\"},\"relativeTime\":{\"future\":{\"one\":\"{0} gün sonra\",\"other\":\"{0} gün sonra\"},\"past\":{\"one\":\"{0} gün önce\",\"other\":\"{0} gün önce\"}}},\"hour\":{\"displayName\":\"Saat\",\"relativeTime\":{\"future\":{\"one\":\"{0} saat sonra\",\"other\":\"{0} saat sonra\"},\"past\":{\"one\":\"{0} saat önce\",\"other\":\"{0} saat önce\"}}},\"minute\":{\"displayName\":\"Dakika\",\"relativeTime\":{\"future\":{\"one\":\"{0} dakika sonra\",\"other\":\"{0} dakika sonra\"},\"past\":{\"one\":\"{0} dakika önce\",\"other\":\"{0} dakika önce\"}}},\"second\":{\"displayName\":\"Saniye\",\"relative\":{\"0\":\"şimdi\"},\"relativeTime\":{\"future\":{\"one\":\"{0} saniye sonra\",\"other\":\"{0} saniye sonra\"},\"past\":{\"one\":\"{0} saniye önce\",\"other\":\"{0} saniye önce\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"uk\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2),i10=i.slice(-1),i100=i.slice(-2);if(ord)return n10==3&&n100!=13?\"few\":\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"рік\",\"relative\":{\"0\":\"цього року\",\"1\":\"наступного року\",\"-1\":\"торік\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} рік\",\"few\":\"через {0} роки\",\"many\":\"через {0} років\",\"other\":\"через {0} року\"},\"past\":{\"one\":\"{0} рік тому\",\"few\":\"{0} роки тому\",\"many\":\"{0} років тому\",\"other\":\"{0} року тому\"}}},\"month\":{\"displayName\":\"місяць\",\"relative\":{\"0\":\"цього місяця\",\"1\":\"наступного місяця\",\"-1\":\"минулого місяця\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} місяць\",\"few\":\"через {0} місяці\",\"many\":\"через {0} місяців\",\"other\":\"через {0} місяця\"},\"past\":{\"one\":\"{0} місяць тому\",\"few\":\"{0} місяці тому\",\"many\":\"{0} місяців тому\",\"other\":\"{0} місяця тому\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сьогодні\",\"1\":\"завтра\",\"2\":\"післязавтра\",\"-2\":\"позавчора\",\"-1\":\"учора\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дні\",\"many\":\"через {0} днів\",\"other\":\"через {0} дня\"},\"past\":{\"one\":\"{0} день тому\",\"few\":\"{0} дні тому\",\"many\":\"{0} днів тому\",\"other\":\"{0} дня тому\"}}},\"hour\":{\"displayName\":\"година\",\"relativeTime\":{\"future\":{\"one\":\"через {0} годину\",\"few\":\"через {0} години\",\"many\":\"через {0} годин\",\"other\":\"через {0} години\"},\"past\":{\"one\":\"{0} годину тому\",\"few\":\"{0} години тому\",\"many\":\"{0} годин тому\",\"other\":\"{0} години тому\"}}},\"minute\":{\"displayName\":\"хвилина\",\"relativeTime\":{\"future\":{\"one\":\"через {0} хвилину\",\"few\":\"через {0} хвилини\",\"many\":\"через {0} хвилин\",\"other\":\"через {0} хвилини\"},\"past\":{\"one\":\"{0} хвилину тому\",\"few\":\"{0} хвилини тому\",\"many\":\"{0} хвилин тому\",\"other\":\"{0} хвилини тому\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"зараз\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунди\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунди\"},\"past\":{\"one\":\"{0} секунду тому\",\"few\":\"{0} секунди тому\",\"many\":\"{0} секунд тому\",\"other\":\"{0} секунди тому\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"zh-cn\",\"parentLocale\":\"zh\"},{\"locale\":\"zh\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"明年\",\"-1\":\"去年\"},\"relativeTime\":{\"future\":{\"other\":\"{0}年后\"},\"past\":{\"other\":\"{0}年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"本月\",\"1\":\"下个月\",\"-1\":\"上个月\"},\"relativeTime\":{\"future\":{\"other\":\"{0}个月后\"},\"past\":{\"other\":\"{0}个月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今天\",\"1\":\"明天\",\"2\":\"后天\",\"-2\":\"前天\",\"-1\":\"昨天\"},\"relativeTime\":{\"future\":{\"other\":\"{0}天后\"},\"past\":{\"other\":\"{0}天前\"}}},\"hour\":{\"displayName\":\"小时\",\"relativeTime\":{\"future\":{\"other\":\"{0}小时后\"},\"past\":{\"other\":\"{0}小时前\"}}},\"minute\":{\"displayName\":\"分钟\",\"relativeTime\":{\"future\":{\"other\":\"{0}分钟后\"},\"past\":{\"other\":\"{0}分钟前\"}}},\"second\":{\"displayName\":\"秒钟\",\"relative\":{\"0\":\"现在\"},\"relativeTime\":{\"future\":{\"other\":\"{0}秒钟后\"},\"past\":{\"other\":\"{0}秒钟前\"}}}}},{\"locale\":\"zh-tw\",\"parentLocale\":\"zh\"}];","define(\"connections-ui/components/accessible-checkbox/component\", [\"exports\", \"ember-purecloud-components/components/accessible-checkbox/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { on, inject, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['admin-ui-modal'],\n\n    application: inject.service(),\n    session: inject.service(),\n    notification: inject.service(),\n\n    src: '',\n    name: 'admin-ui-modal',\n\n    sendClose() {\n        this.sendAction('closeAdminModal');\n    },\n\n    toast(data) {\n        let notificationType = 'info';\n        if (data.type === 'success' || data.type === 'error') {\n            notificationType = data.type;\n        }\n\n        this.get('notification')[notificationType](\n            data.title,\n            data.message,\n            Object.assign(\n                {},\n                {\n                    markdownToHtml: false,\n                    shouldShowPopup: true,\n                    shouldPlaySound: false\n                },\n                data\n            )\n        );\n    },\n\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            if (!event) {\n                return;\n            }\n            try {\n                const sameHost = Ember.get(event, 'originalEvent.source.document.location.host') === location.host;\n                const sameName = Ember.get(event, 'originalEvent.source.name') === this.get('name');\n                if (!(sameHost & sameName)) {\n                    return;\n                }\n                const message = Ember.get(event, 'originalEvent.data');\n                if (message.type === 'modal:close') {\n                    this.sendClose();\n                } else if (message.type === 'content:route:changed') {\n                    if (!message.data.hash.match(/^\\/directory\\/people\\/(add|import|link)/)) {\n                        const hash = `#/admin${message.data.hash}`;\n                        location.hash = hash;\n                    }\n                } else if (message.type === 'toast') {\n                    this.toast(message.data);\n                }\n            } catch (error) {\n                if (error && error.name === 'SecurityError') {\n                    return;\n                }\n                this.logger.error('error handling frame message', {\n                    error\n                });\n            }\n        });\n    },\n\n    startMessageListener: on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, this.handleMessageEvent.bind(this));\n    }),\n\n    stopMessageListener: on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"lfPaatln\",\"block\":\"{\\\"statements\\\":[[11,\\\"iframe\\\",[]],[16,\\\"title\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"name\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"src\\\",[34,[[26,[\\\"src\\\"]]]]],[15,\\\"role\\\",\\\"presentation\\\"],[15,\\\"seamless\\\",\\\"\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/admin-ui-modal/template.hbs\"}});","define(\"connections-ui/components/alert-message/component\", [\"exports\", \"ember-purecloud-components/components/alert-message/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: 'analog-clock',\n    classNameBindings: ['_analogSupported:analog-supported:analog-unsupported', '_invalidTime:invalid-time'],\n    attributeBindings: ['_currTimeLabel:title', '_currTimeLabel:aria-label'],\n\n    intl: inject.service(),\n\n    // Attrs\n    utcOffset: null,\n    staticMoment: null,\n    showSecondHand: true,\n    autoIncrement: true,\n\n    _analogSupported: Modernizr.csstransforms,\n    _displayedMoment: null,\n    _invalidTime: computed.not('_displayedMoment'),\n    _currTimeLabel: null,\n    _pendingTick: null,\n\n    willRender() {\n        this._cancelTimers();\n\n        let time = moment(this.get('staticMoment') || undefined);\n        let formatStr = 'LTS';\n        let invalid = false;\n\n        try {\n            if (this.get('utcOffset')) {\n                time.utcOffset(this.get('utcOffset'));\n                formatStr += ' Z';\n            }\n        } catch (e) {\n            invalid = true;\n        }\n\n        if (invalid || isNaN(time) || !time.isValid()) {\n            this.set('_displayedMoment', null);\n            this.set('_currTimeLabel', this.get('intl').t('components.analogClock.invalidTime'));\n        } else {\n            this.set('_displayedMoment', time);\n            this.set('_currTimeLabel', time.format(formatStr));\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._cancelTimers();\n        this._super(...arguments);\n    },\n\n    didRender() {\n        this._super(...arguments);\n\n        let time = this.get('_displayedMoment');\n\n        if (time && this.get('_analogSupported')) {\n            const hourElement = this.$('.hour-hand')[0];\n            const minuteElement = this.$('.minute-hand')[0];\n\n            let hour = time.hour(),\n                minute = time.minute(),\n                second = time.second(),\n                secondAngle = second * 6,\n                minuteAngle = minute * 6 + secondAngle / 60,\n                hourAngle = ((hour % 12) / 12) * 360 + 90 + minute / 12,\n                hourRule = `rotate(${hourAngle}deg)`,\n                minuteRule = `rotate(${minuteAngle}deg)`,\n                secondRule = `rotate(${secondAngle}deg)`;\n\n            hourElement.style.transform = hourRule;\n            minuteElement.style.transform = minuteRule;\n            if (this.get('showSecondHand')) {\n                const secondElement = this.$('.second-hand')[0];\n                secondElement.style.transform = secondRule;\n            }\n        }\n\n        if (!this.get('staticMoment') && this.get('autoIncrement') && !this.get('_invalidTime')) {\n            this.set(\n                '_pendingTick',\n                Ember.run.later(\n                    this,\n                    () => {\n                        this.rerender();\n                    },\n                    1000\n                )\n            );\n        }\n    },\n\n    _cancelTimers() {\n        ['_pendingTick'].forEach(timerName => {\n            let currTimer = this.get(timerName);\n            if (currTimer) {\n                Ember.run.cancel(currTimer);\n                this.set(timerName, null);\n            }\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"jPusaeLb\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"_analogSupported\\\"]],[33,[\\\"not\\\"],[[28,[\\\"_invalidTime\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clock-face\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hour-hand\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"minute-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSecondHand\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"second-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"_currTimeLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/analog-clock/template.hbs\"}});","import Ember from 'ember';\nimport { isValidEmailAddress } from 'ember-purecloud-components/utils/email';\n\nvar AnchorTagComponent = Ember.Component.extend({\n    tagName: 'span',\n\n    intl: Ember.inject.service(),\n\n    httpRegex: /(http|https):\\/\\/(?:www\\.)?(.*)/i,\n\n    // Anchor tag text body: <a>{{label}}</a>\n    label: null,\n\n    //href components: <a href=\"{{protocol & value}}\">{{label}}</a>\n    value: null, //email address, phone number, URL\n    protocol: null, //protocol of the href in the case of mailto, tel, sms, etc.\n\n    title: null,\n    target: '_blank',\n\n    ariaLabelledBy: null,\n\n    init: function () {\n        this._super();\n\n        this.decorateLabel();\n    },\n\n    text: Ember.computed('value', 'label', function () {\n        var label = this.get('label');\n        if (label) {\n            return label;\n        }\n\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        // If the value already has a protocol for http, gods be good lets not waste space showing it.\n        if (value && value.match(this.get('httpRegex'))) {\n            value = value.replace(this.get('httpRegex'), '$2');\n        }\n\n        if (protocol === 'map') {\n            value = Ember.String.htmlSafe(Ember.Handlebars.Utils.escapeExpression(value).replace(/\\n/g, '<br />'));\n        }\n\n        return value;\n    }),\n\n    anchor: Ember.computed('value', 'protocol', function () {\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        if (protocol === 'map' && value) {\n            this.set('target', '_new');\n            return 'https://maps.google.com/?q=' + window.encodeURIComponent(value);\n        }\n\n        //mailto:, tel:, sms:\n        if (protocol && value) {\n            return `${protocol}:${value}`;\n        }\n\n        if (value && value.match(this.get('httpRegex'))) {\n            return value;\n        }\n        // No protocol assumes plain http:// unless the value already has it set.\n        return `http://${value}`;\n    }),\n\n    decorateLabel: Ember.observer('value', function () {\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        if (protocol === 'mailto' && value) {\n            this.set('target', null);\n\n            // TODO: [Glimmer] fix this value issue\n            value = value.toString();\n\n            if (!isValidEmailAddress(value)) {\n                return this.set('label', this.get('intl').t('purecloud.acdInteraction.relate.validation.invalidEmail'));\n            }\n\n            this.set('label', value);\n        }\n    })\n});\n\nexport default AnchorTagComponent;\n","export default Ember.HTMLBars.template({\"id\":\"cDg6eSfO\",\"block\":\"{\\\"statements\\\":[[11,\\\"a\\\",[]],[16,\\\"href\\\",[26,[\\\"anchor\\\"]],null],[16,\\\"title\\\",[26,[\\\"title\\\"]],null],[16,\\\"target\\\",[26,[\\\"target\\\"]],null],[16,\\\"aria-labelledby\\\",[26,[\\\"ariaLabelledBy\\\"]],null],[13],[1,[26,[\\\"text\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/anchor-tag/template.hbs\"}});","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Component, computed, get } = Ember;\n\nconst DEFAULT_IMG_TYPE = 'icon';\n\n// Possible Future Types: smallIcon (16x16), notificationIcon, launcherIcon, splashIcon (512x512)\nconst IMG_TYPE_CFG_MAP = {\n    icon: {\n        width: 24,\n        height: 24,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    },\n    tile: {\n        width: 128,\n        height: 128,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    }\n};\n\nconst VECTOR_IMG_PROP_NAME = 'vector';\nconst RASTER_IMGS_PROP_NAME = 'raster';\nconst RASTER_IMG_KEY_REG_EXP = /^x(\\d+)$/i;\nconst CLASS_NAMES_PROP_NAME = 'classNames';\nconst SVG_PATH_PROP_NAME = 'svgSpriteHref';\nconst GUX_ICON_PROPS_PATH = 'guxIcon';\n\nconst NO_TITLE_MODE = 'none';\nconst NATIVE_TITLE_MODE = 'native';\nconst TOOLTIP_TITLE_MODE = 'tooltip';\nconst DEFAULT_TITLE_MODE = TOOLTIP_TITLE_MODE;\nconst TITLE_MODES = [NO_TITLE_MODE, NATIVE_TITLE_MODE, TOOLTIP_TITLE_MODE];\n\n/**\n * Generates the image markup for the specified app that is best suited\n * for the specified imgType.  imgType dictates the target environment for\n * the image display while the app's assets contain the dictionary of\n * image categories (icon, launcher, splash, etc.) and sizes (x16, x24, x512, etc.)\n *\n * In general, this algorithm is:\n * <ul>\n *   <li>Utilize the app assets appropriate for the imgType<li>\n *   <li>Use vector (svg) if in config and supported by browser</li>\n *   <li>Use exact or closest (within threshold) sized raster img for src</li>\n *   <li>\n *      Add any supplimental urls (with multiplier > 1 and within threshold)\n *      to srcset attribute if supported by browser\n *   <li>\n *   <li>If no applicable image can be found, use classNames</li>\n *   <li>If no classNames are configured, use the no-img placeholder</li>\n * </ul>\n */\nexport default Component.extend({\n    tagName: 'div',\n    classNames: ['app-img'],\n    classNameBindings: ['imgType'],\n    attributeBindings: ['title'],\n\n    app: null,\n\n    titleMode: computed({\n        get: () => DEFAULT_TITLE_MODE,\n        set(key, value) {\n            if (TITLE_MODES.indexOf(value) < 0) {\n                Ember.assert(`app-img Invalid titleMode: ${value}`);\n            }\n\n            return value;\n        }\n    }),\n\n    showTooltip: computed.equal('titleMode', TOOLTIP_TITLE_MODE),\n\n    title: computed('titleMode', 'app.name', function () {\n        let result = '';\n\n        const appName = this.get('app.name');\n        const titleMode = this.get('titleMode');\n\n        if (appName && appName.trim().length > 0 && titleMode === NATIVE_TITLE_MODE) {\n            result = appName;\n        }\n\n        return result;\n    }),\n\n    imgType: computed({\n        get: () => DEFAULT_IMG_TYPE,\n        set(key, value) {\n            if (Object.prototype.hasOwnProperty.call(IMG_TYPE_CFG_MAP, value)) {\n                return value;\n            } else {\n                Ember.assert(`Invalid app-img type ${value}`);\n            }\n        }\n    }),\n\n    imgWidth: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].width;\n    }),\n\n    imgHeight: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].height;\n    }),\n\n    _sortedRasterMultipliers: computed('app', 'imgType', function () {\n        let result = [];\n\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        let allRasterImgs = get(this, `app.${cfg.assetBasePath}.${RASTER_IMGS_PROP_NAME}`);\n\n        if (allRasterImgs && typeof allRasterImgs === 'object') {\n            _.forEach(allRasterImgs, (rasterUrl, rasterKey) => {\n                let rasterMatch = RASTER_IMG_KEY_REG_EXP.exec(rasterKey);\n                if (rasterMatch) {\n                    let currRasterWidth = parseInt(rasterMatch[1], 10);\n                    if (currRasterWidth && currRasterWidth > 0) {\n                        let currRasterMultiplier = currRasterWidth / cfg.width;\n\n                        result.push({\n                            url: rasterUrl,\n                            multiplier: currRasterMultiplier\n                        });\n                    }\n                }\n            });\n        }\n\n        return result.sort((a, b) => a.multiplier - b.multiplier);\n    }),\n\n    /**\n     * Returns the vectorImgUrl if one exists in the app config\n     * and if vector images are supported as img src in the current\n     * environment\n     */\n    _vectorImgUrl: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        if (app && Modernizr.svgasimg) {\n            result = Ember.get(app, `${cfg.assetBasePath}.${VECTOR_IMG_PROP_NAME}`) || null;\n        }\n\n        return result;\n    }),\n\n    defaultImgUrl: computed('imgType', '_vectorImgUrl', '_sortedRasterMultipliers', function () {\n        let vectorImgUrl = this.get('_vectorImgUrl');\n        if (vectorImgUrl) {\n            return vectorImgUrl;\n        }\n\n        let result = null;\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n\n        let allRasters = this.get('_sortedRasterMultipliers');\n        if (allRasters.length > 0) {\n            let lowestDelta = null;\n\n            for (let index = 0; index < allRasters.length; index++) {\n                let curr = allRasters[index];\n                let currDelta = Math.abs(1 - curr.multiplier);\n\n                if (lowestDelta === null || currDelta < lowestDelta) {\n                    lowestDelta = currDelta;\n                    result = curr.url;\n                }\n            }\n\n            // Ensure the best size default img is within the threshold\n            if (cfg.closestSizeMaxMultiplierDelta && lowestDelta > cfg.closestSizeMaxMultiplierDelta) {\n                result = null;\n            }\n        }\n\n        return result;\n    }),\n\n    imgSrcSet: computed('imgType', '_vectorImgUrl', 'defaultImgUrl', '_sortedRasterMultipliers', function () {\n        let result = '';\n\n        let vectorImgUrl = this.get('_vectorImgUrl');\n        let defaultImgUrl = this.get('defaultImgUrl');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        let allRasters = this.get('_sortedRasterMultipliers');\n\n        if (Modernizr.srcset && !vectorImgUrl && defaultImgUrl && allRasters.length > 0) {\n            let supImgs = [];\n\n            allRasters.forEach(({ url, multiplier }) => {\n                if (\n                    url !== defaultImgUrl &&\n                    multiplier > 1 &&\n                    (!cfg.minSupplimentalRes || multiplier >= cfg.minSupplimentalRes) &&\n                    (!cfg.maxSupplimentalRes || multiplier <= cfg.maxSupplimentalRes)\n                ) {\n                    supImgs.push({\n                        url,\n                        multiplier\n                    });\n                }\n            });\n\n            if (supImgs.length > 0) {\n                // Sort the images by descending multiplier so the best one is choosen\n                supImgs.reverse();\n                result = supImgs.map(curr => `${curr.url} ${curr.multiplier}x`).join(',');\n            }\n        }\n\n        return result;\n    }),\n\n    svgSpriteHref: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let svgPropPath = `${cfg.assetBasePath}.${SVG_PATH_PROP_NAME}`;\n\n            let svgSpriteHref = app.get(svgPropPath);\n            if (svgSpriteHref) {\n                result = svgSpriteHref;\n            }\n        }\n\n        return result;\n    }),\n\n    imgClasses: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let classesPath = `${cfg.assetBasePath}.${CLASS_NAMES_PROP_NAME}`;\n\n            let classNames = app.get(classesPath);\n            if (classNames && Ember.isArray(classNames)) {\n                result = classNames.join(' ');\n            }\n        }\n\n        return result;\n    }),\n\n    guxIcon: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let guxIconPropsPath = `${cfg.assetBasePath}.${GUX_ICON_PROPS_PATH}`;\n\n            let guxIconProps = app.get(guxIconPropsPath);\n            if (\n                guxIconProps &&\n                Object.prototype.hasOwnProperty.call(guxIconProps, 'name') &&\n                guxIconProps.hasOwnProperty('decorative')\n            ) {\n                result = guxIconProps;\n            }\n        }\n\n        return result;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"jh1kqPQo\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"defaultImgUrl\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"src\\\",[34,[[26,[\\\"defaultImgUrl\\\"]]]]],[16,\\\"srcset\\\",[34,[[26,[\\\"imgSrcSet\\\"]]]]],[16,\\\"alt\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"width\\\",[34,[[26,[\\\"imgWidth\\\"]]]]],[16,\\\"height\\\",[34,[[26,[\\\"imgHeight\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"imgClasses\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"imgClasses\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"svgSpriteHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"svg\\\",[]],[15,\\\"class\\\",\\\"svg-icon\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"use\\\",[]],[16,\\\"href\\\",[26,[\\\"svgSpriteHref\\\"]],null],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"guxIcon\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"icon-name\\\",[28,[\\\"guxIcon\\\",\\\"name\\\"]],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-external-apps-unknown\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showTooltip\\\"]],[28,[\\\"app\\\",\\\"name\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"targetOffset\\\"],[\\\"-10px 0\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[28,[\\\"app\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/app-img/template.hbs\"}});","define(\"connections-ui/components/audio-player-v2/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/participant/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/participant/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/timeline/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/timeline/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/waveform-graph/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/waveform-graph/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Howler from 'howler-but-with-updates';\n\nconst Howl = Howler.Howl;\n\nconst { get, inject, computed, observer, RSVP, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-player-v2'],\n\n    clock: inject.service(),\n    logger: inject.service('stash-logger'),\n    webrtc: inject.service(),\n    phone: inject.service(),\n\n    attrs: {\n        source: null,\n        options: {},\n        markAsRead: () => {},\n        onError: () => {}\n    },\n\n    playing: false,\n    didEnd: false,\n    loading: false,\n    loadingError: false,\n    registerStopVoicemailHandler: null,\n    sound: null,\n\n    playFromSelectedOutput: computed.reads('webrtc.session.features.playRecordingFromSelectedOutput'),\n\n    playbackVolume: computed('phone.callVolume', function () {\n        const callVolume = this.get('phone.callVolume');\n        const decimalValue = callVolume / 100;\n        return decimalValue;\n    }),\n\n    selectedOutputDevice: computed('webrtc.defaultOutputDevice', function () {\n        let deviceId;\n        let defaultOutputDevice = this.get('webrtc.defaultOutputDevice');\n        if (defaultOutputDevice) {\n            deviceId = defaultOutputDevice.get('deviceId');\n        }\n\n        return deviceId;\n    }),\n\n    outputDeviceUpdate: observer('webrtc.defaultOutputDevice', function () {\n        if (!this.get('sound') || !this.get('playFromSelectedOutput')) {\n            return;\n        }\n\n        let restartSound = false;\n        if (this.get('playing')) {\n            this.stopPlaying();\n            restartSound = true;\n        }\n\n        const newOutputDeviceId = this.get('selectedOutputDevice');\n        this.sound.setOutputDevice(newOutputDeviceId);\n\n        if (restartSound) {\n            this.sound.play();\n        }\n    }),\n\n    actions: {\n        togglePlay() {\n            if (this.get('playFromSelectedOutput')) {\n                const outputDeviceId = this.get('webrtc.defaultOutputDevice.deviceId');\n                if (outputDeviceId) {\n                    this.sound.setOutputDevice(outputDeviceId);\n                }\n\n                this.sound.volume(this.get('playbackVolume'));\n            }\n\n            if (this.get('playing')) {\n                this.sound.pause();\n            } else {\n                if (this.get('didEnd')) {\n                    this.sound.seek(0);\n                }\n                this.sound.play();\n            }\n        },\n\n        seekSound(value) {\n            this.sound.seek(value);\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        const registerHandler = this.get('registerStopVoicemailHandler');\n        if (registerHandler && typeof registerHandler === 'function') {\n            registerHandler(this.stopPlaying.bind(this));\n        }\n\n        this.setupSound();\n    },\n\n    willDestroyElement() {\n        if (this.sound) {\n            this.sound.off();\n            this.sound.pause();\n        }\n\n        this._super(...arguments);\n    },\n\n    setupSound() {\n        this.set('loading', true);\n\n        const paths = this.getAttr('source');\n        const promise = RSVP.resolve(paths);\n        promise\n            .then(sources => {\n                if (sources && !Array.isArray(sources)) {\n                    return [sources];\n                }\n                return null;\n            })\n            .then(sources => {\n                const useHtml5 = this.get('playFromSelectedOutput');\n\n                if (sources) {\n                    const options = this.get('howlOptions');\n                    options.src = sources;\n                    options.html5 = useHtml5;\n                    this.sound = new Howl(options);\n                } else {\n                    this.set('loading', false);\n                    this.set('loadingError', true);\n\n                    this.get('logger').warn('There were no audio sources passed into the audio-player');\n\n                    this.attrs.onError();\n                }\n            })\n            .catch(err => {\n                this.set('loading', false);\n                this.set('loadingError', true);\n\n                this.get('logger').error('There was an error loading recorded audio', err);\n\n                this.attrs.onError(err);\n            });\n    },\n\n    duration: computed('loading', function () {\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.duration() * 1000);\n    }),\n\n    currentTime: computed('clock.second', function () {\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.seek() * 1000);\n    }),\n\n    loadingAudio: computed(function () {\n        return false;\n    }),\n\n    howlOptions: computed('options', function () {\n        const defaultOptions = {\n            onload: this.onLoad.bind(this),\n            onplay: this.onPlay.bind(this),\n            onpause: this.onPause.bind(this),\n            onend: this.onEnd.bind(this)\n        };\n        return _.merge({}, defaultOptions, this.get('options'));\n    }),\n\n    onLoad() {\n        this.set('loading', false);\n\n        this._checkSoundDuration();\n    },\n\n    onPlay() {\n        this.set('playing', true);\n    },\n\n    onPause() {\n        this.set('playing', false);\n    },\n\n    onEnd() {\n        this.set('playing', false);\n        this.set('didEnd', true);\n        if (this.attrs.markAsRead) {\n            this.attrs.markAsRead();\n        }\n    },\n\n    stopPlaying() {\n        this.sound && this.sound.pause();\n    },\n\n    _checkSoundDuration() {\n        const sound = this.sound;\n        if (!sound) {\n            return;\n        }\n\n        const audio = get(sound, '_sounds.0._node');\n        if (audio && audio.duration === Infinity) {\n            // We are dealing with a recording here\n            // See: http://stackoverflow.com/a/39971175\n            audio.currentTime = 1e101;\n            audio.ontimeupdate = () => {\n                audio.ontimeupdate = () => {};\n                audio.currentTime = 0;\n                sound._duration = audio.duration;\n\n                this.notifyPropertyChange('duration');\n            };\n        } else {\n            this.notifyPropertyChange('duration');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['seek-bar', 'clickable'],\n\n    clock: inject.service(),\n\n    attrs: {\n        sound: null,\n        duration: null,\n        currentTime: null\n    },\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        this._super(...arguments);\n\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (newAttrs.currentTime.value !== oldAttrs.currentTime.value) {\n            const position = this.get('position');\n            let left = position * 100;\n            if (left > 100) {\n                left = 100;\n            }\n            Ember.run(() => {\n                this.$('.progress-bar').css('margin-left', `${left}%`);\n            });\n        }\n    },\n\n    click(event) {\n        const seek = event.offsetX / this.$().width();\n        const totalSeconds = this.getAttr('duration') / 1000;\n        this.sendAction('didSeek', seek * totalSeconds);\n    },\n\n    position: computed('sound', 'currentTime', 'duration', function () {\n        const sound = this.getAttr('sound');\n        if (!sound) {\n            return 0;\n        }\n\n        return this.getAttr('currentTime') / this.getAttr('duration');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"wuEWTVpp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"progress-bar\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/seek-bar/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SXvTXLcA\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loadingError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioPlayer.loadingError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link play-toggle\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"playing\\\"]],[33,[\\\"t\\\"],[\\\"common.pause\\\"],null],[33,[\\\"t\\\"],[\\\"common.play\\\"],null]],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePlay\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"playing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-hold\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-play\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[1,[33,[\\\"audio-player/seek-bar\\\"],null,[[\\\"sound\\\",\\\"duration\\\",\\\"currentTime\\\",\\\"didSeek\\\"],[[28,[\\\"sound\\\"]],[28,[\\\"duration\\\"]],[28,[\\\"currentTime\\\"]],\\\"seekSound\\\"]]],false],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"duration-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"current-time\\\",[28,[\\\"currentTime\\\"]]]]],false],[0,\\\"\\\\n            |\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"total-time\\\",[28,[\\\"duration\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/template.hbs\"}});","import Ember from 'ember';\n\nimport Recorder from '../../utils/sound-recorder';\nimport moment from '../../utils/dates';\n\nconst { run, inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-recorder'],\n\n    webrtc: inject.service(),\n\n    recorder: null,\n    startTime: null,\n    showOptions: false,\n\n    attrs: {\n        file: null, // comes from parent, used for notifications\n\n        uploadImmediately: false,\n        playerOptions: {},\n        reset: () => {},\n        audioFileReady: () => {}\n    },\n\n    actions: {\n        startRecording() {\n            this.get('recorder').reset();\n            this.get('recorder').startRecording();\n            this.set('startTime', moment());\n        },\n\n        stopRecording() {\n            this.get('recorder').stopRecording();\n            this.set('startTime', null);\n        },\n\n        reset() {\n            this.get('recorder').reset();\n            this.attrs.reset();\n        }\n    },\n\n    hasSupport: computed.and('webrtc.audioCallCapable', 'hasMediaRecorder'),\n\n    audioBlob: computed.reads('recorder.blob'),\n    audioSource: computed.reads('recorder.blobURL'),\n    recording: computed.reads('recorder.recording'),\n\n    hasMediaRecorder: computed(function () {\n        return window.MediaRecorder !== undefined;\n    }),\n\n    showUploadButton: computed('audioSource', 'uploadImmediately', function () {\n        return !!this.get('audioSource') && !this.get('uploadImmediately');\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.get('hasSupport')) {\n            run.scheduleOnce('afterRender', this, this.setupRecording);\n        } else {\n            run.scheduleOnce('afterRender', this, this.set, 'loaded', true);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const recorder = this.get('recorder');\n        if (recorder) {\n            recorder.destroy();\n        }\n    },\n\n    didUpdateAttrs({ newAttrs }) {\n        if (newAttrs && newAttrs.file) {\n            if (!newAttrs.file.value) {\n                this.get('recorder').reset();\n            }\n        }\n    },\n\n    setupRecording() {\n        const recorder = Recorder.create(Ember.getOwner(this).ownerInjection());\n        this.set('recorder', recorder);\n\n        recorder.on('blobready', () => {\n            Ember.run(() => this.attrs.audioFileReady(this.get('audioBlob')));\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"X7NdLJyg\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasSupport\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"recording-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"recording\\\"]],\\\"recording\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"stop-recording\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"stopRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-stop\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"start-recording\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"startRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-record\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"audioSource\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\"],[[28,[\\\"audioSource\\\"]],[28,[\\\"playerOptions\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"audio-source-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.recordingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"startTime\\\"],[[28,[\\\"startTime\\\"]]]]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noAudio\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-support\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noSupport\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-recorder/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['auth-loading']\n});\n","export default Ember.HTMLBars.template({\"id\":\"hjOUEo9q\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-body\\\"],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-page-loading-spinner\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/auth-loading/template.hbs\"}});","define(\"connections-ui/components/basic-dropdown\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown\"], function (_exports, _basicDropdown) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDropdown.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content-element\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content-element\"], function (_exports, _contentElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _contentElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content\"], function (_exports, _content) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _content.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/trigger\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-entry'],\n    classNameBindings: ['hasChildren'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    person: null,\n\n    isChild: false,\n    isSuperior: false,\n\n    expand: false,\n\n    actions: {\n        toggleExpand() {\n            if (!this.get('isSuperior')) {\n                this.toggleProperty('expand');\n            }\n        }\n    },\n\n    loading: computed('children.isPending', 'superiors.isPending', function () {\n        return this.get('children.isPending') && this.get('superiors.isPending');\n    }),\n\n    children: computed('person', function () {\n        const children = this.get('person.directReports') || [];\n        const promise = Ember.RSVP.resolve(children);\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    superiors: computed('person', 'isChild', function () {\n        if (this.get('isChild')) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n        const superiors = this.get('person.superiors');\n        const promise = superiors.then(people => {\n            const orderedPeople = [];\n\n            return new Ember.RSVP.Promise(resolve => {\n                function getNextPerson(person) {\n                    if (person && person.get('id')) {\n                        orderedPeople.push(person);\n                        const manager = person.getFieldValue('relationships.manager');\n                        if (!manager) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        const nextPerson = people.find(p => {\n                            return p.get('id') === manager.guid;\n                        });\n\n                        if (!nextPerson) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        return getNextPerson(nextPerson);\n                    }\n\n                    resolve(orderedPeople);\n                }\n                this.get('person.manager')\n                    .then(getNextPerson)\n                    .catch(() => resolve(people));\n            });\n        });\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    hasChildren: computed.gt('children.content.length', 0),\n    hasSuperiors: computed.gt('superiors.content.length', 0),\n\n    directReportsLabel: computed('children.content.length', function () {\n        const intl = this.get('intl');\n        const directReports = this.get('children.content.length');\n        if (directReports > 1) {\n            return intl.lookup('components.cardTree.directReports', { directReports });\n        }\n        return intl.lookup('components.cardTree.directReport');\n    }),\n\n    showTotalReports: computed('person.totalReports.content', 'children.content.length', function () {\n        return this.get('person.totalReports.content') > this.get('children.content.length');\n    }),\n\n    totalReportsLabel: computed('person.totalReports.content', function () {\n        const intl = this.get('intl');\n        const totalReports = this.get('person.totalReports.content');\n        if (totalReports > 1) {\n            return intl.lookup('components.cardTree.totalReports', { totalReports });\n        }\n        return intl.lookup('components.cardTree.totalReport');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"7YOgXSV/\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasSuperiors\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"isChild\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"superiors\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isSuperior\\\",\\\"expand\\\"],[[28,[\\\"superiors\\\",\\\"firstObject\\\"]],true,true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expander\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpand\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasChildren\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"isLinkable\\\",\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"size\\\"],[true,[28,[\\\"person\\\"]],true,true,true,[28,[\\\"canViewChat\\\"]],96]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                -\\\\n                \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasChildren\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"directReportsLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"direct-reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTotalReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        -\\\\n                        \\\"],[1,[26,[\\\"totalReportsLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"children\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSuperior\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[33,[\\\"await\\\"],[[28,[\\\"children\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isChild\\\"],[[28,[\\\"child\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"child\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/card-tree-entry/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    didInsertElement() {\n        this.attachTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this.removeTextInputListeners();\n    },\n\n    attachTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown', event => event.stopPropagation());\n    },\n\n    removeTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off('keydown');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"cLGJxA+O\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row heading\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.treeView\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"model\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"classNames\\\",\\\"expand\\\"],[[28,[\\\"model\\\"]],\\\"parent-entry\\\",true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { eventToString, isNavigation } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-detail-view'],\n\n    intl: inject.service(),\n    presenceSubscription: inject.service(),\n\n    entity: null,\n\n    canMove: true,\n\n    flipster: null,\n    currentPerson: null,\n    currentPersonId: computed.reads('currentPerson.id'),\n\n    selfAndSiblings: null,\n    currentPosition: 0,\n    reportTracker: {},\n\n    attrs: {\n        setCurrentPerson() {}\n    },\n\n    actions: {\n        moveToManager() {\n            const currentPersonManager = this.get('currentPerson.manager');\n            if (!currentPersonManager || !currentPersonManager.content) {\n                return;\n            }\n            currentPersonManager\n                .then(manager => {\n                    if (manager && manager.get) {\n                        var name = manager.get('name');\n                        var position = this.getPosition(this.get('currentPerson'));\n                        var tracker = this.get('reportTracker');\n\n                        if (tracker === null) {\n                            tracker = {};\n                        }\n                        tracker[name] = position;\n                        this.set('reportTracker', tracker);\n\n                        return this.setHierarchy(manager);\n                    }\n                })\n                .then(() => {\n                    this.set('didPeersLoad', true);\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        moveToReports(report) {\n            const currentPersonDirectReports = this.get('currentPerson.directReports');\n            if (!currentPersonDirectReports || !currentPersonDirectReports.content) {\n                return;\n            }\n            currentPersonDirectReports\n                .then(reports => {\n                    if (reports && !_.isEmpty(reports)) {\n                        var trackedReport = this.get('reportTracker')[this.get('currentPerson.name')];\n                        if (report) {\n                            return this.setHierarchy(report);\n                        } else if (trackedReport) {\n                            return this.setHierarchy(reports[trackedReport]);\n                        } else {\n                            return this.setHierarchy(reports[0]);\n                        }\n                    }\n                })\n                .then(() => {\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        setPerson(person) {\n            this.set('currentPerson', person);\n            this.attrs.setCurrentPerson(person);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachTextInputListeners();\n        this.attachNavigationListener();\n    },\n\n    willClearRender() {\n        this._super(...arguments);\n        this.removeTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeListeners();\n    },\n\n    allPeople: computed('entity', function () {\n        const entity = this.get('entity');\n        if (entity.id === this.get('currentPerson.id')) {\n            return { isFulfilled: true };\n        }\n        const promises = Ember.RSVP.all([\n            entity.get('directReports'),\n            entity.get('manager'),\n            entity.get('managerSiblings')\n        ]);\n        const promises2 = [this.setHierarchy(this.get('entity')), promises];\n        Ember.RSVP.all(promises2).then(() => {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                Ember.run.next(this, this.makeCoverFlow);\n            });\n        });\n        return DS.PromiseArray.create({\n            promise: promises\n        });\n    }),\n\n    haveScrolled: computed('currentPersonId', 'entity.id', function () {\n        return this.get('currentPersonId') === this.get('entity.id');\n    }),\n\n    peerCount: computed('currentPerson.selfAndSiblings.length', function () {\n        var count = this.get('currentPerson.selfAndSiblings.length') - 1;\n        if (count === -1) {\n            count = 0;\n        }\n        if (count === 1) {\n            return this.get('intl').lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return this.get('intl').lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    setHierarchy(person) {\n        this.set('didPeersLoad', false);\n\n        const promises = [person.get('selfAndSiblings'), person.get('directReports'), person.get('manager')];\n\n        return Ember.RSVP.all(promises).then(([siblings, directReports, manager]) => {\n            let selfAndSiblings = siblings;\n\n            if (_.isEmpty(siblings)) {\n                selfAndSiblings = [person];\n            }\n\n            if (_.isEmpty(directReports)) {\n                directReports = [];\n            }\n\n            this.set('currentPerson', person);\n            this.get('setCurrentPerson')(person);\n\n            this.set('currentPosition', this._getPosition(selfAndSiblings, person));\n            this.set('selfAndSiblings', selfAndSiblings);\n            this.set('didPeersLoad', true);\n\n            if (selfAndSiblings.length === 1 && directReports.length === 0 && _.isEmpty(manager)) {\n                this.set('canMove', false);\n            } else {\n                this.set('canMove', true);\n            }\n        });\n    },\n\n    makeCoverFlow() {\n        if (_.isEmpty(this.$('li')) || !this.$('.flipster')) {\n            return;\n        }\n\n        if (!_.isEmpty(this.$('.flipster__container'))) {\n            // if we already have flipster elements\n            this.$('.flip-content').contents().unwrap();\n        }\n\n        this.$('.flipster').removeClass('flipster--active');\n\n        const startPosition = this.get('currentPosition');\n\n        let flipster = this.$('.flipster').flipster({\n            itemContainer: 'ul',\n            itemSelector: 'li',\n            style: 'flat',\n            start: startPosition,\n            fadeIn: 0,\n            spacing: -0.3,\n            scrollwheel: false,\n            keyboard: false,\n            touch: false,\n            nav: false, // If true, flipster will insert an unordered list of the slides\n            buttons: false, // If true, flipster will insert Previous / Next buttons\n            onItemSwitch: function (to /*, from*/) {\n                Ember.run.debounce(this, this.changeCurrentPerson, to, 300);\n            }.bind(this)\n        });\n\n        this.set('flipster', flipster);\n    },\n\n    changeCurrentPerson(toElem) {\n        Ember.run.scheduleOnce('afterRender', () => {\n            const card = Ember.$(toElem).find('.card');\n            const entityId = card.data('entity-id');\n\n            if (entityId) {\n                const entity = this.get('selfAndSiblings').findBy('id', entityId);\n                this.set('currentPerson', entity);\n                this.attrs.setCurrentPerson(entity);\n            }\n        });\n    },\n\n    _getPosition(selfAndSiblings, person) {\n        if (_.isEmpty(selfAndSiblings)) {\n            return 0;\n        }\n        for (var position = 0; position < selfAndSiblings.length; position++) {\n            if (selfAndSiblings[position].get('id') === person.get('id')) {\n                return position;\n            }\n        }\n    },\n\n    getPosition(person) {\n        return this._getPosition(this.get('selfAndSiblings'), person);\n    },\n\n    attachNavigationListener() {\n        const event = `keydown.${this.elementId}`;\n        Ember.$(document).on(event, event => Ember.run(() => this.onKeyDownHandler(event)));\n    },\n\n    attachTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown' + ns, event => {\n            Ember.run(() => {\n                var key = eventToString(event);\n                if (key === 'DOWN_ARROW' || key === 'UP_ARROW' || key === 'RIGHT_ARROW' || key === 'LEFT_ARROW') {\n                    if (key === 'LEFT_ARROW' || key === 'RIGHT_ARROW') {\n                        event.stopPropagation();\n                    }\n                }\n            });\n        });\n        fields\n            .on('focus' + ns, () => {\n                Ember.run(() => this.set('canMove', false));\n            })\n            .on('focusout' + ns, () => {\n                Ember.run(() => this.set('canMove', true));\n            });\n    },\n\n    removeTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off(ns);\n        Ember.$(document).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    removeListeners() {\n        const ns = `.${this.elementId}`;\n        Ember.$(document).off(ns);\n        Ember.$(window).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    onKeyDownHandler(event) {\n        const key = eventToString(event);\n\n        if (Ember.$(event.target).is('textarea')) {\n            return;\n        }\n\n        if (isNavigation(event) && this.get('canMove')) {\n            if (key === 'LEFT_ARROW') {\n                this.get('flipster').flipster('prev');\n            } else if (key === 'RIGHT_ARROW') {\n                if (this.$('.flipster > ul > li:not(.empty)').length > 1) {\n                    this.get('flipster').flipster('next');\n                }\n            } else if (key === 'UP_ARROW') {\n                this.send('moveToManager');\n            } else if (key === 'DOWN_ARROW') {\n                this.send('moveToReports');\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"zKRAcuTd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"allPeople\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"manager-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"manager \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"managerCount\\\",\\\"action\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"siblings\\\",\\\"length\\\"]],\\\"moveToManager\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"cards \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"no-manager\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-up \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"peer-count\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"peerCount\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"didPeersLoad\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster\\\"],[15,\\\"id\\\",\\\"flipster\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"flip-items\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"selfAndSiblings\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-card\\\"],null,[[\\\"entity\\\",\\\"setPerson\\\",\\\"actionOpenChatRoom\\\",\\\"actionOpenVideoCall\\\"],[[28,[\\\"person\\\"]],\\\"setPerson\\\",[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\"],null],[33,[\\\"route-action\\\"],[\\\"openChatRoomWithVideo\\\"],null]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"selfAndSiblings\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-down \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\",\\\"content\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"action\\\"],[[28,[\\\"report\\\"]],[28,[\\\"entity\\\"]],\\\"moveToReports\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"report\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    tagName: 'p',\n    classNames: ['character-counter', 'small', 'help-block'],\n\n    intl: Ember.inject.service(),\n\n    model: null,\n    maxCount: 0,\n\n    charactersUsed: Ember.computed('model.length', function () {\n        const length = this.get('model.length') || 0;\n        if (length > 1) {\n            return this.get('intl').lookup('components.navMenu.feedback.charactersUsed', {\n                characterCount: length,\n                maxCount: this.get('maxCount')\n            });\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"C6bOpZUm\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"charactersUsed\\\"]],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/characters-used/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['chat-settings'],\n\n    activeRoom: null,\n\n    chat: Ember.inject.service(),\n\n    check: Ember.computed('activeRoom.jid', 'chat.mutedRooms.[]', function () {\n        const activeJid = this.get('activeRoom.jid');\n        const muted = this.get('chat.mutedRooms');\n\n        return activeJid && muted && muted.any(jid => jid === activeJid);\n    }),\n\n    actions: {\n        toggleRoomMute() {\n            const roomJid = this.get('activeRoom.jid');\n            if (roomJid) {\n                const areNotificationsDisabled = this.toggleProperty('check');\n                this.get('chat').setRoomMuted(roomJid, areNotificationsDisabled);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yvV8FFZW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-drop-down\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"notifications-description\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettings\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"check\\\"]],\\\"toggleRoomMute\\\"]]],false],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpText\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted mention-notifications\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpTextMentions\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/chat-settings/template.hbs\"}});","import ClickOutsideComponent from 'ember-click-outside/components/click-outside';\nexport default ClickOutsideComponent;\n","import Ember from 'ember';\nimport * as focusTrap from 'focus-trap';\n\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNameBindings: [':create-entity-menu', 'showMenu::hidden'],\n\n    application: inject.service(),\n    permissions: inject.service(),\n    showCreateGroup: false,\n\n    canInvitePeople: computed.reads('permissions.canInvitePeople'),\n    canCreateGroups: computed.reads('permissions.canCreateGroups'),\n\n    canCreateLocations: computed(() => false),\n\n    showMenu: computed.or('canInvitePeople', 'canCreateGroups', 'canCreateLocations'),\n\n    adminModalSrc: '/admin/#/directory/people/add',\n\n    trap: null,\n\n    actions: {\n        launchCreateGroup() {\n            this.set('showCreateGroup', true);\n        },\n\n        cancelCreateGroup() {\n            this.set('showCreateGroup', false);\n        },\n        showAdminModal() {\n            this.set('showAdminModal', true);\n        },\n\n        closeAdminModal() {\n            this.set('showAdminModal', false);\n        }\n    },\n\n    showDropdownObserver: Ember.observer('showDropdown', function () {\n        if (this.get('showDropdown')) {\n            if (!this.trap) {\n                const modalContainer = this.$('ul.dropdown-menu');\n                if (modalContainer.length) {\n                    this.trap = focusTrap.createFocusTrap(modalContainer[0], {\n                        clickOutsideDeactivates: true,\n                        onPostDeactivate: () => {\n                            this.set('showDropdown', false);\n                        }\n                    });\n                }\n            }\n            if (this.trap) {\n                setTimeout(() => {\n                    this.trap.activate();\n                });\n            }\n        } else {\n            if (this.trap) {\n                this.trap.deactivate();\n            }\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"WQbIfDVj\",\"block\":\"{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"create-entity-menu\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link menu-selector\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.newEntity.title\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-expanded\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"true\\\",\\\"false\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.newEntity.title\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-add-call\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canInvitePeople\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-person\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAdminModal\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.person\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchCreateGroup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.group\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-location\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.location\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCreateGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"headerText\\\",\\\"confirmText\\\",\\\"cancel\\\"],[[33,[\\\"t\\\"],[\\\"groups.admin.newGroup\\\"],null],[33,[\\\"t\\\"],[\\\"common.create\\\"],null],\\\"cancelCreateGroup\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"new-group\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"disable\\\",\\\"setAttribute\\\"],[[28,[\\\"confirmAction\\\"]],\\\"cancelCreateGroup\\\",[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[28,[\\\"setAttribute\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\",\\\"setAttribute\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAdminModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"showFooter\\\",\\\"showHeader\\\"],[\\\"closeAdminModal\\\",false,false]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"admin-ui-modal\\\"],null,[[\\\"closeAdminModal\\\",\\\"src\\\"],[\\\"closeAdminModal\\\",[28,[\\\"adminModalSrc\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/create-entity-menu/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nvar minViewMode = {\n    days: 0,\n    months: 1,\n    years: 2\n};\n\nexport default Ember.Component.extend({\n    classNames: ['date-picker'],\n    label: null,\n    srOnly: false,\n\n    intl: Ember.inject.service(),\n\n    entity: null,\n    // now takes moment.js format\n    value: null,\n\n    placeholder: null,\n\n    minDate: null,\n    maxDate: null,\n\n    inputMode: false,\n\n    format: null,\n    minView: 'days', //months\n\n    isoLocale: Ember.computed.reads('intl.isoLocale'),\n\n    /**\n     * Some dates need to be displayed as just Month and Year.\n     * The ordering and separator depends on user's locale (e.g., Japanese (ja) should display YYYY/M and German (de) would prefer M.YYYY)\n     * Moment does not provide an api to do this.\n     */\n    monthYearLocaleFormat: Ember.computed('value', function () {\n        moment.locale(this.get('isoLocale'));\n        let now = moment();\n        let localeFormat = now.creationData().locale.longDateFormat('L');\n        const regex = /DD\\W|\\WDD/g;\n        localeFormat = localeFormat.replace(regex, '');\n        return localeFormat.replace(/MM/, 'M');\n    }),\n\n    // Used to populate the bootstrap datepicker in setupDatepicker below.\n    datepickerValue: Ember.computed('value', function () {\n        let monthYearLocaleFormat = 'L';\n        if (this.get('format') === 'monthYear') {\n            monthYearLocaleFormat = this.get('monthYearLocaleFormat');\n        }\n\n        let value = this.get('value');\n        let dateObject = moment();\n        if (!_.isEmpty(value)) {\n            const year = Ember.get(value, 'year');\n            const month = Ember.get(value, 'month') - 1;\n            const day = Ember.get(value, 'day');\n\n            // We don't chain calls in case year or month is empty/null\n            dateObject.year(year);\n            dateObject.month(month);\n            dateObject.date(day);\n        }\n\n        if (_.isEmpty(this.get('value'))) {\n            return '';\n        }\n\n        var view = this.get('minView');\n        if (view === 'months') {\n            return dateObject.format(monthYearLocaleFormat);\n        }\n        return dateObject.format(monthYearLocaleFormat);\n    }),\n\n    initDatepicker: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupDatepicker');\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$('.datepicker').datepicker('remove');\n    }),\n\n    didUpdateAttrs(changes) {\n        this._super(...arguments);\n\n        if (changes.newAttrs.entity.value !== changes.oldAttrs.entity.value) {\n            this.$('.datepicker').datepicker('update', this.get('datepickerValue'));\n        }\n    },\n\n    // This is called when editing the field. It initializes the bootstrap datepicker and passes in the values from the datepickerValue computed.\n    setupDatepicker() {\n        if (!this.get('inputMode')) {\n            return;\n        }\n\n        // lowercase because bootstrap datepicker expects mm instead of MM\n        let format = this.get('format') || moment.localeData()._longDateFormat.L.toLowerCase();\n        // if the format is monthYear then get the localized format and pass that to the datepicker\n        let monthYearLocaleFormat = format === 'monthYear' ? this.get('monthYearLocaleFormat').toLowerCase() : format;\n\n        let minView = Ember.get(minViewMode, this.get('minView'));\n\n        const language = this.get('intl.isoRegionalLocale');\n\n        let options = {\n            orientation: 'left bottom',\n            format: monthYearLocaleFormat,\n            minViewMode: minView,\n            todayHighlight: true,\n            clearBtn: true,\n            language: language,\n            container: `#${this.get('elementId')}`\n        };\n\n        let minDate = this.get('minDate');\n        if (minDate) {\n            options = Object.assign({}, options, {\n                startDate: moment(minDate).toDate()\n            });\n        }\n\n        let maxDate = this.get('maxDate');\n        if (maxDate) {\n            options = Object.assign({}, options, {\n                endDate: moment(maxDate).toDate()\n            });\n        }\n\n        // Some bootstrapper-datepicker languages do not include a\n        // translation for the \"Clear\" button\n        let dates = $.fn.datepicker.dates;\n        if (dates[language] && !dates[language].clear) {\n            const selectedLanguage = this.get('intl.isoLocale');\n            if (selectedLanguage == language) {\n                dates[language].clear = this.get('intl').t('common.clear');\n            }\n        }\n\n        // bootstrap datepicker is setup with datePickerValue from above.\n        this.$('.datepicker')\n            .datepicker(options)\n            .on('changeDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('clearDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('hide', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('show', () => {\n                Ember.run(() => {\n                    let classNames = this.get('classNames');\n                    let datepicker = this.$('.datepicker').data('datepicker');\n                    if (datepicker && datepicker.picker) {\n                        datepicker.picker.addClass(classNames.join(' '));\n                    }\n                });\n            })\n            .datepicker('update', this.get('datepickerValue'));\n\n        if (_.isEmpty(this.get('value')) || (!this.get('value.month') && !this.get('value.year'))) {\n            this.$('input').val('');\n        }\n    },\n\n    setData(event) {\n        let date;\n        let str = this.$('input').val();\n        moment.locale(this.get('intl.isoLocale'));\n        if (event.date && !_.isEmpty(str)) {\n            date = moment(event.date);\n        } else {\n            date = moment(str);\n\n            if (_.isEmpty(str) || isNaN(date.valueOf())) {\n                return this.clearValue();\n            }\n        }\n\n        let value = {};\n\n        let view = this.get('minView');\n\n        let day = date.date();\n        let month = date.month() + 1;\n        let year = date.year();\n\n        if (view === 'days') {\n            Ember.set(value, 'day', day);\n            Ember.set(value, 'month', month);\n        } else if (view === 'months') {\n            Ember.set(value, 'month', month);\n        }\n\n        Ember.set(value, 'year', year);\n\n        this.set('value', value);\n    },\n\n    clearValue() {\n        if (_.isEmpty(this.get('value'))) {\n            return;\n        }\n\n        if (this.get('outOfOffice')) {\n            // TODO: remove check for outOfOffice feature toggle when on in all environments\n            this.set('value', null);\n        } else {\n            this.set('value.day', null);\n            this.set('value.month', null);\n            this.set('value.year', null);\n        }\n    },\n\n    _placeholder: Ember.computed('placeholder', function () {\n        var placeholder = this.get('placeholder');\n        if (placeholder) {\n            return this.get('intl').lookup(placeholder, null, true).toString();\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"SED20YyW\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"label\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"inputMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"srOnly\\\"]],\\\"sr-only\\\"],null]]]],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[[28,[\\\"label\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"srOnly\\\"]],\\\"sr-only\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[[28,[\\\"label\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"inputMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"class\\\",[34,[\\\"form-control datepicker \\\",[33,[\\\"if\\\"],[[28,[\\\"error\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"placeholder\\\",[26,[\\\"_placeholder\\\"]],null],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"class\\\",\\\"datepicker\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/date-picker/template.hbs\"}});","define(\"connections-ui/components/desktop-notification/component\", [\"exports\", \"ember-purecloud-components/components/desktop-notification/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import DocumentTitle from \"ember-document-title/components/document-title\";\n\nexport default DocumentTitle;\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['draggable-dropzone', 'clear'],\n    classNameBindings: ['dragClass'],\n    dragClass: 'deactivated',\n    data: null,\n\n    dragLeave(event) {\n        event.preventDefault();\n        this.set('dragClass', 'deactivated');\n    },\n\n    dragOver(event) {\n        event.preventDefault();\n        this.set('dragClass', 'activated');\n    },\n\n    drop(event) {\n        this.set('dragClass', 'deactivated');\n        this.sendAction('dropped', event);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"22Vbwxkd\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-container/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['draggable-item'],\n    attributeBindings: ['draggable', 'ariaLabel'],\n    ariaLabel: Ember.computed(function () {\n        return this.get('intl').lookup('components.inbox.actions.selectCall');\n    }),\n    draggable: 'true',\n    dataType: 'text',\n\n    data: null,\n\n    intl: Ember.inject.service(),\n\n    dragStart(event) {\n        event.dataTransfer.setData(this.get('dataType'), this.get('data'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KQqsaW/F\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-item/template.hbs\"}});","define(\"connections-ui/components/drop-down/component\", [\"exports\", \"ember-purecloud-components/components/drop-down/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['dropdown-menu-view'],\n\n    showMenu: false,\n\n    actions: {\n        toggleMenu() {\n            this.toggleProperty('showMenu');\n        },\n        handleKeyDown(e) {\n            if (e.code === 'Escape' || e.code === 'Enter') {\n                this.set('showMenu', false);\n            }\n        }\n    },\n\n    didInsertElement() {\n        const id = this.get('elementId');\n        Ember.$(window).on(`click.${id}`, event => {\n            Ember.run(() => {\n                const target = $(event.target);\n                const parents = target.parents('.dropdown-menu-view');\n                const targetOutside = !parents.length || id !== parents.attr('id');\n                const targetInput = target.parent('.input').length;\n                const listItem = target.prop('tagName') === 'LI';\n                if (targetOutside || targetInput || listItem) {\n                    this.set('showMenu', false);\n                }\n            });\n        });\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"qyhLFnOs\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-purecloud\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleMenu\\\"],null]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[1,[26,[\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu list-unstyled \\\",[33,[\\\"if\\\"],[[28,[\\\"showMenu\\\"]],\\\"show\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/dropdown-menu/template.hbs\"}});","define(\"connections-ui/components/duration-format/component\", [\"exports\", \"ember-purecloud-components/components/duration-format/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Component.extend({\n    classNames: ['edit-profile-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    entity: null,\n    editing: false,\n    canUploadPicture: true,\n    canEditProfilePicture: true,\n    canEditInformalPicture: true,\n    canEditAgentImage: false,\n\n    showingProfile: true,\n    showingInformal: false,\n\n    openCaption: null,\n    currentInformal: null,\n\n    attrs: {\n        upload() {},\n        select() {},\n        delete() {},\n        changeType() {}\n    },\n\n    actions: {\n        showInformalPhotos: function () {\n            this.set('showingProfile', false);\n            this.set('showingInformal', true);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('informal');\n        },\n\n        showProfilePictures: function () {\n            this.set('showingProfile', true);\n            this.set('showingInformal', false);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('profile');\n        },\n\n        showAgentPhotos() {\n            this.set('showingProfile', false);\n            this.set('showingInformal', false);\n            this.set('showingAgent', true);\n\n            this.get('changeType')('agent');\n        },\n\n        uploadImage(type) {\n            this.get('upload')(type);\n        },\n\n        selectUploadedImage(type, image, active) {\n            this.get('select')(type, image, active);\n        },\n\n        deleteUploadedImage(type, image, active) {\n            this.get('delete')(type, image, active);\n        },\n\n        removeAgentImage() {\n            const entity = this.get('entity');\n\n            if (this.get('entity.type') === 'person') {\n                const userId = entity.id;\n                const imageId = this.get('entity.agent.profileImage.firstObject._id');\n                if (!imageId) return;\n\n                this.get('ajax')\n                    .delete(Ember.get(this, 'application').pcV2Uri(`api/v2/users/${userId}/images/${imageId}`))\n                    .then(() => {\n                        this.get('store')\n                            .findRecord('person', userId)\n                            .then(() => {\n                                entity.set('agent.profileImage', [], { overwrite: true });\n                            });\n                    })\n                    .catch(err => {\n                        const intl = this.get('intl');\n                        this.logger.error('failed to upload image', { error: err });\n                        this.get('notification').error(\n                            intl.lookup('notification.titles.profileSaveError').toString(),\n                            intl.lookup('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                        return;\n                    });\n            } else {\n                entity.set('agent.profileImage', [], { overwrite: true });\n                let section = entity.get('fieldConfig.agent');\n                entity.saveSection(section);\n            }\n        }\n    },\n\n    scrollActiveImageIntoView: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var activeImg = this.$('img.active'),\n                picturesContainer = this.$('.pictures');\n            if (activeImg.length > 0 && picturesContainer.length > 0) {\n                var target = activeImg[0],\n                    parent = picturesContainer[0];\n\n                parent.scrollTop = target.parentNode.offsetTop;\n            }\n        });\n    }),\n\n    setupTabListeners: Ember.on('didInsertElement', function () {\n        const component = this;\n\n        // Listen for guxactivetabchange event on gux-tabs element\n        this.$('gux-tabs').on('guxactivetabchange', function (event) {\n            Ember.run(function () {\n                const tabId = event.originalEvent.detail;\n\n                if (tabId === 'informal') {\n                    component.send('showInformalPhotos');\n                } else if (tabId === 'profile') {\n                    component.send('showProfilePictures');\n                } else if (tabId === 'agent') {\n                    component.send('showAgentPhotos');\n                }\n                // Set focus on the active tab\n                Ember.run.later(\n                    component,\n                    function () {\n                        const activeTab = component.$('.gux-tab.gux-active')[0];\n                        if (activeTab && activeTab.offsetParent !== null) {\n                            // Blur any currently focused element (likely the close button)\n                            if (document.activeElement) {\n                                document.activeElement.blur();\n                            }\n                            // Focus the active tab\n                            activeTab.focus();\n                        }\n                    },\n                    50\n                );\n            });\n        });\n    }),\n\n    teardownTabListeners: Ember.on('willDestroyElement', function () {\n        this.$('gux-tabs').off('guxactivetabchange');\n    }),\n\n    emptyProfilesText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyProfile';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyProfile';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyProfile';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    emptyInformalsText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyInformal';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyInformal';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyInformal';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    profileInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_profile_instructionText')) {\n            return this.get('intl').lookup('person_images_profile_instructionText').toString();\n        }\n        return '';\n    }),\n\n    informalInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_informal_instructionText')) {\n            return this.get('intl').lookup('person_images_informal_instructionText').toString();\n        }\n        return '';\n    }),\n\n    agentImage: Ember.computed('entity.agent.profileImage.@each.value', function () {\n        let image = this.get('entity').getFieldValue('agent.profileImage');\n        if (_.isEmpty(image) || _.isEmpty(image.value)) {\n            return null;\n        }\n\n        return image.value.x200 || image.value.x800 || image.value.x1024;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O7zPMaH7\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-tabs\\\",{\\\"attrs\\\":[[16,\\\"active-tab\\\",[26,[\\\"changeType\\\"]],null],[15,\\\"guxactivetabchange\\\",\\\"imageSelectTypeSwitchChange($event)\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-tab-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"class\\\",\\\"nav\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"profile-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"profile-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingProfile\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.uploads_images\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"informal-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"informal-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingInformal\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.images_informal\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"agent-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"agent-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingAgent\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.agent_profileImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current current-profile-picture\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"entity\\\"]],400]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-profile\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"profile\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.newImageBtn\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfilePicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"instructionText\\\"],[13],[1,[26,[\\\"profileInstructionText\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedProfilePictures\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],96,[28,[\\\"editing\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[26,[\\\"emptyProfilesText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"instruction-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"informalInstructionText\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"informal-button\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-informal\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"informal\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"pictures informal \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"center\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedInformalPhotos\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"type\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"showingInformal\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],150,\\\"informal\\\",[28,[\\\"editing\\\"]],[28,[\\\"canEditInformalPicture\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"emptyInformalsText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current agent-image current-agent-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-image\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[15,\\\"class\\\",\\\"full-width-image\\\"],[16,\\\"src\\\",[34,[[26,[\\\"agentImage\\\"]]]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"agent-buttons\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture upload-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"agent\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-danger remove-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeAgentImage\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"]]}],[0,\\\"\\\\n\\\"]]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/edit-profile-picture/template.hbs\"}});","define(\"connections-ui/components/ember-modal-dialog-positioned-container\", [\"exports\", \"ember-modal-dialog/components/positioned-container\"], function (_exports, _positionedContainer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _positionedContainer.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-basic-dialog\", [\"exports\", \"ember-modal-dialog/components/basic-dialog\"], function (_exports, _basicDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-in-place-dialog\", [\"exports\", \"ember-modal-dialog/components/in-place-dialog\"], function (_exports, _inPlaceDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inPlaceDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-dialog\"], function (_exports, _liquidDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-tether-dialog\"], function (_exports, _liquidTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/tether-dialog\"], function (_exports, _tetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-tether\", [\"exports\", \"ember-tether/components/ember-tether\"], function (_exports, _emberTether) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberTether.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-wormhole\", [\"exports\", \"ember-wormhole/components/ember-wormhole\"], function (_exports, _emberWormhole) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberWormhole.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport cloneDeep from 'lodash/cloneDeep';\n\nconst { computed } = Ember;\n\nconst COUNTRY_OPTIONS = [\n    {\n        displayName: 'emergencyLocation.country.usa',\n        value: 'US'\n    },\n    {\n        displayName: 'emergencyLocation.country.canada',\n        value: 'CA'\n    }\n];\n\nexport default Ember.Component.extend({\n    classNames: ['emergency-location'],\n    classNameBindings: ['saving:saving-emergency-location'],\n    intl: Ember.inject.service(),\n\n    editingElocation: false,\n    eLocation: computed.reads('emergencyLocationData.eLocation'),\n    showTitle: false,\n    showResetButton: false,\n    showTitleIcons: true,\n    showTitleInEditMode: true,\n    personId: null,\n    primaryVoice: computed.reads('emergencyLocationData.primaryVoice'),\n    saving: false,\n    countryOptions: Ember.A([]),\n\n    street1: computed.reads('updatedAddress.street1'),\n    street2: computed.reads('updatedAddress.street2'),\n    city: computed.reads('updatedAddress.city'),\n    state: computed.reads('updatedAddress.state'),\n    zipcode: computed.reads('updatedAddress.zipcode'),\n    country: computed('updatedAddress.country', 'countryOptions.[]', function () {\n        return this.get('updatedAddress.country') || '';\n    }),\n\n    street1ReadOnly: computed.reads('eLocation.address.street1'),\n    street2ReadOnly: computed.reads('eLocation.address.street2'),\n    cityReadOnly: computed.reads('eLocation.address.city'),\n    stateReadOnly: computed.reads('eLocation.address.state'),\n    zipcodeReadOnly: computed.reads('eLocation.address.zipcode'),\n    countryReadOnly: computed.reads('eLocation.address.country'),\n\n    isAddressEmpty(address) {\n        if (!address) {\n            return true;\n        }\n        return (\n            !Ember.get(address, 'street1') ||\n            !Ember.get(address, 'city') ||\n            !Ember.get(address, 'zipcode') ||\n            !Ember.get(address, 'country')\n        );\n    },\n\n    isEmpty: computed('eLocation.address.{street1,street2,city,zipcode,country}', function () {\n        return this.isAddressEmpty(this.get('eLocation.address'));\n    }),\n\n    showNumberInTitle: computed.notEmpty('primaryVoice.number'),\n\n    // updatedAddess is used to bind to input values while in edit mode\n    // it is initialized with either eLocationAddress or previewAddress\n    // and is updated by user typed in values while in edit mode.\n    // This is the object that is used when saving the address to the endpoint\n    // This should not be passed down by parent component\n    updatedAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    // previewAddress contains the address that is passed down by the parent component\n    // This address is copied over to the updatedAddress to be seen in the address form.\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressIsEligible: true,\n    previewAddressError: '',\n\n    toolTipArrowId: computed('elementId', function () {\n        return `arrow-id-${this.get('elementId')}`;\n    }),\n\n    toolTipHelpId: computed('elementId', function () {\n        return `help-id-${this.get('elementId')}`;\n    }),\n\n    toolTipAlertInfoId: computed('elementId', function () {\n        return `alert-info-id-${this.get('elementId')}`;\n    }),\n\n    isEligibleForE911: computed.reads('emergencyLocationData.isEligibleForE911'),\n    eLocationInlineWarning: computed.reads('emergencyLocationData.eLocationInlineWarning'),\n\n    hasELocationInlineWarning: computed.notEmpty('eLocationInlineWarning'),\n\n    actions: {\n        setField(field, event) {\n            if (!event || !event.target || (!event.target.value && !this.get(`${field}`))) return;\n            this.set(`updatedAddress.${field}`, event.target.value);\n\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(this.get('updatedAddress'));\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        const countryTranslated = COUNTRY_OPTIONS.map(entry => {\n            return {\n                value: entry.value,\n                displayName: this.get('intl').lookup(entry.displayName).toString()\n            };\n        });\n        this.set('countryOptions', countryTranslated);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.get('setUpdatedAddress').perform();\n    },\n\n    setUpdatedAddress: task(function* () {\n        yield waitForQueue('actions');\n        if (this.get('eLocation') && this.get('editingElocation') && !this.get('saving')) {\n            const eLocationCopy = cloneDeep(this.get('previewAddress'));\n            this.set('updatedAddress', eLocationCopy);\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(cloneDeep(this.get('updatedAddress')));\n            }\n        }\n    }).restartable()\n});\n","export default Ember.HTMLBars.template({\"id\":\"p7JEF6x8\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"edit-mode \\\",[33,[\\\"unless\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleInEditMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section-edit\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipAlertInfoId\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"alert-info-edit\\\"],[15,\\\"icon-name\\\",\\\"alert-info\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipAlertInfoId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.alertInfo\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"previewAddressIsEligible\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[15,\\\"name\\\",\\\"street1\\\"],[15,\\\"class\\\",\\\"address-street1\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street1\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address1Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street1\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address1Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[15,\\\"name\\\",\\\"street2\\\"],[15,\\\"class\\\",\\\"address-street2\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street2\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address2Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street2\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address2Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[15,\\\"name\\\",\\\"city\\\"],[15,\\\"class\\\",\\\"address-city\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"city\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.cityPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"city\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.cityLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[15,\\\"name\\\",\\\"state\\\"],[15,\\\"class\\\",\\\"address-state\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"state\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.statePlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"state\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.stateLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[15,\\\"name\\\",\\\"zipcode\\\"],[15,\\\"class\\\",\\\"address-zipcode\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"zipcode\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.zipPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"zipcode\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.zipLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-dropdown\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"country\\\"],null],null],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[15,\\\"name\\\",\\\"country\\\"],[15,\\\"class\\\",\\\"address-country\\\"],[16,\\\"value\\\",[26,[\\\"country\\\"]],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.countryPlaceholder\\\"],null]]]],[15,\\\"filterable\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"countryOptions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"country\\\",\\\"value\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[28,[\\\"country\\\",\\\"displayName\\\"]],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"country\\\"]},null],[0,\\\"                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.countryLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"previewAddressError\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"non-edit-mode \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipArrowId\\\"]]]]],[15,\\\"class\\\",\\\"edit-emergency-location-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"personId\\\"]],[33,[\\\"query-params\\\"],null,[[\\\"editEmergencyLocation\\\"],[\\\"true\\\"]]]],[[\\\"tabindex\\\",\\\"class\\\"],[\\\"0\\\",\\\"to-profile\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"edit\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipArrowId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.update\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipHelpId\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],null],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-help\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipHelpId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showNumberInTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-for-number\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.titleForNumber\\\"],[[\\\"number\\\"],[[28,[\\\"primaryVoice\\\",\\\"display\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street1\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street1ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street2\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street2ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field city-state-zip\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"cityReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"stateReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"zipcodeReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field country\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"countryReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showResetButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null]]]],[15,\\\"accent\\\",\\\"tertiary\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"resetElocation\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/emergency-location/template.hbs\"}});","define(\"connections-ui/components/emoji-dom/component\", [\"exports\", \"ember-purecloud-components/components/emoji-dom/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import { equal, notEmpty } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\nimport DS from 'ember-data';\nimport isEmpty from 'lodash.isempty';\nimport debounce from 'lodash.debounce';\nimport { inject as service } from '@ember/service';\nimport Ember from 'ember';\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-contact-group-v2'],\n    classNameBindings: ['compact'],\n    intl: service(),\n    session: service(),\n    application: service(),\n    canViewChat: true,\n    canViewVideo: true,\n    entity: null,\n    videoTooltipTitle: '',\n    linkProfile: false,\n    showFavorite: false,\n    showImages: true,\n    compact: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isChatEnabled: false,\n    isWebrtcEnabled: false,\n    isVideoButtonEnabled: false,\n    onContact() {},\n    callEntity() {},\n    toggleFavorite() {},\n\n    useMediaProviders: false,\n\n    actions: {\n        makeCall: debounce(function () {\n            if (this.get('isGroup')) {\n                const groupNumber = this.get('entity.contactInfo.groupNumber.firstObject.value.number');\n                const groupExtension = this.get('entity.contactInfo.groupNumber.firstObject.value.extension');\n                const phoneNumber = groupNumber || groupExtension;\n                this.bubbleAction({\n                    action: 'startCallByNumber',\n                    actionContext: [phoneNumber]\n                });\n            } else {\n                this.bubbleAction({\n                    action: 'startCallPersonById',\n                    actionContext: [this.get('entity.id')]\n                });\n            }\n\n            this.get('onContact')();\n        }, 250),\n\n        startChat() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [entity.get('jid')]\n            });\n\n            this.get('onContact')();\n        },\n\n        sendLove() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'sendLove',\n                actionContext: [entity]\n            });\n\n            this.get('onContact')();\n        },\n\n        launchWebrtc() {\n            if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                return;\n            }\n\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoomWithVideo',\n                actionContext: [entity.get('id'), this.get('useMediaProviders')]\n            });\n\n            this.get('onContact')();\n        },\n\n        showGallery() {\n            this.sendAction('viewLightGallery');\n\n            this.get('onContact')();\n        },\n\n        navigateTo() {\n            this.get('application').navigateTo(this.get('entity.type'), this.get('entity.id'));\n        }\n    },\n\n    isPerson: equal('entity.type', 'person'),\n    isGroup: equal('entity.type', 'group'),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    isSelf: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    hasImages: computed(\n        'entity.uploadedInformalPhotos.[]',\n        'entity.images.informal.[]',\n        'entity.images.gallery.[]',\n        function () {\n            if (!this.get('showImages')) {\n                return false;\n            }\n\n            const personHasImage = this.get('entity.type') === 'person' && !!this.get('entity.images.informal.length');\n            const groupHasImage = this.get('entity.type') === 'group' && !!this.get('entity.images.gallery.length');\n            return personHasImage || groupHasImage;\n        }\n    ),\n\n    hasPhone: computed('entity.phone', 'entity.contactInfo.groupNumber', function () {\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('entity.contactInfo.groupNumber'));\n        }\n        return !isEmpty(this.get('entity.phone'));\n    }),\n\n    email: computed('entity.primaryContactInfo.email.firstObject.value.fieldId', 'isPerson', function () {\n        if (!this.get('isPerson')) {\n            return;\n        }\n        let entity = this.get('entity');\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n        let email = entity.getFieldValue('primaryContactInfo.email');\n        return email.value;\n    }),\n    phone: computed(\n        'entity.primaryContactInfo.voice.firstObject.value.fieldId',\n        'isPerson',\n        'entity.contactInfo.groupNumber.firstObject.value.fieldId',\n        'isGroup',\n        function () {\n            if (!this.get('isPerson') && !this.get('isGroup')) {\n                return;\n            }\n            let entity = this.get('entity');\n            if (entity instanceof DS.PromiseObject) {\n                entity = entity.get('content');\n            }\n            if (!entity) {\n                return;\n            }\n            let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n            if (this.get('isGroup')) {\n                phone = entity.getFieldValue('contactInfo.groupNumber', true);\n            }\n            if (phone && phone.value && phone.value.fieldPath) {\n                return entity.getFieldValue(phone.value.fieldPath);\n            }\n            return phone;\n        }\n    ),\n\n    mailto: computed('email', 'emailEnabled', function () {\n        if (this.get('emailEnabled')) {\n            return `mailto:${this.get('email')}`;\n        }\n        return '';\n    }),\n\n    tel: computed('phone', function () {\n        const phone = this.get('phone');\n        if (phone.rel) {\n            return `tel:${phone.rel.e164}`;\n        }\n    }),\n\n    emailEnabled: notEmpty('email'),\n\n    // Phone button enabled if a phone is available or the entity has a phone number to use for a tel: link\n    phoneEnabled: computed('phoneServiceEnabled', 'phoneAvailable', 'phone', function () {\n        return (this.get('phoneServiceEnabled') && this.get('phoneAvailable')) || !isEmpty(this.get('phone'));\n    }),\n\n    showPhone: computed('phoneServiceEnabled', 'phone', 'isGroup', function () {\n        if (!this.get('phoneServiceEnabled')) {\n            return false;\n        }\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('phone'));\n        } else {\n            return true;\n        }\n    }),\n\n    entityData: computed('entity.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('entity.id'),\n            name: this.get('entity.name'),\n            isFavorite: this.get('entity.isFavorite'),\n            type: this.get('entity.type')\n        };\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    didRender() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this._updateFavoriteAttributes);\n    },\n\n    _updateFavoriteAttributes() {\n        const entity = this.get('entity');\n        if (!entity) {\n            return;\n        }\n\n        const intl = this.get('intl');\n        if (!intl) {\n            return;\n        }\n\n        const isFavorite = entity.get('isFavorite');\n        const name = entity.get('name') || '';\n        const title = isFavorite ? intl.t('common.unMarkFavorite', { name }) : intl.t('common.markFavorite', { name });\n\n        // Find the entity-favorite component in this component's DOM\n        const element = this.element;\n        if (!element) {\n            return;\n        }\n\n        // Find the button (it might be the root element or inside)\n        let favoriteButton = element.querySelector('button.entity-favorite, button.person-favorite');\n        if (!favoriteButton) {\n            const favoriteComponent = element.querySelector('.entity-favorite');\n            if (favoriteComponent) {\n                favoriteButton =\n                    favoriteComponent.tagName === 'BUTTON'\n                        ? favoriteComponent\n                        : favoriteComponent.querySelector('button');\n            }\n        }\n\n        if (favoriteButton && title) {\n            // Set title on the button element\n            favoriteButton.setAttribute('title', title);\n            favoriteButton.title = title;\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"+JHLGccX\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"showPhone\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"tel\\\"]]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"font-icon\\\"],null,[[\\\"class\\\"],[\\\"pc-moon pc-phone\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"isPerson\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.emailSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],null],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"mailto\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-email\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.email\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"isChatEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact chat\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startChat\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-chat\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact webrtc \\\",[33,[\\\"if\\\"],[[28,[\\\"isVideoButtonEnabled\\\"]],\\\"enabled\\\",\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.openVideoCallSr\\\"],[[\\\"tooltip\\\",\\\"name\\\"],[[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchWebrtc\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-video\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[26,[\\\"videoTooltipTitle\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isLoveEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact purelove\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.propsSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendLove\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-love\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.props\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasImages\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact gallery\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.goToGallerySr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showGallery\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToGallery\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"linkProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact profile\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"icon\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"showFavorite\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"import-data\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.importLinkedinSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showLinkedInImport\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-linkedin\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.importLinkedin\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-favorite\\\"],null,[[\\\"entity\\\",\\\"toggleFavorite\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact-group-v2/template.hbs\"}});","define(\"connections-ui/components/entity-contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport PersonModel from '../../models/person';\nimport EntityContact from '../entity-contact/component';\n\nexport default EntityContact.extend(FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n    session: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n\n    layoutName: 'components/entity-contact',\n\n    makingCall: false,\n    queue: null,\n    phoneNumber: null,\n    call: null,\n\n    actions: {\n        makeCall: function () {\n            if (!this.get('makingCall')) {\n                const person = this.get('otherParty.content') || this.get('person');\n\n                const queue = this.get('queue.content');\n                const phoneNumber = this.get('phoneNumber');\n\n                let callPromise;\n                this.set('makingCall', true);\n\n                if (this.get('call.isAcdCall')) {\n                    if (person instanceof PersonModel) {\n                        callPromise = this.phoneService.makeCall(person, null, queue);\n                    } else if (this.get('person') && _.isEmpty(phoneNumber)) {\n                        this.set('makingCall', false);\n                        this._super();\n                        return;\n                    } else {\n                        callPromise = this.phoneService.makeCall(phoneNumber, null, queue);\n                    }\n                } else {\n                    callPromise = this.phoneService.makeCall(queue, null, false);\n                }\n\n                callPromise.finally(() => {\n                    this.set('makingCall', false);\n                });\n            }\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport debounce from 'lodash.debounce';\n\nimport PromiseLoadingMixin from '../../mixins/promise-loading';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport * as focusTrap from 'focus-trap';\n\nvar EntityContactComponent = Ember.Component.extend(PromiseLoadingMixin, FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressformat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    showPhone: false,\n    showChat: false,\n    showEmail: false,\n    showFavorite: false,\n    shouldTether: false,\n    contact: null,\n    phoneNumber: null,\n    email: null,\n    callId: null,\n\n    shouldDisplayDropdown: true,\n    showDropdown: false,\n    callConnecting: false,\n    flaggingSupportEnabled: false,\n    isRedial: false,\n    _closingViaEscape: false,\n\n    tether: null,\n\n    trap: null,\n\n    actions: {\n        toggleFavorite: function () {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        },\n\n        toggleDropdown: function (skipFocus) {\n            this.toggleProperty('showDropdown');\n\n            if (this.get('showDropdown') && !skipFocus && !this.get('_closingViaEscape')) {\n                let tether = this.get('tether');\n                if (this.get('shouldTether') && !_.isEmpty(tether)) {\n                    Ember.run.scheduleOnce('afterRender', tether, tether.position);\n                }\n                // Focus first focusable element when dropdown opens\n                Ember.run.scheduleOnce('afterRender', this, function () {\n                    // Use a small delay to ensure tethered dropdown is positioned\n                    const focusTimer = Ember.run.later(\n                        this,\n                        function () {\n                            if (this.get('_closingViaEscape') || !this.get('showDropdown')) {\n                                return;\n                            }\n                            // Check both regular and tethered dropdown menus\n                            const dropdown =\n                                this.$('.dropdown-menu.show').length > 0\n                                    ? this.$('.dropdown-menu.show')\n                                    : Ember.$('.entity-contact-dropdown-menu.show');\n\n                            const firstFocusable = dropdown\n                                .find('a, button, [tabindex=\"0\"]')\n                                .filter(':visible')\n                                .first();\n\n                            if (firstFocusable.length > 0) {\n                                firstFocusable.focus();\n                            }\n                        },\n                        50\n                    );\n                    this.set('_focusTimer', focusTimer);\n                });\n            }\n        },\n\n        makeCall: debounce(function (address) {\n            if (this.get('session.features.digitalFirstPURE2942') && !this.get('permissions.phoneEnabled')) {\n                return;\n            }\n            this.set('showDropdown', false);\n\n            this.get('person').then(person => {\n                if (address) {\n                    // Prefer action supplied phone number entry to makeCall.\n                    // User has clicked dropdown and selected a specific number.\n                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [address]\n                    });\n                } else if (!_.isEmpty(person) && !(this.get('isExternalContact') || this.get('isGroup'))) {\n                    // Or call person by their guid\n                    // Calling a person back at their preferred number.\n                    this.bubbleAction({\n                        action: 'startCallPersonById',\n                        actionContext: [this.get('person.id')]\n                    });\n                } else {\n                    // Otherwise call person by specified phone number to the component.\n                    // (call-history-entry, active-call-entry components)\n                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [this.get('phoneNumber')]\n                    });\n                }\n            });\n        }, 250),\n\n        recordRecentContact: function (type, value) {\n            if (type === 'email') {\n                window.top.location = 'mailto:' + value.data.value;\n            } else if (type === 'voice' && !this.get('phone.enabled')) {\n                if (this.get('session.features.digitalFirstPURE2942')) {\n                    return;\n                }\n                window.top.location = 'tel:' + value.data.rel.e164;\n            }\n        },\n\n        startChat: function (jid) {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [jid]\n            });\n            this.set('showDropdown', false);\n        },\n\n        sendToProfile: function () {\n            this.get('person').then(person => {\n                this.bubbleAction({\n                    action: 'transitionToEntityDetail',\n                    actionContext: [person]\n                });\n\n                this.set('showDropdown', false);\n            });\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    },\n\n    entityData: Ember.computed('contact.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('contact.id'),\n            name: this.get('contact.name'),\n            isFavorite: this.get('contact.isFavorite'),\n            type: this.get('contact.type')\n        };\n    }),\n\n    isEntityFavoriteDecompEnabled: Ember.computed.readOnly('session.features.epcDecompEntityFavorite'),\n\n    callConnected: Ember.observer('phone.activeCall', function () {\n        const activeCall = this.get('phone.activeCall');\n\n        if (activeCall) {\n            const activeCallId = Ember.get(activeCall, 'id');\n            const componentCallIsActiveCall = activeCallId === this.get('callId');\n            if (componentCallIsActiveCall) {\n                this.set('callConnecting', false);\n            }\n        }\n    }),\n\n    phoneNumberDetails: Ember.computed('phoneNumber', 'person', function () {\n        if (this.get('person.name')) {\n            return this.get('person.name');\n        }\n        return this.get('addressformat').formatAddressForDisplay(this.get('phoneNumber'));\n    }),\n\n    phoneServiceEnabled: Ember.computed('phone.{enabled,phoneDisabled,noStationSelected}', function () {\n        return this.get('phone.enabled') && !this.get('phone.noStationSelected') && !this.get('phone.phoneDisabled');\n    }),\n\n    phoneEnabled: Ember.computed('showPhone', 'isExternalContact', 'phoneNumber', 'phone.phoneDisabled', function () {\n        if (this.get('phone.phoneDisabled') || this.get('personIsDeleted')) {\n            return false;\n        }\n        return (\n            this.get('showPhone') ||\n            ((this.get('isExternalContact') || this.get('isGroup')) && !!this.get('phoneNumber'))\n        );\n    }),\n\n    chatEnabled: Ember.computed('showChat', 'isExternalContact', 'permissions.canViewBusinessChat', function () {\n        return this.get('permissions.canViewBusinessChat') && this.get('showChat') && !this.get('isExternalContact');\n    }),\n\n    emailEnabled: Ember.computed('showEmail', 'isExternalContact', 'email', function () {\n        return this.get('showEmail') || (this.get('isExternalContact') && !!this.get('email'));\n    }),\n\n    favoriteEnabled: Ember.computed('showFavorite', 'isExternalContact', 'favorites.enabled', function () {\n        return this.get('showFavorite') && !this.get('isExternalContact') && this.get('favorites.enabled');\n    }),\n\n    isExternal: Ember.computed('contact.participantType', function () {\n        if (this.get('contact.type') === 'person' || this.get('isExternalContact')) {\n            return false;\n        }\n        return (\n            !this.get('contact.purpose') ||\n            this.get('contact.purpose').toLowerCase() === 'external' ||\n            _.isEmpty(this.get('contact.userId'))\n        );\n    }),\n\n    isExternalContact: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'externalContact';\n    }),\n\n    isGroup: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'group';\n    }),\n\n    setExternalContactInfo: Ember.on('didInsertElement', function () {\n        if (this.get('isExternalContact')) {\n            var phone = this.get('contact.contactInfo.phone');\n            if (phone) {\n                this.set('phoneNumber', `tel:${phone[0].rel.e164}`);\n            }\n\n            var email = this.get('contact.contactInfo.email');\n            if (email) {\n                this.set('email', `mailto:${email[0].value}`);\n            }\n        }\n    }),\n\n    setupGroupPhoneNumber: Ember.on('didInsertElement', function () {\n        if (this.get('isGroup')) {\n            Ember.run.scheduleOnce('afterRender', this, this.setGroupNumber);\n        }\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        });\n    }),\n\n    person: Ember.computed('contact.{userId,type,id}', function () {\n        var type = this.get('contact.type');\n        var id = this.get('contact.id');\n        var userId = this.get('contact.userId');\n        if (type && id) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(this.get('contact'))\n            });\n        } else if (userId) {\n            // This fall through will not be needed after public api v3 -- this looks up a user by GUID\n            return this.store.find('person', userId);\n        }\n        return Ember.RSVP.resolve({});\n    }),\n\n    personIsDeleted: Ember.computed.equal('person.state', 'deleted'),\n\n    hideChat: Ember.computed('contact.{id,userId}', 'session.person.id', function () {\n        let id = this.get('contact.id') || this.get('contact.userId');\n        return id === this.get('session.person.id');\n    }),\n\n    jid: Ember.computed('person.jid', 'contact.jid', function () {\n        if (this.get('contact.type') === 'group') {\n            return this.get('contact.jid');\n        }\n\n        return this.get('person.jid');\n    }),\n\n    phones: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.phone');\n        } else {\n            var promise = this.get('person').then(person => {\n                return this.getContactFieldValuesByType(person, 'voice');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    emails: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.email');\n        } else {\n            var promise = this.get('person').then(person => {\n                this.getContactFieldValuesByType(person, 'email');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    displayDropdown: Ember.computed('shouldDisplayDropdown', 'phones', 'emails', 'isExternalContact', function () {\n        var hasEmail = !_.isEmpty(this.get('emails'));\n        var hasPhone = !_.isEmpty(this.get('phones'));\n        var canDisplay = this.get('shouldDisplayDropdown');\n        var isContact = this.get('isExternalContact');\n\n        return canDisplay && (!isContact || hasEmail || hasPhone);\n    }),\n\n    callTitle: Ember.computed(function () {\n        return this.get('intl').t('tooltip.contactIcon.phone').toString();\n    }),\n\n    attachListeners: Ember.on('didInsertElement', function () {\n        var id = this.get('elementId');\n\n        Ember.$(window).on('click.' + id, Ember.run.bind(this, this.detectOutsideClick));\n        // Use keyup instead of keydown to avoid conflicts\n        Ember.$(document).on('keyup.' + id, Ember.run.bind(this, this.handleKeyDown));\n    }),\n\n    setupTether: Ember.on('didInsertElement', function () {\n        if (!this.get('shouldTether')) {\n            return;\n        }\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let tether = new window.Tether({\n                element: this.$('.dropdown-menu')[0],\n                target: this.$('.show-more')[0],\n                attachment: 'top right',\n                targetAttachment: 'bottom right',\n                constraints: [\n                    {\n                        to: 'scrollParent',\n                        attachment: 'together',\n                        pin: true\n                    }\n                ]\n            });\n\n            this.set('tether', tether);\n        });\n    }),\n\n    showDropdownObserver: Ember.observer('showDropdown', function () {\n        if (this.get('showDropdown')) {\n            if (!this.trap) {\n                const modalContainer = this.$('ul.dropdown-menu');\n                if (modalContainer.length) {\n                    this.trap = focusTrap.createFocusTrap(modalContainer[0], {\n                        clickOutsideDeactivates: true,\n                        onPostDeactivate: () => {\n                            this.set('showDropdown', false);\n                        }\n                    });\n                }\n            }\n            if (this.trap) {\n                setTimeout(() => {\n                    this.trap.activate();\n                });\n            }\n        } else {\n            if (this.trap) {\n                this.trap.deactivate();\n            }\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    }),\n\n    removeTether() {\n        let tether = this.get('tether');\n        if (tether) {\n            tether.destroy();\n            if (tether.element) {\n                tether.element.remove();\n            }\n        }\n    },\n\n    removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    willDestroyElement() {\n        this.removeListeners();\n        this.removeTether();\n\n        this._super(...arguments);\n    },\n\n    detectOutsideClick: function (event) {\n        var id = this.get('elementId');\n        var target = Ember.$(event.target);\n\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        // Check if click is outside component and outside tethered dropdown\n        const isOutsideComponent = id && !target.parents('#' + id).length;\n        const isOutsideTetheredDropdown = !target.closest('.entity-contact-dropdown-menu').length;\n\n        if (isOutsideComponent && isOutsideTetheredDropdown) {\n            Ember.run.once(this, this.set, 'showDropdown', false);\n        }\n    },\n\n    handleKeyDown: function (event) {\n        const key = event.key || event.keyCode;\n\n        // Close dropdown on Escape\n        if ((key === 'Escape' || key === 'Esc' || key === 27) && this.get('showDropdown')) {\n            // Cancel any pending focus timer\n            const focusTimer = this.get('_focusTimer');\n            if (focusTimer) {\n                Ember.run.cancel(focusTimer);\n                this.set('_focusTimer', null);\n            }\n\n            // Set flag to prevent auto-focus\n            this.set('_closingViaEscape', true);\n\n            // Store reference to toggle button\n            const toggleButton = this.$('.show-more');\n\n            // Close dropdown\n            this.set('showDropdown', false);\n\n            // Return focus to toggle button\n            if (toggleButton && toggleButton.length > 0) {\n                toggleButton.focus();\n            }\n\n            // Reset flag after a delay\n            Ember.run.later(() => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.set('_closingViaEscape', false);\n                }\n            }, 200);\n\n            return false;\n        }\n    },\n\n    getContactFieldValuesByType: function (person, type) {\n        if (!person.getContactFieldValuesByType) {\n            return [];\n        }\n        var items = person.getContactFieldValuesByType(type).map(function (item) {\n            return { data: item };\n        });\n        var primary = person.getFieldValue(`primaryContactInfo.${type}`, true);\n        if (!_.isEmpty(primary)) {\n            var primaryItem = _.find(items, function (item) {\n                return Ember.get(item.data, '_id') === Ember.get(primary, 'value.fieldId');\n            });\n            if (primaryItem) {\n                primaryItem.primary = true;\n            }\n        }\n        return _.sortBy(items, function (item) {\n            return item.primary;\n        });\n    },\n\n    notifyError: function (key) {\n        this.get('notification').show({\n            target: this.get('phone.applicationController'),\n            tag: 'callHistory',\n            message: this.get('intl').t(key),\n            type: 'error',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').t('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    setGroupNumber() {\n        const data = this.get('contact').getFieldValue('contactInfo.groupNumber');\n        if (!_.isEmpty(data)) {\n            const number = this.get('addressformat').format(data);\n            this.set('phoneNumber', `tel:${number}`);\n        }\n    }\n});\n\nexport default EntityContactComponent;\n","export default Ember.HTMLBars.template({\"id\":\"qfK+BISY\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isRedial\\\"]],[33,[\\\"t\\\"],[\\\"components.callHistory.redial\\\"],null],[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone make-call \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disablePhoneButton\\\"]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPhoneSpinner\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[16,\\\"target\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-chat \\\",[33,[\\\"unless\\\"],[[28,[\\\"chatEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\",[28,[\\\"jid\\\"]]],null]]],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"emailEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"icon btn btn-link btn-email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[26,[\\\"email\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"favoriteEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"contact\\\",\\\"isFavorite\\\"]],[33,[\\\"t\\\"],[\\\"common.unMarkFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],[33,[\\\"t\\\"],[\\\"common.markFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-expanded\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"true\\\",\\\"false\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.moreActionSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.more\\\"],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-dropdown show-more \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null],\\\"hide\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"shouldTether\\\"]],\\\"entity-contact-dropdown-menu\\\"],null]]]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.phone\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]],[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"phoneEnabled\\\"]]],null]],null],\\\"disable-call\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\",\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"data\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.email\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry email \\\",[33,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"email\\\",[28,[\\\"email\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entry email primary\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isExternalContact\\\"]]],null],[33,[\\\"or\\\"],[[28,[\\\"chatEnabled\\\"]],[28,[\\\"person\\\",\\\"id\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"action-buttons\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-default action-button \\\",[33,[\\\"if\\\"],[[28,[\\\"hideChat\\\"]],\\\"hidden\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"startChat\\\",[28,[\\\"jid\\\"]]]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.chat\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"personIsDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-deleted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"person.deleted\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],null],[15,\\\"class\\\",\\\"btn btn-default action-button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendToProfile\\\"]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.profile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-actions\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flagInteraction\\\",[33,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]],\\\"unflag\\\",\\\"flag\\\"],null]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"flagOperationInProcess\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"flag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact/template.hbs\"}});","define(\"connections-ui/components/entity-favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"BPBaFQxl\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"saving\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.saveObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.saveObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"cancelling\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.cancelEditObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.cancelEditObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"hideFooterRemoveButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"remove-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmRemoveSection\\\"],null],null],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-footer/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"IcVORgWW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-header \\\",[33,[\\\"if\\\"],[[28,[\\\"showInstructionText\\\"]],\\\"show-instruction-text\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[28,[\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[15,\\\"class\\\",\\\"title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"3\\\"],[13],[1,[26,[\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEditAction\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-action\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.editObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"editSection\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showHeaderLock\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"lock\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lock\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAddNew\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/add-new\\\"],null,[[\\\"section\\\",\\\"fieldValues\\\",\\\"disableDropdown\\\",\\\"modal\\\",\\\"addNewEntry\\\",\\\"toggleAddValue\\\"],[[28,[\\\"section\\\"]],[28,[\\\"fieldValuesToAdd\\\"]],[28,[\\\"disableAddValueDropdown\\\"]],[28,[\\\"modal\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-header/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { on, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-new'],\n    classNameBindings: ['hide'],\n\n    attrs: {\n        section: null,\n\n        fieldValues: [],\n        disableDropdown: false,\n\n        toggleAddValue: null,\n        addNewEntry: () => {}\n    },\n\n    fieldValues: [],\n\n    showDropdown: false,\n\n    actions: {\n        addNewEntry(value) {\n            this.attrs.addNewEntry(value);\n            this.set('showDropdown', false);\n        },\n\n        toggleAddValue() {\n            if (this.get('disableDropdown')) {\n                this.attrs.toggleAddValue();\n            } else {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    hide: computed('fieldValues.[]', function () {\n        return _.isEmpty(this.get('fieldValues'));\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-new').length) {\n                    this.set('showDropdown', false);\n                }\n            });\n        });\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"ZGyvYY2O\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"add-new-button\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null],null],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"disableDropdown\\\"]],[33,[\\\"t\\\"],[\\\"common.addNewObjectToList\\\"],[[\\\"name\\\",\\\"list\\\"],[[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]],[33,[\\\"t\\\"],[\\\"fieldSection.selectTypeToAddToList\\\"],[[\\\"list\\\"],[[28,[\\\"section\\\",\\\"sectionName\\\"]]]]]],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.addNew\\\"],null],false],[0,\\\"\\\\n\\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu add-new-dropdown \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldValues\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entity-list-item\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"add-new-entity-\\\",[28,[\\\"fieldValue\\\",\\\"fieldPathClass\\\"]]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.addNewObjectToList\\\"],[[\\\"name\\\",\\\"list\\\"],[[28,[\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"fieldValue\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"fieldValue\\\",\\\"i18nLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldValue\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/add-new/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport curry from 'lodash/curry';\nimport groupBy from 'lodash/groupBy';\nimport isEmpty from 'lodash/isEmpty';\nimport map from 'lodash/map';\nimport reject from 'lodash/reject';\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { rerunLayouts } from '../../utils/masonry';\nimport FieldData from '../entity-profile/profiles/field-data';\nimport Profile from '../entity-profile/profiles/profile';\n\nconst { on, run, inject, getOwner, computed, observer, Component } = Ember;\n\nconst EXCLUDE_TYPES = ['image', 'reference'];\n\nfunction filterExcludedField(excludedFields, field) {\n    if (!excludedFields) {\n        return true;\n    }\n    return EXCLUDE_TYPES.indexOf(field.type) === -1 && excludedFields.indexOf(field.key) === -1;\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['entity-field-section', 'content'],\n    classNameBindings: ['section.key', 'editing'],\n    attributeBindings: ['tabindex:tabindex'],\n    tabindex: '-1',\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    // required\n    entity: null,\n    sectionInfo: null,\n\n    // public\n    hideHeader: false,\n    editingProfile: false,\n    scrollOnAddNew: true,\n    excludedFields: [],\n    excludedEditingFields: [],\n\n    attrs: {\n        entity: null,\n        sectionInfo: null,\n\n        hideHeader: false,\n        editingProfile: false,\n        excludedFields: [],\n        excludedEditingFields: [],\n\n        removeSection: () => {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n    sectionName: computed.reads('section.sectionName'),\n    sectionKey: computed.reads('sectionInfo.section.key'),\n    editingSection: computed.alias('sectionInfo.editingSection'),\n\n    editing: computed.and('editingSection', 'editingProfile'),\n\n    // others\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: computed.reads('permissions.canViewCollaborateVideo'),\n    saving: false,\n    showModal: false,\n    cancelling: false,\n    hideEmptyValues: true,\n    showInstructionText: false,\n    disableAddValueDropdown: false,\n\n    showRemoveSectionModal: false,\n\n    fallbackToEmptyLabel: false,\n\n    hideFooterRemoveButton: false,\n\n    timer: null,\n\n    // legacy support\n    isEditing: computed.alias('editing'),\n\n    actions: {\n        toggleInstructionText() {\n            this.toggleProperty('showInstructionText');\n        },\n\n        editSection() {\n            this.set('editingSection', true);\n            this.updateMasonry();\n\n            if (this.get('hideFooterRemoveButton')) {\n                return;\n            }\n\n            const key = this.get('section.key');\n            if (this.get('profile.writeableSections').includes(key)) {\n                const readableFields = this.get('profile').getReadableFieldPathsForSection(this.get('section'));\n                const writeableFields = this.get('profile').getEditableFieldPathsForSection(this.get('section'));\n\n                this.set('hideFooterRemoveButton', readableFields.length !== writeableFields.length);\n            }\n        },\n\n        saveSection() {\n            this.saveSection()\n                .then(() => {\n                    this.set('editingSection', false);\n                    this.updateMasonry();\n                })\n                .catch(err => {\n                    this.logger.error('Error saving field section:', { err });\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    Ember.run.once(this, 'reconcileNewFields');\n                    const focusTarget = '.add-section button:first';\n                    doFocus(Ember, focusTarget);\n                });\n        },\n\n        cancel() {\n            this.set('cancelling', true);\n\n            this.reset().finally(\n                Ember.run.bind(this, () => {\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    this.set('editingSection', false);\n                    this.set('cancelling', false);\n\n                    if (this.cancelEditElocation) {\n                        this.cancelEditElocation();\n                    }\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n\n                        let top = this.$().position().top;\n                        Ember.$('#orgspan').animate(\n                            {\n                                scrollTop: top\n                            },\n                            600\n                        );\n\n                        this.updateMasonry();\n                        const focusTarget = '.add-section button:first';\n                        doFocus(Ember, focusTarget);\n                    });\n                })\n            );\n        },\n\n        addNewEntry(field) {\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n\n            entity.set(path, '');\n\n            const valueReference = [].concat(entity.get(path)).pop();\n\n            const fieldData = FieldData.create({\n                entity,\n                field,\n                valueReference,\n                session: this.get('session')\n            });\n\n            this.get('fieldData').pushObject(fieldData);\n            this.get('_newFields').pushObject(fieldData);\n\n            this.notifyPropertyChange('groupedFieldData');\n\n            if (this.get('scrollOnAddNew')) {\n                Ember.run.scheduleOnce('afterRender', this, this.scrollToNewField, fieldData);\n            }\n\n            this.updateMasonry();\n        },\n\n        removeEntry(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        removeContactSection(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        confirmRemoveSection() {\n            this.set('showRemoveSectionModal', true);\n            const focusTarget = '.remove-section-confirmation button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        cancelRemoveSection() {\n            this.set('showRemoveSectionModal', false);\n            const focusTarget = '.add-section button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        removeSection() {\n            let entity = this.get('entity');\n            let fieldList = this.get('section.fieldList');\n            fieldList.forEach(field => {\n                let path = field.get('fieldPath');\n                if (entity.get(path) && !field.get('required')) {\n                    entity.set(path, [], { overwrite: true });\n                }\n            });\n\n            return this.saveSection().then(() => {\n                this.set('sectionInfo.adding', false);\n                this.set('sectionInfo.editingSection', false);\n\n                if (isEmpty(fieldList.filterBy('required'))) {\n                    this.attrs.removeSection(this.get('sectionInfo'));\n                }\n\n                this.send('cancelRemoveSection');\n            });\n        },\n\n        toggleAddValue: () => {}\n    },\n\n    removeEntryFromFieldData(fieldData) {\n        let entity = this.get('entity');\n        let field = fieldData.get('field');\n        let entry = fieldData.get('entry');\n        let path = field.getFieldPath();\n\n        this.get('fieldData').removeObject(fieldData);\n        this.get('_newFields').removeObject(fieldData);\n\n        entity.getFieldValue(path).removeObject(entry);\n        this.updateMasonry();\n    },\n\n    _groupedFieldData: null,\n    _newFields: null,\n\n    init() {\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        // Ensure section exists\n        if (section && section.key) {\n            if (entity.get(section.key) === undefined) {\n                entity.set(section.key, {});\n            }\n\n            const sectionData = entity.get(section.key);\n            const fieldPath = this.get('field') && this.get('field.key');\n\n            if (fieldPath && !Ember.get(sectionData, fieldPath)) {\n                const fullPath = `${section.key}.${fieldPath}`;\n                Ember.run.once(entity, entity.set, fullPath, [], { overwrite: true });\n            }\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        Ember.run.cancel(this.timer);\n    },\n\n    setupCacheValues: on('init', function () {\n        this.setProperties({\n            _groupedFieldData: [],\n            _newFields: []\n        });\n    }),\n\n    instructionTextTooltipOnInsert: on('didInsertElement', function () {\n        this.timer = run.scheduleOnce('afterRender', this, 'setupInstructionText');\n    }),\n\n    isViewMode: computed.not('editingProfile'),\n\n    ownProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    filteredFields: computed('entity.id', 'section', 'excludedFields.[]', 'profile.readableSections.[]', function () {\n        let section = this.get('section');\n        let fieldList = section.get('fieldList');\n        let isSuper = this.get('session.user.isAdmin') && !this.get('session.user.personId');\n\n        let fields = [],\n            filteredFields = [];\n        let excludedFields = this.get('excludedFields');\n        let excludedFieldsFilter = curry(filterExcludedField)(excludedFields);\n\n        if (isSuper) {\n            filteredFields = fieldList.filter(excludedFieldsFilter);\n        } else {\n            let readableFieldPaths = this.get('profile').getReadableFieldPathsForSection(section);\n\n            filteredFields = fieldList\n                .filter(excludedFieldsFilter)\n                .filter(field => {\n                    let section = this.get('section');\n                    let fieldPath = field.get('fieldPath');\n                    if (!section) {\n                        return false;\n                    }\n                    return readableFieldPaths.indexOf(fieldPath) !== -1;\n                })\n                .filter(field => {\n                    return field.type !== 'group';\n                });\n        }\n\n        fields.addObjects(filteredFields);\n\n        return fields;\n    }),\n\n    fieldData: computed('entity.id', 'filteredFields.[]', 'editingSection', '_newFields.[]', function () {\n        const filteredFields = this.get('filteredFields');\n        return this.getFieldEntries(filteredFields);\n    }),\n\n    groupedFieldData: computed('fieldData.[]', 'fieldData.length', function () {\n        const fieldData = this.get('fieldData');\n        const groupedData = groupBy(fieldData, data => data.get('field.key'));\n        return map(groupedData, (data, key) => ({ key, fieldData: data }));\n    }),\n\n    instructionText: computed('intl.isoLocale', function () {\n        const intl = this.get('intl');\n        const section = this.get('section').getI18nKey();\n        const key = `${section}_instructionText`;\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('section.instructionText');\n        }\n    }),\n\n    fieldValuesToAdd: computed('filteredFields.[]', function () {\n        let fields = this.get('filteredFields');\n        return fields.filterBy('repeatable');\n    }),\n\n    fieldSectionHasData: computed('fields.@each.isEmpty', 'editing', function () {\n        if (this.get('editing')) {\n            return true;\n        }\n\n        const fields = this.get('fieldData') || [];\n        return fields.some(field => !field.get('isEmpty'));\n    }),\n\n    canEditSection: computed(\n        'editingProfile',\n        'entity.id',\n        'session.user.isAdmin',\n        'profile.writeableSections.[]',\n        function () {\n            let editingProfile = this.get('editingProfile');\n            let permissions = this.get('profile.writeableSections');\n\n            if (this.get('session.user.isAdmin') && editingProfile) {\n                return true;\n            }\n\n            return permissions.indexOf(this.get('section.key')) !== -1 && editingProfile;\n        }\n    ),\n\n    hideAddNew: computed('section.key', 'section.fieldList', function () {\n        const sections = ['location', 'education', 'bio'];\n        return (\n            !sections.includes(this.get('section.key')) && isEmpty(this.get('section.fieldList').filterBy('repeatable'))\n        );\n    }),\n\n    disableSave: computed('entity.type', 'fieldData.@each.{isValid,isEmpty}', function () {\n        const fieldData = this.get('fieldData');\n        const isGroup = this.get('entity.type') === 'group';\n        const validFields = fieldData.map(data => {\n            const emptyCheck = ['weblink', 'email'];\n\n            if (emptyCheck.includes(data.get('field.type')) && !isGroup) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return reject(validFields).length > 0;\n    }),\n\n    showEditAction: computed('canEditSection', 'editingProfile', 'editingSection', function () {\n        const canEditSection = this.get('canEditSection');\n        const editingProfile = this.get('editingProfile');\n        const editingSection = this.get('editingSection');\n\n        return canEditSection && editingProfile && !editingSection;\n    }),\n\n    showHeaderLock: computed('editingProfile', 'canEditSection', function () {\n        return this.get('editingProfile') && !this.get('canEditSection');\n    }),\n\n    showAddNew: computed('editing', 'hideAddNew', function () {\n        return this.get('editing') && !this.get('hideAddNew');\n    }),\n\n    onEditingChange: observer('editingProfile', function () {\n        Ember.run.once(this, 'handleEditingChange');\n    }),\n\n    onValidityChange: observer('disableSave', function () {\n        const disableModal = this.get('disableModal');\n        if (disableModal) {\n            Ember.run.once(this, disableModal, this.get('disableSave'));\n        }\n    }),\n\n    getFieldEntries(fields) {\n        return fields\n            .map(field => {\n                const entity = this.get('entity');\n                const path = field.get('fieldPath');\n                const repeatable = Ember.get(field, 'repeatable');\n\n                let values = this.get('entity').getFieldValue(path) || [];\n\n                if (isEmpty(values) && !this.get('hideEmptyValues')) {\n                    entity.set(path, '');\n                    values = entity.get(path);\n                }\n\n                if (repeatable) {\n                    return values.map(valueReference =>\n                        FieldData.create({\n                            entity,\n                            field,\n                            valueReference,\n                            session: this.get('session'),\n                            permissions: this.get('permissions')\n                        })\n                    );\n                }\n\n                return FieldData.create({\n                    entity,\n                    field,\n                    valueReference: values,\n                    session: this.get('session'),\n                    permissions: this.get('permissions')\n                });\n            })\n            .flat()\n            .filter(v => !!v);\n    },\n\n    handleEditingChange() {\n        this.set('editingSection', false);\n    },\n\n    reconcileNewFields() {\n        this.set('_newFields', []);\n    },\n\n    saveSection(reload = true) {\n        const intl = this.get('intl');\n        const notification = this.get('notification');\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        this.set('saving', true);\n\n        return entity\n            .saveSection(section)\n            .then(() => {\n                if (reload) {\n                    entity.reload();\n                }\n\n                if (Ember.get(section, 'key') === 'contactInfo' && this.get('session.features.emergencyLocation')) {\n                    return;\n                }\n                const title = intl.lookup('notification.titles.profileSave');\n                const message = intl.lookup('notification.fieldSection.saved');\n\n                notification.info(title, message, { markdownToHtml: false, tag: 'profile' });\n            })\n            .catch(response => {\n                const errors = response.errors || response.payload;\n                const error = !isEmpty(errors) && errors[0];\n\n                this.set('saving', false);\n\n                if (!error) {\n                    return Ember.RSVP.reject(response);\n                }\n\n                if (error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                    return Ember.RSVP.resolve();\n                }\n\n                const statusCode = error.code || error.status;\n                if (statusCode) {\n                    const errorTitle = intl.lookup('notification.titles.profileSaveError');\n                    let errorMessage =\n                        error && error.detail ? error.detail : intl.lookup('notification.fieldSection.error');\n                    if (statusCode === 403) {\n                        errorMessage = intl.lookup('notification.fieldSection.forbidden');\n                    } else if (statusCode === 500 || statusCode === 400) {\n                        const title = error.title || (error.details && error.details.title);\n                        if (title) {\n                            // Check if its a duplicate error and let the user know\n                            const regex = /Duplicate value (?:.*) (.*)=[\\S]+/;\n                            const match = title.match(regex);\n                            if (match && match[1]) {\n                                const field = match[1];\n                                if (field === 'contactInfo.email_main') {\n                                    errorMessage = intl.lookup('notification.fieldSection.duplicateEmailError');\n                                }\n                            }\n                        }\n                    }\n\n                    notification.error(errorTitle, errorMessage, { markdownToHtml: false, tag: 'profile' });\n\n                    this.reset();\n                }\n\n                return Ember.RSVP.reject(response);\n            });\n    },\n\n    reset() {\n        return this.get('entity')\n            .reload()\n            .then(() => {\n                this.notifyPropertyChange('section');\n\n                let entity = this.get('entity');\n                let fieldPaths = this.get('section.fieldList').mapBy('fieldPath');\n                fieldPaths.forEach(path => {\n                    let currentValue = entity.getFieldValue(path);\n                    if (Array.isArray(currentValue)) {\n                        const tempValues = currentValue.filter(value => !!value.tempId);\n                        if (tempValues.length && currentValue.length) {\n                            entity.set(path, [], { overwrite: true });\n                        } else if (tempValues.length) {\n                            tempValues.forEach(value => {\n                                currentValue.removeObject(value);\n                            });\n                        }\n                    } else if (currentValue.tempId && !currentValue._id) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n            });\n    },\n\n    scrollToNewField(fieldData) {\n        let elem = this.$().find(`[data-field-id=${fieldData.get('fieldId')}]`);\n        let parent = elem.parents('.field-section');\n        if (!isEmpty(elem)) {\n            let top = elem.position().top;\n            let parentTop = parent.position().top;\n            Ember.$('#orgspan').animate(\n                {\n                    scrollTop: top + parentTop\n                },\n                600\n            );\n        }\n    },\n\n    setupInstructionText() {\n        let text = this.get('instructionText');\n        if (text) {\n            this.$('.title').tooltip({\n                title: text,\n                placement: 'right'\n            });\n        }\n    },\n\n    _updateMasonry() {\n        rerunLayouts();\n    },\n\n    updateMasonry() {\n        Ember.run(() => Ember.run.scheduleOnce('afterRender', this, this._updateMasonry));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.delete[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport EmergencyLocationUtil from 'connections-ui/utils/emergency-location-util';\n\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nimport ContactInfoGroup from './contact-info-group';\n\nconst { inject, computed } = Ember;\n\nfunction keyForField(field) {\n    let type = field.type;\n    let key = field.key;\n\n    if (_.includes(['email', 'phone', 'address'], type)) {\n        return type;\n    } else if (_.includes(['im', 'address'], key) || type === 'multiline-text') {\n        return key;\n    } else {\n        return 'other';\n    }\n}\n\nexport default EntityFieldSection.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    hideAddNew: false,\n    hideEmptyValues: true,\n    hideFooterRemoveButton: true,\n    updatedElocationAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressisEligible: false,\n\n    excludedFields: ['chat', 'voicemailEnabled'],\n\n    _groupedContactInfo: null,\n\n    actions: {\n        editSection() {\n            if (this.editElocation && this.get('session.features.emergencyLocation')) {\n                this.editElocation();\n            }\n            this._super(...arguments);\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const entity = this.get('entity');\n            const primaryContactSection = this.get('entity.fieldConfig.primaryContactInfo');\n            const latestPrimaryContactInfo = _.clone(this.get('entity.primaryContactInfo'));\n\n            this.set('saving', true);\n\n            this.saveSection(false)\n                .then(() => {\n                    // cant set non-existent fields as primary...so delay primary saving\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('saving', false);\n                        this.set('editingSection', false);\n                    }\n                    return this.reconcilePrimaryContact(latestPrimaryContactInfo);\n                })\n                .then(() => {\n                    return entity.saveSection(primaryContactSection);\n                })\n                .then(() => {\n                    const errorField = this.get('_newFields').find(field => {\n                        return !_.isEmpty(field.get('value.rel.errorCode'));\n                    });\n\n                    if (errorField) {\n                        const title = intl.lookup('notification.titles.profileContactInfoError');\n                        const message = intl.lookup('notification.fieldSection.contactInfoError');\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    entity.reload();\n\n                    Ember.run.once(this, 'reconcileNewFields');\n\n                    if (this.get('session.features.emergencyLocation')) {\n                        const isAddressEmpty =\n                            !this.get('updatedElocationAddress.city') &&\n                            !this.get('updatedElocationAddress.street1') &&\n                            !this.get('updatedElocationAddress.street2') &&\n                            !this.get('updatedElocationAddress.state') &&\n                            !this.get('updatedElocationAddress.zipcode');\n\n                        if (this.saveElocation && !isAddressEmpty) {\n                            return this.saveElocation(this.get('updatedElocationAddress'));\n                        } else if (this.refreshAllEmergencylocationInfo) {\n                            //Should run this in case user changes from a primary number that is not E911 capable to one that is.\n                            return this.refreshAllEmergencylocationInfo(true); //notify=true\n                        }\n                    } else {\n                        return Ember.RSVP.resolve();\n                    }\n                })\n                .then(() => {\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('notification.titles.profileSave');\n                        const message = intl.lookup('notification.fieldSection.saved');\n                        this.get('notification').info(title, message, { markdownToHtml: false, tag: 'profile' });\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                    }\n                })\n                .catch(errObject => {\n                    if (errObject.softError && !errObject.hardError) {\n                        //If only inline custom errors\n                        //softError are handled in the service\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                        return;\n                    }\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('emergencyLocation.errors.title');\n                        const hardErrorMessage = errObject.hardError ? errObject.hardError : '';\n                        const defaultErrorMessage = intl.lookup('emergencyLocation.errors.e911LocationSet');\n\n                        const message = hardErrorMessage || defaultErrorMessage;\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('editingSection', false);\n                    }\n                });\n        },\n\n        updateElocationOnChange(updatedAddress) {\n            this.set('updatedElocationAddress', updatedAddress);\n        },\n\n        addNewEntry(group) {\n            const field = group.get('field') || group.get('repeatableField') || group;\n            this._super(field);\n        },\n\n        removeContactSection(fieldData, group) {\n            _.forEach(fieldData, field => {\n                this._super(field);\n            });\n\n            const groupedFieldData = this.get('_groupedContactInfo');\n            if (groupedFieldData) {\n                groupedFieldData.removeObject(group);\n            }\n        },\n\n        removeEntry(fieldData) {\n            let key = keyForField(fieldData.get('field'));\n            let group = this.get('groupedContactInfo').findBy('key', key);\n            if (group) {\n                group.get('fieldData').removeObject(fieldData);\n\n                if (fieldData.get('isPrimaryField')) {\n                    this.removePrimaryContact(fieldData);\n                }\n\n                this._super(...arguments);\n            }\n        },\n        setPrimaryCallback(phoneNumber) {\n            if (!this.get('session.features.emergencyLocation')) {\n                return;\n            }\n            if (this.getEmergencyLocation) {\n                this.getEmergencyLocation(phoneNumber)\n                    .then(response => {\n                        this.set('previewAddressIsEligible', true);\n                        this.set('previewAddress', response.address);\n                    })\n                    .catch(err => {\n                        this.set('previewAddressIsEligible', false);\n                        this.set('previewAddress', {\n                            street1: '',\n                            street2: '',\n                            city: '',\n                            state: '',\n                            zipcode: '',\n                            country: ''\n                        });\n\n                        const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                        this.set('previewAddressError', errorMessage);\n                    });\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_groupedContactInfo', []);\n    },\n\n    didReceiveAttrs() {\n        const editingElocation = this.get('editingElocation');\n        if (this.get('session.features.emergencyLocation') && editingElocation) {\n            this.get('setEditingSection').perform(editingElocation);\n        }\n    },\n\n    setEditingSection: task(function* (editingElocation) {\n        yield waitForQueue('actions');\n        this.set('editingSection', editingElocation);\n        const phoneNumber =\n            this.get('emergencyLocationData.primaryVoice.number') ||\n            this.get('emergencyLocationData.primaryVoice.display');\n        if (phoneNumber) {\n            this.get('actions.setPrimaryCallback').call(this, phoneNumber);\n        }\n    }).restartable(),\n\n    groupedContactInfo: computed('entity.id', 'fieldData', 'fieldData.[]', 'fieldData.@each.', function () {\n        return this.handleData(this.get('fieldData'));\n    }),\n\n    missingData: computed('filteredFields.[]', 'fieldData.[]', function () {\n        let fields = this.get('filteredFields');\n        let fieldData = this.get('fieldData');\n        let missingFields = _.difference(fields, fieldData.mapBy('field'));\n        return _.reject(missingFields, field => {\n            let type = field.get('type');\n            return fieldData.filterBy('field.type', type).length > 0;\n        });\n    }),\n\n    fieldValuesToAdd: computed('missingData.[]', function () {\n        let fields = this.get('missingData');\n        return fields.filterBy('repeatable');\n    }),\n\n    disableSave: computed('groupedContactInfo.@each.disableSave', function () {\n        const fieldData = this.get('groupedContactInfo');\n        const disableSave = fieldData.mapBy('disableSave');\n        return _.filter(disableSave).length > 0;\n    }),\n\n    handleData(data) {\n        return _.chain(data)\n            .groupBy(fieldData => {\n                return keyForField(fieldData.get('field'));\n            })\n            .map((fieldData, key) => {\n                let data = {\n                    key,\n                    fieldData,\n                    section: this.get('section')\n                };\n\n                Ember.setOwner(data, Ember.getOwner(this));\n\n                return ContactInfoGroup.create(data);\n            })\n            .filter()\n            .value();\n    },\n\n    removePrimaryContact(fieldData) {\n        let entity = this.get('entity');\n        let type = fieldData.get('field.type');\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        entity.set(path, [], { overwrite: true });\n    },\n\n    reconcilePrimaryContact(latestPrimaryContactInfo) {\n        let fields = this.get('fieldData');\n        let entity = this.get('entity');\n        let primaryContactCollection = [];\n        fields.rejectBy('isEmpty').forEach(fieldData => {\n            let type = fieldData.get('field.type');\n            if (type === 'phone') {\n                type = 'voice';\n            }\n\n            let primary = Ember.get(latestPrimaryContactInfo, type);\n            this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            if (type === 'voice') {\n                // run the voice primary checks for SMS as well\n                type = 'sms';\n                primary = Ember.get(latestPrimaryContactInfo, type);\n                this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            }\n        });\n\n        return entity.reload().then(() => {\n            _.forEach(primaryContactCollection, contact => {\n                entity.setPrimaryContact(contact.type, contact.value, contact.fieldPath, contact.fieldData);\n            });\n        });\n    },\n\n    _storePrimary(primary, type, fieldData, collection) {\n        if (_.isEmpty(primary)) {\n            return;\n        }\n        let fieldPath = fieldData.get('field.fieldPath');\n        let fieldDataId = fieldData.get('fieldId');\n        primary = primary[0];\n\n        let equalFieldIds = primary.value.fieldId === fieldDataId;\n        let equalFieldPaths = primary.value.fieldPath === fieldPath;\n\n        // New fields also set to primary have a temp id generated using Ember.generateGuid\n        let isNewFieldValue = primary.value.fieldId.indexOf('ember') === 0;\n\n        // New fields will at least match the field path, if not the field id (different temp id)\n        if (isNewFieldValue && !equalFieldIds && equalFieldPaths) {\n            // Lets also check for value equal on extension or number\n            let value = fieldData.get('value.value');\n            let valueNumber = value.number;\n            let primaryNumber = primary.ref.number;\n\n            // Sometimes we will have formatting\n            if (valueNumber && valueNumber.replace) {\n                valueNumber = valueNumber.replace(/[-\\s]/gi, '');\n            }\n            if (primaryNumber && primaryNumber.replace) {\n                primaryNumber = primaryNumber.replace(/[-\\s]/gi, '');\n            }\n\n            if (primary.ref.extension === value.extension || primaryNumber === valueNumber) {\n                collection.push({\n                    type,\n                    fieldPath,\n                    fieldData,\n                    value: fieldData.get('value')\n                });\n            }\n        } else if (primary.value && equalFieldPaths && equalFieldIds) {\n            collection.push({\n                type,\n                fieldPath,\n                fieldData,\n                value: fieldData.get('value')\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['contact-group-choices'],\n\n    entity: null,\n\n    field: null,\n    entry: null,\n\n    showDropdown: false,\n\n    currentLabel: computed.reads('field.i18nLabel'),\n\n    fieldChoices: computed('field', 'entry', function () {\n        let keys = this.get('field.labelKeys');\n        let entity = this.get('entity');\n        let field = this.get('field');\n        let path = field.get('fieldPath').replace(/\\./gi, '_');\n        return _.map(keys, function (key) {\n            return {\n                field,\n                keyPath: `${entity.get('type')}_${path}_labelKey_${key}`\n            };\n        });\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"a/PgzvrS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"entity-field-section.entity-contact-info.contact-group-choices\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"menu-selector dropdown-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clickable\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"choice\\\",\\\"keyPath\\\"]]],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    key: null,\n    field: null,\n    section: null,\n    fieldData: [],\n\n    label: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.name`);\n    }),\n\n    addNewLabel: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.addNew`);\n    }),\n\n    isEmpty: computed('fieldData', 'fieldData.@each.isEmpty', 'field', function () {\n        let emptyFields = this.get('fieldData').mapBy('isEmpty');\n        return emptyFields && _.reject(emptyFields).length === 0;\n    }),\n\n    containsRepeatable: computed('fieldData.[]', 'field', 'repeatableField', function () {\n        let field = this.get('field') || this.get('repeatableField');\n        if (field) {\n            return field.get('repeatable');\n        }\n\n        return this.get('fieldData').filterBy('field.repeatable').length > 0;\n    }),\n\n    repeatableField: computed('fieldData.[]', 'key', 'section', function () {\n        let key = this.get('key');\n        return this.get('section.fieldList')\n            .filterBy('repeatable')\n            .find(function (field) {\n                return field.get('key') === key || field.get('type') === key;\n            });\n    }),\n\n    disableSave: computed('fieldData.[]', 'fieldData.@each.isValid', function () {\n        const fieldData = this.get('fieldData');\n        let validFields = fieldData.map(data => {\n            let emptyCheck = ['weblink', 'email'];\n\n            if (_.includes(emptyCheck, data.get('field.type'))) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return _.reject(validFields).length > 0;\n    }),\n\n    isPhone: computed.equal('key', 'phone'),\n    isEmail: computed.equal('key', 'email'),\n    isIm: computed.equal('key', 'im'),\n    isAddress: computed.equal('key', 'address'),\n\n    showHeadings: computed('isPhone', 'isEmail', 'permissions.canEditProfiles', function () {\n        if (this.get('isEmail')) {\n            return this.get('permissions.canEditProfiles');\n        }\n        return this.get('isPhone');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"ceACQLuN\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedContactInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries contact-info-\\\",[28,[\\\"group\\\",\\\"key\\\"]],\\\"-type\\\\n                    \\\",[33,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isEmpty\\\"]],\\\"empty-group\\\"],null],\\\"\\\\n                    \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"group\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[16,\\\"aria-labelledby\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label sr-only\\\"],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"group\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isIm\\\"]],[28,[\\\"group\\\",\\\"isAddress\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label remove-section clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"group\\\",\\\"label\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeContactSection\\\",[28,[\\\"group\\\",\\\"fieldData\\\"]],[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"showHeadings\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"headings\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"primary\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-sms-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"accept-sms\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-values entry-values\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"fieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry\\\\n                                \\\",[28,[\\\"fieldData\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"fieldData\\\",\\\"fieldId\\\"]]]]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[33,[\\\"eq\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]],\\\"entity-fields/phone-field\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\",\\\"headingLevel\\\",\\\"setPrimaryCallback\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true,5,[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimaryCallback\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"and\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"repeatable\\\"]],[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"removable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"value\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\",\\\"i18nLabel\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"fieldData\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-value\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldData\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"containsRepeatable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-new-value\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-flat btn-sm add-new-value\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"+\\\"],[14],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"group\\\",\\\"addNewLabel\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content emergency-location-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-group entries field-entries\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry text-field \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"emergency-location\\\"],null,[[\\\"emergencyLocationData\\\",\\\"editingElocation\\\",\\\"showResetButton\\\",\\\"personId\\\",\\\"showTitle\\\",\\\"showTitleIcons\\\",\\\"previewAddress\\\",\\\"previewAddressIsEligible\\\",\\\"previewAddressError\\\",\\\"saving\\\",\\\"updateElocationOnChange\\\"],[[28,[\\\"emergencyLocationData\\\"]],[28,[\\\"editingElocation\\\"]],false,[28,[\\\"personId\\\"]],true,false,[28,[\\\"previewAddress\\\"]],[28,[\\\"previewAddressIsEligible\\\"]],[28,[\\\"previewAddressError\\\"]],[28,[\\\"saving\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateElocationOnChange\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    layout: template,\n\n    disableAddValueDropdown: true,\n\n    fallbackToEmptyLabel: true,\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        }\n    },\n\n    canAddNew: computed('fieldData.[]', function () {\n        let fieldData = this.get('fieldData');\n        let empties = fieldData.filterBy('isEmpty', true);\n        return empties.length < 1;\n    }),\n\n    disableSave: computed('fieldData.@each.{isValid,isEmpty}', function () {\n        let fieldData = this.get('fieldData');\n        let validFields = fieldData.map(field => {\n            return field.get('isValid') && !field.get('isEmpty');\n        });\n\n        return _.reject(validFields).length > 0;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nconst { inject, computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-groups'],\n\n    session: inject.service(),\n    application: inject.service(),\n\n    actions: {\n        changeGroups(group) {\n            this.set('showMore', false);\n            this.set('activeKey', group);\n        },\n\n        toggleMore() {\n            this.toggleProperty('showMore');\n        },\n\n        navigateTo(routeType, routeId) {\n            this.get('application').navigateTo(routeType, routeId);\n        }\n    },\n\n    allKeys: null,\n    activeKey: null,\n\n    showMore: false,\n    flowTabsInline: true,\n\n    init() {\n        this._super(...arguments);\n\n        const entity = this.get('entity');\n        const fieldConfig = entity.get('fieldConfig');\n\n        const hasOfficialField = !!fieldConfig.getFieldByKey('groups.official');\n        const hasSocialField = !!fieldConfig.getFieldByKey('groups.social');\n\n        const allKeys = [];\n        if (hasOfficialField) {\n            allKeys.push('official');\n        }\n        if (hasSocialField) {\n            allKeys.push('social');\n        }\n\n        let activeKey = 'official';\n        if (!hasOfficialField) {\n            activeKey = hasSocialField ? 'social' : 'owned';\n        }\n\n        this.setProperties({\n            allKeys,\n            activeKey,\n            hasSocialField,\n            hasOfficialField\n        });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        let section = this.get('sectionInfo');\n        let promises = this.get('allKeys').map(key => this.getGroups(key));\n\n        Ember.RSVP.all(promises).then(function (results) {\n            let groups = _.flatten(results);\n            section.set('isEmpty', groups.length === 0);\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            const title = this.$('.title');\n            const tabs = this.$('.nav-tabs li');\n            if (title && !_.isEmpty(tabs)) {\n                const titleWidth = title.width();\n                const tabWidth = _.chain(tabs)\n                    .map(tab => Ember.$(tab).width())\n                    .reduce((acc, val) => val + acc, 0);\n                this.set('flowTabsInline', tabWidth + titleWidth < this.$().width());\n            }\n        });\n    },\n\n    canEditSection: computed(function () {\n        return false;\n    }),\n\n    activeGroups: computed('entity.id', 'activeKey', 'showMore', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            if (!this.get('showMore')) {\n                return _.slice(groups, 0, 4);\n            }\n            return groups;\n        });\n\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    section: computed('entity.fieldConfig.groups', function () {\n        return this.get('entity.fieldConfig.groups');\n    }),\n\n    shouldShowMore: computed('activeKey', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            return groups.length > 4;\n        });\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    getGroups(key) {\n        return this.get(`entity.${key}Groups`);\n    },\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"XzRWnkV8\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content tab-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs nav-tabs-flex\\\"],[15,\\\"role\\\",\\\"tablist\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasOfficialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-official active\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#official\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"official\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"official\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_official\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"hasSocialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-social\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#social\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"social\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"social\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_social\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owned\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owned\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"owned\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"owned\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owned\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"activeGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group \\\",[28,[\\\"group\\\",\\\"groupType\\\"]]]]],[16,\\\"title\\\",[28,[\\\"group\\\",\\\"name\\\"]],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"size\\\",\\\"entity\\\",\\\"isLinkable\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[96,[28,[\\\"group\\\"]],true,true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\",\\\"group\\\",[28,[\\\"group\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"group.detail\\\",[28,[\\\"group\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"name\\\"]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupMemberships\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"error\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message error\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.loadError\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message group-loading-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"shouldShowMore\\\"]],[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"show-more-less \\\",[33,[\\\"if\\\"],[[28,[\\\"showMore\\\"]],\\\"showing-more\\\",\\\"showing-less\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleMore\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-groups/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend(LoggerMixin, {\n    layout: template,\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    _cachedGroupFieldData: [],\n    _cachedLocations: [],\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        },\n\n        removeEntry(fieldData) {\n            let entity = this.get('entity');\n            let field = fieldData.get('field');\n            let entry = fieldData.get('entry');\n            let location = fieldData.get('_sectionLocation');\n            let path = field.getFieldPath();\n            let fields = this.get('fieldData');\n            let currentEntry = fields.findBy('_sectionLocation', location);\n\n            fields.removeObject(currentEntry);\n            entity.getFieldValue(path).removeObject(entry);\n        }\n    },\n\n    disableSave: computed(function () {\n        return false;\n    }),\n\n    getFieldEntries() {\n        const entries = this._super(...arguments);\n        return entries.filter(entry => {\n            const value = entry.get('value');\n            if (value.value) {\n                const location = value.value;\n                if (location && !location.locationId) {\n                    this.logger.warn('Location without id encountered. Removing.');\n                    return false;\n                }\n            }\n            return true;\n        });\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport Profile from '../../entity-profile/profiles/profile';\nimport EntityFieldSection from '../component';\n\nimport { BASE_PERSON } from '../../../models/person';\n\nimport RelationshipGroup from './relationship-group';\n\nconst { inject, getOwner, computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-relationships'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    viewingMore: { siblings: false, reports: false },\n\n    _relationships: null,\n\n    actions: {\n        toggleAddValue() {\n            const field = this.get('repeatableField');\n            this.send('addNewEntry', field);\n        },\n\n        addNewEntry(field) {\n            this._super(...arguments);\n\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n            const fieldValue = _.last(entity.get(path));\n\n            const count = this.get('otherRelationships.length');\n            const key = this.get('intl').t('person.relationships.relationship', { count: !!count ? count : count + 1 });\n\n            Ember.set(fieldValue, 'labelKey', key);\n            this.set('otherRelationships.lastObject.key', key);\n\n            this.notifyPropertyChange('otherRelationshipValues');\n        },\n\n        updatedField(relationshipGroup) {\n            let excludedFields = this.get('excludedFields');\n            let fieldPath = relationshipGroup.get('fieldPath');\n            if (!fieldPath || relationshipGroup.get('isOtherRelationship')) {\n                return;\n            }\n\n            let fieldKey = fieldPath.split('.')[1];\n            if (relationshipGroup.get('people.length') === 0) {\n                excludedFields.removeObject(fieldKey);\n            } else {\n                excludedFields.addObject(fieldKey);\n            }\n        },\n\n        removeSection() {\n            let reports = this.get('relationships').findBy('key', 'defaultReports');\n            let promise = Ember.RSVP.resolve();\n            if (reports && reports.get('promise')) {\n                promise = reports.get('promise').then(people => {\n                    if (people) {\n                        people.forEach(person => {\n                            reports.removePerson(person);\n                        });\n                    }\n                });\n            }\n\n            return promise.then(() => {\n                let entity = this.get('entity');\n                let fieldList = this.get('section.fieldList');\n                fieldList.forEach(field => {\n                    let path = field.get('fieldPath');\n                    if (entity.get(path)) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n\n                return this.saveReports()\n                    .then(() => this.saveSection())\n                    .then(() => {\n                        this.set('sectionInfo.adding', false);\n                        this.set('sectionInfo.editingSection', false);\n\n                        this.attrs.removeSection(this.get('sectionInfo'));\n\n                        this.send('cancelRemoveSection');\n                    });\n            });\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const notification = this.get('notification');\n\n            this.set('saving', true);\n\n            this.saveReports()\n                .then(() => this.saveSection())\n                .then(() => {\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n                })\n                .then(() => {\n                    // Cache bust!\n                    this.get('entity').clearDirectReportsCache();\n                })\n                .catch(err => {\n                    const title = intl.lookup('notification.titles.profileSaveError');\n                    const message = intl.lookup('notification.fieldSection.error');\n                    notification.error(title, message);\n\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n\n                    this.reset().then(() => {\n                        this.notifyPropertyChange('allRelationships');\n                    });\n\n                    return Ember.RSVP.reject(err);\n                });\n        },\n\n        updatedLabel() {\n            const fields = this.get('otherRelationships').filter(field => {\n                return _.isEmpty(field.get('label'));\n            });\n            this.set('disableSave', fields.length !== 0);\n        }\n    },\n\n    section: computed('entity.fieldConfig.relationships', function () {\n        return this.get('entity.fieldConfig.relationships');\n    }),\n\n    manager: computed.reads('entity.manager'),\n    management: computed.reads('entity.superiors'),\n    assistants: computed.reads('entity.adminAssistants'),\n    defaultReports: computed.reads('filteredReports'),\n    defaultSiblings: computed.reads('filteredSiblings'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_relationships', []);\n    },\n\n    relationships: computed('entity.id', 'otherRelationships.[]', 'assistants.[]', 'management.[]', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        const cachedGroups = this.get('_relationships');\n        if (cachedGroups && cachedGroups.length > 0) {\n            // Set relationship promise so that reloads can happen if necessary\n            cachedGroups.forEach(group => {\n                const key = group.get('key');\n                const promise = this.get(key);\n                group.set('promise', promise);\n            });\n            return cachedGroups;\n        }\n\n        const groups = relationshipKeys.map(key => {\n            let entity = this.get('entity');\n            let relationship = this.get(key);\n\n            if (!relationship) {\n                return;\n            }\n\n            let data = {\n                key: key,\n                entity: entity,\n                promise: relationship\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n\n        this.set('_relationships', groups);\n\n        return groups;\n    }),\n\n    otherRelationships: computed('otherRelationshipValues', function () {\n        const entity = this.get('entity');\n        const values = this.get('otherRelationshipValues');\n        return Object.keys(values).map(key => {\n            const value = values[key];\n            let promise = Ember.RSVP.resolve([]);\n            const ids = value.mapBy('value').reject(id => !id);\n            if (ids && !_.isEmpty(ids) && ids[0]) {\n                promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n            }\n\n            let data = {\n                key,\n                promise,\n                entity: entity\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n    }),\n\n    allRelationships: computed('otherRelationships.[]', function () {\n        return [].concat(this.get('relationships'), this.get('otherRelationships'));\n    }),\n\n    otherRelationshipValues: computed('entity.relationships.relationships.[]', function () {\n        const entity = this.get('entity');\n        const values = entity.getFieldValue('relationships.relationships');\n        // Fallback to incorrect form of \"labelkey\" due to directory bug\n        return _.groupBy(values, v => v.labelKey || v.labelkey);\n    }),\n\n    filteredReports: computed.reads('entity.directReports'),\n    filteredSiblings: computed('entity.siblings', function () {\n        let promise = this.get('entity.siblings').then(siblings => {\n            return siblings.filter(sibling => {\n                return sibling.get('id') !== this.get('entity.id');\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    readableFieldPaths: computed('entity.id', function () {\n        let profile = Profile.getProfileForModel(this.get('entity'), getOwner(this));\n        return profile.getReadableFieldPathsForSection(this.get('section'));\n    }),\n\n    repeatableField: computed('filteredFields.[]', function () {\n        return this.get('filteredFields')\n            .filter(field => {\n                return field.get('repeatable') && field.get('customLabels');\n            })\n            .find(field => {\n                const key = field.get('key');\n                return key === 'relationships';\n            });\n    }),\n\n    hideAddNew: computed('repeatableField', function () {\n        return _.isEmpty(this.get('repeatableField'));\n    }),\n\n    canAddMultiple: computed('repeatableField', function () {\n        return this.get('repeatableField.customLabels');\n    }),\n\n    excludedFields: computed('relationships.[]', function () {\n        return ['directReportCount'];\n    }),\n\n    saveReports() {\n        let promise = Ember.RSVP.resolve();\n        let reports = this.get('relationships').findBy('key', 'defaultReports');\n\n        if (reports && reports.get('reportsToSave')) {\n            let people = reports.get('reportsToSave');\n            let section = this.get('section');\n            let promises = people.map(person => {\n                // we have to load permissions before saving...this is unconventional\n                return person.get('readWritePermissions').then(() => person.saveSection(section));\n            });\n            promise = Ember.RSVP.all(promises);\n\n            reports.set('reportsToSave', []);\n        }\n\n        return promise;\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport forEachRight from 'lodash/forEachRight';\nimport isEmpty from 'lodash/isEmpty';\nimport uniqBy from 'lodash/uniqBy';\n\nconst { set, inject, computed, observer, Component } = Ember;\n\nconst LIMIT = 15;\n\nfunction getNextPerson(orderedPeople, people, person) {\n    if (person && person.get && person.get('id')) {\n        orderedPeople.pushObject(person);\n        const manager = person.getFieldValue('relationships.manager');\n        if (!manager) {\n            return;\n        }\n        const nextPerson = people.find(p => {\n            return p.get('id') === manager.guid;\n        });\n\n        if (!nextPerson) {\n            return;\n        }\n        return getNextPerson(orderedPeople, people, nextPerson);\n    }\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['field-component', 'relationship-field'],\n\n    intl: inject.service(),\n\n    entity: null,\n    editing: false,\n    relationship: null,\n    fieldValuesToAdd: [],\n\n    showingMore: false,\n\n    people: null,\n\n    attrs: {\n        onUpdateLabel: () => {},\n        onUpdateField: () => {}\n    },\n\n    actions: {\n        selectPerson(person) {\n            const relationship = this.get('relationship');\n            relationship.addPerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removePerson(person) {\n            const relationship = this.get('relationship');\n            relationship.removePerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removeRelationship() {\n            let shouldRemove = true;\n            if (this.get('relationship.people.length')) {\n                const message = this.get('intl').lookup('person.relationships.confirmRemove').toString();\n                shouldRemove = confirm(message);\n            }\n\n            if (shouldRemove) {\n                const relationship = this.get('relationship');\n                if (relationship.get('isOtherRelationship')) {\n                    const key = this.get('relationship.key');\n                    const values = this.get('entity.relationships.relationships');\n                    const valuesToRemove = values.filter(value => value.labelKey === key);\n                    values.removeObjects(valuesToRemove);\n                } else {\n                    const people = relationship.get('people');\n                    forEachRight(people, person => relationship.removePerson(person));\n                }\n\n                this.get('onUpdateField')(relationship);\n            }\n        },\n\n        toggleShowing() {\n            this.toggleProperty('showingMore');\n        },\n\n        onUpdateLabel(newLabel, oldLabel) {\n            const people = this.get('people');\n            const ids = people.mapBy('id');\n            const values = this.get('entity.relationships.relationships').filter(\n                value => (value.labelKey === oldLabel || value.labelkey === oldLabel) && ids.includes(value.value)\n            );\n\n            uniqBy(values, 'value').forEach(value => {\n                set(value, 'labelKey', newLabel);\n            });\n\n            this.get('onUpdateLabel')(...arguments);\n        }\n    },\n\n    canEdit: computed.and('editing', 'relationship.canEdit'),\n    canRemove: computed('canEdit', 'people.[]', 'manager', function () {\n        const canEdit = this.get('canEdit');\n        if (this.get('isManagerField')) {\n            return canEdit && !isEmpty(this.get('manager'));\n        }\n        return canEdit && !isEmpty(this.get('people'));\n    }),\n\n    manager: computed.reads('entity.manager.content'),\n    isManagerField: computed.equal('relationship.key', 'management'),\n\n    updatePeople: observer('relationship.people.[]', 'showingMore', 'isManagerField', function () {\n        const people = this.get('relationship.people') || Ember.A([]);\n\n        if (this.get('isManagerField')) {\n            const cachedPeople = this.get('people');\n            if (cachedPeople && people && cachedPeople.length > 0 && people.length === cachedPeople.length) {\n                return;\n            }\n            const orderedPeople = Ember.A([]);\n            this.get('entity.manager')\n                .then(getNextPerson.bind(this, orderedPeople, people))\n                .catch(err => {\n                    this.logger.error('Error loading managers:', { err });\n                    this.set('people', people);\n                })\n                .finally(() => this.set('people', orderedPeople));\n        }\n\n        if (this.get('showingMore')) {\n            this.set('people', people);\n            return;\n        }\n\n        this.set('people', people.slice(0, LIMIT));\n    }),\n\n    relationshipKeyTrimAll: computed('relationship.key', function () {\n        const key = this.get('relationship.key');\n        return key ? key.replace(/\\s/g, '') : '';\n    }),\n\n    hasMore: computed('relationship.people.[]', function () {\n        return this.get('relationship.people.length') > LIMIT;\n    }),\n\n    haveManager: computed('manager', function () {\n        return !isEmpty(this.get('manager'));\n    }),\n\n    hideSection: computed('editing', 'canEdit', 'relationship.people.[]', function () {\n        const editing = this.get('editing');\n        const canEdit = this.get('canEdit');\n        if (editing) {\n            return !canEdit;\n        }\n\n        return !this.get('relationship.people.length');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"t0ksefmz\",\"block\":\"{\\\"statements\\\":[[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group \\\",[28,[\\\"relationship\\\",\\\"key\\\"]],\\\"-relationship relationship-container \\\",[33,[\\\"if\\\"],[[28,[\\\"hideSection\\\"]],\\\"hide\\\"],null]]]],[16,\\\"aria-labelledby\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-entry field-entries\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-label\\\"],null,[[\\\"entity\\\",\\\"relationship\\\",\\\"editing\\\",\\\"onUpdateLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onUpdateLabel\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values field-value \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEdit\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-field-section/entity-relationships/relationship-search\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"select\\\",\\\"relationship\\\"],[[28,[\\\"entity\\\"]],\\\"person\\\",\\\"selectPerson\\\",[28,[\\\"relationship\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"isManagerRelationship\\\"]],\\\"is-manager\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"unless\\\"],[[33,[\\\"can-edit\\\"],[[28,[\\\"result\\\"]],\\\"relationships.manager\\\"],null],\\\"disabled\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canEdit\\\"]],[28,[\\\"isManagerField\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveManager\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"manager\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"manager\\\",\\\"name\\\"]],\\\"\\\",[28,[\\\"relationship\\\",\\\"label\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"people\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"person\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"person\\\",\\\"name\\\"]],\\\"\\\",[28,[\\\"relationship\\\",\\\"label\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isManagerField\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"divider-icon ion-ios-arrow-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"toggle-showing\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleShowing\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showingMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRemove\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-relationship\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"relationship\\\",\\\"label\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRelationship\\\"]],[13],[0,\\\"                                        \\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n\n    key: null,\n    entity: null,\n    promise: null,\n    cache: null,\n\n    reportsToSave: [],\n\n    loading: computed('promise.isPending', 'people.[]', function () {\n        return this.get('promise.isPending') && this.get('people.length') === 0;\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('cache', []);\n    },\n\n    people: computed('promise', function () {\n        let cache = this.get('cache');\n        let promise = this.get('promise');\n\n        // Clear cache if promise changed\n        if (this._lastPromise !== promise) {\n            cache.clear();\n            this._lastPromise = promise;\n        }\n\n        promise.then(people => {\n            if (people) {\n                if (cache.length === 0 || cache.length !== people.length) {\n                    cache.clear();\n                    cache.addObjects(people);\n                }\n            }\n        });\n        return cache;\n    }),\n\n    label: computed('key', 'isOtherRelationship', function () {\n        const intl = this.get('intl');\n        const key = this.get('key');\n        if (this.get('isOtherRelationship')) {\n            const field = this.get('session.person.fieldConfig.relationships.relationships');\n            const fieldKey = field.getI18nKey();\n            const lookupKey = `${fieldKey}_labelKey_${key}`;\n            if (intl.query(lookupKey)) {\n                return intl.lookup(lookupKey);\n            }\n            return key;\n        }\n\n        return intl.lookup(`person.relationships.${key}`).toString();\n    }),\n\n    canEdit: computed('key', function () {\n        let key = this.get('key');\n        if (key === 'management' || key === 'assistants') {\n            return this.get('permissions.canEditProfiles');\n        } else if (_.includes(key.toLowerCase(), 'siblings')) {\n            return false;\n        }\n\n        return true;\n    }),\n\n    isManagerRelationship: computed.equal('key', 'management'),\n\n    isReportRelationship: computed('key', function () {\n        let key = this.get('key');\n        return _.includes(key.toLowerCase(), 'reports');\n    }),\n\n    isAssistantsRelationship: computed.equal('key', 'assistants'),\n\n    isOtherRelationship: computed('key', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        return !_.includes(relationshipKeys, this.get('key'));\n    }),\n\n    fieldPath: computed('key', 'isOtherRelationship', function () {\n        let key = this.get('key');\n        if (key === 'assistants') {\n            return 'relationships.administrativeAssistant';\n        } else if (_.includes(key, 'reports')) {\n            return 'children';\n        } else if (key === 'otherRelationships' || this.get('isOtherRelationship')) {\n            return 'relationships.relationships';\n        }\n    }),\n\n    values: computed('entity', 'fieldPath', function () {\n        let entity = this.get('entity');\n        let fieldPath = this.get('fieldPath');\n        if (fieldPath) {\n            return entity.getFieldValue(fieldPath);\n        }\n        return null;\n    }),\n\n    addPerson(person) {\n        const entity = this.get('entity');\n        const fieldPath = this.get('fieldPath');\n        const key = this.get('key');\n        const intl = this.get('intl');\n\n        if (this.get('isManagerRelationship')) {\n            this.addManager(entity, person);\n        } else {\n            this.get('people').addObject(person);\n            if (this.get('isReportRelationship')) {\n                const personId = person.get('id');\n                const currentManager = entity.getFieldValue('relationships.manager');\n                if (currentManager && currentManager.value === personId) {\n                    this.get('people').removeObject(person);\n                    this.get('notification').error(\n                        intl.lookup('notification.titles.profileDataError').toString(),\n                        intl.lookup('notification.person.managerReportError').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'relationship'\n                        }\n                    );\n                } else {\n                    this.addManager(person, entity);\n                    this.get('reportsToSave').addObject(person);\n                }\n            } else {\n                let fieldValue = _.find(entity.get(fieldPath), value => _.isEmpty(value.value));\n\n                if (_.isEmpty(fieldValue)) {\n                    entity.set(fieldPath, person.get('id'));\n                    fieldValue = _.last(entity.get(fieldPath));\n                } else {\n                    Ember.set(fieldValue, 'value', person.get('id'));\n                }\n\n                Ember.set(fieldValue, 'labelKey', key);\n            }\n        }\n    },\n\n    removePerson(person) {\n        let fieldPath = this.get('fieldPath');\n        if (this.get('isManagerRelationship')) {\n            this.removeManager(this.get('entity'));\n        } else {\n            this.get('people').removeObject(person);\n            let values = this.get('entity').getFieldValue(fieldPath);\n            if (!_.isEmpty(values)) {\n                let value = values.findBy('value', person.get('id'));\n                values.removeObject(value);\n            } else if (this.get('isReportRelationship')) {\n                this.removeManager(person);\n                this.get('reportsToSave').addObject(person);\n            }\n        }\n    },\n\n    addManager(person, newManager) {\n        this.removeManager(person);\n        person.set('relationships.manager', newManager.get('id'));\n    },\n\n    removeManager(person) {\n        if (!person) {\n            person = this.get('entity');\n        }\n\n        let manager = person.getFieldValue('relationships.manager');\n        if (!_.isEmpty(manager)) {\n            person.get('relationships.manager').removeObject(manager);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['relationship-label'],\n\n    intl: inject.service(),\n\n    attrs: {\n        onUpdateLabel: () => {}\n    },\n\n    entity: null,\n    editing: false,\n    relationship: null,\n\n    showLabelChoices: false,\n\n    actions: {\n        updateLabel(event) {\n            Ember.run(this, this.updateLabel, event.target.value);\n        },\n\n        focusInput() {\n            this.set('showLabelChoices', true);\n        },\n\n        selectLabel({ key }) {\n            this.updateLabel(key);\n            this.set('showLabelChoices', false);\n        },\n\n        toggleChoices() {\n            this.toggleProperty('showLabelChoices');\n            if (this.get('showLabelChoices')) {\n                this.$('input').trigger('focus');\n            }\n        },\n\n        hideChoices() {\n            this.set('showLabelChoices', false);\n        },\n\n        handleKeyDownOnDropdownArrow(event) {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                event.preventDefault();\n                this.send('toggleChoices');\n            }\n        },\n\n        handleKeyDownOnLabel(event) {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        }\n    },\n\n    isOtherRelationship: computed.reads('relationship.isOtherRelationship'),\n\n    hasLabelChoices: computed.gt('labelChoices.length', 0),\n\n    canShowLabelChoices: computed.and('editing', 'showLabelChoices', 'isOtherRelationship', 'hasLabelChoices'),\n\n    field: computed(function () {\n        return this.get('entity.fieldConfig.relationships.relationships');\n    }),\n\n    labelChoices: computed('field.labelKeys.[]', function () {\n        const intl = this.get('intl');\n        const i18nKey = this.get('field.i18nKey');\n        const labelKeys = this.get('field.labelKeys');\n        return labelKeys.map(key => {\n            return {\n                key,\n                text: intl.lookup(`${i18nKey}_labelKey_${key}`)\n            };\n        });\n    }),\n\n    relationshipKeyTrimAll: computed('relationship.key', function () {\n        const key = this.get('relationship.key');\n        return key ? key.replace(/\\s/g, '') : '';\n    }),\n\n    didInsertElement() {\n        if (!this.get('isOtherRelationship')) {\n            return;\n        }\n\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                const target = Ember.$(event.target);\n                if (!target.parents(`#${this.elementId}`).length) {\n                    this.set('showLabelChoices', false);\n                }\n            });\n        });\n\n        this.$().on('focusout', () => {\n            Ember.run.later(() => {\n                if (!this.$().is(':focus-within')) {\n                    this.set('showLabelChoices', false);\n                }\n            }, 100);\n        });\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n        this.$().off('focusout');\n    },\n\n    updateLabel(newLabel) {\n        const relationship = this.get('relationship');\n        const oldLabel = relationship.get('key');\n\n        relationship.set('key', newLabel);\n\n        this.setLabelKey(newLabel, oldLabel);\n    },\n\n    setLabelKey(newLabel, oldLabel) {\n        this.attrs.onUpdateLabel(newLabel, oldLabel);\n        this.handleTooltip(newLabel);\n    },\n\n    handleTooltip(label) {\n        const message = this.get('intl').lookup('person.relationships.emptyLabel');\n        const input = this.$('input');\n        if (_.isEmpty(label)) {\n            input\n                .tooltip({\n                    title: message.toString(),\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n        } else {\n            input.tooltip('destroy');\n        }\n    },\n\n    focusOut() {\n        this.hideChoices();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WPuRGndo\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isOtherRelationship\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[16,\\\"value\\\",[34,[[28,[\\\"relationship\\\",\\\"label\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateLabel\\\"],null],null],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focusInput\\\"],null],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLabelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDownOnDropdownArrow\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoices\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"label-choices \\\",[33,[\\\"unless\\\"],[[28,[\\\"canShowLabelChoices\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"label-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDownOnLabel\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectLabel\\\",[28,[\\\"choice\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"choice\\\",\\\"text\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[14],[0,\\\"   \\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.hbs\"}});","import Ember from 'ember';\n\nimport EntitySearch from '../../../entity-search/component';\nimport layout from '../../../entity-search/template';\n\nconst { on, run, inject, RSVP } = Ember;\n\nexport default EntitySearch.extend({\n    classNames: ['relationship-search'],\n    layout,\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    entity: null,\n    relationship: null,\n    searchLimit: 6,\n\n    actions: {\n        selectResult(result) {\n            const isOtherRelationship =\n                this.get('relationship.isOtherRelationship') || this.get('relationship.isAssistantsRelationship');\n            const entity = this.get('entity');\n            let canEdit = this.get('permissions.canEditProfiles');\n            if (isOtherRelationship) {\n                canEdit = entity.get('id') === this.get('session.person.id') || canEdit;\n            }\n\n            if (canEdit) {\n                this.set('searchQuery', '');\n                this.set('userInput', '');\n\n                this.sendAction('select', result);\n            }\n        }\n    },\n\n    resultsLoaded: on('didRender', function () {\n        if (!this.get('currentSearchRequest.isFulfilled')) {\n            return false;\n        }\n\n        this.get('currentSearchRequest')\n            .then(([people]) => {\n                // Lets be safe...\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n\n                this.$('.disabled').tooltip('destroy');\n\n                return RSVP.all(people.map(person => person.get('readWritePermissions')));\n            })\n            .then(() => {\n                run.scheduleOnce('afterRender', this, function () {\n                    // ...doubly safe\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    if (this.get('relationship.isManagerRelationship')) {\n                        this.$('.disabled').tooltip({\n                            title: this.get('intl').lookup('person.relationships.cantModify').toString(),\n                            placement: 'top',\n                            trigger: 'hover',\n                            container: `#${this.elementId} .search-results`\n                        });\n                    }\n                });\n            });\n    }),\n\n    selectNext() {\n        const entities = this.get('wrappedSearchResults.content');\n        if (!entities || entities.length === 0) return;\n\n        const nowSelected = this.get('currentSelected');\n        const nextSelected = nowSelected + 1;\n\n        if (nextSelected < entities.length) {\n            // Remove selected class from current\n            if (nowSelected >= 0) {\n                this.$('.result-container').eq(nowSelected).removeClass('selected');\n            }\n            // Add selected class to next\n            this.$('.result-container').eq(nextSelected).addClass('selected');\n\n            this.set('currentSelected', nextSelected);\n            this.scrolling(true);\n        }\n    },\n\n    selectPrevious() {\n        const entities = this.get('wrappedSearchResults.content');\n        if (!entities || entities.length === 0) return;\n\n        const nowSelected = this.get('currentSelected');\n        const previousSelected = nowSelected - 1;\n\n        if (previousSelected >= 0) {\n            // Remove selected class from current\n            this.$('.result-container').eq(nowSelected).removeClass('selected');\n            // Add selected class to previous\n            this.$('.result-container').eq(previousSelected).addClass('selected');\n\n            this.set('currentSelected', previousSelected);\n            this.scrolling(false);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"MAcLLPE/\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"allRelationships\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-field\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"relationship\\\",\\\"componentUpdated\\\",\\\"onUpdateField\\\",\\\"onUpdateLabel\\\",\\\"sectionName\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedField\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedLabel\\\"],null],[28,[\\\"sectionName\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"f95OPLsQ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hideHeader\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-content \\\",[33,[\\\"if\\\"],[[28,[\\\"ownProfile\\\"]],\\\"own-profile\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedFieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries field-group-\\\",[28,[\\\"groupedData\\\",\\\"key\\\"]],\\\"\\\\n                    num-entries-\\\",[28,[\\\"groupedData\\\",\\\"fieldData\\\",\\\"length\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"sort-field-data\\\"],[[28,[\\\"groupedData\\\",\\\"fieldData\\\"]]],[[\\\"group\\\"],[[28,[\\\"groupedData\\\"]]]]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"isViewMode\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"fieldPathClass\\\"]],\\\"\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]],\\\"new-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]],\\\"repeatable\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"data\\\",\\\"fieldId\\\"]]]]],[16,\\\"aria-labelledby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label-tag\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entry-label\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[16,\\\"aria-labelledby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label-tag\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"editing\\\",\\\"field\\\",\\\"entry\\\",\\\"writeable\\\",\\\"showHistoryYearRange\\\",\\\"fallbackToEmpty\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\",\\\"field\\\"]],[28,[\\\"data\\\",\\\"fieldValue\\\"]],[28,[\\\"data\\\",\\\"writeable\\\"]],false,[28,[\\\"fallbackToEmptyLabel\\\"]]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"id\\\",\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"allFieldData\\\",\\\"cancelAddNew\\\",\\\"componentUpdated\\\",\\\"sectionName\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\"],null],[28,[\\\"componentUpdated\\\"]],[28,[\\\"sectionName\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"data\\\",\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"data\\\",\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n                                            \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"data\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupedData\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.scheduleOnce('afterRender', this, this.setValues);\n        }\n    }),\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"39ssHkh9\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"protocol\\\",\\\"value\\\",\\\"ariaLabelledBy\\\"],[\\\"map\\\",[28,[\\\"entry\\\",\\\"value\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/address-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    didInsertElement() {\n        this._super(...arguments);\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entity = this.get('entity');\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n\n        if (_.isEmpty(entry) || entry.value === undefined) {\n            entity.set(path, false);\n        }\n\n        // Make sure things get bound correctly for input checkbox changes\n        this.set('entry', entity.getFieldValue(path));\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"ZN7jpTBV\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"type\\\",\\\"id\\\",\\\"name\\\",\\\"checked\\\"],[\\\"checkbox\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],\\\"entry.value\\\",[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"label \\\",[33,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],\\\"label-success\\\",\\\"label-danger\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-check-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-true\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-false\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/boolean-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, observer, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.year', 'entry.value.month', 'entry.value.day'],\n\n    actions: {\n        selectDate(date) {\n            if (!date) {\n                this.set('entry.value', null);\n            } else {\n                const day = date.getDate();\n                const month = date.getMonth() + 1;\n                const year = date.getFullYear();\n                const value = { day, month, year };\n\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: observer('canEdit', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    value: computed('entry.value', function () {\n        let entry = this.get('entry');\n\n        if (!this.isComplexFieldEmpty()) {\n            let copy = Ember.copy(entry, true);\n            copy.value.month -= 1;\n\n            return moment(copy.value).toDate();\n        }\n\n        return null;\n    }),\n\n    formattedValue: computed('value', function () {\n        const date = this.get('value');\n        if (!date) {\n            return '';\n        }\n        return moment(date).format('L');\n    }),\n\n    options: computed('intl.locale', function () {\n        const localeData = moment.localeData();\n        return {\n            i18n: {\n                previousMonth: this.get('intl').t('chat.presence.outOfOffice.picker.previousMonth').toString(),\n                nextMonth: this.get('intl').t('chat.presence.outOfOffice.picker.nextMonth').toString(),\n                months: localeData._months,\n                weekdays: localeData._weekdays,\n                weekdaysShort: localeData._weekdaysShort\n            }\n        };\n    }),\n\n    dateFormat: computed('intl.iosLocale', function () {\n        let locale = this.get('intl.isoLocale');\n        if (locale === 'no') {\n            // moment uses nb as its Norwegian locale\n            locale = 'nb';\n        }\n        return moment.localeData(locale)._longDateFormat.L;\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n        const path = this.get('field.fieldPath');\n\n        if (_.isEmpty(entry)) {\n            entity.set(path, entry);\n        } else {\n            entity.set(path, [entry], { overwrite: true });\n        }\n\n        if (_.isEmpty(entry.value)) {\n            let value = {\n                year: null,\n                month: null,\n                day: null\n            };\n\n            Ember.set(entry, 'value', value);\n        }\n\n        this.set('entry', entity.getFieldValue(path));\n    },\n\n    isComplexFieldEmpty: function () {\n        let entry = this.get('entry');\n        if (!entry || !entry.value) {\n            return true;\n        }\n\n        return (\n            typeof entry.value.year !== 'number' &&\n            typeof entry.value.month !== 'number' &&\n            typeof entry.value.day !== 'number'\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"CiFxiWqE\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"pikaday-input\\\"],null,[[\\\"value\\\",\\\"classNames\\\",\\\"format\\\",\\\"placeholder\\\",\\\"firstDay\\\",\\\"onSelection\\\",\\\"options\\\"],[[28,[\\\"value\\\"]],\\\"form-control\\\",[28,[\\\"dateFormat\\\"]],\\\"\\\",0,[33,[\\\"action\\\"],[[28,[null]],\\\"selectDate\\\"],null],[28,[\\\"options\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"formattedValue\\\"]],true],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty-value\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/date-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-value'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    currentTooltip: null,\n    isActive: false,\n    headingLevel: null,\n    hasError: computed.not('isValid'),\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        let empty;\n        if (!entry) {\n            empty = true;\n        } else {\n            empty = _.isEmpty(entry.value);\n        }\n\n        if (empty) {\n            const timer = Ember.run.scheduleOnce('afterRender', this, this.setValues);\n            this.timers.push(timer);\n        }\n    },\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', 'isEmpty', {\n        get() {\n            let entryId = this.get('entry._id');\n            let fieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n            return fieldId && fieldId === entryId && !this.get('isEmpty');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(\n                type,\n                this.get('entry'),\n                this.get('fieldData.field.fieldPath'),\n                this.get('fieldData')\n            );\n\n            return value;\n        }\n    }),\n\n    errorMessage: computed('isValid', 'entry.value', 'entity.type', function () {\n        const intl = this.get('intl');\n        const valid = this.get('isValid');\n        const empty = _.isEmpty(this.get('entry.value'));\n        const isGroup = this.get('entity.type') === 'group';\n\n        if (empty && !isGroup) {\n            return intl.lookup('tooltip.fields.email.blankError').toString();\n        }\n\n        if (!valid && !empty) {\n            return intl.lookup('tooltip.fields.email.invalidError').toString();\n        }\n    }),\n\n    canSetPrimary: computed.reads('permissions.canEditProfiles'),\n\n    focusOut() {\n        this.set('isActive', false);\n    },\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KvjQxAMU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"email-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"has-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\",\\\"focus-in\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"validation-error\\\"],null],\\\"focus\\\"]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"protocol\\\",\\\"value\\\",\\\"title\\\",\\\"ariaLabelledBy\\\"],[\\\"mailto\\\",[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"canSetPrimary\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\",\\\"ariaDescribedBy\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryMail\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.primary\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/email-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNames: ['history'],\n\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: [\n        'entry.value.where',\n        'entry.value.startDate.month',\n        'entry.value.startDate.year',\n        'entry.value.endDate.month',\n        'entry.value.endDate.year'\n    ],\n\n    errors: null,\n    isActive: false,\n\n    actions: {\n        saveHistoryEntry() {\n            this.set('isNewField', false);\n            this.set('isEmpty', false);\n        },\n\n        cancelHistoryEntry() {\n            this.attrs.cancelAddNew(this.get('fieldData'));\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    focusOut: function () {\n        this.set('isActive', false);\n    },\n\n    showTooltip: computed('isValid', 'entry.value.where', 'isActive', function () {\n        let active = this.get('isActive');\n        let valid = this.get('isValid');\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        return !active && (empty || !valid);\n    }),\n\n    focusNewField() {\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        let added = this.get('entry.isAdded');\n\n        if (empty && !added) {\n            let $input = this.$('.where input');\n            this.set('entry.isAdded', true);\n            $input.trigger('focus');\n        }\n    },\n\n    ensureDateObjectsExist() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n\n        if (typeof entry.value !== 'object') {\n            Ember.set(entry, 'value', {});\n        }\n\n        if (!entry.value.endDate) {\n            Ember.set(entry, 'value.endDate', {\n                month: null,\n                year: null\n            });\n        }\n\n        if (!entry.value.startDate) {\n            Ember.set(entry, 'value.startDate', {\n                month: null,\n                year: null\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('errors', {\n            where: false,\n            date: false\n        });\n\n        Ember.run.once(this, this.ensureDateObjectsExist);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.delete[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n        Ember.run.scheduleOnce('afterRender', this, this.focusNewField);\n        Ember.run.scheduleOnce('afterRender', this, this.calculateValidityOnInsert);\n    },\n\n    calculateValidityOnInsert() {\n        this.validityChanged();\n    },\n\n    resetData: on('willDestroyElement', function () {\n        this.cleanFieldForSave();\n    }),\n\n    section: computed.reads('fieldData.field.section'),\n    useEducationLabels: computed.equal('section.key', 'education'),\n\n    isNewField: computed('entry._id', 'entry.tempId', function () {\n        return !this.get('entry._id') && this.get('entry.tempId');\n    }),\n\n    where: computed('entry.value.where', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.where');\n    }),\n\n    what: computed('entry.value.what', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.what');\n    }),\n\n    notes: computed('entry.value.notes', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.notes');\n    }),\n\n    whereLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhere');\n        }\n        return intl.lookup('entity.fieldTypes.history.where').toString();\n    }),\n\n    datesLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationDates');\n        }\n        return intl.lookup('entity.fieldTypes.history.dates').toString();\n    }),\n\n    whatLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhat');\n        }\n        return intl.lookup('entity.fieldTypes.history.what').toString();\n    }),\n\n    notesLabel: computed(function () {\n        return this.get('intl').lookup('entity.fieldTypes.history.notes');\n    }),\n\n    validityChanged: observer('showTooltip', 'isEmpty', function () {\n        let isValid = this.get('isValid');\n        let isEmpty = this.get('isEmpty');\n\n        Ember.run.scheduleOnce('afterRender', this, this.whereErrorChanged, isEmpty);\n        Ember.run.scheduleOnce('afterRender', this, this.dateErrorChanged, !isValid);\n    }).on('init'),\n\n    whereErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n        let showTooltip = this.get('showTooltip');\n\n        var input = this.get('whereInput');\n        if (error && showTooltip) {\n            var elem = this.$('.where input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.whereError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('whereInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    dateErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n\n        var input = this.get('dateInput');\n        if (error) {\n            var elem = this.$('.from-date input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.dateError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('dateInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    isComplexFieldEmpty: function () {\n        // only required field is `where`\n        var where = this.get('entry.value.where');\n        return where === undefined || _.isEmpty(where.trim());\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"PbnyqSd4\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]],\\\"new-field\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"field-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs where-and-dates\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-where\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"whereLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"focus-in\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-where\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"where\\\"]],\\\"form-control\\\",\\\"focus\\\",[33,[\\\"if\\\"],[[28,[\\\"errors\\\",\\\"where\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-range\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"datesLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-pickers\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-from-date-picker\\\"]]],[15,\\\"class\\\",\\\"sr-only\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.history.from\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"from-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"error\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-from\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"startDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minStartDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxStartDate\\\"]],[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-to-date-picker\\\"]]],[15,\\\"class\\\",\\\"to\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.history.to\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"to-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"placeholder\\\",\\\"error\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-to\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"endDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minEndDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxEndDate\\\"]],\\\"entity.fieldTypes.history.toPlaceholder\\\",[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs what\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-what\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"whatLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-what\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"what\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs note\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-notes\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"notesLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-notes\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"notes\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete remove-new-field\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[33,[\\\"t\\\"],[\\\"fieldSection.historyEntry\\\"],null],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"cancelHistoryEntry\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[1,[26,[\\\"where\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"what\\\"],[13],[1,[26,[\\\"what\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"notes\\\"]]],null,{\\\"statements\\\":[[6,[\\\"expander-plugin\\\"],null,null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"notes\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dates\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"fallbackToEmpty\\\",\\\"showInstructionText\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],true,false]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/history-field/template.hbs\"}});","import TextField from '../text-field/component';\n\nexport default TextField.extend();\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n\n    location: null,\n    parentLocation: null,\n    floorLocation: null,\n\n    googleMapsHref: '',\n\n    showFloorplan: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('location', this.get('locationData'));\n        this.set('filterLocations', this.filterLocationsHelper.bind(this));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.focusFieldOnInsert);\n    },\n\n    focusFieldOnInsert() {\n        const input = this.$('input');\n        if (input) {\n            input.trigger('focus');\n        }\n    },\n\n    actions: {\n        selectParentLocation(location) {\n            this.set('parentLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', true);\n        },\n\n        selectFloorLocation(location) {\n            this.set('floorLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', false);\n        },\n\n        saveNewLocation() {\n            let parentLocation = this.get('parentLocation');\n            let floorLocation = this.get('floorLocation');\n            if (floorLocation) {\n                this.send('selectLocation', floorLocation);\n            } else {\n                this.send('selectLocation', parentLocation);\n            }\n        },\n\n        cancelNewLocation() {\n            this.get('cancelAddNew')(this.get('fieldData'));\n        },\n\n        selectLocation(location) {\n            let entry = this.get('entry');\n            let id = location.get('id');\n\n            let value = {\n                locationId: id,\n                coordinates: {},\n                notes: ''\n            };\n\n            if (location.get('floorplanImage') && location.get('floorplanImage.length') > 0) {\n                value.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', value);\n            this.set('location', this.get('locationData'));\n        },\n\n        removeNewParentLocation() {\n            this.set('parentLocation', null);\n        },\n\n        noop() {},\n\n        toggleFloorplan() {\n            Ember.run.once(this, this.toggleProperty, 'showFloorplan');\n        },\n\n        hideFloorplan() {\n            this.set('showFloorplan', false);\n            this.set('location', this.get('locationData'));\n        },\n\n        confirm() {\n            var location = this.get('location');\n            var entity = this.get('entity');\n\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            if (entity === undefined) {\n                entity = this.get('modal.entity');\n            }\n\n            return location\n                .then(() => entity.save())\n                .then(() => entity.reload())\n                .catch(resp => {\n                    if (resp.responseText) {\n                        var json = JSON.parse(resp.responseText);\n                        var code = Ember.get(json, 'payload.code');\n                        if (code === 'VERSION_MISMATCH') {\n                            this.bubbleAction({\n                                action: 'confirm'\n                            });\n                        }\n                    }\n                });\n        },\n\n        cancel() {\n            var location = this.get('location');\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            location.then(location => {\n                this.get('modal.controller.entity').reset();\n                location.reload();\n            });\n        }\n    },\n\n    parentLocationName: computed('location.parent.name', function () {\n        return this.get('intl').lookup('field.in', {\n            location: this.get('location.parent.name')\n        });\n    }),\n\n    isValid: computed('entry.value.locationId', 'parentLocation', function () {\n        var entry = this.get('entry');\n\n        var selectedFloor = !_.isEmpty(Ember.get(entry, 'value')) && !_.isEmpty(Ember.get(entry, 'value.locationId'));\n        var haveParent = !_.isEmpty(this.get('parentLocation'));\n\n        return haveParent || selectedFloor;\n    }),\n\n    haveFloor: computed('editing', 'location', 'locationData', 'parentLocation', 'selectedFloor', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        if (!this.get('editing')) {\n            return true;\n        }\n\n        if (this.get('parentLocation') && !this.get('selectedFloor')) {\n            return false;\n        }\n        return location || this.get('selectedFloor');\n    }),\n\n    locationData: computed('entry.value.locationId', 'editing', function () {\n        let id = this.get('entry.value.locationId');\n        let emptyPromise = DS.PromiseObject.create({\n            promise: Ember.RSVP.resolve(undefined)\n        });\n\n        if (this.get('parentLocation') && !this.get('floorLocation')) {\n            return emptyPromise;\n        } else if (id) {\n            return this.get('store').findRecord('location', id);\n        }\n\n        return emptyPromise;\n    }),\n\n    locationAddress: computed('location', 'locationData', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        let promise = location.then(location => {\n            if (!location) {\n                return '';\n            }\n\n            if (location.get('isFloor')) {\n                return location.get('parent.address');\n            }\n\n            return location.get('address');\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    isRichAddress: computed('locationAddress', function () {\n        let promise = this.get('locationAddress').then(address => {\n            return typeof address !== 'string';\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    parentLocations: computed(function () {\n        var promise = this.store.findAll('location').then(function (locations) {\n            return _.filter(\n                locations.content.map(x => x.getRecord()),\n                function (location) {\n                    return (\n                        location.get('state') !== 'deleted' &&\n                        location.get('type') !== 'floor' &&\n                        location.get('id') !== null\n                    );\n                }\n            );\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    canShowEdit: computed('editing', 'location', function () {\n        return this.get('editing') && !_.isEmpty(this.get('location.content.parent.content.sublocationOrder'));\n    }),\n\n    locationChoices: computed('parentLocation', function () {\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n\n        return this.get('parentLocation.floors');\n    }),\n\n    choiceText: computed('parentLocation', function () {\n        const intl = this.get('intl');\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return intl.lookup('locations.selectLocation');\n        }\n\n        return `${intl.lookup('locations.selectFloor')}${parentLocation.get('name')}`;\n    }),\n\n    selectedParentLocation: computed('parentLocation', function () {\n        return !_.isEmpty(this.get('parentLocation'));\n    }),\n\n    editText: computed('location', 'location.isFloor', function () {\n        const intl = this.get('intl');\n        if (this.get('location.isFloor')) {\n            return intl.lookup('locations.selectOfficeShort');\n        }\n\n        return intl.lookup('locations.editLocation');\n    }),\n\n    attachmentId: computed('elementId', function () {\n        return `attachment-${this.elementId}`;\n    }),\n\n    setGoogleMapsLinkInfo: observer('location.parent', function () {\n        var parent = this.get('location.parent');\n\n        if (parent) {\n            parent.then(\n                Ember.run.bind(this, parentLocation => {\n                    if (this.get('_state') === 'inDOM') {\n                        var address;\n                        if (parentLocation) {\n                            address = parentLocation.get('address');\n                        } else if (!parentLocation) {\n                            address = this.get('location.address');\n                        }\n\n                        if (typeof address === 'string') {\n                            address = address.replace(/^\\s+|\\s+$/g, '').replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        } else if (address && typeof address === 'object') {\n                            let street1 = address.street1 || '';\n                            let street2 = address.street2 || '';\n                            let street = street1 && street2 ? `${street1} ${street2}` : street1;\n                            let city = address.city || '';\n                            let state = address.state || '';\n                            let zipcode = address.zipcode || '';\n                            let country = address.country || '';\n                            address = `${street} ${city}, ${state}, ${zipcode}, ${country}`\n                                .replace(/^\\s+|\\s+$/g, '')\n                                .replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        }\n                    }\n                })\n            );\n        }\n    }),\n\n    parentLocationUpdated: observer('parentLocation', function () {\n        if (this.get('parentLocation')) {\n            var dropdown = this.$('.dropdown-menu-view');\n\n            if (dropdown) {\n                dropdown.addClass('flash');\n\n                Ember.run.scheduleOnce('afterRender', this, this.toggleFlash, dropdown);\n            }\n        }\n    }),\n\n    filterLocationsHelper(data) {\n        let entity = this.get('entity');\n        let fieldPath = this.get('field.fieldPath');\n        let locationIds = entity.getFieldValue(fieldPath).mapBy('value.locationId');\n        let locations = _.filter(\n            locationIds.map(id => {\n                if (!id) {\n                    return;\n                }\n\n                let location = this.get('store').peekRecord('location', id);\n                if (!location) {\n                    return;\n                }\n                if (location.get('parent.id')) {\n                    return location.get('parent.content');\n                }\n                return location;\n            })\n        );\n\n        return _.reject(data, location => {\n            return _.includes(locations.mapBy('id'), location.get('id')) || location.get('isFloor');\n        });\n    },\n\n    toggleFlash(dropdown) {\n        Ember.run.later(\n            this,\n            function () {\n                dropdown.removeClass('flash');\n            },\n            150\n        );\n    },\n\n    showFloorPlan() {\n        this.set('showFloorplan', true);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yVVZmAiU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\"]],[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information location-details\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"parentLocationName\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationAddress\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"isRichAddress\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.address\\\"],[[\\\"street1\\\",\\\"street2\\\",\\\"city\\\",\\\"state\\\",\\\"country\\\",\\\"zipcode\\\"],[[28,[\\\"locationAddress\\\",\\\"street1\\\"]],[28,[\\\"locationAddress\\\",\\\"street2\\\"]],[28,[\\\"locationAddress\\\",\\\"city\\\"]],[28,[\\\"locationAddress\\\",\\\"state\\\"]],[28,[\\\"locationAddress\\\",\\\"country\\\"]],[28,[\\\"locationAddress\\\",\\\"zipcode\\\"]]]]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"locationAddress\\\",\\\"content\\\"]]],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"location\\\",\\\"floorplan\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat floorplan-action\\\"],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"id\\\",[34,[[26,[\\\"attachmentId\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleFloorplan\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-floor-plan\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.editFloor\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.floorplan\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"floorplan-popover\\\"],null,[[\\\"show\\\",\\\"attachmentId\\\",\\\"hidePopover\\\"],[[28,[\\\"showFloorplan\\\"]],[28,[\\\"attachmentId\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"hideFloorplan\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"floorplan-editor\\\"],null,[[\\\"entity\\\",\\\"location\\\",\\\"editing\\\",\\\"parentLocation\\\",\\\"field\\\",\\\"fieldData\\\",\\\"saveLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"locationData\\\",\\\"content\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]],[28,[\\\"field\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"googleMapsHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"map\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[16,\\\"href\\\",[26,[\\\"googleMapsHref\\\"]],null],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-map\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.map\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"parent-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"parentLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null],true],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"floorLocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"floor-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"floorLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"location-container dropdown\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"selectedParentLocation\\\"]],\\\"selected-parent\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"dropdown-menu\\\"],null,[[\\\"title\\\"],[[28,[\\\"choiceText\\\"]]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"parent-location floor-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFloorLocation\\\",[28,[\\\"location\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],96]]],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[11,\\\"strong\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"location\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"location\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.noFloors\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"filterFunction\\\",\\\"select\\\",\\\"class\\\"],[\\\"locations\\\",[28,[\\\"filterLocations\\\"]],\\\"selectParentLocation\\\",[33,[\\\"concat\\\"],[[33,[\\\"if\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null],\\\" \\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/location-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, run, set } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-text'],\n\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            run(() => {\n                const timer = run.once(this, this.setValues);\n                this.timers.pushObject(timer);\n            });\n        }\n    }),\n\n    isFieldEmpty() {\n        let field = this.get('field');\n        let entity = this.get('entity');\n\n        if (field && entity) {\n            let path = this.get('field').getFieldPath();\n            let value = this.get('entity').getFieldValue(path);\n\n            return _.isEmpty(value);\n        }\n    },\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"pGASiGw8\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxFieldWithLength\\\"],[[\\\"length\\\"],[[28,[\\\"field\\\",\\\"params\\\",\\\"maxLength\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],[[\\\"id\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/multiline-text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    actions: {\n        selectPersonFromPicker: function (person) {\n            this.set('entry.value', person.get('id'));\n        }\n    },\n\n    person: Ember.computed('entry.value', function () {\n        var value = this.get('entry.value');\n        if (value) {\n            return this.store.find('person', value);\n        }\n\n        return undefined;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"u4vyWJcp\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"personId\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/person-field/template.hbs\"}});","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { get, inject, computed, observer, Component } = Ember;\n\nlet requireFields = ['contactInfo.phone_other'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isNumberError:invalid-value', 'hasErrorCode:has-error-code'],\n\n    intl: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.number', 'entry.value.extension', 'entry.value.acceptSMS'],\n\n    isActive: false,\n    headingLevel: null,\n\n    entry: computed.alias('fieldData.value'),\n\n    timers: null,\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n            if (\n                this.get('session.features.emergencyLocation') &&\n                this.get('entry.value.number') &&\n                this.setPrimaryCallback\n            ) {\n                this.setPrimaryCallback(this.get('entry.value.number'));\n            }\n        },\n\n        setPrimarySMS() {\n            this.set('isPrimarySMS', true);\n            this.set('entry.value.acceptsSMS', true);\n        },\n\n        toggleSMS(event) {\n            this.toggleProperty('entry.value.acceptsSMS');\n\n            if (event) {\n                event.stopPropagation();\n            }\n        },\n\n        makeCall: debounce(function () {\n            var phoneNumber = this.get('entry');\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [phoneNumber]\n            });\n        }, 250),\n\n        focus() {\n            this.set('isActive', true);\n        },\n\n        updateNumber(event) {\n            this.set('entry.value.number', event.target.value);\n        },\n\n        updateExtension(value) {\n            this.set('entry.value.extension', value);\n        }\n    },\n\n    init() {\n        this.set('timers', []);\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setupData);\n        this.get('timers').addObject(timer);\n    }),\n\n    addBehavior: observer('editing', function () {\n        let timer;\n        if (!this.get('editing')) {\n            timer = Ember.run.scheduleOnce('afterRender', this, this.setupTooltips);\n            this.get('timers').addObject(timer);\n\n            return;\n        }\n\n        timer = Ember.run.scheduleOnce('afterRender', this, this._setupInput);\n        this.get('timers').addObject(timer);\n    }).on('didInsertElement'),\n\n    dialableNumber: computed('entry.rel.e164', 'entry.value.{number,extension}', function () {\n        var e164 = this.get('entry.rel.e164');\n        if (e164) {\n            return e164;\n        }\n\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n\n        number = number ? number.replace(/\\D/g, '') : number;\n        extension = extension ? extension.replace(/\\D/g, '') : extension;\n\n        if (number) {\n            number = this.get('addressformat').formatAddress(number);\n            if (extension) {\n                return `${number};ext=${extension}`;\n            } else {\n                return number;\n            }\n        } else if (extension) {\n            return extension;\n        }\n    }),\n\n    isPrimarySMS: computed('entry._id', 'entity.primaryContactInfo.sms', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('sms');\n        },\n\n        set(key, value) {\n            const entity = this.get('entity');\n            const type = 'sms';\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.voice', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('voice');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    dialCode: computed('entry.value.number', function () {\n        let $input = this.get('$input');\n        let initialCountry = !_.isEmpty($input) ? $input.intlTelInput('getSelectedCountryData') : null;\n        if (_.isEmpty(initialCountry) && this.get('intl.iso2LocaleCountry')) {\n            initialCountry = this.get('intl.iso2LocaleCountry');\n        }\n        return initialCountry.dialCode;\n    }),\n\n    errorMsg: computed('entry.value.{number,extension}', function () {\n        const intl = this.get('intl');\n        const number = this.get('entry.value.number');\n        const extension = this.get('entry.value.extension');\n        const $input = this.get('$input');\n\n        let iso2LocaleCountry, initialCountry;\n\n        if (this.get('intl.iso2LocaleCountry')) {\n            iso2LocaleCountry = this.get('intl.iso2LocaleCountry.iso2');\n        }\n\n        if ($input.intlTelInput('getSelectedCountryData')) {\n            initialCountry = $input.intlTelInput('getSelectedCountryData').iso2;\n        }\n\n        if (!initialCountry) {\n            $input.intlTelInput('setCountry', iso2LocaleCountry);\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return null;\n        }\n\n        // https://github.com/Bluefieldscom/intl-tel-input/blob/master/lib/libphonenumber/src/utils.js#L175\n        let errorCode = $input.intlTelInput('getValidationError');\n        let message = '';\n        switch (errorCode) {\n            case intlTelInputUtils.validationError.INVALID_COUNTRY_CODE:\n                message = intl.lookup('entity.fieldTypes.phone.validation.invalidCountryCode');\n                break;\n            case intlTelInputUtils.validationError.TOO_SHORT:\n                message = intl.lookup('entity.fieldTypes.phone.validation.tooShort');\n                break;\n            case intlTelInputUtils.validationError.TOO_LONG:\n                // I don't understand this error.  This occurs on U.S. numbers as you type them in with an area code.  Using 'Not a number' instead of too long message.\n                // this.set('errorMsg', lookup('entity.fieldTypes.phone.validation.tooLong'));\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            case intlTelInputUtils.validationError.NOT_A_NUMBER:\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            default:\n                message = null;\n        }\n\n        return message;\n    }),\n\n    isRequiredPhone: computed('field', function () {\n        let path = this.get('field').getFieldPath();\n        return Ember.A(requireFields).includes(path);\n    }),\n\n    isRequiredError: computed('entry.value.{number,extension}', 'isRequiredPhone', function () {\n        if (!this.get('isRequiredPhone')) {\n            return false;\n        }\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    isNumberError: computed('entry.value.{number,extension}', '$input', 'isRequiredPhone', function () {\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        if (!this.get('isRequiredPhone') && _.isEmpty(number)) {\n            return false;\n        } else if (this.get('isRequiredPhone') && _.isEmpty(number) && !_.isEmpty(extension)) {\n            // Any extension is allowed because we dont know what the extension pool contains\n            return false;\n        }\n        const $input = this.get('$input');\n        if (!$input || !$input.intlTelInput) {\n            return false;\n        }\n        return !$input.intlTelInput('isValidNumber');\n    }),\n\n    errorClass: computed('isRequiredError', 'isNumberError', function () {\n        if (this.get('isRequiredError')) {\n            return 'has-error';\n        }\n        if (this.get('isNumberError')) {\n            return 'has-warning';\n        }\n        return '';\n    }),\n\n    isValid: computed('entry.value.{number,extension}', 'isRequiredError', function () {\n        if (!this.get('editing') || this.isDestroyed || this.isDestroying) {\n            return true;\n        }\n\n        const isRequiredError = this.get('isRequiredError');\n        const isValid = this.get('isRequiredPhone') ? !isRequiredError : true;\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setFieldDataValidity, isValid);\n        this.get('timers').addObject(timer);\n\n        return isValid;\n    }),\n\n    hasError: computed.not('isValid'),\n    hasErrorCode: computed('entry.rel.errorCode', function () {\n        return !_.isEmpty(this.get('entry.rel.errorCode'));\n    }),\n\n    errorMessage: computed('entry.rel.errorCode', function () {\n        const errorCode = this.get('entry.rel.errorCode');\n        const key = `purecloud.error.api.${errorCode}`;\n        return this.get('intl').lookup(key, null, errorCode.replace(/_/g, ' ')).toString();\n    }),\n\n    didUpdateAttrs({ newAttrs }) {\n        if (!get(newAttrs, 'editing.value') && !this.get('isValid')) {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    willDestroyElement() {\n        this.get('timers').forEach(timer => Ember.run.cancel(timer));\n\n        this.$('.phone-input').intlTelInput('destroy');\n\n        this._super(...arguments);\n    },\n\n    checkPrimaryForType(type) {\n        let entryId = this.get('entry._id');\n        let fieldId = this.get(`entity.primaryContactInfo.${type}.firstObject.value.fieldId`);\n        return fieldId && fieldId === entryId && !this.get('isEmpty');\n    },\n\n    focusOut() {\n        this._super(...arguments);\n\n        this.set('isActive', false);\n\n        const value = this.get('entry.value.number');\n        if (value === '+1') {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    focusNewField() {\n        let empty = this.get('isEmpty');\n        let added = this.get('entry.isAdded');\n\n        if (added) {\n            return;\n        }\n\n        this.set('entry.isAdded', true);\n        if (empty) {\n            this.$('.phone-input').trigger('focus');\n        }\n    },\n\n    cleanFieldForSave() {\n        if (this.get('entry.value') && this.get('$input')) {\n            var countryData = this.get('$input').intlTelInput('getSelectedCountryData');\n            if (countryData && countryData.iso2) {\n                this.set('entry.value.countryCode', countryData.iso2.toLocaleUpperCase());\n            }\n        }\n    },\n\n    isComplexFieldEmpty() {\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n        return (\n            ((typeof number === 'string' && number.length === 0) || number === undefined) &&\n            ((typeof extension === 'string' && extension.length === 0) || extension === undefined)\n        );\n    },\n\n    setupTooltips() {\n        this.$('[data-toggle=\"tooltip\"]').tooltip();\n    },\n\n    _setupData() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n        let entity = this.get('entity');\n        let emptyData = {\n            number: '',\n            extension: '',\n            acceptsSMS: false\n        };\n\n        if (_.isEmpty(entry) || (_.isEmpty(entry.value) && !this.get('field.repeatable'))) {\n            let path = this.get('field').getFieldPath();\n            entity.set(path, emptyData);\n            this.set('entry', _.last(entity.get(path)));\n        } else if (!_.isEmpty(entry) && _.isEmpty(entry.value)) {\n            Ember.set(entry, 'value', emptyData);\n        }\n    },\n\n    _setupInput() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const orgCountryCode = this.get('session.org.orgDefaultCountryCode');\n        let countryCode = 'us';\n        if (orgCountryCode) {\n            countryCode = orgCountryCode.toLowerCase();\n        }\n\n        let $input = this.$('.phone-input');\n        $input.intlTelInput({\n            nationalMode: false,\n            utilsScript: `${this.get('application.urlprefix')}assets/intltelinput/utils.js`,\n            // preferredCountries: ['us', 'gb', 'es', 'fr']\n            initialCountry: countryCode\n        });\n\n        $input.on('blur', function () {\n            //Let the Ember input binding know that the plugin updated the value after blur event.\n            $input.trigger('change');\n        });\n\n        this.set('$input', $input);\n        this.notifyPropertyChange('isValid');\n    },\n\n    _setFieldDataValidity(value) {\n        this.set('fieldData.isValid', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"pA8qbsDD\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"phone-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[26,[\\\"errorClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null]]]],[15,\\\"type\\\",\\\"tel\\\"],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]],[16,\\\"class\\\",[34,[\\\"phone-input form-control phone-number \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focus\\\"],[[\\\"on\\\"],[\\\"focus\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-extension\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extensionLabel\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"key-up\\\",\\\"classNames\\\",\\\"class\\\",\\\"placeholder\\\",\\\"type\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-extension\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"updateExtension\\\",\\\"form-control phone-extension\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-warning\\\"],null],[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],\\\"tel\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRequiredError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.validation.notANumber\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isNumberError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warn help-block\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.sms.errors.invalidNumberFormat\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasErrorCode\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[15,\\\"data-placement\\\",\\\"right\\\"],[15,\\\"data-trigger\\\",\\\"hover\\\"],[16,\\\"title\\\",[34,[[26,[\\\"errorMessage\\\"]]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\",\\\"ariaLabelledBy\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value-type \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"primary-phone-choice\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryPhone\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isPrimarySMS\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimarySMS\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type primary-sms-choice\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\"],[[28,[\\\"isPrimarySMS\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimarySMS\\\"],null],\\\"primarySms\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading-indicator\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/phone-field/template.hbs\"}});","import Ember from 'ember';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: Ember.inject.service(),\n\n    choice: Ember.computed.alias('entry.value'),\n\n    actions: {\n        setValue(value) {\n            if (!value) {\n                value = this.get('defaultValue.id');\n            }\n\n            this.set('choice', value);\n            Ember.set(this, 'entry.value', value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: Ember.observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n\n        if (this.isFieldEmpty()) {\n            let value = this.get('field.params.allowedValues')[0];\n\n            if (!value) {\n                value = '';\n            }\n\n            if (!isEmpty(entry)) {\n                Ember.set(entry, 'value', value);\n                entity.set(path, [entry], { overwrite: true });\n            } else {\n                entity.set(path, value);\n            }\n\n            this.set('entry', entity.getFieldValue(path));\n        }\n    },\n\n    defaultValue: Ember.computed('content', 'entry.value', function () {\n        const value = this.get('entry.value');\n        if (!isEmpty(value)) {\n            const defaultValue = find(this.get('content'), 'id', value);\n            if (!isEmpty(defaultValue)) {\n                return defaultValue;\n            }\n        }\n\n        return this.get('content.0.id');\n    }),\n\n    content: Ember.computed('field.params.allowedValues', function () {\n        const allowedValues = this.get('field.params.allowedValues') || [];\n        return allowedValues.map(value => {\n            const label = this.translatedAllowedValue(value).toString();\n            return {\n                id: value,\n                label\n            };\n        });\n    }),\n\n    translatedValue: Ember.computed('entry.value', function () {\n        const value = this.get('entry.value');\n        if (value) {\n            const fieldKey = this.get('field').getI18nKey();\n            const valueKey = value.replace(/\\./g, '_');\n            const key = `${fieldKey}_value_${valueKey}`;\n\n            if (this.get('intl').query(key)) {\n                return this.get('intl').lookup(key);\n            }\n        }\n        return value;\n    }),\n\n    translatedAllowedValue(value) {\n        const fieldKey = this.get('field').getI18nKey();\n        const valueKey = value.replace(/\\./g, '_');\n        const key = `${fieldKey}_value_${valueKey}`;\n\n        if (this.get('intl').query(key)) {\n            return this.get('intl').lookup(key);\n        }\n\n        return valueKey;\n    },\n\n    isFieldEmpty() {\n        const field = this.get('field');\n        const entity = this.get('entity');\n\n        if (field && entity) {\n            const path = this.get('field').getFieldPath();\n            const value = this.get('entity').getFieldValue(path);\n\n            return isEmpty(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Qv4n7ECK\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-10\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"select\\\",[]],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setValue\\\"],[[\\\"value\\\"],[\\\"target.value\\\"]]],null],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"content\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"option\\\",[]],[16,\\\"value\\\",[28,[\\\"item\\\",\\\"id\\\"]],null],[16,\\\"selected\\\",[33,[\\\"eq\\\"],[[28,[\\\"choice\\\"]],[28,[\\\"item\\\",\\\"id\\\"]]],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"item\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"item\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"translatedValue\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/select-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\nimport { rerunLayouts } from '../../../utils/masonry';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['tags'],\n    classNameBindings: ['field.fieldPathClass'],\n\n    intl: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n\n    actions: {\n        addTag(tag) {\n            let tags = this.get('entry.value');\n            if (!_.isEmpty(tag) || (typeof tag === 'string' && !_.isEmpty(tag.trim()))) {\n                if (tags.indexOf(tag) !== -1) {\n                    this.send('showDuplicateError', tag);\n                }\n                tags.addObject(tag);\n                rerunLayouts();\n            }\n        },\n\n        removeTag(tag) {\n            this.get('entry.value').removeObject(tag);\n            rerunLayouts();\n        },\n\n        showDuplicateError(tag) {\n            let addTag = this.$('.add-tag');\n\n            addTag\n                .tooltip({\n                    title: this.get('intl').lookup('tooltip.fields.tags.duplicate', { tag }).toString(),\n                    placement: 'bottom',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n\n            Ember.run.later(function () {\n                addTag.tooltip('destroy');\n            }, 3000);\n        },\n\n        navigateToSearchTag(queryParams) {\n            this.get('application').navigateTo('search', undefined, queryParams.values);\n        }\n    },\n\n    linkable: computed('field.fieldPath', function () {\n        const fieldPath = this.get('field.fieldPath');\n        return _.includes(['skills.skills', 'skills.certs'], fieldPath);\n    }),\n\n    sortedTags: computed('entry.value.[]', function () {\n        let tags = this.get('entry.value') || [];\n        return _.sortBy(tags, tag => tag.toLowerCase());\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    ensurePopulatedField: Ember.on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const timer = Ember.run.once(this, this.setValues);\n        this.timers.pushObject(timer);\n    }),\n\n    setValues() {\n        let entry = this.get('entry');\n        let fieldPath = this.get('field').getFieldPath();\n        let entity = this.get('entity');\n\n        if (entity && (!entry || typeof entry.value !== 'object')) {\n            entity.set(fieldPath, [], { recordChange: true });\n            this.set('entry', entity.getFieldValue(fieldPath));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.remove-tag[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { on, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['tag-editor'],\n\n    ajax: inject.service(),\n    search: inject.service(),\n\n    attrs: {\n        field: null,\n        addTag() {}\n    },\n\n    tagValue: null,\n\n    currentRequest: null,\n\n    initTagInput: on('didInsertElement', function () {\n        let $typeahead = this.$('input').typeahead(\n            { highlight: true, hint: false },\n            {\n                name: 'tags',\n                async: true,\n                limit: 100,\n                displayKey: 'text',\n                source: Ember.run.bind(this, (query, syncResults, asyncResults) => {\n                    Ember.run.debounce(this, this.performSearch.bind(this, query, asyncResults), 300);\n                })\n            }\n        );\n\n        $typeahead.on('typeahead:selected', this.addTagFromTypeahead.bind(this));\n        $typeahead.on('typeahead:change', this.clearInput.bind(this));\n\n        this.$('input').on('blur', this.clearInput.bind(this));\n    }),\n\n    removeBehavior: on('willDestroyElement', function () {\n        this.$('input').typeahead('destroy');\n    }),\n\n    performSearch(query, cb) {\n        let type = 'purecloud.skills';\n        const fieldPath = this.get('field').getFieldPath();\n        if (fieldPath === 'skills.spokenLanguages') {\n            type = 'purecloud.languages';\n        }\n        const request = this.get('search').search({\n            types: ['tags'],\n            query: [\n                {\n                    type: 'TERM',\n                    value: type,\n                    fields: ['namespace']\n                },\n                {\n                    type: 'STARTS_WITH',\n                    value: query,\n                    fields: ['name']\n                }\n            ],\n            returnFields: ['key']\n        });\n        this.set('currentRequest', request);\n        return request\n            .then(data => {\n                let tags = data.results;\n                let suggestions = Ember.A(tags).map(function (tag) {\n                    return {\n                        value: tag.key,\n                        text: tag.key\n                    };\n                });\n\n                cb(suggestions);\n            })\n            .catch(() => {\n                cb([]);\n            });\n    },\n\n    addTagFromTypeahead(event, suggestion /*, dataset*/) {\n        Ember.run(() => {\n            this.attrs.addTag(suggestion.value);\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n        });\n    },\n\n    clearInput() {\n        Ember.run(() => {\n            if (!this.get('tagValue')) {\n                this.$('input').val('');\n            }\n        });\n    },\n\n    keyDown(event) {\n        if (eventToString(event) === 'ENTER') {\n            this.attrs.addTag(this.get('tagValue'));\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n\n            let currentRequest = this.get('currentRequest');\n            if (currentRequest && currentRequest.abort) {\n                currentRequest.abort();\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"c9aPS9VM\",\"block\":\"{\\\"statements\\\":[[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-tag-add\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.add\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[1,[33,[\\\"input\\\"],null,[[\\\"class\\\",\\\"id\\\",\\\"value\\\",\\\"placeholder\\\"],[\\\"form-control tag-editor-input\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-tag-add\\\"],null],[28,[\\\"tagValue\\\"]],[33,[\\\"t\\\"],[\\\"common.add\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"add\\\"],[13],[0,\\\"+\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/tag-editor/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'span',\n    classNames: ['tag', 'tag-label', 'label-default'],\n    classNameBindings: ['flash'],\n\n    flash: false,\n\n    timers: [],\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this.flashTag);\n        this.timers.pushObject(timer);\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    flashTag() {\n        this.set('flash', true);\n\n        const timer = Ember.run.later(\n            this,\n            () => {\n                this.set('flash', false);\n            },\n            500\n        );\n        this.timers.pushObject(timer);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"K7sP69JX\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-tag\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-fields/tag-field/tag-editor\\\"],null,[[\\\"field\\\",\\\"addTag\\\"],[[28,[\\\"field\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addTag\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-fields/tag-field/tag-wrapper\\\"],null,null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                        ×\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"linkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.forTag\\\"],[[\\\"tag\\\"],[[28,[\\\"tag\\\"]]]]]]]],[15,\\\"class\\\",\\\"tag tag-label label-default clickable\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateToSearchTag\\\",[33,[\\\"query-params\\\"],null,[[\\\"query\\\",\\\"entity\\\",\\\"queryFacets\\\"],[\\\"\\\",\\\"people\\\",[33,[\\\"join-strings\\\"],[\\\":\\\",[28,[\\\"field\\\",\\\"fieldPath\\\"]],[28,[\\\"tag\\\"]]],null]]]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                                ×\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"search\\\",[33,[\\\"query-params\\\"],null,[[\\\"query\\\",\\\"entity\\\",\\\"queryFacets\\\"],[\\\"\\\",\\\"people\\\",[33,[\\\"join-strings\\\"],[\\\":\\\",[28,[\\\"field\\\",\\\"fieldPath\\\"]],[28,[\\\"tag\\\"]]],null]]]]],[[\\\"title\\\",\\\"classNames\\\"],[[33,[\\\"t\\\"],[\\\"search.forTag\\\"],[[\\\"tag\\\"],[[28,[\\\"tag\\\"]]]]],\\\"tag tag-label label-default clickable\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                                ×\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"tag tag-label label-default\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                            ×\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport textValidator from '../../entity-fields/validators/text';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, observer, computed, Component } = Ember;\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['text-field'],\n    classNameBindings: ['canEdit:editing', 'onProfile:on-profile'],\n\n    intl: inject.service(),\n    embedded: inject.service(),\n\n    attrs: {\n        onProfile: false\n    },\n\n    onProfile: false,\n    isGeneralField: false,\n\n    actions: {\n        saveField(event) {\n            const value = event.target.value;\n            if (this.get('onProfile') && this.get('canEdit')) {\n                if (event.type === 'keyup' && event.keyCode !== 13) {\n                    return;\n                }\n                this.saveField(value);\n\n                if (this.get('isGeneralField')) {\n                    // notifyUserGeneralFieldUpdated will trigger a userGeneralFieldUpdated event to Web-Directory if entity is current user.\n                    const embedded = this.get('embedded');\n                    embedded.notifyUserGeneralFieldUpdated(this.get('entity.id'));\n                }\n            } else if (this.get('canEdit')) {\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    showPlaceholder: computed.reads('onProfile'),\n\n    isValid: computed('entry.value', function () {\n        let fieldData = this.get('fieldData');\n\n        if (fieldData) {\n            return fieldData.get('isValid');\n        } else {\n            let entry = this.get('entry');\n            let field = this.get('field');\n            return textValidator.isValid(entry, field);\n        }\n    }),\n\n    watchValidityToDisableModal: observer('isValid', function () {\n        const disable = this.get('disableModal');\n        if (typeof disable === 'function') {\n            Ember.run.next(null, disable, !this.get('isValid'));\n        }\n    }),\n\n    isEmpty: computed('entry.value', function () {\n        return this.isFieldEmpty();\n    }),\n\n    placeholderText: computed('showPlaceholder', function () {\n        if (this.get('showPlaceholder')) {\n            return this.get('field.i18nLabel');\n        }\n\n        return '';\n    }),\n\n    setMinWidth: observer('canEdit', 'entry.value', function () {\n        // self sizing behavior...\n        if (this.get('onProfile') && this.get('canEdit') && _.isEmpty(this.get('entry.value'))) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                let span = Ember.$('<span class=\"off-page\"></span>');\n                let placeholder = this.get('placeholderText');\n                span.text(placeholder);\n                this.$().append(span);\n                this.$('input').css('min-width', span.width() + 15);\n                span.remove();\n            });\n        }\n    }).on('didInsertElement'),\n\n    ensurePopulatedWhenEditing: observer('editing', 'canEdit', function () {\n        Ember.run.once(this, this.ensurePopulatedField);\n    }).on('didInsertElement'),\n\n    ensurePopulatedField() {\n        if ((!this.get('editing') || this.isDestroyed) && !this.get('isGeneralField')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.once(this, this.setValues);\n        }\n    },\n\n    setWidth: on('didRender', function () {\n        if (this.get('onProfile') && this.get('canEdit')) {\n            let span = this.$('span');\n            this.$('input').width(span.width() + 5);\n        }\n    }),\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    },\n\n    isFieldEmpty() {\n        let entry = this.get('entry');\n\n        if (!entry) {\n            return true;\n        }\n\n        return _.isEmpty(entry.value);\n    },\n\n    getFieldError() {\n        const intl = this.get('intl');\n        let value = this.get('entry.value');\n        let maxLength = this.get('field.params.maxLength');\n        let fieldPath = this.get('field.fieldPath');\n        if (_.isEmpty(value) && _.includes(requiredFieldPaths, fieldPath)) {\n            return intl.lookup('tooltip.fields.text.requiredError').toString();\n        }\n\n        return intl.lookup('tooltip.fields.text.lengthError', { length: maxLength }).toString();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"20qjoxwv\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\",\\\"writeable\\\",\\\"canEdit\\\",\\\"for\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"canEdit\\\"]],[28,[\\\"canEdit\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"placeholderText\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-text-field-label\\\"],null]]]],[13],[1,[26,[\\\"placeholderText\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholderText\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[16,\\\"aria-describedby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-text-field-label\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.requiredField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"entry-value\\\"],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"off-page\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport email from './validators/email';\nimport tag from './validators/tag';\nimport history from './validators/history';\nimport text from './validators/text';\nimport location from './validators/location';\nimport date from './validators/date';\nimport phone from './validators/phone';\nimport boolean from './validators/boolean';\nimport address from './validators/address';\nimport select from './validators/select';\nimport multiline from './validators/multiline-text';\nimport person from './validators/person';\nimport weblink from './validators/weblink';\nimport image from './validators/image';\n\nconst { getOwner, computed } = Ember;\n\nexport default Ember.Object.extend({\n    fieldConfig: computed(function () {\n        return getOwner(this).lookup('field-config:person');\n    }),\n\n    default: {\n        isValid() {\n            return false;\n        },\n\n        isEmpty() {\n            return true;\n        }\n    },\n    tag,\n    text,\n    date,\n    email,\n    phone,\n    image,\n    person,\n    select,\n    history,\n    boolean,\n    address,\n    location,\n    weblink,\n    'multiline-text': multiline\n}).create();\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(entry, field) {\n        var maxLength = field.get('params.maxLength');\n        if (entry && _.isEmpty(entry.value)) {\n            return true;\n        }\n        return !!(entry && entry.value && Ember.get(entry, 'value.length') <= maxLength);\n    },\n\n    isEmpty(entry) {\n        let value = entry.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","export default {\n    isValid(bool) {\n        let value = bool.value;\n        return (value !== undefined && value !== null) || value === '';\n    },\n\n    isEmpty(bool) {\n        let value = bool.value;\n        return value === undefined || value === null || value === '';\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(date, field) {\n        if (field.get('required')) {\n            let value = date.value;\n            return !_.isEmpty(value) && value.day && value.month && value.year;\n        }\n\n        return true;\n    },\n\n    isEmpty(date) {\n        if (!date) {\n            return true;\n        }\n\n        let value = date.value;\n        return _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let value = Ember.get(entry, 'value');\n        let path = field.getFieldPath();\n\n        if (value) {\n            if (typeof value.year !== 'number') {\n                delete value.year;\n            }\n\n            if (typeof value.month !== 'number') {\n                delete value.month;\n            }\n\n            if (typeof value.day !== 'number') {\n                delete value.day;\n            }\n\n            if (!value.year && !value.month && !value.day) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            let data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidEmail(email) {\n    let reg =\n        /^(([^<>()\\[\\]\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\"]+)*)|(\".+\"))@(([^<>()[\\]\\.,;:\\s@\"]+\\.)+[^<>()[\\]\\.,;:\\s@\"]{2,})$/;\n    return email.match(reg);\n}\n\nfunction isEmpty(email) {\n    let value = email && email.value;\n    return !!(value === undefined || value === null || _.isEmpty(value));\n}\n\nexport default {\n    isEmpty,\n\n    isValid(entry, field) {\n        const isGroupField = field.get('section.fieldConfig.entityType') === 'group';\n        if (isEmpty(entry) && isGroupField) {\n            return true;\n        }\n        var maxLength = field.get('params.maxLength');\n\n        return !!(entry && entry.value && entry.value.length <= maxLength && !!isValidEmail(entry.value));\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\n\nexport default {\n    isValid(history) {\n        if (history && history.value) {\n            let startDate = history.value.startDate;\n            let endDate = history.value.endDate;\n\n            let haveStartDate = !!(startDate && startDate.month && startDate.year);\n            let haveEndDate = !!(endDate && endDate.month && endDate.year);\n\n            if (!haveStartDate && !haveEndDate) {\n                return true;\n            } else if (!haveStartDate && haveEndDate) {\n                return false;\n            } else if (haveStartDate && !haveEndDate) {\n                return true;\n            } else {\n                if (startDate.year < endDate.year) {\n                    return true;\n                } else if (startDate.year > endDate.year) {\n                    return false;\n                } else {\n                    return startDate.month <= endDate.month;\n                }\n            }\n        }\n\n        return history;\n    },\n\n    isEmpty(history) {\n        let value = history.value;\n        // only required field is `where`\n        var where = Ember.get(value, 'where');\n        return where === undefined || _.isEmpty(where.trim());\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let month, year, day;\n        let startDate = Ember.get(entry, 'value.startDate');\n        let endDate = Ember.get(entry, 'value.endDate');\n\n        if (moment.isMoment(startDate)) {\n            startDate = {\n                month: Ember.get(entry, 'value.startDate').format('M'),\n                year: Ember.get(entry, 'value.startDate').format('YYYY')\n            };\n        }\n\n        if (moment.isMoment(endDate)) {\n            endDate = {\n                month: Ember.get(entry, 'value.endDate').format('M'),\n                year: Ember.get(entry, 'value.endDate').format('YYYY')\n            };\n        }\n\n        if (startDate) {\n            day = parseInt(startDate.day);\n            month = parseInt(startDate.month);\n            year = parseInt(startDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete startDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete startDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete startDate.year;\n            }\n        } else if (startDate === undefined) {\n            startDate = {};\n        }\n\n        if (endDate) {\n            day = parseInt(endDate.day);\n            month = parseInt(endDate.month);\n            year = parseInt(endDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete endDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete endDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete endDate.year;\n            }\n        } else if (endDate === undefined) {\n            endDate = {};\n        }\n\n        if (entry.value) {\n            Ember.set(entry, 'value.startDate', startDate);\n            Ember.set(entry, 'value.endDate', endDate);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text !== undefined;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(location) {\n        if (!location) {\n            return false;\n        }\n\n        let value = location.value;\n        return !_.isEmpty(value.locationId);\n    },\n\n    isEmpty(location) {\n        if (!location) {\n            return true;\n        }\n\n        let value = location.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if (maxLength && text.value) {\n            return text.value.length <= maxLength;\n        }\n\n        if (field.get('required')) {\n            return !_.isEmpty(text);\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text;\n    },\n\n    isEmpty(person) {\n        if (!person) {\n            return true;\n        }\n        let value = person.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst requireFields = ['contactInfo.phone_other'];\n\nfunction isEmptyValue(value) {\n    return value === undefined || value === null || _.isEmpty(value.trim());\n}\n\nexport default {\n    isValid(entry, field, intl, $input) {\n        if (arguments.length !== 4 || !entry || !field || !$input || !intl) {\n            return true;\n        }\n\n        const path = field.getFieldPath();\n        const params = Ember.get(field, 'params');\n        const number = Ember.get(entry, 'value.number');\n        const extension = Ember.get(entry, 'value.extension');\n\n        const isRequired = _.includes(requireFields, path);\n        if (_.isEmpty(number) && _.isEmpty(extension)) {\n            return !isRequired;\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return true;\n        }\n\n        let isValid = number.length <= params.numberMaxLength;\n\n        if (extension && extension.length) {\n            isValid = isValid && extension.length <= params.extensionMaxLength && !!number;\n        }\n\n        return isValid;\n    },\n\n    isEmpty(phone) {\n        if (!phone || !phone.value) {\n            return true;\n        }\n\n        let value = phone.value;\n        let number = Ember.get(value, 'number');\n        let extension = Ember.get(value, 'extension');\n        return isEmptyValue(number) && isEmptyValue(extension);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (value) {\n            if (_.isEmpty(value.number)) {\n                delete value.number;\n            }\n\n            if (_.isEmpty(value.extension)) {\n                delete value.extension;\n            }\n\n            if (!value.number && !value.extension) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(select) {\n        if (!select) {\n            return false;\n        }\n\n        return !!(select && select.value);\n    },\n\n    isEmpty(select) {\n        let value = select.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        if (!entry) {\n            return;\n        }\n\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid() {\n        return true;\n    },\n\n    isEmpty(tags) {\n        let value = tags.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nfunction isEmpty(text) {\n    if (typeof text === 'string') {\n        return _.isEmpty(text);\n    } else {\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n}\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if ((maxLength && text.value && text.value.length > maxLength) || (!text.value && text.length > maxLength)) {\n            return false;\n        }\n\n        if ((field.get('required') || _.includes(requiredFieldPaths, field.getFieldPath())) && isEmpty(text)) {\n            return false;\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        return isEmpty(text);\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidUrl(url) {\n    var reg =\n        /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/;\n    return reg.test(url);\n}\n\nexport default {\n    isValid(url) {\n        if (url && Object.prototype.hasOwnProperty.call(url, 'value')) {\n            url = url.value;\n        }\n\n        return _.isEmpty(url) || isValidUrl(url);\n    },\n\n    isEmpty(url) {\n        let value = url.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nimport validator from '../validators/weblink';\n\nconst { inject, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['web-link'],\n\n    intl: inject.service(),\n\n    tooltip: null,\n\n    labelChoices: Ember.computed(function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(\n            this.get('field.labelKeys'),\n            function (labelKey) {\n                return {\n                    id: labelKey,\n                    label: this._s(`${baseKey}_labelKey_${labelKey}`)\n                };\n            },\n            this\n        );\n    }),\n\n    customLabel: Ember.computed(function () {\n        return '<i class=\"ion-link\"></i>';\n    }),\n\n    isValid: Ember.computed('entry.value', function () {\n        let entry = this.get('entry');\n        return entry && this.isValidUrl(entry);\n    }),\n\n    validityChanged: observer('isValid', 'isEmpty', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupTooltips');\n    }).on('didInsertElement'),\n\n    isValidUrl(url) {\n        return validator.isValid(url);\n    },\n\n    isFieldEmpty() {\n        return _.isEmpty(this.get('entry.value'));\n    },\n\n    setupTooltips() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        let input = this.$('input');\n        if (this.get('isValid') && !this.get('isEmpty')) {\n            input.tooltip('destroy');\n            this.set('tooltip', null);\n        } else {\n            if (this.get('tooltip')) {\n                return;\n            }\n\n            let title = this.get('intl').lookup('tooltip.fields.weblink.error');\n            let tooltip = input\n                .attr('title', title)\n                .tooltip({\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('fixTitle')\n                .tooltip('show');\n            this.set('tooltip', tooltip);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"hik8w8PJ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-link\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.webLink.name\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-link\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"url\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/weblink-field/template.hbs\"}});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { not, or, reads } from '@ember/object/computed';\nimport { bind, cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport $ from 'jquery';\nimport Popper from 'popper.js';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.get('applicationUrlPrefix') + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-mini-card-container'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndChatEnabled:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials'\n    ],\n\n    feature: service(),\n    permissions: service(),\n    presenceSubscription: service(),\n    session: service(),\n    application: service(),\n\n    entity: null,\n    user: null,\n    size: 200,\n    self: null,\n    hoverParent: null,\n    type: 'profile',\n    applicationUrlPrefix: '',\n    showFavorite: true,\n    isPlaceholderImage: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    microCard: false,\n    showMiniCard: false,\n    showQueueToggle: false,\n    showPresenceDropdown: false,\n    showLogOffButton: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    imageLoadError: false,\n    isHoveringCard: false,\n    isHoveringImage: false,\n    hoverTimer: null,\n    isFirstHover: true,\n    canViewChat: true,\n    canViewVideo: true,\n\n    // Extensions for third-party UCC affordances\n    useMediaProviders: false,\n    haveMediaProviders: false,\n    mediaProviderComponent: null,\n    useIntegrationBadges: false,\n    integrationBadgesComponent: null,\n\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            attachment: 'together',\n            pin: ['left', 'right']\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    toggleFavorite() {},\n    callEntity() {},\n\n    actions: {\n        triggerShowMiniCard() {\n            once(this, this._displayHoverCard);\n            return false;\n        },\n        mouseEnterCard() {\n            this.set('isHoveringCard', true);\n            this.onHoverChanged();\n        },\n        mouseLeaveCard() {\n            this.set('isHoveringCard', false);\n            this.onHoverChanged();\n        },\n        onContact() {\n            run.next(() => this.set('showMiniCard', false));\n        },\n        navigateTo() {\n            this.get('application').navigateTo(this.get('entity.type'), this.get('entity.id'));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._attachListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeListeners();\n    },\n\n    isHovering: or('isHoveringCard', 'isHoveringImage'),\n    isOnline: not('entity.isOffline'),\n\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    tetherSelector: computed('elementId', function () {\n        return `#${this.get('elementId')}`;\n    }),\n\n    tetherElementId: computed('elementId', function () {\n        return `entity-mini-card-${this.get('elementId')}`;\n    }),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-mini-card`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    cardImageUrl: computed(\n        'entity',\n        'entity.isLoaded',\n        'entity.profilePicture',\n        'entity.profilePictureSizes',\n        function () {\n            if (this.get('type') === 'profile') {\n                return this.getProfilePicture(75);\n            } else {\n                return '';\n            }\n        }\n    ),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.get('initialsPlaceholderSupported') && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('showPresence') && this.get('entity.type') === 'person';\n    }),\n\n    entityIsGroup: computed('entity.type', function () {\n        return this.get('entity.type') === 'group';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    isSelfEntity: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', true);\n        return this.placeholderImage(this.get('entity'));\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('size');\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    mouseEnter() {\n        this.set('isHoveringImage', true);\n        this.onHoverChanged();\n    },\n\n    mouseLeave() {\n        this.set('isHoveringImage', false);\n        this.onHoverChanged();\n    },\n\n    _createPopper() {\n        const el = this.element;\n        if (!el) {\n            return;\n        }\n\n        const targetEl = el.querySelector('.mini-card-component-wrapper');\n        const cardEl = el.querySelector('.entity-mini-card');\n\n        this._popper = new Popper(targetEl, cardEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                offset: {\n                    offset: '40%p,10px'\n                },\n                arrow: {\n                    element: '.arrow'\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _displayHoverCard() {\n        if (!this.get('showMiniCard') && this.get('_state') === 'inDOM' && this.get('enableMiniCard')) {\n            this.set('showMiniCard', true);\n            scheduleOnce('afterRender', this, function () {\n                this._createPopper();\n\n                const image = new Image();\n                image.src = this.get('cardImageUrl');\n                image.onload = () => {\n                    this.set('imageLoadError', false);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n                image.onerror = () => {\n                    this.set('imageLoadError', true);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n            });\n        }\n    },\n\n    onHoverChanged() {\n        const hoverTimeout = 800;\n        const isHovering = this.get('isHovering');\n        let timer = this.get('hoverTimer');\n\n        cancel(timer);\n\n        if (isHovering) {\n            if (!this.get('enableMiniCard')) {\n                return;\n            }\n\n            timer = later(() => {\n                this._displayHoverCard();\n            }, hoverTimeout);\n        } else {\n            timer = later(() => {\n                if (!this.get('isHovering') && this.get('_state') === 'inDOM') {\n                    scheduleOnce('afterRender', this, () => {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                    });\n                }\n            }, hoverTimeout);\n        }\n\n        this.set('hoverTimer', timer);\n    },\n\n    _attachListeners() {\n        let id = this.get('uniqueId');\n\n        $(window).on(\n            'click.' + id,\n            bind(this, function (event) {\n                if (!event) {\n                    return;\n                }\n                let target = $(event.target);\n\n                let clickedHoverCard = target.parents('#' + id).length || target.parents('.entity-mini-card').length;\n                let checkHoverState = !clickedHoverCard;\n\n                if (checkHoverState) {\n                    if (this.get('showMiniCard')) {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                        event.preventDefault();\n                    }\n                }\n            })\n        );\n    },\n\n    _removeListeners() {\n        const id = this.get('elementId');\n        const uniqueId = this.get('uniqueId');\n        this.$().off(`.${id}`);\n        $(window).off(`.${uniqueId}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Bw0eX6lh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"mini-card-component-wrapper\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerShowMiniCard\\\"]],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"enableMiniCard\\\"]],[28,[\\\"showMiniCard\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entity-mini-card visible\\\\n        \\\",[26,[\\\"tetherElementId\\\"]],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"microCard\\\"]],\\\"micro-card\\\"],null],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"imageLoadError\\\"]],\\\"image-load-error\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseEnterCard\\\"],[[\\\"on\\\"],[\\\"mouseEnter\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseLeaveCard\\\"],[[\\\"on\\\"],[\\\"mouseLeave\\\"]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"arrow\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"left-bar chat-presence \\\",[26,[\\\"chatPresenceClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"useIntegrationBadges\\\"]],[28,[\\\"integrationBadgesComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"integrationBadgesComponent\\\"]]],[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"image-link\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"useIntegrationBadges\\\"]],[28,[\\\"integrationBadgesComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"integrationBadgesComponent\\\"]]],[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"entityIsGroup\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"wrap\\\",\\\"showStatus\\\",\\\"isChatEnabled\\\"],[[28,[\\\"entity\\\"]],true,false,[28,[\\\"isChatEnabled\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"isGeolocationEnabled\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"isGeolocationEnabled\\\"]],\\\"entity-geolocation align-center\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-selector-dropdown\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-bar\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"name-header\\\"],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasChatStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"presence-label-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-quote-left blockquote-start\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showQueueToggle\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]],[28,[\\\"isOnline\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"queue-toggle-switch\\\"],null,[[\\\"dataOn\\\",\\\"dataOff\\\",\\\"entity\\\",\\\"continueOnQueue\\\"],[\\\"toggle.onQueue\\\",\\\"toggle.offQueue\\\",[28,[\\\"entity\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showLogOffButton\\\"]],[28,[\\\"permissions\\\",\\\"canLogOffAgents\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"logoff-link\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isSelfEntity\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"linkProfile\\\",\\\"showFavorite\\\",\\\"compact\\\",\\\"showImages\\\",\\\"phoneServiceEnabled\\\",\\\"phoneAvailable\\\",\\\"isOneToOneOfflineOrBusy\\\",\\\"isChatEnabled\\\",\\\"isWebrtcEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"videoTooltipTitle\\\",\\\"onContact\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"useMediaProviders\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entityDeleted\\\"]]],null],[28,[\\\"showFavorite\\\"]],true,false,[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isOneToOneOfflineOrBusy\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onContact\\\"],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"useMediaProviders\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"user\\\"]],[28,[\\\"useMediaProviders\\\"]],[28,[\\\"mediaProviderComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"mediaProviderComponent\\\"]]],[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-hover-card-v2/template.hbs\"}});","define(\"connections-ui/components/entity-hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport { and, reads } from '@ember/object/computed';\nimport { cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport $ from 'jquery';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.get('applicationUrlPrefix') + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-image'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndChatEnabled:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials',\n        'entityIsContact:external-contact'\n    ],\n\n    presenceSubscription: service(),\n\n    // parameters used by entity image\n    entity: null,\n    size: 200,\n    type: 'profile',\n    isLinkable: false,\n    applicationUrlPrefix: '',\n    subscribeToPresence: false,\n    showStatusQuote: false,\n    imageLoadError: false,\n    isPlaceholderImage: true,\n    showPresence: false,\n    canViewChat: true,\n    canViewVideo: true,\n    // parameters passed through to entity hover card\n    self: null,\n    showFavorite: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    isVideoButtonEnabled: false,\n    // entity image logic\n\n    init() {\n        this._super(...arguments);\n        once(this, this._managePresenceSubscription);\n    },\n\n    callEntity() {},\n    toggleFavorite() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.on('load', () => {\n                const func = this.get('componentUpdated');\n                if (func && typeof func === 'function') {\n                    run(() => this.get('componentUpdated')());\n                }\n            });\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removePresenceSubscription();\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.off();\n        }\n\n        if (this.get('_animationRun')) {\n            cancel(this.get('_animationRun'));\n        }\n    },\n\n    managePresenceSubscription: observer(\n        'isChatEnabled',\n        'entity.type',\n        'entity.jid',\n        'subscribeToPresence',\n        function () {\n            once(this, this._managePresenceSubscription);\n        }\n    ),\n\n    displayStatusQuote: and('showPresenceAndChatEnabled', 'showStatusQuote', 'entity.hasChatStatus'),\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-image`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    imageUrl: computed('entity', 'entity.isLoaded', 'entity.profilePicture', 'entity.profilePictureSizes', function () {\n        if (this.get('type') === 'profile') {\n            return this.getProfilePicture();\n        } else {\n            return '';\n        }\n    }),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.get('initialsPlaceholderSupported') && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    _animationRun: null,\n    _currentPresence: null,\n    isStatusAnimating: false,\n    animateOnPresenceChange: observer('chatPresence', function () {\n        const nextPresence = this.get('chatPresence');\n        const prevPresence = this.get('_currentPresence');\n        this.set('_currentPresence', nextPresence);\n        if (nextPresence !== prevPresence) {\n            this.set('isStatusAnimating', true);\n            const animationPeriod = 1250;\n            if (this.get('_animationRun')) {\n                cancel(this.get('_animationRun'));\n            }\n            this.set(\n                '_animationRun',\n                later(() => {\n                    if (!this.isDestroying && !this.isDestroyed) {\n                        this.set('isStatusAnimating', false);\n                        this.set('_animationRun', null);\n                    }\n                }, animationPeriod)\n            );\n        }\n    }),\n\n    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('showPresence') && this.get('entity.type') === 'person';\n    }),\n\n    entityIsContact: computed('entity.type', function () {\n        return this.get('entity.type') === 'externalContact';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.modifyPlaceholderImage, false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.modifyPlaceholderImage, true);\n        return this.placeholderImage(this.get('entity'));\n    },\n\n    modifyPlaceholderImage(value) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n        this.set('isPlaceholderImage', value);\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('size');\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    _removePresenceSubscription() {\n        if (this.get('subscribeToPresence')) {\n            this.get('presenceSubscription').autoSubscribe(null, this);\n        }\n    },\n\n    _managePresenceSubscription() {\n        if (this.get('subscribeToPresence') && this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"N/zSf8dm\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"hoverParent\\\",\\\"showFavorite\\\",\\\"isChatEnabled\\\",\\\"phoneAvailable\\\",\\\"isWebrtcEnabled\\\",\\\"enableMiniCard\\\",\\\"isOneToOneOffline\\\",\\\"videoTooltipTitle\\\",\\\"phoneServiceEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"applicationUrlPrefix\\\",\\\"showPresenceDropdown\\\",\\\"showLogOffButton\\\",\\\"showQueueToggle\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"elementId\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"enableMiniCard\\\"]],[28,[\\\"isOneToOneOffline\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"applicationUrlPrefix\\\"]],[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"showLogOffButton\\\"]],[28,[\\\"showQueueToggle\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayStatusQuote\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc-moon pc-quote-right status-quote \\\",[26,[\\\"chatPresence\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isLinkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"enableMiniCard\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"external-contact-icon\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"top\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"center\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"bottom\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"isStatusAnimating\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-status\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-radiate chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-pulse chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-image-v2/template.hbs\"}});","define(\"connections-ui/components/entity-image/component\", [\"exports\", \"ember-purecloud-components/components/entity-image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-location/component\", [\"exports\", \"ember-purecloud-components/components/entity-location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini'],\n    classNameBindings: ['entityTypeClass', 'isClickable:clickable'],\n\n    intl: Ember.inject.service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    // fallback to `showPresence` when this is undefined\n    subscribeToPresence: undefined,\n\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    actions: {\n        sendToProfile: function () {\n            let person = this.get('entity');\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [person]\n            });\n        }\n    },\n\n    phoneTooltip: Ember.computed(function () {\n        return this.get('intl').lookup('tooltip.contactIcon.phone');\n    }),\n\n    entityTypeClass: Ember.computed('entity.type', function () {\n        if (!this.get('entity.type')) {\n            return 'empty-type';\n        }\n\n        return Ember.String.dasherize(this.get('entity.type'));\n    }),\n\n    entityIsPerson: Ember.computed.equal('entity.type', 'person'),\n\n    entityIsQueue: Ember.computed.equal('entity.type', 'queue'),\n\n    entityIsMe: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityIsGroup: Ember.computed.equal('entity.type', 'group'),\n\n    entityIsContact: Ember.computed.equal('entity.type', 'externalContact'),\n\n    canContactEntity: Ember.computed('entityIsGroup', 'entityIsPerson', 'entityIsContact', function () {\n        return this.get('entityIsPerson') || this.get('entityIsGroup') || this.get('entityIsContact');\n    }),\n\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    useInitials: Ember.computed.reads('entityIsContact'),\n\n    showOrganization: Ember.computed('entityIsContact', function () {\n        return this.get('entityIsContact') && !!this.get('entity.organization');\n    }),\n\n    entityRoutePath: Ember.computed('entity.type', function () {\n        let type = this.get('entity.type');\n        if (type === 'floor') {\n            type = 'location';\n        }\n\n        return `${type}.detail`;\n    }),\n\n    isClickable: Ember.computed('entity._entity', 'entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'floor' || type === 'location' || type === 'externalContact') {\n            return false;\n        }\n        const entity = this.get('entity._entity');\n        return entity !== 'locations' && this.get('clickToProfile');\n    }),\n\n    _subscribePresence: Ember.computed('showPresence', 'subscribeToPresence', function () {\n        const subscribe = this.get('subscribeToPresence');\n        if (subscribe === undefined) {\n            return this.get('showPresence');\n        }\n\n        return subscribe;\n    }),\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    click: function (event) {\n        if (!this.get('isClickable')) {\n            return;\n        }\n        const target = Ember.$(event.target);\n        if (target.is('a') || target.is('i') || target.parents().is('.entity-contact')) {\n            // Defer to link-to or primary contact icon action\n            //event.stopPropagation();\n            //event.preventDefault();\n            return;\n        }\n\n        if (this.get('isSearchResult')) {\n            // When this is a search result, only allow the link-to elements for transitioning due to the extra realestate.\n            return false;\n        }\n\n        if (!target.is('a')) {\n            this.send('sendToProfile');\n        }\n    },\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            if (!this.get('entity')) return;\n\n            return {\n                wrap: false,\n                showStatus: true,\n                showActivity: true,\n                eActivityPresenceClass: Ember.get(this.entity, 'activityPresenceClass'),\n                totalCalls: Ember.get(this.entity, 'activityValues.calls'),\n                totalChats: Ember.get(this.entity, 'activityValues.chats'),\n                totalEmails: Ember.get(this.entity, 'activityValues.emails'),\n                totalMessages: Ember.get(this, 'totalMessages'),\n                totalSocialExpression: Ember.get(this, 'totalSocialExpression'),\n                presenceLabel: Ember.get(this.entity, 'presenceLabel'),\n                eChatStatus: Ember.get(this.entity, 'chatStatus'),\n                isShowingActivitySummary: Ember.get(this.entity, 'showConversationSummaryIndicator')\n            };\n        }\n    )\n});\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport ViewportMixin from '../../../mixins/viewport';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend(ViewportMixin, {\n    classNameBindings: ['enteredViewport:in-viewport:outside-viewport', 'hasRequiredPermission::no-permission'],\n\n    session: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n    requiredPermission: null,\n\n    hasRequiredPermission: Ember.computed(\n        'requiredPermission.[]',\n        'entity.extends.authorization.permissions',\n        function () {\n            const requiredPermission = this.get('requiredPermission') || [];\n            const perms = this.get('entity.expands.authorization.permissions') || [];\n            if (requiredPermission.length && perms.length) {\n                const agentHasOnQueue = perms.includes(`routing:agent:onqueue`);\n                const agentHasRequiredPermission = !!requiredPermission.find(permission => {\n                    return perms.includes(permission);\n                });\n                return agentHasRequiredPermission || !agentHasOnQueue;\n            }\n            return true;\n        }\n    ),\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!isTesting) {\n            run.join(this, this._subscribeToPresence);\n        }\n    },\n\n    didEnterViewport() {\n        run(() => run.once(this, this._subscribeToPresence));\n        this._super(...arguments);\n    },\n\n    didExitViewport() {\n        // A run loop is needed here because the mixin invokes this\n        // function using request animation frame as opposed to Ember\n        // backburner.\n        run(() => run.once(this, this._unsubscribeFromPresence));\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._unsubscribeFromPresence();\n        this._super(...arguments);\n    },\n\n    _subscribeToPresence() {\n        if (this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    },\n\n    _unsubscribeFromPresence() {\n        this.get('presenceSubscription').autoSubscribe(null, this);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"gyhZ7ZGJ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"showFavorite\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"isSearchResult\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],[28,[\\\"isSearchResult\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"chat\\\",\\\"enabled\\\"]],[28,[\\\"showFavorite\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/default/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-details'],\n\n    // Child of entity-mini display only all attributes are inherited\n    entityIsPerson: false,\n    entityIsContact: false,\n    entityIsMe: false,\n    showDepartment: true,\n    showOrganization: false,\n    showPresence: false,\n    isPresenceLabelToggleEnabled: false,\n    subscribeToPresence: false,\n    canContactEntity: false,\n    useInitials: false,\n    isClickable: false,\n    entity: null,\n    entityLocationData: null,\n    presenceLabelData: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"cu2qwlzH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]],\\\"external-contact-image\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isClickable\\\"]],\\\"not-clickable\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"useInitialsPlaceholder\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"_subscribePresence\\\"]],[28,[\\\"useInitials\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"information \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"is-me\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"showActions\\\"]],\\\"actions-hide\\\"],null]]]],[16,\\\"tabindex\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]],\\\"-1\\\",\\\"0\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[18,\\\"default\\\",[\\\"details\\\"]],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showDepartment\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"organization\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"description\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"description\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"group-type \\\",[28,[\\\"entity\\\",\\\"groupType\\\"]]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"groupType\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasGeolocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"geolocation-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-geolocation\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"item\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/entity-details/template.hbs\"}});","import Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport default Ember.Component.extend(RelateFeaturesMixin, {\n    classNames: ['external-contact'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    externalContact: null,\n    showPhones: true,\n    showEmails: false,\n    showAcceptsSMS: true,\n    acdOutboundWhatsApp: true,\n\n    _getEmailTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return /.*Email$/.test(modelKey);\n        });\n    },\n\n    _getPhoneTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return this.get('acdOutboundWhatsApp') ? /.*Phone$|whatsAppId/.test(modelKey) : /.*Phone$/.test(modelKey);\n        });\n    },\n\n    dropdownTitle: Ember.computed('phones', function () {\n        return this.get('intl').t('purecloud.acdInteraction.relate.titles.selectPhone');\n    }),\n\n    externalContactHasNoEmailAddresses: Ember.computed.not('externalContact.hasEmailAddresses'),\n\n    phones: Ember.computed(function () {\n        if (!this.get('showPhones')) {\n            return [];\n        }\n        return this._getPhoneTypes().reduce((phones, phoneType) => {\n            if (this.get(`externalContact.${phoneType}.display`)) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const phoneTypeTranslated = this.get('intl').t(\n                    `purecloud.acdInteraction.relate.phoneTypes.${phoneType}`\n                );\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.display`),\n                    e164: this.get(`externalContact.${phoneType}.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.acceptsSMS`),\n                    canUseNonE164\n                });\n            } else if (\n                this.get('acdOutboundWhatsApp') &&\n                this.get(`externalContact.${phoneType}.phoneNumber.display`)\n            ) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const typeName = phoneType.replace(/Id/, '').toLowerCase();\n                const phoneTypeTranslated = this.get('intl').t(\n                    `purecloud.acdInteraction.relate.channelTypes.${typeName}`\n                );\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.phoneNumber.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.phoneNumber.display`),\n                    e164: this.get(`externalContact.${phoneType}.phoneNumber.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.phoneNumber.acceptsSMS`),\n                    canUseNonE164\n                });\n            }\n            return phones;\n        }, []);\n    }),\n\n    externalContactHasNoPhoneNumbers: Ember.computed.empty('phones'),\n\n    emails: Ember.computed(function () {\n        if (!this.get('showEmails')) {\n            return [];\n        }\n        return this._getEmailTypes().reduce((email, emailType) => {\n            if (this.get(`externalContact.${emailType}`)) {\n                return email.concat({\n                    type: this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`),\n                    address: this.get(`externalContact.${emailType}`)\n                });\n            }\n            return email;\n        }, []);\n    }),\n\n    hasMultipleEmails: Ember.computed.gt('emails.length', 1),\n\n    hasMultiplePhoneRecords: Ember.computed.gt('phones.length', 1),\n\n    actions: {\n        selectEntityWithEmail(email, emailType, event) {\n            this.set('externalContact.email', email);\n            this.set('externalContact.emailType', emailType);\n            if (typeof this.get('onSelectEmail') === 'function') {\n                this.get('onSelectEmail')(email, emailType, event);\n            }\n        },\n\n        selectEntityWithPhone(phoneNumber, phoneType, event) {\n            this.set('externalContact.phoneNumber', phoneNumber);\n            this.set('externalContact.phoneType', phoneType);\n            if (typeof this.get('onSelectPhone') === 'function') {\n                this.get('onSelectPhone')(phoneNumber, phoneType, event);\n            }\n        },\n\n        onPreventClick(event) {\n            event.stopPropagation();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Ao/YabLy\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-mini external-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profileImage\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"defaultWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"initials\\\"],[13],[1,[28,[\\\"externalContact\\\",\\\"initials\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information contactWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"onPreventClick\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"viewDetails\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[[28,[\\\"contactRoute\\\"]],[28,[\\\"externalContact\\\"]]],[[\\\"bubbles\\\"],[[28,[\\\"preventExternalContactDefault\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.viewExternalContactDetails\\\"],null],null],[15,\\\"class\\\",\\\"fa fa-arrow-up\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canShowCustomFields\\\"]],[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"schema-title\\\"],[13],[1,[33,[\\\"await\\\"],[[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"externalContact\\\",\\\"externalOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.relateExternalContactDetails.atOrg\\\"],null],false],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"externalContact\\\",\\\"externalOrganization\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information phones phonesWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phones\\\"]],[28,[\\\"showPhones\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"externalContactHasNoPhoneNumbers\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phonesExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"canUseNonE164\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithPhone\\\",[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"number\\\"]]],null],[28,[\\\"phone\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phone\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number-container\\\"],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phone\\\",\\\"acceptsSMS\\\"]],[28,[\\\"showAcceptsSMS\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"keepInWindow\\\",\\\"setPin\\\",\\\"side\\\",\\\"target\\\"],[true,true,\\\"top\\\",[33,[\\\"concat\\\"],[\\\"#list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.acceptsSMS\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon-container\\\"],[13],[0,\\\"\\\\n                                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[\\\"list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]]],[15,\\\"class\\\",\\\"svg-icon accept-sms\\\"],[15,\\\"icon-name\\\",\\\"device-cellphone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"div\\\",[]],[13],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"phone\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showPhones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information emails emailsWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emailsExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithEmail\\\",[28,[\\\"email\\\",\\\"address\\\"]],[28,[\\\"email\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emailType\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"type\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"email ellipsis\\\"],[16,\\\"tooltip\\\",[34,[[28,[\\\"email\\\",\\\"address\\\"]]]]],[15,\\\"tooltip-popup-delay\\\",\\\"500\\\"],[15,\\\"tooltip-placement\\\",\\\"bottom\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noEmails\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.emailNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/external-contact/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini-queue'],\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    queueService: Ember.inject.service('queue'),\n    permissions: Ember.inject.service(),\n\n    makingCall: false,\n    isDetailsLoaded: false,\n    isDetailsLoading: false,\n\n    queue: null,\n    clickToProfile: false,\n    showActions: false,\n\n    canViewQueueDetails: Ember.computed.bool('permissions.canViewQueueObservations'),\n\n    actions: {\n        getQueueData: function () {\n            const id = this.get('queue.id');\n\n            // Ultimately, UX wants to show the following:\n            //   - Active agents\n            //   - Waiting customers by media type\n            //   - Longest wait time (AR-1102)\n            //   - Queue description  (CW-724 is the closest JIRA that mentions this, https://projects.invisionapp.com/share/545F0JYVS#/screens/124326256)\n\n            if (id) {\n                this.set('isDetailsLoading', true);\n                let promises = {\n                    waitTimePromise: this.get('queueService').getQueueEstimatedWaitTime(id, this.get('interactionType'))\n                };\n\n                Ember.RSVP.hash(promises)\n                    .then(hash => {\n                        const joinedData = hash.joinedPromise;\n                        const waitTimeResults = hash.waitTimePromise.results;\n                        const getMetricCount = function (array, metricName) {\n                            const metricData = _.find(array, { metric: metricName });\n                            return metricData.stats.count;\n                        };\n\n                        const getOnQueueCounts = function (array, routingStatus) {\n                            const getRoutingStatusCount = function (datum, routingStatus) {\n                                if (routingStatus) {\n                                    return datum.metric === 'oOnQueueUsers' && datum.qualifier === routingStatus;\n                                }\n                                return datum.metric === 'oOnQueueUsers';\n                            };\n                            return _.chain(array)\n                                .filter(_.partial(getRoutingStatusCount, _, routingStatus))\n                                .map(_.property('stats.count'))\n                                .filter(value => typeof value === 'number')\n                                .sum()\n                                .value();\n                        };\n\n                        const getWaitTime = function (array) {\n                            const bestTime = _.find(array, { formula: 'BEST' });\n                            if (bestTime) {\n                                return bestTime.estimatedWaitTimeSeconds;\n                            }\n                        };\n\n                        const joined = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === undefined;\n                        });\n                        const callData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'voice';\n                        });\n\n                        const callbackData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'callback';\n                        });\n\n                        const chatData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'chat';\n                        });\n\n                        const emailData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'email';\n                        });\n\n                        const messageData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'message';\n                        });\n\n                        let onQueueCount = 0;\n                        let idleCount = 0;\n                        if (joined) {\n                            onQueueCount = getOnQueueCounts(joined.data);\n                            idleCount = getOnQueueCounts(joined.data, 'IDLE');\n                        }\n\n                        let callWaiting;\n                        if (callData) {\n                            callWaiting = getMetricCount(callData.data, 'oWaiting');\n                        }\n\n                        let callbackWaiting;\n                        if (callbackData) {\n                            callbackWaiting = getMetricCount(callbackData.data, 'oWaiting');\n                        }\n\n                        let chatWaiting;\n                        if (chatData) {\n                            chatWaiting = getMetricCount(chatData.data, 'oWaiting');\n                        }\n\n                        let emailWaiting;\n                        if (emailData) {\n                            emailWaiting = getMetricCount(emailData.data, 'oWaiting');\n                        }\n\n                        let messageWaiting;\n                        if (messageData) {\n                            messageWaiting = getMetricCount(messageData.data, 'oWaiting');\n                        }\n\n                        let queueData = {\n                            agentData: `${idleCount}/${onQueueCount}`,\n                            callCount: callWaiting,\n                            callbackCount: callbackWaiting,\n                            chatCount: chatWaiting,\n                            emailCount: emailWaiting,\n                            messageCount: messageWaiting\n                        };\n\n                        let waitStr;\n                        const bestWaitTime = getWaitTime(waitTimeResults);\n                        if (bestWaitTime !== undefined) {\n                            // show estimated wait time\n                            const wait = moment.duration(bestWaitTime * 1000); // convert from sec to ms\n\n                            const intl = this.get('intl');\n                            let hr = wait.hours(),\n                                min = wait.minutes(),\n                                sec = wait.seconds();\n                            if (hr) {\n                                // use hours, minutes, & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.hoursMinutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString(),\n                                    hours: hr.toString()\n                                });\n                            } else if (min) {\n                                // use minutes & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.minutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString()\n                                });\n                            } else {\n                                // use seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.seconds', { seconds: sec.toString() });\n                            }\n                            queueData.waitTime = waitStr;\n                        }\n\n                        this.set('queue.queueDetails', queueData);\n                        this.set('isDetailsLoaded', true);\n                    })\n                    .finally(() => this.set('isDetailsLoading', false));\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"9e9+NV5j\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"isSearchResult\\\"],[[28,[\\\"queue\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],false,false,false,false]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"details\\\"],null],[28,[\\\"canViewQueueDetails\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin loading-icon\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoaded\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.agents\\\"],[[\\\"ratio\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"agentData\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.waitingCount\\\"],null],false],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callbackCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone-outbound\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"chatCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"roster-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"emailCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"messageCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"sms-message-icon\\\"],null,[[\\\"subMessageType\\\"],[\\\"sms\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.estimatedWait\\\"],[[\\\"wait\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"get-queue-data\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"getQueueData\\\",[28,[\\\"entity\\\"]]],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.view\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact-queue\\\"],null,[[\\\"queue\\\"],[[28,[\\\"queue\\\"]]]]],false],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/queue/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"s3GYSE14\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"entityRoutePath\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showActions\\\"]],[28,[\\\"canContactEntity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"actions \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\",[\\\"actions\\\"]],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport const imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        profileInstructionText: 'images.profile',\n        informal: 'images.informal',\n        activeProfilePictureSection: 'images'\n    },\n\n    group: {\n        profile: 'images.profilePictures',\n        profileInstructionText: 'images.activeProfilePicture',\n        informal: 'images.gallery',\n        activeProfilePictureSection: 'images'\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['entity-picture-content'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    embedded: Ember.inject.service(),\n\n    attrs: {\n        open() {},\n        close() {},\n\n        entity: null,\n        askToDelete: false\n    },\n\n    type: 'profile', // or 'informal'\n\n    askToDelete: false,\n    showUploadModal: false,\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        },\n\n        uploadPicture() {\n            this.attrs.close();\n\n            this.set('showUploadModal', true);\n        },\n\n        confirmUpload() {\n            let type = this.get('type');\n            let entity = this.get('entity');\n\n            entity.notifyPropertyChange('uploadedProfilePictures');\n            entity.notifyPropertyChange('uploadedInformalPhotos');\n\n            const pictures = entity.get('uploadedProfilePictures');\n            const picture = pictures[pictures.length - 1];\n            if (!picture) {\n                return;\n            }\n\n            if (type === 'profile') {\n                this.send('selectUploadedImage', type, picture, false);\n            }\n\n            this.send('cancelUploadModal');\n        },\n\n        selectUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityJid = entity.get('jid');\n            const tag = 'profile-success';\n            const edit = this.get('canEditProfilePicture');\n            let section = entity.get('fieldConfig.images');\n\n            if (!edit || active) {\n                return;\n            }\n\n            type = type || this.get('type');\n\n            if (entity.type === 'person') {\n                // When adding and remove images using the public API it updates the group.\n                // Each time it updates the group its version number increases, we go out and get the group\n                // to make sure we have the latest version.  Once venue is release we will not\n                // need to do this since it doesn't require a version like directory did.\n                entity\n                    .reload()\n                    .then(user => {\n                        section['version'] = user.version;\n                        if (type === 'profile') {\n                            entity.setProfilePicture(image);\n                            section = entity.get('fieldConfig.images');\n                        }\n                        return section;\n                    })\n                    .then(updatedSection => {\n                        entity.saveSection(updatedSection);\n                    })\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = _.head(errors);\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            } else {\n                if (type === 'profile') {\n                    entity.setProfilePicture(image);\n                }\n                return entity\n                    .saveSection(section)\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = errors.firstObject;\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            }\n        },\n\n        deleteUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityType = entity.get('type');\n\n            let promise = Ember.RSVP.resolve();\n\n            if (active) {\n                const images = entity.get('uploadedImages');\n\n                if (!_.isEmpty(images)) {\n                    const newImage = images[0];\n\n                    if (newImage) {\n                        const profilePictureSection = entity.get(\n                            `fieldConfig.${imageMappings[entityType].activeProfilePictureSection}`\n                        );\n                        entity.setProfilePicture(newImage);\n                        promise = entity.saveSection(profilePictureSection);\n                    }\n                }\n            }\n\n            const fieldPath = imageMappings[entityType][type];\n            const path = `entity.${fieldPath}`;\n\n            this.get(path).removeObject(image);\n            if (entityType === 'person') {\n                return this.entity.reload();\n            }\n\n            promise\n                .then(() => {\n                    const sectionKey = fieldPath.split('.')[0];\n                    const section = entity.get(`fieldConfig.${sectionKey}`);\n                    return entity.saveSection(section);\n                })\n                .catch(() => this.get(path).addObject(image));\n        },\n\n        cancelUploadModal() {\n            this.set('showUploadModal', false);\n            this.attrs.open();\n        },\n\n        cancelDeleteModal() {\n            this.set('askToDelete', false);\n            this.set('showing', false);\n        },\n\n        changeType(type) {\n            this.set('type', type);\n        },\n\n        doneDeleting() {\n            this.set('askToDelete', false);\n            this.set('showing', true);\n        }\n    },\n\n    _showing: false,\n    showing: computed('canEditProfilePicture', {\n        get() {\n            return this._showing;\n        },\n\n        set(key, value) {\n            this._showing = value;\n            return value;\n        }\n    }),\n\n    canUploadPicture: Ember.computed(\n        'session.user.isAdmin',\n        'entity.{readWritePermissions,type}',\n        'entity.uploadedImages.[]',\n        'entity.fieldConfig.uploads.images.maxRepeat',\n        'type',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            return this.hasAccessToPicture('uploads.images');\n        }\n    ),\n\n    canEditProfilePicture: Ember.computed(\n        'session.{user.isAdmin,features,person}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditInformalPicture: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditAgentImage: Ember.computed(\n        'entity.{readWritePermissions,id}',\n        'entity.fieldConfig.agent.profileImage',\n        'permissions.hasEngageAccess',\n        function () {\n            let field = this.get('entity.fieldConfig.agent.profileImage');\n            if (_.isEmpty(field)) {\n                return false;\n            }\n\n            return this.hasAccessToPicture('agent.profileImage') && this.get('permissions.hasEngageAccess');\n        }\n    ),\n\n    hasAccessToPicture(path) {\n        let isSelf = this.get('session.person.id') === this.get('entity.id');\n        let canEditProfiles = this.get('permissions.canEditProfiles');\n        if (path === 'agent.profileImage') {\n            return canEditProfiles;\n        }\n        if (path === 'uploads.images') {\n            return isSelf || canEditProfiles;\n        }\n        return isSelf;\n    }\n});\n","import Ember from 'ember';\n\nimport { imageMappings } from '../component';\n\nconst { set, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['delete-pictures'],\n\n    type: null,\n    entity: null,\n\n    confirm: () => {},\n    disable: () => {},\n    done: () => {},\n\n    actions: {\n        selectImage(upload) {\n            const current = upload.selected;\n            set(upload, 'selected', !current);\n\n            const limit = this.get('number');\n            const total = this.get('uploads.length');\n            const currentSelection = this.get('currentSelected.length');\n\n            this.attrs.disable(currentSelection < total - limit);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.disable(true);\n        this.set('confirm', this.deleteImages.bind(this));\n    },\n\n    number: computed(function () {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const imageType = this.get('type');\n        const field = entity.get(`fieldConfig.${imageMappings[entityType][imageType]}`);\n        return field.get('maxRepeat');\n    }),\n\n    uploads: computed('entity.uploadedImages.[]', function () {\n        const images = this.get('entity.uploadedImages') || [];\n        return images.map(image => {\n            return {\n                image,\n                selected: false\n            };\n        });\n    }),\n\n    currentSelected: computed('uploads.@each.selected', function () {\n        return this.get('uploads').filterBy('selected');\n    }),\n\n    imagesToSave: computed('uploads.@each.selected', function () {\n        return this.get('uploads').rejectBy('selected');\n    }),\n\n    deleteImages() {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const type = this.get('type');\n        const fieldPath = imageMappings[entityType][type];\n        const images = this.get('imagesToSave').mapBy('image');\n        entity.set(fieldPath, images, { overwrite: true });\n        return entity.save().then(() => {\n            this.attrs.done();\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Nb8kFlFf\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"explain\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.delete.explanation\\\"],[[\\\"number\\\"],[[28,[\\\"number\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"images\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"uploads\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"upload\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"isActive\\\",\\\"type\\\",\\\"canEdit\\\",\\\"editing\\\",\\\"size\\\",\\\"select\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"upload\\\",\\\"image\\\"]],[28,[\\\"upload\\\",\\\"selected\\\"]],[28,[\\\"type\\\"]],true,true,96,[33,[\\\"action\\\"],[[28,[null]],\\\"selectImage\\\",[28,[\\\"upload\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"upload\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/delete-pictures/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"1F/33ouu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showing\\\"]],[33,[\\\"not\\\"],[[28,[\\\"askToDelete\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"targetAttachment\\\"],[\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.done\\\"],null],[28,[\\\"targetAttachment\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"edit-profile-picture\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"canUploadPicture\\\",\\\"canEditProfilePicture\\\",\\\"canEditInformalPicture\\\",\\\"canEditAgentImage\\\",\\\"changeType\\\",\\\"upload\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],true,[28,[\\\"canUploadPicture\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[28,[\\\"canEditInformalPicture\\\"]],[28,[\\\"canEditAgentImage\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"changeType\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"uploadPicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"askToDelete\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[\\\"cancelDeleteModal\\\",[33,[\\\"t\\\"],[\\\"images.delete.title\\\"],null],[33,[\\\"t\\\"],[\\\"common.delete\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-picture-content/delete-pictures\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"confirm\\\",\\\"disable\\\",\\\"done\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"doneDeleting\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showUploadModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null],\\\"cancelUploadModal\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"upload-picture\\\"],null,[[\\\"entity\\\",\\\"uploadType\\\",\\\"confirm\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/template.hbs\"}});","import Ember from 'ember';\nimport { doFocus } from 'connections-ui/utils/focus-management';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-section'],\n\n    addingSection: false,\n\n    attrs: {\n        sections: null,\n        emptySections: null,\n\n        addSection() {}\n    },\n\n    actions: {\n        toggleAddingSection() {\n            this.toggleProperty('addingSection');\n            if (this.get('addingSection')) {\n                const focusTarget = '.add-section .name a:first';\n                Ember.run.later(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            }\n        },\n\n        addSection() {\n            this.attrs.addSection(...arguments);\n\n            this.set('addingSection', false);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachHandler);\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n\n        this._super(...arguments);\n    },\n\n    attachHandler() {\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-section').length) {\n                    this.set('addingSection', false);\n                }\n            });\n        });\n\n        Ember.$(window).on(`keydown.${this.elementId}`, event => {\n            if (event.key === 'Escape' && this.get('addingSection')) {\n                // ESC key when new-sections is displayed\n                Ember.run(() => {\n                    this.set('addingSection', false);\n                });\n            }\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"XG0aXktB\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"add-new-section \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddingSection\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSection\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"new-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emptySections\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/section-icon\\\"],null,[[\\\"sectionInfo\\\",\\\"addSection\\\"],[[28,[\\\"sectionInfo\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSectionEmpty\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/add-section/template.hbs\"}});","import Ember from 'ember';\nimport isEmpty from 'lodash/isEmpty';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport Profile from './profiles/profile';\n\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { deregisterLayout, registerLayout } from '../../utils/masonry';\nimport { isPurecloudSource } from '../../utils/presence-utils';\nimport ProfilePermissionsMixin from './permissions';\nimport { hasSupplementalVideoProvider } from 'connections-ui/services/media-providers';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nconst { run, inject, getOwner, computed, observer, Component } = Ember;\n\nexport default Component.extend(EntityControllerMixin, ProfilePermissionsMixin, {\n    classNames: ['entity-profile', 'person-detail', 'profile', 'entity'],\n    classNameBindings: ['isEditingSection:editing-section', 'onOwnProfile:own-profile', 'compactLayout:compact-layout'],\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    mediaProviders: inject.service(),\n    favorites: Ember.inject.service(),\n\n    resizeDetector: inject.service(),\n    application: inject.service(),\n    emergencyLocation: Ember.inject.service('emergency-location'),\n    emergencyLocationOn: Ember.computed.reads('session.features.emergencyLocation'),\n    editEmergencyLocation: false,\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    eLocation: Ember.computed.reads('emergencyLocation.eLocation'),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    canViewChat: computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: computed.bool('permissions.canViewCollaborateVideo'),\n    attrs: {\n        entity: null,\n\n        setEditingSection() {}\n    },\n\n    entity: null,\n    lastEntity: null,\n\n    editing: false,\n    showCardView: false,\n\n    compactLayout: false,\n\n    excludedContactFields: ['chat'],\n\n    excludedEditingFields: ['chat'],\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            return {\n                wrap: true,\n                showStatus: false,\n                showActivity: true,\n                eActivityPresenceClass: this.entity.get('activityPresenceClass'),\n                totalCalls: this.entity.get('activityValues.calls'),\n                totalChats: this.entity.get('activityValues.chats'),\n                totalEmails: this.entity.get('activityValues.emails'),\n                totalMessages: this.get('totalMessages'),\n                totalSocialExpression: this.get('totalSocialExpression'),\n                presenceLabel: this.entity.get('presenceLabel'),\n                eChatStatus: this.entity.get('chatStatus'),\n                isShowingActivitySummary: this.entity.get('showConversationSummaryIndicator')\n            };\n        }\n    ),\n    location: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('location', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('location'),\n            selfLocation: this.get('selfLocation'),\n            iconHoverText: this.get('intl').t('components.navMenu.userDropdown.setViaGeolocation')\n        };\n    }),\n\n    scrollToBottom() {\n        const parentNode = this.get('element.parentNode');\n        parentNode.scrollTop = parentNode.scrollHeight; //Scroll to very bottom\n    },\n\n    actions: {\n        toggleEditProfile() {\n            const editing = this.get('editingProfile');\n\n            if (editing) {\n                if (!this.get('entity.isSaving')) {\n                    this.get('entity').reload();\n                }\n            }\n\n            this.toggleProperty('editingProfile');\n\n            if (\n                this.get('emergencyLocationOn') &&\n                !this.get('editingProfile') &&\n                this.get('emergencyLocation').cancelEditElocation\n            ) {\n                this.get('emergencyLocation').cancelEditElocation();\n            }\n            this.updateMasonry();\n        },\n\n        editProfilePicture: function (event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            if (this.get('editingProfile') && this.get('canEditProfilePicture')) {\n                this.set('editingPictures', true);\n            }\n        },\n\n        editContactInfo() {\n            this.get('contactInfoSection').send('showModal');\n        },\n\n        setContactInfo(section) {\n            this.set('contactInfoSection', section);\n        },\n\n        addSection(sectionInfo) {\n            sectionInfo.set('adding', true);\n\n            run.scheduleOnce('afterRender', this, function () {\n                let key = sectionInfo.get('section.key');\n                let $section = this.$(`.${key}`);\n                let top = $section.position().top;\n                Ember.$('#orgspan').animate(\n                    {\n                        scrollTop: top\n                    },\n                    600\n                );\n                this.updateMasonry();\n                const focusTarget = this.$(`.${key}:first`);\n                run.debounce(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            });\n        },\n\n        removeSection(sectionInfo) {\n            this.get('fieldSections').removeObject(sectionInfo);\n            this.updateMasonry();\n        },\n\n        toggleCardView() {\n            this.toggleProperty('showCardView');\n        },\n\n        componentUpdated() {\n            this.updateMasonry();\n        },\n\n        noop() {},\n\n        resize(data) {\n            Ember.run.once(this, this.handleResize, data);\n        },\n\n        saveElocation(updatedElocationAddress) {\n            return this.get('emergencyLocation').saveElocation(updatedElocationAddress);\n        },\n        editElocation() {\n            this.set('editEmergencyLocation', true);\n        },\n        cancelEditElocation() {\n            this.set('editEmergencyLocation', false);\n        },\n        refreshAllEmergencylocationInfo(notify) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').refreshAllEmergencylocationInfo(notify);\n            }\n        },\n        getEmergencyLocation(phoneNumber) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').getEmergencyLocation(phoneNumber);\n            }\n        }\n    },\n\n    allSections: computed.reads('profile.profileSections'),\n    canEditStatus: computed.and('onOwnProfile', 'isPurecloudSource'),\n\n    isPurecloudSource: computed(\n        'session.features.acdHybridToastNoActiveQueue',\n        'session.user.presence.source',\n        function () {\n            if (this.get('session.features.acdHybridToastNoActiveQueue')) {\n                return isPurecloudSource(this.get('session.user.presence.source'));\n            }\n            return true;\n        }\n    ),\n    editingProfile: computed('editing', 'canEditProfile', {\n        get() {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n            return this.get('editing');\n        },\n\n        set(key, value) {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n\n            return value;\n        }\n    }),\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    emptySections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => sectionInfo.get('isEmpty') && !sectionInfo.get('adding'));\n    }),\n\n    fieldSections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => !sectionInfo.get('isEmpty') || sectionInfo.get('adding'));\n    }),\n\n    emptyWriteableSections: computed('emptySections.[]', 'profile.writeableSections.[]', function () {\n        let sections = this.get('emptySections');\n        let sectionKeys = this.get('profile.writeableSections');\n        return sections.filter(sectionInfo => sectionKeys.includes(sectionInfo.get('section.key')));\n    }),\n\n    isEditingSection: computed('fieldSections.@each.editingSection', 'editEmergencyLocation', function () {\n        if (this.get('editEmergencyLocation')) {\n            return true;\n        }\n        return !isEmpty(this.get('fieldSections').findBy('editingSection', true));\n    }),\n\n    showStatus: computed('editingProfile', 'onOwnProfile', 'entity.hasChatStatus', 'chatService.enabled', function () {\n        if (!this.get('chatService.enabled')) {\n            return false;\n        }\n\n        return (this.get('editingProfile') && this.get('onOwnProfile')) || this.get('entity.hasChatStatus');\n    }),\n\n    videoProviders: computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'));\n    }),\n\n    haveVideoMediaProviders: computed('videoProviders.@each.haveAccess', function () {\n        return hasSupplementalVideoProvider(this.get('videoProviders'));\n    }),\n\n    entityData: Ember.computed('entity.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('entity.id'),\n            name: this.get('entity.name'),\n            isFavorite: this.get('entity.isFavorite'),\n            type: this.get('entity.type')\n        };\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('favorites').toggleFavorite(this.get('entity'));\n        });\n        this.notifyPropertyChange('entityData');\n    }),\n\n    profileChanged: observer('entity.id', function () {\n        Ember.run.once(this, 'handleProfileChange');\n    }),\n\n    editingSectionChange: observer('isEditingSection', function () {\n        Ember.run.once(this, 'handleEditingSectionChange');\n    }),\n\n    handleProfileChange() {\n        let lastId = this.get('lastEntity.id');\n        if (this.get('entity.id') !== lastId) {\n            this.set('lastEntity', this.get('entity'));\n        }\n    },\n\n    handleEditingSectionChange() {\n        if (this.get('editEmergencyLocation')) {\n            Ember.run.later(() => {\n                this.scrollToBottom();\n            }, 800);\n        }\n\n        if (this.get('setEditingSection')) {\n            this.get('setEditingSection')(this.get('isEditingSection'));\n        }\n    },\n\n    // masonry configuration\n    masonryEl: null,\n\n    _useMasonry() {\n        const debug = this.get('application.debug');\n        const enableMasonry = this.get('application.debugSettings.masonry');\n        return !debug || enableMasonry;\n    },\n\n    _masonryId() {\n        return `entity-profile-${this.get('elementId')}`;\n    },\n\n    _isInDOM() {\n        return this.get('_state') === 'inDOM';\n    },\n\n    fieldSectionsUpdate: Ember.observer('fieldSections.[]', function () {\n        if (isEmpty(this.get('fieldSections'))) {\n            return;\n        }\n\n        Ember.run.scheduleOnce('afterRender', () => {\n            this.updateMasonry();\n        });\n    }),\n\n    attachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.$('.masonry-container');\n            masonryEl.masonry({\n                itemSelector: '.field-section',\n                columnWidth: '.field-section',\n                fitWidth: true\n            });\n            masonryEl.on('click submit', () => Ember.run(() => this.updateMasonry()));\n            this.set('masonryEl', masonryEl);\n\n            registerLayout(this._masonryId(), this);\n        }\n    },\n\n    _updateMasonry() {\n        if (this._useMasonry()) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                const masonryEl = this.get('masonryEl');\n                if (masonryEl && this._isInDOM()) {\n                    masonryEl.masonry('reloadItems').masonry();\n                }\n            });\n        }\n    },\n\n    rerun() {\n        // ^ this method is required for the utils/masonry#rerunLayouts()\n        Ember.run(() => this.updateMasonry());\n    },\n\n    updateMasonry() {\n        Ember.run.throttle(this, this._updateMasonry, 500, false);\n    },\n\n    detachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.get('masonryEl');\n            this.set('masonry', null);\n            if (masonryEl) {\n                masonryEl.masonry('destroy');\n                masonryEl.off('click submit');\n            }\n\n            deregisterLayout(this._masonryId());\n        }\n    },\n\n    startMasonry: Ember.on('didInsertElement', function () {\n        this.attachMasonry();\n    }),\n\n    stopMasonry: Ember.on('willDestroyElement', function () {\n        this.detachMasonry();\n    }),\n\n    handleResize(data) {\n        if (!data.width) {\n            return;\n        }\n\n        if (data.width < 500) {\n            this.set('compactLayout', true);\n        } else {\n            this.set('compactLayout', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nconst { Mixin, inject, computed } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    canEditProfile: computed.or('onOwnProfile', 'profile.canEditProfile', 'session.person.isAdmin'),\n\n    canEditName: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditTitle: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditDepartment: computed('editingProfile', 'permissions.canEditProfiles', function () {\n        if (!this.get('editingProfile')) {\n            return false;\n        }\n        return this.get('permissions.canEditProfiles');\n    }),\n\n    canReadHR: computed.reads('permissions.canReadProfile'),\n\n    onOwnProfile: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: Ember.computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    canReadGroups: Ember.computed('entity.groups.{social,official}', function () {\n        let groupsFieldConfig = this.get('entity.fieldConfig')\n            ? this.get('entity.fieldConfig').getSectionByKey('groups')\n            : null;\n        let groups = this.get('entity.groups');\n        if (!groupsFieldConfig || _.isEmpty(groups)) {\n            return false;\n        }\n        return Ember.get(groups, 'social.length') || Ember.get(groups, 'official.length');\n    }),\n\n    canEditProfilePicture: Ember.computed('canEditProfile', function () {\n        return this.get('canEditProfile');\n    }),\n\n    canEditGeneralInfo: Ember.computed('onOwnProfile', function () {\n        var promise = new Ember.RSVP.Promise(resolve => {\n            resolve(this.get('onOwnProfile'));\n        });\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    canEditContactInfo: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.readWritePermissions',\n        'onOwnProfile',\n        function () {\n            var promise = new Ember.RSVP.Promise(resolve => {\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewLocations: Ember.computed(\n        'ownOwnProfile',\n        'entity.readWritePermissions',\n        'session.{user.isAdmin,features}',\n        'entity.fieldConfig.location.location',\n        function () {\n            var locationsField = this.get('entity.fieldConfig.location.location');\n            var promise = new Ember.RSVP.Promise(resolve => {\n                if (_.isEmpty(locationsField)) {\n                    return resolve(false);\n                }\n                if (this.get('session.user.isAdmin')) {\n                    return resolve(true);\n                }\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewInformals: Ember.computed('canEditProfilePicture', 'entity.images.informal', function () {\n        var photos = this.get('entity.images.informal');\n\n        if (photos && photos !== undefined) {\n            return photos.length > 0;\n        }\n        return false;\n    })\n});\n","import Ember from 'ember';\n\nimport Validators from '../../entity-fields/validators';\nimport { BUILTIN_SECTIONS, customSectionKeys } from './profile';\n\nconst { computed } = Ember;\n\nconst PERMISSIONED_FIELD_PATHS = [\n    'contactInfo.email_main',\n    'contactInfo.phone_work',\n    'contactInfo.voicemaileEnabled',\n    'general.title',\n    'hr.empId',\n    'hr.empType',\n    'hr.hireDate',\n    'hr.officialName',\n    'relationships.manager',\n    'relationships.administrativeAssistant',\n    'purecloud.defaultStationId',\n    'purecloud.siteId',\n    'purecloud.skills',\n    'purecloud.languages',\n    'purecloud.acdAutoAnswer',\n    'agent.name',\n    'agent.profileImage',\n    'primaryContactInfo.email'\n];\n\nconst POSSIBLE_INTEGRATION_FIELDS = ['contactInfo.phone_other'];\n\nexport default Ember.Object.extend({\n    session: null,\n    permissions: null,\n    entity: null,\n    field: null,\n    valueReference: null,\n\n    value: computed('fieldPath', 'entity.{fieldPath}.[]', 'entity.{fieldPath}.@each._id', function () {\n        const id = this.get('valueReference._id');\n        const tempId = this.get('valueReference.tempId');\n        const fieldPath = this.get('fieldPath');\n        const entity = this.get('entity');\n        const data = entity ? entity.get(fieldPath) : null;\n\n        let location = this.get('_sectionLocation');\n        let value = {};\n\n        if (Array.isArray(data) && data.length) {\n            if (location === null || location === undefined || location >= data.length || location < 0) {\n                if (tempId) {\n                    location = data.findIndex(d => d.tempId === tempId);\n                } else if (id) {\n                    location = data.findIndex(d => d._id === id);\n                } else {\n                    location = 0;\n                }\n\n                this.set('_sectionLocation', location);\n            } else if (id != null) {\n                location = data.findIndex(d => d._id === id);\n                this.set('_sectionLocation', location);\n            }\n\n            if (location != null && location >= 0) {\n                value = data[location];\n            } else {\n                // if no location found or negative index then we assume its at the top\n                value = data[0];\n            }\n        }\n\n        // if the value does not have an id or tempId then its a new addition and we need to assign a tempId for ui tracking\n        if (!value.id && !value.tempId) {\n            value.tempId = Ember.generateGuid();\n        }\n\n        return value;\n    }),\n\n    _sectionLocation: null,\n\n    // Legacy support\n    entry: computed.reads('value'),\n    fieldValue: computed.reads('value'),\n\n    sectionKey: computed('field', function () {\n        return this.get('field.section.key');\n    }),\n\n    fieldPath: computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: computed('fieldPath', function () {\n        const fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    fieldId: computed('value._id', 'value.tempId', function () {\n        return this.get('value._id') || this.get('value.tempId');\n    }),\n\n    writeable: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return true;\n        }\n\n        const canEditProfiles = this.get('permissions.canEditProfiles');\n        const path = this.get('fieldPath');\n\n        // Integration fields have their own editing requirements\n        if (this.get('integrationManaged')) {\n            return false;\n        }\n\n        if (Ember.A(PERMISSIONED_FIELD_PATHS).includes(path)) {\n            // Only admins can edit core contact fields\n            return canEditProfiles;\n        }\n\n        if (Ember.A(BUILTIN_SECTIONS).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        const myOwnProfile = this.get('session.person.id') === this.get('entity.id');\n        const customKeys = customSectionKeys(this.get('entity.fieldConfig.sections'));\n        if ((myOwnProfile || canEditProfiles) && Ember.A(customKeys).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        return false;\n    }),\n\n    /**\n     * @deprecated\n     * This computed value is deprecated. Please use `removable` instead.\n     */\n    removeable: computed(function () {\n        Ember.Logger.warn(\n            '`components/entity-profile/profiles/field-data.js` - The use of the computed value `removeable` is deprecated. Please update to use `removable` on this class instead.'\n        );\n        return this.get('removable');\n    }),\n\n    removable: computed('integrationManaged', 'field.repeatable', function () {\n        const repeatable = this.get('field.repeatable');\n        return repeatable && !this.get('integrationManaged');\n    }),\n\n    integrationManaged: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return false;\n        }\n\n        const path = this.get('fieldPath');\n        if (Ember.A(POSSIBLE_INTEGRATION_FIELDS).includes(path)) {\n            let value = this.get('value');\n            return value && value.value && !!value.value.integration;\n        }\n\n        return false;\n    }),\n\n    isEmpty: computed('field.type', 'value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isEmpty(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isValid: computed('value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isValid(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isPrimaryField: computed('value._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', function () {\n        const primaryFieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n        return this.get('value._id') === primaryFieldId;\n    }),\n\n    isNewValue: computed('value._id', 'value.tempId', {\n        get() {\n            return !this.get('value._id');\n        },\n\n        set(path, value) {\n            return value;\n        }\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport SectionInfo from './section-info';\n\nconst { inject, computed } = Ember;\n\nconst PROFILE_CACHE = {};\n\nconst EXCLUDED_SECTIONS = [\n    'status',\n    'general',\n    'primaryContactInfo',\n    'images',\n    'uploads',\n    'cic',\n    'scs',\n    'custserv',\n    'device',\n    'purecloud',\n    'preferences',\n    'externalContacts'\n];\n\nexport const BUILTIN_SECTIONS = ['general', 'contactInfo', 'skills', 'location', 'bio', 'education', 'hr'];\n\nexport const ADMIN_SECTIONS = ['relationships', 'agent'];\n\nexport function customSectionKeys(sections) {\n    const builtins = [...BUILTIN_SECTIONS, ...ADMIN_SECTIONS, ...EXCLUDED_SECTIONS];\n    const keys = Ember.A(sections).mapBy('key');\n    return keys.filter(key => !Ember.A(builtins).includes(key));\n}\n\nlet Profile = Ember.Object.extend({\n    _cache: PROFILE_CACHE,\n\n    session: inject.service('session'),\n    permissions: inject.service('permissions'),\n\n    model: null,\n    readWritePermissions: null,\n\n    writeableSections: null,\n    readableSections: null,\n\n    sections: computed.reads('model.fieldConfig.sections'),\n    canEditProfiles: computed.reads('permissions.canEditProfiles'),\n    canReadProfiles: computed.reads('permissions.canReadProfiles'),\n\n    init() {\n        this._super(...arguments);\n\n        let writeableSections = [];\n        const customKeys = customSectionKeys(this.get('sections'));\n        let readableSections = [...BUILTIN_SECTIONS, 'relationships', 'groups', ...customKeys];\n\n        if (this.get('model.id') === this.get('session.person.id')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys];\n        }\n\n        if (this.get('canEditProfiles')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys, ...ADMIN_SECTIONS];\n        }\n        if (this.get('canReadProfiles')) {\n            readableSections = readableSections.concat(ADMIN_SECTIONS);\n        }\n\n        this.setProperties({\n            readWritePermissions: {\n                write: [],\n                read: []\n            },\n            writeableSections,\n            readableSections\n        });\n    },\n\n    profileSections: computed('session.person', 'model', 'readableSections.[]', function () {\n        let data = [];\n        let sections = this.get('sections');\n        let isSuper = this.get('session.person.isAdmin') && !this.get('session.user.personId');\n        if (isSuper) {\n            data = _.filter(sections, section => {\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1;\n            });\n        } else {\n            data = _.filter(sections, section => {\n                let readableSections = this.get('readableSections');\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n            });\n        }\n\n        return _.map(data, section => {\n            return SectionInfo.create({\n                section: section,\n                entity: this.get('model')\n            });\n        });\n    }),\n\n    canEditProfile: computed('writeableSections.[]', function () {\n        return this.get('writeableSections.length') > 0;\n    }),\n\n    canEditProfilePictures: computed('model.id', 'session.person.id', 'canEditProfiles', function () {\n        if (this.get('model.id') === this.get('session.person.id')) {\n            return true;\n        }\n        return this.get('canEditProfiles');\n    }),\n\n    canEditSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canEditProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('writeableSections');\n        return _.includes(sections, section.key);\n    },\n\n    canReadSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canReadProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('readableSections');\n        return _.includes(sections, section.key);\n    },\n\n    getReadableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    },\n\n    getEditableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    }\n});\n\nProfile.reopenClass({\n    getProfileForModel(model, owner) {\n        let id = model.get('id');\n        if (PROFILE_CACHE[id]) {\n            return PROFILE_CACHE[id];\n        }\n        let profile = Profile.create(\n            {\n                model: model\n            },\n            owner.ownerInjection()\n        );\n        PROFILE_CACHE[id] = profile;\n        return profile;\n    }\n});\n\nexport default Profile;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nlet customSections = ['groups', 'relationships', 'contactInfo', 'location', 'education'];\n\nexport default Ember.Object.extend({\n    entity: null,\n    section: null,\n\n    adding: false,\n    editingSection: false,\n\n    init() {\n        this._super(...arguments);\n\n        // consume computed...\n        this.get('groupSectionChange');\n    },\n\n    componentName: computed('section.key', function () {\n        let key = this.get('section.key');\n        if (_.includes(customSections, key)) {\n            let name = Ember.String.dasherize(key);\n            return `entity-field-section/entity-${name}`;\n        }\n\n        return 'entity-field-section';\n    }),\n\n    hasCustomComponent: computed('section.key', function () {\n        return _.includes(customSections, this.get('section.key'));\n    }),\n\n    isEmpty: computed(\n        'entity',\n        'section',\n        'adding',\n        'entity.groups.official.[]',\n        'entity.groups.social.[]',\n        'entity.directReports.content',\n        {\n            get() {\n                let entity = this.get('entity');\n                let section = this.get('section');\n\n                if (section.get('fieldList.length') === 0) {\n                    return true;\n                }\n\n                let emptyFields = _.filter(section.get('fieldList'), field => {\n                    let fieldPath = field.get('fieldPath');\n                    let values = entity.get(fieldPath);\n\n                    // Work-around weird direct reports relationship...\n                    if (section.get('key') === 'relationships' && field.get('key') === 'directReportCount') {\n                        return !entity.get('directReports.content.length');\n                    }\n\n                    if (!_.isEmpty(values)) {\n                        let emptyValues = _.filter(values, value => {\n                            if (_.isEmpty(value._id) && _.isEmpty(value.guid)) {\n                                return true;\n                            }\n\n                            return _.isEmpty(value.value);\n                        });\n\n                        return !_.isEmpty(emptyValues);\n                    }\n\n                    return true;\n                });\n\n                return !_.isEmpty(emptyFields) && emptyFields.length === section.get('fieldList.length');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['section-icon', 'clickable'],\n    classNameBindings: ['section.key'],\n\n    attrs: {\n        sectionInfo: null,\n        addSection() {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n\n    icon: computed('section.key', function () {}),\n\n    click() {\n        this.attrs.addSection(this.get('sectionInfo'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"r2fmlELA\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[1,[28,[\\\"section\\\",\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/section-icon/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"lCPY4TyH\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"resize-detector\\\"],[\\\".entity-profile .banner\\\"],[[\\\"on-resize\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"resize\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h1\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingEditMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingViewMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content banner-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-profile\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleEditProfile\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-edit-profile\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"button-text-removal\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewPublicProfile\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewEditMode\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"favorite links \\\",[33,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tree-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"\\\"],[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],\\\"clickable\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-camera camera\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"showStatus\\\",\\\"wrap\\\"],[[28,[\\\"entity\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"class\\\",\\\"entity\\\",\\\"locationHoverText\\\"],[\\\"entity-geolocation\\\",[28,[\\\"entity\\\"]],[33,[\\\"t\\\"],[\\\"components.navMenu.userDropdown.setViaGeolocation\\\"],null]]]],false],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]],[28,[\\\"name\\\"]],[28,[\\\"canEditName\\\"]],true,true]]],false],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"general \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"department\\\",\\\"value\\\"]]],null],\\\"show-divider\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]],[28,[\\\"title\\\"]],[28,[\\\"canEditTitle\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]],[28,[\\\"department\\\"]],[28,[\\\"canEditDepartment\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showStatus\\\"]],[33,[\\\"or\\\"],[[28,[\\\"isPurecloudSource\\\"]],[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entity\\\",\\\"editable\\\",\\\"onProfile\\\",\\\"showPlaceholder\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"and\\\"],[[28,[\\\"canEditStatus\\\"]],[28,[\\\"editingProfile\\\"]]],null],true,true]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"entity\\\",\\\"user\\\",\\\"useMediaProviders\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"user\\\"]],[28,[\\\"haveVideoMediaProviders\\\"]],false,\\\"viewLightGallery\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveVideoMediaProviders\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"media-providers/video-dropdown\\\"],null,[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"main-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/add-section\\\"],null,[[\\\"entity\\\",\\\"sections\\\",\\\"emptySections\\\",\\\"addSection\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"fieldSections\\\"]],[28,[\\\"emptyWriteableSections\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"sections profile-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"masonry-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldSections\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section \\\",[28,[\\\"sectionInfo\\\",\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[15,\\\"role\\\",\\\"region\\\"],[16,\\\"aria-labelledby\\\",[34,[[28,[\\\"sectionInfo\\\",\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]],\\\"entity-field-section/entity-contact-info\\\"],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"editingElocation\\\",\\\"emergencyLocationOn\\\",\\\"showResetButton\\\",\\\"onOwnProfile\\\",\\\"emergencyLocationData\\\",\\\"removeSection\\\",\\\"componentUpdated\\\",\\\"saveElocation\\\",\\\"cancelEditElocation\\\",\\\"editElocation\\\",\\\"refreshAllEmergencylocationInfo\\\",\\\"getEmergencyLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[28,[\\\"emergencyLocationOn\\\"]],false,[28,[\\\"onOwnProfile\\\"]],[28,[\\\"emergencyLocation\\\",\\\"emergencyLocationData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"saveElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"editElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"refreshAllEmergencylocationInfo\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"getEmergencyLocation\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"removeSection\\\",\\\"componentUpdated\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"card-view-container \\\",[33,[\\\"unless\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"profile\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editingPictures\\\"]],[28,[\\\"profile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { ThenableSearchMixin } from '../../mixins/search';\nimport { pluralize } from 'ember-inflector';\n\nconst UP = 38;\nconst DOWN = 40;\nconst ESCAPE = 27;\nconst ENTER = 13;\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(ThenableSearchMixin, {\n    classNames: ['entity-search'],\n\n    currentSelected: -1,\n\n    intl: Ember.inject.service(),\n    search: Ember.inject.service(),\n\n    select: '',\n    type: 'all',\n    filterFunction: null,\n\n    searchQuery: '',\n    userInput: null,\n    searchLimit: 10,\n    debouncedScheduleQueryUpdate: null,\n    relationship: null,\n    disabled: false,\n\n    init() {\n        this._super(...arguments);\n        this.ensurePluralType();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachClickListener();\n        this.debouncedScheduleQueryUpdate = _.debounce(this._scheduleSearchQueryUpdate, 250, { maxWait: 500 });\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    },\n\n    keyDown(event) {\n        switch (event.keyCode) {\n            case UP:\n                return this.selectPrevious();\n            case DOWN:\n                return this.selectNext();\n            case ESCAPE:\n                return this.cancelInput();\n            case ENTER:\n                if (this.get('wrappedSearchResults')) {\n                    return this.chooseSelected();\n                }\n                break;\n            default:\n                this.debouncedScheduleQueryUpdate();\n                this.set('currentSelected', -1);\n                break;\n        }\n    },\n\n    actions: {\n        setUserInput(event) {\n            Ember.run.debounce(this, this._updateSearchQuery, event.target.value, 250);\n        },\n\n        submit() {\n            this.notifyPropertyChange('searchQuery');\n        },\n\n        selectResult(entity) {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            this.sendAction('select', entity);\n        },\n\n        clearSearch() {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            return this.set('currentSelected', -1);\n        }\n    },\n\n    entityFilter: computed.reads('type'),\n\n    results: computed('searchQuery', function () {\n        if (!this.get('isEmpty')) {\n            const search = this.get('search');\n            const entities = this.get('type').split(',');\n\n            return DS.PromiseArray.create({\n                promise: search.performSearch(this.get('searchQuery'), 0, entities).then(({ results }) => {\n                    return this._buildResults(results);\n                })\n            });\n        }\n        return Ember.RSVP.resolve(Ember.A([]));\n    }),\n\n    wrappedSearchResults: Ember.computed('results', function () {\n        let searchResults = this.get('results');\n        return DS.PromiseArray.create({\n            promise: searchResults.then(searchResults => {\n                return _.map(searchResults, function (entity) {\n                    Ember.set(entity, 'selected', false);\n                    return entity;\n                });\n            })\n        });\n    }),\n\n    loading: computed('wrappedSearchResults.isFulfilled', function () {\n        return !this.get('wrappedSearchResults.isFulfilled');\n    }),\n\n    haveResults: computed('results.[]', function () {\n        return !_.isEmpty(this.get('results'));\n    }),\n\n    placeholder: computed('type', function () {\n        let map = {\n            all: 'components.entitySearch.search',\n            people: 'components.personSearch.search',\n            groups: 'components.groupSearch.search',\n            locations: 'components.locationSearch.search'\n        };\n\n        let key = map[this.get('type')];\n        if (key) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        return '';\n    }),\n\n    isEmpty: computed('searchQuery', function () {\n        return _.isEmpty(this.get('searchQuery'));\n    }),\n\n    noResultsKey: computed('type', function () {\n        if (this.get('type') !== 'locations') {\n            return 'components.entitySearch.noResults';\n        }\n\n        return 'components.entitySearch.noResultsLocation';\n    }),\n\n    ensurePluralType() {\n        let type = this.get('type');\n        if (!_.isEmpty(type) && type !== 'all') {\n            let plural = pluralize(type);\n            this.set('type', plural);\n        }\n    },\n\n    attachClickListener() {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.entity-search').length) {\n                    this.set('searchResults', []);\n                }\n            });\n        });\n    },\n\n    selectNext() {\n        const entities = this.get('wrappedSearchResults.content');\n        const nowSelected = this.get('currentSelected');\n        const nextSelected = nowSelected + 1;\n        if (nowSelected + 1 < entities.length) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[nextSelected]) {\n                entities[nextSelected].set('selected', true);\n            }\n            this.set('currentSelected', nextSelected);\n            this.scrolling(true);\n        }\n    },\n\n    selectPrevious() {\n        const entities = this.get('wrappedSearchResults');\n        const nowSelected = this.get('currentSelected');\n        const previousSelected = nowSelected + 1;\n        if (nowSelected - 1 >= 0) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[previousSelected]) {\n                entities[previousSelected].set('selected', true);\n            }\n            this.set('currentSelected', previousSelected);\n            this.scrolling(false);\n        }\n    },\n\n    scrolling(next) {\n        const areaScroll = this.$('.scrollable-area').scrollTop();\n        const entityHeight = this.$('.scroll-entity').height();\n        if (next) {\n            if (this.currentSelected !== 0) {\n                this.$('.scrollable-area').scrollTop(areaScroll + entityHeight);\n            }\n        } else {\n            this.$('.scrollable-area').scrollTop(areaScroll - entityHeight);\n        }\n    },\n\n    clearInputs() {\n        this.set('searchQuery', null);\n        this.set('currentSelected', -1);\n    },\n\n    cancelInput() {\n        if (this.get('searchQuery')) {\n            this.clearInputs();\n        } else {\n            this.sendAction('cancel');\n            this.clearInputs();\n        }\n    },\n\n    chooseSelected() {\n        const entities = this.get('wrappedSearchResults.content');\n        let chosen = entities[this.currentSelected];\n        if (entities.length === 1) {\n            chosen = entities[0];\n        }\n        if (chosen && !chosen.disabled) {\n            this.send('selectResult', chosen);\n        }\n    },\n\n    _buildResults(results) {\n        let filterFunction = this.get('filterFunction');\n        _.each(results, function (result) {\n            if (result.selected) {\n                Ember.set(result, 'selected', false);\n            }\n        });\n        if (results && filterFunction) {\n            return filterFunction(results);\n        }\n        return results;\n    },\n\n    _scheduleSearchQueryUpdate() {\n        Ember.run.join(() => {\n            this._updateSearchQuery();\n        });\n    },\n\n    _updateSearchQuery(value) {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        value = value || this.get('userInput');\n        this.set('searchQuery', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"HBSzv/yj\",\"block\":\"{\\\"statements\\\":[[11,\\\"form\\\",[]],[15,\\\"class\\\",\\\"input-form\\\"],[15,\\\"autocomplete\\\",\\\"off\\\"],[16,\\\"aria-labelledby\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search-label\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"submit\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search-label\\\"]]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[0,\\\" - \\\"],[1,[26,[\\\"placeholder\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[16,\\\"value\\\",[34,[[26,[\\\"userInput\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setUserInput\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"search-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-spin pc-loading\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"loading\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-container scrollable-area\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"wrappedSearchResults\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[18,\\\"default\\\",[[28,[\\\"result\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\"],null]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"noResultsKey\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"noResultsKey\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nconst isEnter = event => eventToString(event) === 'ENTER';\n\nconst MAX_STATUS_LENGTH = 50;\nconst stripHtml = str => str.replace(/(<([^>]+)>)/gi, '');\n\nexport default Component.extend({\n    classNames: ['entity-status'],\n    classNameBindings: ['editable'],\n    layoutName: 'components/entity-status',\n\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    presence: inject.service(),\n\n    entity: null,\n    editable: false,\n    onProfile: false,\n    showPlaceholder: false,\n    savedStatus: null,\n    isLoading: false,\n    maxLength: MAX_STATUS_LENGTH,\n\n    debounceTime: 1000,\n\n    init() {\n        this._super(...arguments);\n        this.set('savedStatus', this.get('status'));\n    },\n\n    showStatus: computed.or('entity.hasChatStatus', 'editable', 'showPlaceholder'),\n\n    status: computed('entity.chatStatus', {\n        get() {\n            return this.get('entity.chatStatus');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    isInvalid: computed('status', function () {\n        const status = this.get('status');\n        return !_.isEmpty(status) && status.length > MAX_STATUS_LENGTH;\n    }),\n\n    actions: {\n        changeStatus(event) {\n            if (event && event.target && isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                event.preventDefault();\n                this.updateStatus();\n            }\n        },\n\n        changeStatusEventually(event) {\n            if (event && event.target && !isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                Ember.run.debounce(this, this.updateStatus, this.debounceTime);\n            }\n        }\n    },\n\n    updateStatus() {\n        if (this.get('isInvalid')) {\n            return;\n        }\n        const status = this.get('status');\n        Ember.Logger.debug(`STATUS-MSG: updateStatus(${status})`);\n        this.set('isLoading', true);\n\n        this.get('presence')\n            .setUsersStatus(this.get('session.person'), status)\n            .then(() => {\n                this.set('savedStatus', status);\n            })\n            .catch(response => {\n                const message = stripHtml(response.message || '');\n                this.showUpdateError(message);\n                this.set('status', this.get('savedStatus'));\n            })\n            .finally(() => {\n                this.set('isLoading', false);\n            });\n    },\n\n    showUpdateError(message) {\n        const title = this.get('intl').t('chat.statusError');\n        const options = { hideAfter: 5 };\n        this.get('notification').error(title, message, options);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"OEYdL51E\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"h6\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"person.status\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-left\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-left\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editable\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"form\\\",[]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"id\\\",\\\"statusPlaceHolderLabel\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"textarea\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"status-input form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"isInvalid\\\"]],\\\" invalid\\\"],null],[33,[\\\"if\\\"],[[28,[\\\"isLoading\\\"]],\\\" loading\\\"],null]]]],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null]]]],[16,\\\"maxlength\\\",[34,[[26,[\\\"maxLength\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatusEventually\\\"],null],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],null],null],[16,\\\"value\\\",[34,[[26,[\\\"status\\\"]]]]],[15,\\\"aria-labelledby\\\",\\\"statusPlaceHolderLabel\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flair-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],[[\\\"hideIfText\\\"],[true]]],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPlaceholder\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text placeholder\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"onProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-right\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-right\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-status/template.hbs\"}});","define(\"connections-ui/components/entity-v2/activity-indicator/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/activity-indicator/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/image/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/location/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-indicator-dot/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-indicator-dot/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { rerunLayouts } from 'connections-ui/utils/masonry';\n\nvar ExpanderPluginComponent = Ember.Component.extend({\n    tagName: 'div',\n    classNames: ['expander'],\n\n    intl: Ember.inject.service(),\n\n    init: function () {\n        this._super();\n    },\n\n    addBehavior: Ember.on('didInsertElement', function () {\n        const intl = this.get('intl');\n        var expandText = intl.lookup('common.more').toString().toLowerCase();\n        var collapseText = intl.lookup('common.less').toString().toLowerCase();\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var $el = this.$();\n            if ($el) {\n                $el.expander({\n                    expandText: expandText + ' &raquo;',\n                    userCollapseText: '&laquo; ' + collapseText,\n                    afterExpand: rerunLayouts,\n                    afterCollapse: rerunLayouts\n                });\n            }\n        });\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$().expander('destroy');\n    })\n});\nexport default ExpanderPluginComponent;\n","export default Ember.HTMLBars.template({\"id\":\"+M2hHWWk\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/expander-plugin/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend({\n    classNameBindings: ['field.customLabels:custom-label', 'editing', ':label-component'],\n\n    intl: inject.service(),\n\n    field: null,\n    entry: null,\n    entity: null,\n\n    editing: false,\n    isEmpty: false,\n    fallbackToEmpty: true,\n    showHistoryYearRange: true,\n    showInstructionText: true,\n\n    choices: null,\n    choicesHidden: true,\n\n    customLabelText: null,\n\n    attributeBindings: ['for'],\n\n    labelFor: null,\n\n    actions: {\n        toggleChoicesView: function () {\n            this.toggleProperty('choicesHidden');\n        },\n\n        selectChoice: function (id) {\n            this.set('customLabelText', null);\n            this.set('entry.labelKey', id);\n            this.set('choicesHidden', true);\n        }\n    },\n\n    setupCustomLabelText: on('init', function () {\n        if (this.hasCustomLabelKey()) {\n            this.set('customLabelText', this.get('entry.labelKey'));\n        }\n    }),\n\n    canEdit: computed('editing', 'writeable', 'writeable.isFulfilled', function () {\n        const editing = this.get('editing');\n        const writeable = this.get('writeable');\n        if (writeable && typeof writeable === 'object') {\n            return editing && writeable.content;\n        }\n        return editing && writeable;\n    }),\n\n    label: computed('entry.labelKey', 'editing', 'entry.{value.startDate.year,value.endDate.year}', function () {\n        // isEmpty is set by the display-field.hbs template\n        if (this.get('isEmpty')) {\n            return this.get('field.i18nLabel');\n        }\n\n        if (!this.get('editing')) {\n            if (this.get('field.type') === 'history' && this.get('showHistoryYearRange')) {\n                return this.labelForHistoryField();\n            }\n        }\n\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n\n        // A custom label is not configured for this field.\n        // Or custom labels are in use, but no label key is found, then this is a label key for an empty value.\n        // Or group link field\n        if (!this.get('field.customLabels') || !labelKey || this.get('field.fieldPath') === 'general.links') {\n            return this.get('field.i18nLabel');\n        }\n\n        var key = `${baseKey}_labelKey_${labelKey}`;\n\n        // If there is a translation for the custom label key, use it.\n        if (!this.hasCustomLabelKey()) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        // Otherwise return the label key as it was typed in.\n        return labelKey;\n    }),\n\n    customLabels: computed('field.{customLabels,fieldPath}', 'isEmpty', function () {\n        return (\n            this.get('field.customLabels') && !this.get('isEmpty') && this.get('field.fieldPath') !== 'general.links'\n        );\n    }),\n\n    labelChoices: computed('entry', function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(this.get('field.labelKeys'), labelKey => {\n            return {\n                id: labelKey,\n                label: this.get('intl').lookup(`${baseKey}_labelKey_${labelKey}`).toString()\n            };\n        });\n    }),\n\n    instructionText: computed('field.instructionText', function () {\n        let field = this.get('field').getI18nKey();\n        let key = `${field}_instructionText`;\n\n        const intl = this.get('intl');\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('field.instructionText');\n        }\n    }),\n\n    _placeholder: computed(function () {\n        return this.get('intl').lookup('common.label').toString();\n    }),\n\n    customLabelTextChanged: observer('customLabelText', function () {\n        let label = this.get('customLabelText');\n        let entry = this.get('entry');\n        if (!entry) {\n            return;\n        }\n\n        if (label) {\n            this.set('entry.labelKey', label);\n        } else if (_.isEmpty(this.get('labelChoices'))) {\n            this.set('entry.labelKey', '');\n        } else {\n            this.set('entry.labelKey', this.get('labelChoices')[0].id);\n        }\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        var clickId = this.get('elementId');\n        Ember.$(document).on('click.' + clickId, event => {\n            Ember.run(() => {\n                var pickerParent = $(event.target).parents('.picker'),\n                    containerParent = $(event.target).parents(`#${clickId}`);\n                if (!pickerParent.length || !containerParent.length) {\n                    this.set('choicesHidden', true);\n                }\n            });\n        });\n    }),\n\n    attachTooltip: on('didInsertElement', function () {\n        if (this.get('instructionText') && this.get('showInstructionText')) {\n            this.$('.picker .btn').tooltip({\n                html: true,\n                title: () => {\n                    return this.get('instructionText');\n                },\n                placement: 'right',\n                trigger: 'hover'\n            });\n        }\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n        this.$('i.instruction-text').tooltip('destroy');\n    }),\n\n    keyPress(event) {\n        if (this.$('input').is(':focus') && event.keyCode === 13) {\n            this.set('customLabelText', this.get('customLabelText'));\n            this.send('toggleChoicesView');\n        }\n    },\n\n    keyDown(event) {\n        const target = event.target;\n        if ((event.keyCode === 13 || event.keyCode === 32) && target.classList.contains('current-entry')) {\n            event.preventDefault();\n            this.send('toggleChoicesView');\n            return false;\n        }\n        if (\n            (event.keyCode === 13 || event.keyCode === 32) &&\n            event.target.closest('li[id]') &&\n            event.target.closest('.choices')\n        ) {\n            event.preventDefault();\n            const choiceId = event.target.closest('li').id;\n            this.send('selectChoice', choiceId);\n            return false;\n        }\n    },\n\n    // Returned from label computed above if the label is a history field. Label is not like a form label here.\n    // It's the value of the thing from entry.value\n    labelForHistoryField() {\n        moment.locale(this.get('intl.isoLocale'));\n        var startDate = this.get('entry.value.startDate');\n        var endDate = this.get('entry.value.endDate');\n\n        if (_.isEmpty(startDate) && _.isEmpty(endDate)) {\n            if (this.get('fallbackToEmpty')) {\n                return '';\n            }\n            return this.get('field.i18nLabel');\n        }\n\n        var hasStartDate = Ember.get(startDate, 'year');\n        var hasEndDate = endDate ? Ember.get(endDate, 'year') : false;\n\n        if (!hasStartDate && !hasEndDate) {\n            return this.get('field.i18nLabel');\n        }\n\n        let now = moment();\n        const regex = /DD\\W|\\WDD/g;\n        let localeFormat = now._locale._longDateFormat.L;\n        localeFormat = localeFormat.replace(/MM/, 'M');\n        let monthYearLocaleFormat = localeFormat.replace(regex, '');\n\n        var monthYearFmt = monthYearLocaleFormat; // cannot hardcode this to a particular format because then we can't adjust based on locale\n        var yearFmt = 'YYYY';\n\n        var startDateFmt = yearFmt;\n        var endDateFmt = yearFmt;\n\n        if (hasStartDate && startDate.month) {\n            startDate = _.clone(startDate);\n            startDate.month = startDate.month - 1;\n            startDateFmt = monthYearFmt;\n        } else if (hasStartDate) {\n            startDate = _.clone(startDate);\n            startDate.month = 0;\n        }\n\n        if (hasEndDate && endDate.month) {\n            endDate = _.clone(endDate);\n            endDate.month = endDate.month - 1;\n            endDateFmt = monthYearFmt;\n        } else if (hasStartDate && hasEndDate) {\n            endDate = _.clone(endDate);\n            endDate.month = new Date().getMonth();\n        }\n\n        var result;\n        if (!startDate && endDate) {\n            result = moment(endDate).format(endDateFmt);\n        } else {\n            var mStartDate = moment(startDate);\n            var mEndDate = endDate ? moment(endDate) : moment();\n            if (endDate && endDate.month) {\n                mEndDate = mEndDate.endOf('month');\n            }\n\n            var difference = mEndDate.diff(mStartDate);\n            var duration = moment.duration(difference).humanize();\n\n            let placeholder = this.get('intl').lookup('entity.fieldTypes.history.toPlaceholder');\n            let formattedStartDate = mStartDate.format(startDateFmt);\n            let formattedEndDate = hasEndDate ? mEndDate.format(endDateFmt) : placeholder.toString();\n            result = `${formattedStartDate}&ndash;${formattedEndDate}<div class=\"duration label label-default\">${duration}</div>`;\n        }\n\n        return Ember.String.htmlSafe(result);\n    },\n\n    hasCustomLabelKey() {\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n        return !this.get('intl').query(`${baseKey}_labelKey_${labelKey}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"nM312VbL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"customLabels\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"writeable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picker custom-labels is-editing\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-entry btn btn-default\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoicesView\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[1,[26,[\\\"label\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"choicesHidden\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"choices list-unstyled\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-choice\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.labels.customLabel\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"placeholder\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-choice\\\"],null],[28,[\\\"customLabelText\\\"]],[28,[\\\"_placeholder\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[16,\\\"id\\\",[28,[\\\"choice\\\",\\\"id\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectChoice\\\",[28,[\\\"choice\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"choice\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"custom-labels not-editing\\\"],[16,\\\"for\\\",[26,[\\\"labelFor\\\"]],null],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"no-custom-labels\\\"],[16,\\\"for\\\",[26,[\\\"labelFor\\\"]],null],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/field-label/template.hbs\"}});","define(\"connections-ui/components/fixtable-column-header\", [\"exports\", \"fixtable-ember/components/fixtable-column-header\"], function (_exports, _fixtableColumnHeader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnHeader.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-column-label\", [\"exports\", \"fixtable-ember/components/fixtable-column-label\"], function (_exports, _fixtableColumnLabel) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnLabel.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-empty-state\", [\"exports\", \"fixtable-ember/components/fixtable-empty-state\"], function (_exports, _fixtableEmptyState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableEmptyState.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-footer\", [\"exports\", \"fixtable-ember/components/fixtable-footer\"], function (_exports, _fixtableFooter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableFooter.default;\n    }\n  });\n});\n","import FixtableGrid from 'fixtable-ember/components/fixtable-grid';\n\nexport default FixtableGrid.extend({\n    classNames: ['fixtable-grid']\n});\n","define(\"connections-ui/components/fixtable-row-toggle\", [\"exports\", \"fixtable-ember/components/fixtable-row-toggle\"], function (_exports, _fixtableRowToggle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRowToggle.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-row\", [\"exports\", \"fixtable-ember/components/fixtable-row\"], function (_exports, _fixtableRow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRow.default;\n    }\n  });\n});\n","define(\"connections-ui/components/flashy-webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/flashy-webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-editor'],\n\n    store: inject.service('store'),\n    session: inject.service(),\n\n    entity: null,\n    fieldData: null,\n    field: null,\n\n    location: null,\n    parentLocation: null,\n\n    editing: true,\n\n    saveLocation: () => {},\n\n    coordinates: {},\n    coordinatesRatio: {},\n\n    type: 'edit',\n\n    selectFloorplan: true,\n\n    entry: computed.alias('fieldData.value'),\n\n    actions: {\n        setCurrentFloor(floor) {\n            let entry = this.get('entry');\n\n            let data = {\n                coordinates: {},\n                locationId: floor.get('id'),\n                notes: ''\n            };\n\n            let floorplans = floor.get('floorplanImages');\n            floorplans = floor.get('floorplanImage');\n            if (floorplans) {\n                data.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', data);\n\n            let currentLocation = this.get('location');\n            let floors = this.get('floors');\n\n            this.set('location', floor);\n            this.send('showFloorplan');\n\n            if (currentLocation.get('isFloor')) {\n                floors.addObject(currentLocation);\n            }\n\n            floors.removeObject(floor);\n\n            floors = floors.sortBy('name');\n            this.set('floors', floors);\n        },\n\n        showFloorplan() {\n            if (this.get('floorplanImageUrl')) {\n                this.set('selectFloorplan', true);\n            }\n        },\n\n        saveFloorplan() {},\n\n        closeFloorplan: function () {\n            this.set('selectFloorplan', false);\n        }\n    },\n\n    loadInitialPinLocation: on('didRender', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let coordinates = this.get('entry.value.coordinates');\n            let img = this.$('.floorplan-image img');\n            if (!img) {\n                return;\n            }\n\n            img.one('load', () => {\n                let coords = this.getRatioCoordinates(coordinates, img[0], function (a, b) {\n                    return a * b;\n                });\n\n                this.attachPinForXY(coords.x, coords.y);\n            });\n        });\n    }),\n\n    floorplanImageUrl: computed('location.floorplanImage', function () {\n        let images = this.get('location.floorplanImage');\n        if (images && images.length > 0) {\n            let image = images.find(image => image.resolution === 'x800');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    showFloorplan: computed('floorplanImageUrl', 'selectFloorplan', function () {\n        return this.get('floorplanImageUrl') && this.get('selectFloorplan');\n    }),\n\n    floors: computed('location.floors.[]', 'parentLocation.floors.[]', 'location.{id,isFloor}', function () {\n        let locationFloors = this.get('location.floors');\n        let parentFloors = this.get('parentLocation.floors');\n        let floors = [];\n        if (locationFloors && locationFloors.length > 0) {\n            floors = locationFloors;\n        }\n        if (parentFloors && parentFloors.length > 0) {\n            floors = parentFloors;\n        }\n        // Remove yourself\n        if (this.get('location.isFloor') && floors.length > 0) {\n            floors = floors.filter(floor => floor.get('id') !== this.get('location.id'));\n        }\n        return floors;\n    }),\n\n    loadFloors() {\n        return;\n    },\n\n    updateCoordinatesRatio: observer('coordinates', function () {\n        let coordinates = this.get('coordinates');\n        if (!!coordinates) {\n            let img = this.$('.floorplan-image img')[0];\n            let coords = this.getRatioCoordinates(coordinates, img, function (a, b) {\n                return a / b;\n            });\n\n            if (img) {\n                this.set('coordinatesRatio', {\n                    x: coords.x,\n                    y: coords.y\n                });\n            }\n        } else {\n            this.set('coordinatesRatio', {});\n        }\n    }),\n\n    updateCoordinatesOnLocation: observer('coordinatesRatio', function () {\n        let ratio = this.get('coordinatesRatio');\n        let entry = this.get('entry');\n\n        let value = entry.value;\n        value.coordinates = ratio;\n\n        Ember.set(entry, 'value', value);\n    }),\n\n    click(event) {\n        let target = Ember.$(event.target);\n\n        if (target.parent().is('.floorplan-image') && target.is('img') && this.get('editing')) {\n            let x = event.offsetX || event.clientX - $(event.target).offset().left + window.pageXOffset;\n            let y = event.offsetY || event.clientY - $(event.target).offset().top + window.pageYOffset;\n\n            this.attachPinForXY(x, y);\n\n            this.set('coordinates', {\n                x: x,\n                y: y\n            });\n        }\n    },\n\n    getRatioCoordinates(coordinates, image, operation) {\n        if (!image) {\n            return { x: 0, y: 0 };\n        }\n\n        let naturalHeight = image.naturalHeight;\n        let naturalWidth = image.naturalWidth;\n        let heightDiff = naturalHeight - image.height;\n        let widthDiff = naturalWidth - image.width;\n\n        let x = operation(coordinates.x, naturalWidth - widthDiff);\n        let y = operation(coordinates.y, naturalHeight - heightDiff);\n\n        return { x: x, y: y };\n    },\n\n    attachPinForXY(x, y) {\n        let icon = $('<i class=\"pin pc pc-location\"></i><i class=\"pin shadow pc pc-location\"></i>').css({\n            position: 'absolute',\n            left: x - 12,\n            top: y - 12\n        });\n\n        let currentPin = this.$('i.pin');\n        if (currentPin) {\n            this.$('i.pc-location').remove();\n        }\n\n        const image = this.$('.floorplan-image');\n        if (image) {\n            image.append(icon);\n        }\n    },\n\n    floorSorter(a, b) {\n        let init = [a.get('name'), b.get('name')];\n        let sorted = init.sort();\n        if (sorted[0] === a.get('name')) {\n            return 1;\n        } else {\n            return -1;\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"xheP5PK6\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"locations\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.floors\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"isFloor\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-location\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"location\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"floors\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"setCurrentFloor\\\",[28,[\\\"floor\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"floor\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"floor\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showFloorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.selectOffice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-image\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[26,[\\\"floorplanImageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"locations.noFloorplan\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-editor/template.hbs\"}});","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nconst { on, Component, run } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-popover'],\n    classNameBindings: ['show::hide'],\n\n    show: false,\n    attachmentId: '',\n    hidePopover: () => {},\n\n    tetherConstraints: {\n        pin: ['left', 'right']\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        const show = this.get('show');\n        if (show) {\n            run.scheduleOnce('afterRender', this, this._createPopper);\n        } else {\n            run.scheduleOnce('afterRender', this, this._destroyPopper);\n        }\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _createPopper() {\n        if (this._popper) {\n            return;\n        }\n\n        const targetEl = document.querySelector(`#${this.get('attachmentId')}`);\n        const popoverEl = this.element;\n        if (!targetEl || !popoverEl) {\n            return;\n        }\n\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        run.later(() => {\n            this.$('img').on(\n                'load',\n                Ember.run.bind(this, () => {\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                })\n            );\n        }, 10);\n    },\n\n    attachClickHandler: on('didInsertElement', function () {\n        Ember.$(document).on(\n            `click.${this.get('elementId')}`,\n            Ember.run.bind(this, event => {\n                if (!this.get('show')) {\n                    return;\n                }\n\n                let target = Ember.$(event.target);\n\n                if (\n                    target.parents('.floorplan-action').length ||\n                    target.parents('.floorplan-popover').length ||\n                    target.parent('.location-name').length ||\n                    target.parent('.mini-card-component-wrapper').length\n                ) {\n                    return;\n                } else {\n                    this.get('hidePopover')();\n                }\n            })\n        );\n    }),\n\n    removeHandlers: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"j0uG/gql\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popover-content\\\"],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-popover/template.hbs\"}});","define(\"connections-ui/components/font-icon/component\", [\"exports\", \"ember-purecloud-components/components/font-icon/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nlet GroupContactModalComponent = Ember.Component.extend({\n    classNames: ['group-contact-form'],\n    classNameBindings: ['group-ring-voicemail'],\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    fileUpload: Ember.inject.service('file-upload'),\n\n    entity: Ember.computed.reads('model'),\n\n    attrs: {\n        close: () => {},\n        disableModal: () => {}\n    },\n\n    saveContactInfo: () => {},\n\n    number: null,\n    extension: null,\n    originalExtension: null,\n\n    voicemailFile: null,\n    showVoicemailOptions: false,\n    // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n    resetGreeting: false,\n\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n\n    actions: {\n        saveForm() {\n            this.saveContactInfo();\n        },\n\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n            }\n        },\n\n        toggleVoicemail() {\n            this.toggleProperty('voicemailOn');\n        },\n\n        toggleEmailNotification() {\n            this.toggleProperty('emailNotificationOn');\n        },\n\n        toggleOptions() {\n            this.toggleProperty('showVoicemailOptions');\n        },\n        // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n        cancel() {\n            this.attrs.close();\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableModal(key, value) {\n            this.set(key, value);\n            this.attrs.disableModal(value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n        Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n    },\n\n    numberOfRotations: Ember.computed('entity.numberOfRotations', 'entity.numberOfRotations.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.numberOfRotations.content');\n        }\n    }),\n\n    rotateCallSeconds: Ember.computed('entity.rotateCallSeconds', 'entity.rotateCallSeconds.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.rotateCallSeconds.content');\n        }\n    }),\n\n    _voicemailOn: false,\n    voicemailOn: Ember.computed(\n        'entity.voicemailEnabled',\n        'entity.voicemailEnabled.{content,isFulfilled}',\n        'editingVoicemailDisabled',\n        {\n            get() {\n                if (this.get('entity.isSaving')) {\n                    return this._voicemailOn;\n                }\n\n                if (this.get('editingVoicemailDisabled')) {\n                    this._voicemailOn = false;\n                    return false;\n                }\n\n                const value =\n                    this.get('entity.voicemailEnabled.isFulfilled') && this.get('entity.voicemailEnabled.content');\n\n                this._voicemailOn = value;\n                return value;\n            },\n\n            set(key, value) {\n                this._voicemailOn = value;\n\n                return value;\n            }\n        }\n    ),\n\n    emailNotificationOn: Ember.computed(\n        'entity.emailNotificationEnabled',\n        'entity.emailNotificationEnabled.{content,isFulfilled}',\n        {\n            get() {\n                return this.get('entity.emailNotificationEnabled');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    ),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if ((originalExtension && extension !== originalExtension) || this.get('entity.isSaving')) {\n            return false;\n        }\n\n        return !!this.get('entity.number.rel.errorCode');\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        function () {\n            const number = this.get('number');\n            const ext = this.get('extension');\n\n            if (_.isEmpty(number) && _.isEmpty(ext)) {\n                return true;\n            }\n\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (!number) {\n                return !this.get('invalidExtension');\n            }\n\n            return !this.get('invalidPhoneNumber');\n        }\n    ),\n\n    isInvalid: Ember.computed.not('isValid'),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (this.get('invalidExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidExtension').toString();\n        } else if (this.get('invalidPhoneNumber')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidPhoneNumber').toString();\n        } else if (this.get('haveNumberAndExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.numberAndExtension').toString();\n        }\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        const elem = this.$('.group-ring-phone-input');\n        if (elem) {\n            return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber');\n        }\n        return false;\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    showGroupEmail: Ember.computed(function () {\n        return false; // maybe true in the future...\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting.content');\n        return !!greeting;\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.audioFile.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    showEmailNotification: Ember.computed.not('session.org.hasHipaaEnabled'),\n    // ^^^ This corresponds to `emailNotifications.show` in `group-profile/group-contact-panel/*`.\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        this.attrs.disableModal(!this.get('isValid'));\n    }),\n\n    setupInput() {\n        this.$('.group-ring-phone-input').intlTelInput({\n            nationalMode: false,\n            utilsScript: `${this.get('application.urlprefix')}assets/intltelinput/utils.js`\n        });\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n\n        if (!_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(inputElem.intlTelInput('getNumber'))) {\n                inputElem.intlTelInput('setNumber', info.number);\n            }\n\n            if (_.isEmpty(extElem.val())) {\n                extElem.val(info.extension);\n            }\n\n            this.set('number', info.number);\n            this.set('extension', info.extension);\n\n            this.set('originalExtension', info.extension);\n        }\n    },\n\n    async uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        if (this.get('session.features.EC-760')) {\n            return await this.get('fileUpload').uploadGreetingWithPreSigned(file, this.get('entity.guid'));\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('entity.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    save() {\n        const entity = this.get('entity');\n        const ajax = this.get('ajax');\n        const notification = this.get('notification');\n        const application = this.get('application');\n\n        const { voicemailOn, numberOfRotations, rotateCallSeconds, emailNotificationOn } = this.getProperties(\n            'voicemailOn',\n            'numberOfRotations',\n            'rotateCallSeconds',\n            'emailNotificationOn'\n        );\n\n        this.setNumberData();\n\n        const promise = entity.save();\n        let showExtensionErrorNotification = false;\n\n        // Reset since we are saving\n        this.set('originalExtension', null);\n\n        promise\n            .then(() => {\n                const haveError = !!entity.get('number.rel.errorCode');\n\n                if (!this.get('isEmpty') && !haveError) {\n                    return entity.get('policy').then(policy => {\n                        policy.setProperties({\n                            enabled: voicemailOn,\n                            rotateCallsSecs: rotateCallSeconds,\n                            stopRingingAfterRotations: numberOfRotations,\n                            sendEmailNotifications: emailNotificationOn\n                        });\n                        return policy.save();\n                    });\n                }\n\n                showExtensionErrorNotification = haveError;\n            })\n            .then(() => {\n                const resetGreeting = this.get('resetGreeting');\n                if (resetGreeting) {\n                    return this.get('entity.greeting').then(greeting => {\n                        let path = greeting.selfUri;\n                        if (_.head(path) === '/') {\n                            path = path.substring(1);\n                        }\n                        const url = application.pcV2Uri(path);\n                        return ajax.delete(url);\n                    });\n                } else {\n                    let file = this.get('recordingFile');\n                    if (!file) {\n                        file = this.get('voicemailFile');\n                    }\n\n                    return this.uploadGreeting(file);\n                }\n            })\n            .then(() => {\n                entity.notifyPropertyChange('greeting');\n            });\n\n        return promise\n            .then(() => {\n                let title = this.get('entity.name');\n                let message = this.get('intl').lookup('notification.group.general');\n                let handler = notification.info.bind(notification);\n\n                if (showExtensionErrorNotification) {\n                    handler = notification.error.bind(notification);\n\n                    const isExtensionResourceInUse = this.get('isExtensionResourceInUse');\n                    const isExtensionNotInPool = this.get('isExtensionNotInPool');\n\n                    if (isExtensionNotInPool) {\n                        title = this.get('intl').lookup('notification.group.extensionNotInPoolError.title');\n                        message = this.get('intl').lookup('notification.group.extensionNotInPoolError.message');\n                    } else if (isExtensionResourceInUse) {\n                        title = this.get('intl').lookup('notification.group.resourceInUseError.title');\n                        message = this.get('intl').lookup('notification.group.resourceInUseError.message');\n                    } else {\n                        title = this.get('intl').lookup('notification.group.groupRingExtensionError.title');\n                        message = this.get('intl').lookup('notification.group.groupRingExtensionError.message');\n                    }\n                }\n\n                handler(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n            })\n            .catch(err => {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.saveError');\n                notification.error(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                Ember.Logger.error(message, err);\n            })\n            .finally(() => {\n                this.attrs.close();\n                entity.reload();\n            });\n    },\n\n    setNumberData() {\n        var number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        var extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('entity.contactInfo'))) {\n                this.set('entity.contactInfo', {});\n            }\n\n            var valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            var emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('entity.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('entity.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('entity.contactInfo.groupNumber.firstObject.value.extension', extension);\n    }\n});\n\nexport default GroupContactModalComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {},\n        disableModal: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableModal(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"rA8lkHhw\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"dNb/ur5f\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showGroupEmail\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"email\\\"],[15,\\\"id\\\",\\\"group-email\\\"],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],null],[16,\\\"value\\\",[26,[\\\"email\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number phone-field\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[15,\\\"class\\\",\\\"group-ring-phone-input form-control\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"group-ring-extension-input form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"call-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRingNotice\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"rotateCallSeconds\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"numberOfRotations\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.voicemail\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"voicemailEnabled\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemailOn\\\"]],[28,[\\\"editingVoicemailDisabled\\\"]],\\\"toggleVoicemail\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingVoicemailDisabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"haveExtensionError\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionResourceInUse\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inUseError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionNotInPool\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.extensionError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.genericError\\\"],null],false],[0,\\\"\\\\n                        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.editingVoicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemailOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"greeting\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleOptions\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEmailNotification\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotification\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotificationOn\\\"]],\\\"toggleEmailNotification\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotificationOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotificationHelpText\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport DS from 'ember-data';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport FieldSection from '../../field-config/field-section';\n\nimport { BASE_PERSON } from '../../models/person';\n\nconst { Component, run, inject, RSVP } = Ember;\n\nlet jobEndpoint = function (id) {\n    return `/api/v2/jobs/${id}`;\n};\n\nlet GroupProfileComponent = Component.extend(EntityControllerMixin, {\n    classNames: ['group-profile', 'entity'],\n    classNameBindings: ['chatEnabled'],\n\n    intl: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    favorites: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    phoneEnabled: Ember.computed.bool('permissions.phoneEnabled'),\n    chatEnabled: Ember.computed.alias('chatService.enabled'),\n    model: null,\n\n    showDropdown: false,\n\n    isEditing: false,\n    showContactInfo: false,\n    saves: [],\n\n    groupRoom: null,\n    showMembers: true,\n    showLinkDropdown: false,\n    displayIndices: false,\n\n    hasLinks: false,\n    hasInformals: false,\n\n    isLoading: false,\n\n    displayWarningModal: false,\n\n    activeTab: 'members',\n    shouldFocusToggle: false,\n\n    excludedFieldSections: ['general', 'images', 'membership', 'membershipDraft', 'privacy', 'owners'],\n\n    excludedMembershipFields: ['includeOwners', 'exclusions', 'inclusions'],\n\n    excludedEditingFields: ['compiledQuery'],\n\n    view: Ember.$('<div class=\"center-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>'),\n\n    toggleLoading: Ember.observer('isLoading', function () {\n        if (this.get('_state') === 'inDOM' && this.get('isLoading')) {\n            this.$('.field-section .content').append(this.get('view'));\n        } else if (this.$()) {\n            this.$('.center-indicator').remove();\n        }\n    }),\n\n    generalExcludedEditingFields: ['groupType'],\n\n    actions: {\n        selectTab(tab) {\n            this.set('activeTab', tab);\n        },\n\n        toggleCallsEnabled() {\n            if (!this.get('callsEnabled') && this.get('hasRules')) {\n                this.set('displayWarningModal', true);\n            } else {\n                this.set('shouldFocusToggle', true);\n                this.toggleProperty('callsEnabled');\n                this.saveCallsEnabledState();\n            }\n            this.set('isEditing', false);\n        },\n\n        toggleEditing() {\n            if (!this.get('isEditing')) {\n                this.get('model').reload();\n            }\n            this.toggleProperty('isEditing');\n        },\n\n        changeEditingMode(editing) {\n            this.set('isEditing', editing);\n        },\n\n        editGeneralInfo() {\n            this.set('isShowingGeneralModal', true);\n        },\n\n        editContactInfo() {\n            this.set('showContactInfo', true);\n        },\n\n        cancelEditContactInfo() {\n            this.set('showContactInfo', false);\n        },\n\n        editPrivacyRules() {\n            this.set('isShowingPrivacyModal', true);\n        },\n\n        toggleLinks() {\n            this.toggleProperty('showLinkDropdown');\n        },\n\n        goToLink(href) {\n            if (href.indexOf('http://') !== -1 || href.indexOf('https://') !== -1) {\n                window.open(href, '_blank');\n            } else {\n                window.open('http://' + href, '_blank');\n            }\n        },\n\n        confirmGeneral() {\n            const notification = this.get('notification');\n            const group = this.get('model');\n            group\n                .save()\n                .then(data => {\n                    Ember.Logger.debug('GROUP-PROFILE: group saved', data);\n                    this.closeAllModals();\n                    if (!_.isEmpty(data)) {\n                        if (data.job) {\n                            this.handleJob(data.job);\n                        }\n                    }\n\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.general');\n                    notification.info(title, message, {\n                        forceBrowserNotification: true,\n                        hideAfter: 5\n                    });\n                })\n                .catch(e => {\n                    Ember.Logger.error('group save failed', { error: e });\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.saveError');\n                    notification.error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    group.reload();\n                });\n\n            this.send('setHasLinks');\n        },\n\n        cancelGeneral() {\n            this.get('model').reload();\n            this.closeAllModals();\n        },\n\n        confirm() {\n            const notification = this.get('notification');\n            let model = this.get('model');\n            if (model.get('owners.owners.length') === 0) {\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('notification.group.noOwners').toString();\n                notification.info(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                model.reload();\n            } else {\n                this.set('isLoading', true);\n\n                model.save().then(() => {\n                    const title = this.get('model.name');\n                    const message = this.get('intl').lookup('notification.group.general').toString();\n                    notification.show(title, message, {\n                        hideAfter: 8\n                    });\n\n                    var job = this.store.metadataFor('group').job;\n                    this.handleJob(job);\n                    this.set('isLoading', false);\n                });\n            }\n\n            return false;\n        },\n\n        noop() {},\n\n        deleteGroup() {\n            this.set('isShowingDeleteModal', true);\n        },\n\n        cancelDelete() {\n            this.closeAllModals();\n        },\n\n        confirmDelete() {\n            const notification = this.get('notification');\n            const model = this.get('model');\n            const id = model.get('id');\n            const groupType = model.get('groupType');\n            const person = this.get('session.person');\n\n            model.deleteRecord();\n            model\n                .save()\n                .then(group => {\n                    Ember.Logger.debug('GROUP-PROFILE: Deleted Group: ', group);\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleting');\n                    notification.info(title, message, {\n                        icon: '',\n                        hideAfter: 8\n                    });\n                    this.closeAllModals();\n                    window.history.back();\n                })\n                .then(function () {\n                    if (groupType) {\n                        const type = groupType.toLowerCase();\n                        const groups = person.get(`groups.${type}`) || [];\n                        const groupData = groups.findBy('value', id);\n                        groups.removeObject(groupData);\n                    }\n                })\n                .catch(e => {\n                    Ember.Logger.error('GROUP-PROFILE: Error deleting group', {\n                        error: e\n                    });\n\n                    model.set('state', 'active');\n\n                    const title = model.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleteError');\n                    notification.error(title, message, {\n                        icon: ''\n                    });\n                });\n        },\n\n        setHasLinks() {\n            let links = this.get('model.general.links');\n            if (links && links !== undefined) {\n                this.set('hasLinks', links.length > 0 && links[0].value !== '');\n            } else {\n                this.set('hasLinks', false);\n            }\n        },\n\n        makeCall: debounce(function () {\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [this.get('phoneNumber')]\n            });\n        }, 250),\n\n        confirmWarningModal() {\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n            this.set('displayWarningModal', false);\n            this.set('shouldFocusToggle', true);\n            this.set('callsEnabled', true);\n            this.saveCallsEnabledState();\n        },\n\n        closeWarningModal() {\n            this.set('displayWarningModal', false);\n        },\n\n        toggleGroupProfileEditPopover(status) {\n            this.set('showDropdown', !status);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('model') && !this.get('model.uniqueRoleCount')) {\n            const group = this.get('model');\n            group.getGrants();\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.setupToggleAccessibility();\n        this.setupKeyboardHandlers();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.teardownKeyboardHandlers();\n    },\n\n    setupKeyboardHandlers() {\n        this._handleEscapeKey = event => {\n            if (event.key === 'Escape' && this.get('showDropdown')) {\n                this.set('showDropdown', false);\n                // Return focus to the edit button that opened the popover\n                run.scheduleOnce('afterRender', this, function () {\n                    const editButton = this.$('#group-profile-edit');\n                    if (editButton && editButton.length) {\n                        editButton.focus();\n                    }\n                });\n            }\n        };\n        document.addEventListener('keydown', this._handleEscapeKey);\n    },\n\n    teardownKeyboardHandlers() {\n        if (this._handleEscapeKey) {\n            document.removeEventListener('keydown', this._handleEscapeKey);\n        }\n    },\n\n    // Observer to reapply accessibility attributes when toggle state changes\n    callsEnabledObserver: Ember.observer('callsEnabled', function () {\n        run.scheduleOnce('afterRender', this, 'setupToggleAccessibility');\n        // Focus the toggle in the newly displayed template if it was triggered by user action\n        if (this.get('shouldFocusToggle')) {\n            run.scheduleOnce('afterRender', this, 'focusToggleAfterSwitch');\n        }\n    }),\n\n    // Observer to handle conditional voicemail-related toggles\n    voicemailStateObserver: Ember.observer('model.policy.enabled', function () {\n        run.scheduleOnce('afterRender', this, 'setupConditionalToggleAccessibility');\n    }),\n\n    setupToggleAccessibility() {\n        // Fix accessibility issue with toggle switch\n        run.schedule('afterRender', this, function () {\n            const toggleInput = this.$('.toggle-switch-wrapper .switch-input');\n            const innerLabel = this.$('.toggle-switch-wrapper .toggle-switch[title]');\n            const labelText = this.get('intl').lookup('groups.groupRing.enableCalls');\n\n            if (toggleInput.length && labelText) {\n                // Associate the input with the existing label\n                toggleInput.attr('aria-labelledby', this.get('callsEnabled') ? 'toggleLabel' : 'membershipToggleLabel');\n                toggleInput.attr('aria-label', labelText);\n            }\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && labelText) {\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n            // Map of label IDs to their corresponding toggle switch selectors (always visible)\n            const toggleMappings = [\n                {\n                    labelId: 'forward-call-label',\n                    toggleSelector: '.backup-container .switch-input',\n                    innerLabelSelector: '.backup-container .toggle-switch[title]'\n                },\n                {\n                    labelId: 'voicemails-label',\n                    toggleSelector: '.group-voicemail .switch-input',\n                    innerLabelSelector: '.group-voicemail .toggle-switch[title]'\n                }\n            ];\n\n            toggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n                const innerLabel = this.$(mapping.innerLabelSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                    // Remove any existing sr-only text to avoid duplicates\n                    innerLabel.find('.sr-only').remove();\n                    const srText = Ember.$('<span class=\"sr-only\">' + label.text() + '</span>');\n                    innerLabel.prepend(srText);\n                }\n            });\n\n            // Handle conditional toggles that appear when voicemails are enabled\n            this.setupConditionalToggleAccessibility();\n        });\n    },\n\n    setupConditionalToggleAccessibility() {\n        // Handle toggles that are conditionally rendered when voicemails are enabled\n        run.schedule('afterRender', this, function () {\n            const conditionalToggleMappings = [\n                {\n                    labelId: 'email-notifications-label',\n                    toggleSelector: '.email-notification .switch-input',\n                    innerLabelSelector: '.email-notification .toggle-switch[title]'\n                },\n                {\n                    labelId: 'pii-email-notifications-label',\n                    toggleSelector: '.email-notification-pii .switch-input',\n                    innerLabelSelector: '.email-notification-pii .toggle-switch[title]'\n                },\n                {\n                    labelId: 'transcriptions-label',\n                    toggleSelector: '.voicemail-transcription .switch-input',\n                    innerLabelSelector: '.voicemail-transcription .toggle-switch[title]'\n                }\n            ];\n\n            conditionalToggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n                const innerLabel = this.$(mapping.innerLabelSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                    // Remove any existing sr-only text to avoid duplicates\n                    innerLabel.find('.sr-only').remove();\n                    const srText = Ember.$('<span class=\"sr-only\">' + label.text() + '</span>');\n                    innerLabel.prepend(srText);\n                }\n            });\n        });\n    },\n\n    focusToggleAfterSwitch() {\n        // Focus the toggle in the newly displayed template\n        // Use a small delay to ensure the DOM has fully rendered after the conditional template switch\n        run.later(\n            this,\n            function () {\n                const callsEnabled = this.get('callsEnabled');\n                let toggleSelector;\n\n                if (callsEnabled) {\n                    // When callsEnabled is true, the group-contact-panel is shown with toggle in group-header\n                    toggleSelector = '.group-header .header-right .toggle-switch-wrapper .switch-input';\n                } else {\n                    // When callsEnabled is false, the membership-listing is shown with toggle in membership-header\n                    toggleSelector = '.membership-header .header-right .toggle-switch-wrapper .switch-input';\n                }\n\n                const toggleInput = this.$(toggleSelector);\n                if (toggleInput.length) {\n                    toggleInput.focus();\n                }\n\n                // Reset the flag\n                this.set('shouldFocusToggle', false);\n            },\n            50\n        );\n    },\n\n    closeAllModals() {\n        this.setProperties({\n            isShowingDeleteModal: false,\n            isShowingPrivacyModal: false,\n            isShowingGeneralModal: false\n        });\n    },\n\n    ensureCorrectLinksState: Ember.on('init', function () {\n        run.scheduleOnce('afterRender', this, function () {\n            this.send('setHasLinks');\n        });\n    }),\n\n    membersTabSelected: Ember.computed.equal('tabSelected', 'members'),\n\n    settingsTabSelected: Ember.computed.equal('tabSelected', 'settings'),\n\n    generalFieldConfigSection: Ember.computed('groupRingVisible', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [\n            config.get('general.name'),\n            config.get('general.groupType'),\n            config.get('general.description'),\n            config.get('general.links'),\n            config.get('membership.includeOwners'),\n            config.get('contactInfo.email')\n        ];\n\n        let fieldSection = FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: this.get('model.fieldConfig'),\n            instructionText: null,\n            fieldList: fields\n        });\n\n        // Override setting general section on non-general fields\n        fieldSection.get('includeOwners').set('section', config.get('membership'));\n        fieldSection.get('email').set('section', config.get('contactInfo'));\n\n        return fieldSection;\n    }),\n\n    privacyFieldConfigSection: Ember.computed(function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('privacy.groupVisibility'), config.get('privacy.membershipVisible')];\n\n        return FieldSection.create({\n            key: 'privacy',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    linksFieldSection: Ember.computed('model.general.links.@each.value', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('general.links')];\n\n        return FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    callsEnabled: Ember.computed('model.contactInfo.allowCallConfiguration.firstObject.value', 'phoneEnabled', {\n        get() {\n            return this.get('phoneEnabled') && this.get('model.contactInfo.allowCallConfiguration.firstObject.value');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    phoneNumber: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        return this.get('model.contactInfo.groupNumber.firstObject');\n    }),\n\n    dialableNumber: Ember.computed('phoneNumber', function () {\n        return this.get('addressformat').format(this.get('phoneNumber'));\n    }),\n\n    phoneRef: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        var number = this.get('model.contactInfo.groupNumber.firstObject.rel.e164');\n        return `tel:#${number}`;\n    }),\n\n    name: Ember.computed('model.general.name.@each.value', function () {\n        return this.get('model').getFieldValue('general.name');\n    }),\n\n    description: Ember.computed('model.general.description.@each.value', function () {\n        return this.get('model').getFieldValue('general.description');\n    }),\n\n    groupType: Ember.computed('model.general.groupType.@each.value', function () {\n        return this.get('model').getFieldValue('general.groupType');\n    }),\n\n    groupVisibility: Ember.computed('model.privacy.groupVisibility.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.groupVisibility');\n    }),\n\n    membershipVisible: Ember.computed('model.privacy.membershipVisible.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.membershipVisible');\n    }),\n\n    includeOwners: Ember.computed('model.membership.includeOwners.@each.value', function () {\n        return this.get('model').getFieldValue('membership.includeOwners');\n    }),\n\n    email: Ember.computed('model.contactInfo.email.@each.value', function () {\n        return this.get('model').getFieldValue('contactInfo.email');\n    }),\n\n    groupTypeIcon: Ember.computed('model.general.groupType', function () {\n        let groupType = this.get('model').getFieldValue('general.groupType').value;\n        let icon = 'pc pc-official-group';\n\n        if (groupType === 'groups.social') {\n            icon = 'pc pc-social-group';\n        }\n\n        return icon;\n    }),\n\n    groupOwners: Ember.computed('model.owners.owners.[]', function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let promise = RSVP.resolve([]);\n\n        if (owners) {\n            promise = this.store.findMany('person', owners.mapBy('guid'), BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    membershipHeader: Ember.computed('model.memberCount', function () {\n        const count = this.get('model.memberCount');\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    groupRolesHeader: Ember.computed('model.uniqueRoleCount', function () {\n        const count = this.get('model.uniqueRoleCount');\n        return this.get('intl').lookup('groups.roles.rolesWithCount', { count }).toString();\n    }),\n\n    sections: Ember.computed('fieldSections', function () {\n        return this.get('fieldSections');\n    }),\n\n    canEditLeftRailInfo: Ember.computed.alias('canEditInformation'),\n    canEditProfilePicture: Ember.computed.alias('canEditInformation'),\n    canEditInformation: Ember.computed(\n        'model.owners.owners.[]',\n        'session.person',\n        'session.person.isAdmin',\n        'permissions.canEditGroups',\n        function () {\n            let namedPermissions = this.get('session.namedPermissions') || [];\n            let isOwner = this.get('model').isPersonOwner(this.get('session.person'));\n            let canEditGroups = this.get('permissions.canEditGroups');\n\n            return (\n                isOwner ||\n                canEditGroups ||\n                this.get('session.person.isAdmin') ||\n                _.includes(namedPermissions, 'group_administration')\n            );\n        }\n    ),\n\n    canEditGroupTelephonySettings: Ember.computed.readOnly('permissions.canEditGroupTelephonySettings', function () {\n        return this.get('permissions.canEditGroupTelephonySettings');\n    }),\n    disableToggleCalls: Ember.computed.not('canEditGroupTelephonySettings'),\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        const hasRolesView = this.get('session').hasPermissionAndDivision('authorization:role:view');\n        const hasGrantsEdit = this.get('session').hasPermissionAndDivision('authorization:grant:add');\n        return hasRolesView.hasPermission && hasGrantsEdit.hasPermission;\n    }),\n\n    canDeleteGroup: Ember.computed.reads('permissions.canDeleteGroup'),\n\n    updateLinksChange: Ember.observer('model.general.links.@each.value', function () {\n        this.send('setHasLinks');\n    }),\n\n    setHasInformals: Ember.observer('model.images.gallery', 'model.images.gallery.length', function () {\n        let informals = this.get('model.images.gallery');\n        if (informals && informals !== undefined) {\n            this.set('hasInformals', informals.length > 0);\n        } else {\n            this.set('hasInformals', false);\n        }\n    }),\n\n    checkMembers: Ember.observer('model.membership', function () {\n        let exclusions = this.get('model.membership.exclusions') !== undefined;\n        let inclusions = this.get('model.membership.inclusions') !== undefined;\n        let canEdit = this.get('canEditMembership.labelKey') === 'owners' || this.get('session.person.isAdmin');\n\n        let value = exclusions || inclusions || canEdit;\n        this.set('showMembers', value);\n    }),\n\n    canEditMembership: Ember.computed(function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let isOwner = _.find(owners, owner => owner.value === this.get('session.person.id'));\n\n        return isOwner || this.get('session.person.isAdmin');\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    saveCallsEnabledState() {\n        const model = this.get('model');\n        const callsEnabled = this.get('callsEnabled');\n        if (!callsEnabled) {\n            model.set('contactInfo.groupNumber', [], { overwrite: true });\n        }\n        model.set('contactInfo.allowCallConfiguration', callsEnabled);\n        return model\n            .save()\n            .then(() => {\n                model.get('policy').then(policy => {\n                    if (!this.get('callsEnabled')) {\n                        this.get('store').unloadRecord(policy);\n                        this.get('store')\n                            .findRecord('group-policy', model.get('guid'))\n                            .then(policy => {\n                                this.set('policy', policy);\n                            });\n                    }\n                });\n            })\n            .catch(() => {\n                this.toggleProperty('callsEnabled');\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('groups.groupRing.enableCallsError');\n                this.get('notification').error(title, message, {\n                    forceBrowserNotification: true\n                });\n                return Ember.RSVP.reject();\n            });\n    },\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    },\n\n    handleJob(job) {\n        if (job) {\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 2000);\n        }\n    },\n\n    getJobData(job) {\n        return this.get('ajax')\n            .request(jobEndpoint(job.jobId))\n            .then(data => {\n                data = data.res;\n\n                let retryJobId = data.retryJobId;\n\n                if (data.status !== 'in-progress' && data.status !== 'pending') {\n                    window.clearInterval(job.interval);\n\n                    if (data.status === 'retry') {\n                        job.jobId = retryJobId;\n                        this.handleJob(job);\n                    } else if (job.status !== 'failed') {\n                        this.get('model').reload();\n                    }\n                }\n            })\n            .catch(() => {\n                window.clearInterval(job.interval);\n\n                this.get('model').reload();\n            });\n    },\n\n    commitRevertHandler(data) {\n        let model = this.get('model');\n        model.set('version', data.res.version);\n\n        // Ember-Data is doing something weird and not marking as saved, so we do this manually\n        model.save().then(function (group) {\n            group.adapterDidCommit();\n        });\n    }\n});\nexport default GroupProfileComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-acd-expressions'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    notification: inject.service('notification-proxy'),\n\n    group: null,\n    showSaveModal: false,\n    showCancelModal: false,\n    loading: false,\n    previewValue: null,\n\n    expressionDisplay: computed('group.expression.@each.{display,opAnd}', function () {\n        const conditions = this.get('group.expression');\n        let display = '';\n        let valid = true;\n\n        if (!conditions || conditions.length === 0) {\n            return this.get('intl').t('groups.expressions.empty');\n        }\n\n        conditions.forEach(con => {\n            if (con.display === null || con.display === undefined) {\n                valid = false;\n                return;\n            }\n\n            display += con.display;\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    //last rule\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n        });\n\n        const empty = display.replace(/[()]/g, '').trim().length === 0;\n        if (empty) {\n            display = this.get('intl').t('groups.expressions.empty');\n        } else if (!valid) {\n            display = this.get('intl').t('groups.expressions.invalid');\n        }\n\n        return display;\n    }),\n\n    saveDisabled: computed('group.expression.@each.display', 'loading', function () {\n        const invalid = this.get('group.expression').filterBy('display', null).length > 0;\n        const loading = this.get('loading');\n        return invalid && !loading;\n    }),\n\n    maximumExpressions: computed('group.expression.length', 'group.expression.@each.length', function () {\n        //we have a limit of 3 skills total\n        const skills = this.get('group.expression').mapBy('rules');\n        return _.flatten(skills).length >= 3;\n    }),\n\n    numberPreview: computed('previewValue', function () {\n        return isNaN(this.get('previewValue')) ? this.get('intl').t('purecloud.unknown') : this.get('previewValue');\n    }),\n\n    actions: {\n        selectTab(tab) {\n            this.selectTab(tab);\n        },\n        addCondition() {\n            if (!this.get('maximumExpressions')) {\n                if (this.get('group.expression') && this.get('group.expression').length > 0) {\n                    let exp = this.get('group.expression');\n                    exp.forEach(condition => {\n                        Ember.set(condition, 'lastCondition', false);\n                        if (condition.operation === null) {\n                            Ember.set(condition, 'operation', 'AND');\n                            Ember.set(condition, 'opAnd', true);\n                        }\n                    });\n                    exp.pushObject({\n                        lastCondition: true,\n                        operation: 'OR',\n                        opAnd: false,\n                        display: null,\n                        rules: [\n                            {\n                                skill: null,\n                                comparator: null,\n                                proficiency: null,\n                                operation: 'OR',\n                                lastRule: true,\n                                opAnd: false\n                            }\n                        ]\n                    });\n                    Ember.set(exp, 'lastObject.lastCondition', true);\n                } else {\n                    this.set('group.expression', [\n                        {\n                            lastCondition: true,\n                            operation: 'OR',\n                            opAnd: false,\n                            display: null,\n                            rules: [\n                                {\n                                    skill: null,\n                                    comparator: null,\n                                    proficiency: null,\n                                    operation: 'OR',\n                                    lastRule: true,\n                                    opAnd: false\n                                }\n                            ]\n                        }\n                    ]);\n                }\n            } else {\n                this.get('notification').error(\n                    this.get('intl').t('groups.expressions.maxConditionsTitle'),\n                    this.get('intl').t('groups.expressions.maxConditionsMessage')\n                );\n            }\n        },\n        removeCondition(index) {\n            let exp = this.get('group.expression');\n\n            if (exp.length === 1) {\n                this.set('group.expression', []);\n            } else {\n                Ember.A(exp).removeAt(index);\n                exp.forEach(condition => {\n                    Ember.set(condition, 'lastCondition', false);\n                });\n                exp.set('lastObject.lastCondition', true);\n                exp.set('lastObject.operation', 'OR');\n                exp.set('lastObject.opAnd', false);\n                this.set('group.expression', exp);\n            }\n        },\n        conditionOperation(condition, op) {\n            Ember.set(condition, 'operation', op);\n            Ember.set(condition, 'opAnd', op == 'AND');\n        },\n        save() {\n            // use new endpoints to save our changed inclusions\n            this.set('loading', true);\n            let saveData = this.prepareExpression(this.get('group.expression'));\n            let success = true;\n            const payload = {\n                data: {\n                    skillConditions: saveData\n                }\n            };\n            const groupId = this.get('group.guid');\n            const path = `api/v2/groups/${groupId}/dynamicsettings`;\n            const url = this.get('application').pcV2Uri(path);\n\n            this.get('ajax')\n                .put(url, payload)\n                .then(() => {\n                    this.get('group').reload();\n                })\n                .catch(error => {\n                    success = false;\n                    this.get('notification').error(\n                        this.get('intl').t('groups.expressions.saveErrorTitle'),\n                        this.get('intl').t('groups.expressions.saveErrorMessage')\n                    );\n                    this.get('logger').error('Error trying to save dynamic expression to group', {\n                        error\n                    });\n                    this.set('loading', false);\n                })\n                .finally(() => {\n                    if (success) {\n                        this.set('group.lastSavedExpression', saveData);\n\n                        // use the preview endpoint to show the new expected number of group members\n                        this.get('notification').info(\n                            this.get('intl').t('groups.expressions.saveTitle'),\n                            this.get('intl').t('groups.expressions.saveMessage')\n                        );\n                        const previewPath = `api/v2/groups/dynamicsettings/preview`;\n                        const previewUrl = this.get('application').pcV2Uri(previewPath);\n                        this.get('ajax')\n                            .post(previewUrl, payload)\n                            .then(preview => {\n                                this.set('previewValue', preview.userCount);\n                            })\n                            .catch(e => {\n                                this.get('logger').error('Error trying to get preview for dynamic group', {\n                                    e\n                                });\n                            })\n                            .finally(() => {\n                                this.set('loading', false);\n                                this.set('showSaveModal', true);\n                            });\n                    }\n                });\n        },\n        openCancelModal() {\n            this.set('showCancelModal', true);\n        },\n        closeCancelModal() {\n            this.set('showCancelModal', false);\n        },\n        cancel() {\n            this.set('showCancelModal', false);\n            const group = this.get('group');\n            group.reload();\n\n            if (this.get('group.lastSavedExpression')) {\n                group.set('expression', group.parseExpression(group.get('lastSavedExpression')));\n            } else {\n                group.set('expression', group.parseExpression(group.get('_expression.content.skillConditions')));\n            }\n            this.selectTab('members');\n        },\n        closeSaveModal() {\n            this.set('previewValue', null);\n            this.set('showSaveModal', false);\n            this.selectTab('members');\n        }\n    },\n\n    prepareExpression(input) {\n        let output = [];\n        input.forEach(con => {\n            let save = {\n                routingSkillConditions: [],\n                languageSkillConditions: []\n            };\n\n            let parent = null;\n            con.rules.forEach((rule, index) => {\n                const skillPropName =\n                    rule.skill.type == 'routing' ? 'routingSkillConditions' : 'languageSkillConditions';\n                const ruleType = rule.skill.type == 'routing' ? 'routingSkill' : 'languageSkill';\n\n                if (index === 0) {\n                    // we're making this rule the current parent skill\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent = newObj;\n                    save[skillPropName].pushObject(newObj);\n                    save.operation = con.operation;\n                    if (input.length === 1) {\n                        save.operation = rule.operation;\n                    }\n                } else {\n                    // we're adding this skill as a childCondition\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent.childConditions[skillPropName].pushObject(newObj);\n                    parent = newObj;\n                }\n            });\n\n            output.pushObject(save);\n        });\n\n        return output;\n    }\n});\n","import Ember from 'ember';\n\nconst { observer, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['condition-display'],\n\n    intl: inject.service(),\n\n    comparators: null,\n    values: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('values', [\n            { name: '0', value: 0 },\n            { name: '1', value: 1 },\n            { name: '2', value: 2 },\n            { name: '3', value: 3 },\n            { name: '4', value: 4 },\n            { name: '5', value: 5 }\n        ]);\n\n        this.set('comparators', [\n            {\n                label: 'equals (==)',\n                value: 'EqualTo',\n                class: 'equalto',\n                op: '=='\n            },\n            {\n                label: 'not equals (!=)',\n                value: 'NotEqualTo',\n                class: 'notequalto',\n                op: '!='\n            },\n            {\n                label: 'greater than (>)',\n                value: 'GreaterThan',\n                class: 'greaterthan',\n                op: '>'\n            },\n            {\n                label: 'greater than or equal to (>=)',\n                value: 'GreaterThanOrEqualTo',\n                class: 'greaterthanorequalto',\n                op: '>='\n            },\n            {\n                label: 'less than (<)',\n                value: 'LessThan',\n                class: 'lessthan',\n                op: '<'\n            },\n            {\n                label: 'less than or equal to (<=)',\n                value: 'LessThanOrEqualTo',\n                class: 'lessthanorequalto',\n                op: '<='\n            }\n        ]);\n\n        this.get('condition.rules').forEach(rule => {\n            // check to see if we're starting fresh\n            if (rule.comparator === null) return;\n\n            // set comparators to proper objects\n            const compPlace = this.get('comparators').mapBy('op').indexOf(rule.comparator.op);\n            if (compPlace >= 0) {\n                Ember.set(rule, 'comparator', this.get('comparators')[compPlace]);\n            } else {\n                Ember.set(rule, 'comparator', null);\n            }\n\n            if (!isNaN(rule.proficiency.value)) {\n                Ember.set(rule, 'proficiency', this.get('values')[rule.proficiency.value]);\n            }\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.set('condition.display', this.display());\n        });\n    },\n\n    updateConditionDisplay: observer(\n        'condition',\n        'condition.rules.@each.{skill,comparator,proficiency,opAnd,lastRule}',\n        function () {\n            this.set('condition.display', this.display());\n            this.set('condition.length', this.get('condition.rules').length);\n        }\n    ),\n\n    actions: {\n        addRule() {\n            let rules = this.get('condition').rules;\n            rules.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            rules.set('lastObject.operation', 'OR');\n            rules.set('lastObject.opAnd', false);\n            rules.pushObject({\n                skill: null,\n                comparator: null,\n                proficiency: null,\n                operation: 'OR',\n                lastRule: true,\n                opAnd: false\n            });\n        },\n        removeRule(index) {\n            let con = this.get('condition').rules;\n            Ember.A(con).removeAt(index);\n            con.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            con.set('lastObject.lastRule', true);\n            con.set('lastObject.operation', 'OR');\n            con.set('lastObject.opAnd', false);\n            this.set('condition.rules', con);\n        },\n        ruleOperation(rule, op) {\n            Ember.set(rule, 'operation', op);\n            Ember.set(rule, 'opAnd', op == 'AND');\n        },\n        skillChanged(rule, skill, value) {\n            if (value) {\n                Ember.set(rule, skill, value);\n            }\n        }\n    },\n\n    /**\n     * This is the same function found in `/components/skillgroup-profile/dynamic-rules/condition-display` component.\n     * TODO: Remove these functions from component level and make reusable util.\n     */\n    display() {\n        const rules = this.get('condition.rules');\n        let display = '(';\n        let valid = true;\n        let orWrap = false;\n\n        for (const rule of rules) {\n            // if a rule is not valid then break the rest of the for-loop and set the valid to `false`\n            if (!rule.skill || !rule.comparator || !rule.proficiency) {\n                valid = false;\n                return;\n            }\n\n            display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n            if (rule.lastRule) {\n                display += ')';\n            } else if (!rule.opAnd) {\n                display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                orWrap = true;\n            } else {\n                display += ` ${this.get('intl').t('groups.expressions.and')} `;\n            }\n        }\n\n        if (orWrap) {\n            display = `(${display})`;\n        }\n\n        return valid ? display : null;\n    }\n});\n","import Ember from 'ember';\nconst { computed, Component, inject } = Ember;\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['skill-search'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n\n    skillResults: null,\n    languageResults: null,\n    showSearchResults: false,\n    searchvalue: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('skillResults', []);\n        this.set('languageResults', []);\n    },\n\n    results: computed('skillResults', 'languageResults', function () {\n        return this.get('skillResults').concat(this.get('languageResults'));\n    }),\n\n    placeHolder: computed('skill', function () {\n        return this.get('skill') ? this.get('skill.name') : this.get('intl').t('groups.expressions.defaultSkill');\n    }),\n\n    skillSelected: computed('skill', function () {\n        return !!this.get('skill');\n    }),\n\n    actions: {\n        select(result) {\n            this.set('skill', result);\n            this.reset();\n        },\n        clearSearch() {\n            this.reset();\n        },\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange(event.target.value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachOutsideHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeOutsideHandler();\n    },\n\n    attachOutsideHandler() {\n        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.skill-search').length) {\n                    this.reset();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    reset() {\n        this.set('showSearchResults', false);\n        this.set('searchValue', null);\n        this.set('languageResults', []);\n        this.set('skillResults', []);\n    },\n\n    updateSearchOnChange(query) {\n        if (!_.isEmpty(query)) {\n            Ember.run.debounce(this, this.runSearch, query.toLowerCase(), 250);\n        } else {\n            this.reset();\n        }\n    },\n\n    runSearch(query) {\n        this.set('showSearchResults', true);\n        this.languageSearch(query);\n        this.skillSearch(query);\n    },\n\n    skillSearch(query) {\n        const url = this.get('application').pcV2Uri(`api/v2/routing/skills`);\n        this.get('ajax')\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let skills = res.entities;\n                skills.forEach(skl => {\n                    skl.type = 'routing';\n                    skl.class = skl.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('skillResults', skills);\n            })\n            .catch(error => {\n                // uhhhh\n                this.get('logger').error('Error trying to fetch routing skills', {\n                    error\n                });\n                this.set('skillResults', []);\n            });\n    },\n\n    languageSearch(query) {\n        const url = this.get('application').pcV2Uri(`api/v2/routing/languages`);\n        this.get('ajax')\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let langs = res.entities;\n                langs.forEach(lang => {\n                    lang.type = 'language';\n                    lang.class = lang.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('languageResults', langs);\n            })\n            .catch(error => {\n                // uhhhh\n                this.get('logger').error('Error trying to fetch routing languages', {\n                    error\n                });\n                this.set('languageResults', []);\n            });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"wU85NT0e\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.searchSkill\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"if\\\"],[[28,[\\\"skillSelected\\\"]],\\\"selected\\\"],null]]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeHolder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"clearfix \\\",[28,[\\\"result\\\",\\\"class\\\"]],\\\" \\\",[28,[\\\"result\\\",\\\"type\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"pAm/MlNF\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"condition\\\",\\\"rules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"rule\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display/skill-search\\\"],null,[[\\\"skill\\\"],[[28,[\\\"rule\\\",\\\"skill\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-comparator\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"comparator\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"comparator\\\"],null],\\\"form-control comparator-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultComparator\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"comparators\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"op\\\"]],[28,[\\\"op\\\",\\\"class\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"op\\\",\\\"label\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"op\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-proficiency\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"proficiency\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"proficiency\\\"],null],\\\"form-control proficiency-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultValue\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"values\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"val\\\"]],[28,[\\\"val\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"val\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"val\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"lastRule\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addRule\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rule-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"unless\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"condition\\\",\\\"rules\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRule\\\",[28,[\\\"rIndex\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-minus\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\",\\\"rIndex\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SdJHLOQh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dynamic-expression-builder\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-arrow-left\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.title\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"subtitle\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.subtitle\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-preview\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-builder\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"expression\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.condition\\\"],[[\\\"index\\\",\\\"display\\\"],[[33,[\\\"add\\\"],[[28,[\\\"cIndex\\\"]],1],null],[28,[\\\"condition\\\",\\\"display\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeCondition\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.removeCondition\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-rules\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display\\\"],null,[[\\\"condition\\\",\\\"group\\\",\\\"maximumExpressions\\\"],[[28,[\\\"condition\\\"]],[28,[\\\"group\\\"]],[28,[\\\"maximumExpressions\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-footer-line\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"footer-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"lastCondition\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"condition-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"condition\\\",\\\"cIndex\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"first-condition-line\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-action\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Primary\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[15,\\\"class\\\",\\\"save-button\\\"],[16,\\\"disabled\\\",[26,[\\\"saveDisabled\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"save\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Tertiary\\\"],[15,\\\"accent\\\",\\\"tertiary\\\"],[15,\\\"class\\\",\\\"cancel-button\\\"],[16,\\\"disabled\\\",[26,[\\\"loading\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openCancelModal\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-screen\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSaveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"noCancel\\\",\\\"confirm\\\",\\\"headerText\\\"],[\\\"preview-modal\\\",true,[33,[\\\"action\\\"],[[28,[null]],\\\"closeSaveModal\\\"],null],[33,[\\\"t\\\"],[\\\"groups.expressions.previewHeader\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"preview-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.previewText\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start name-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entityStrings.group\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-expression\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start expression-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.expression\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-number\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start number-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.number\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"numberPreview\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCancelModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\"],[\\\"cancel-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"closeCancelModal\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.cancelDisclaimer\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport request from 'ember-ajax';\n\nexport const LIST_TYPES = {\n    OWNERS: 'owners',\n    MEMBERS: 'members'\n};\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-contact-panel'],\n    classNameBindings: ['slideInList'],\n\n    //---- SERVICES ----//\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    fileUpload: Ember.inject.service('file-upload'),\n\n    group: null,\n    editing: false,\n    loading: false,\n    disableSave: false,\n    slideInList: true,\n    personSearch: false,\n    saves: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    listType: LIST_TYPES.OWNERS,\n\n    routeSelection: Ember.computed.reads('group.policy.groupAlertType'),\n\n    ringRotations: Ember.computed.reads('group.policy.stopRingingAfterRotations'),\n\n    isSequential: Ember.computed.equal('routeSelection', 'SEQUENTIAL'),\n\n    isRotary: Ember.computed.equal('routeSelection', 'ROUND_ROBIN'),\n\n    displayIndices: Ember.computed.or('isSequential', 'isRotary'),\n\n    disabled: Ember.computed.or('disableSave', 'loading'),\n\n    reasons: Ember.computed('orgVoicemailPolicy', 'group.policy', function () {\n        return {\n            org: {\n                isMissing: _.isEmpty(this.get('orgVoicemailPolicy'))\n            },\n            group: {\n                isMissing: _.isEmpty(this.get('group.policy'))\n            }\n        };\n    }).readOnly(),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        this.set('saves', []);\n        if (this.get('canEditGroupTelephonySettings')) {\n            this.loadOrgVoicemailPolicy();\n        }\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n        this.scheduleRemoveAnimation();\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        appendSave(func) {\n            this.get('saves').addObject(func);\n        },\n\n        removeSave(func) {\n            this.get('saves').removeObject(func);\n        },\n\n        disableSave(value) {\n            this.set('disableSave', value);\n        },\n\n        save() {\n            if (!this.get('loading')) {\n                this.save();\n            }\n        },\n\n        cancel() {\n            this.sendAction('toggleEditing');\n            this.set('personSearch', false);\n            this.get('group').rollbackAttributes();\n        },\n\n        changeListType(type) {\n            this.set('listType', type);\n        }\n    },\n\n    async loadOrgVoicemailPolicy() {\n        try {\n            //---- Try Loading Data ----//\n\n            const url = this.get('application').pcV2Uri(`api/v2/voicemail/policy`);\n            const data = await this.get('ajax').request(url);\n            this.set('orgVoicemailPolicy', data);\n\n            //------------//\n        } catch (err) {\n            //---- Handle Error ----//\n\n            // Log the error.\n            const errorPath = 'components/group-profile/group-contact-panel';\n            const errorMessage = \"Couldn't load organization's voicemail policy.\";\n            this.get('logger').error(`${errorPath}: ${errorMessage}`, {\n                error: err,\n                remoteData: {\n                    voicemailGroupId: this.get('group.id')\n                }\n            });\n\n            // Show the user a toast.\n            const toastTitle = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastTitle');\n            const toastMessage = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastMessage');\n            this.get('notification').error(toastTitle, toastMessage);\n\n            // Clean up.\n            this.set('orgVoicemailPolicy', null);\n\n            //------------//\n        }\n    },\n\n    scheduleRemoveAnimation() {\n        Ember.run.later(\n            this,\n            () => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    if (this._state !== 'destroying' && this._state !== 'destroyed') {\n                        this.set('slideInList', false);\n                    }\n                });\n            },\n            500\n        );\n    },\n\n    save() {\n        const saveData = this.get('saves').map(save => save());\n        const greetingData = _.filter(saveData, { type: 'group-ring-settings' })[0];\n        const ringSequenceData = _.filter(saveData, { type: 'ring-sequence' })[0];\n\n        this.set('loading', true);\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.saveModelData(ringSequenceData)\n                .then(() => {\n                    if (!!this.get('group.number.rel.errorCode')) {\n                        return reject({\n                            title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                            message: this.get('intl').lookup('notification.group.groupRingError.message')\n                        });\n                    }\n\n                    this.get('group.policy').then(policy => {\n                        if (policy.get('languagePreference') === '' || !policy.get('languagePreference')) {\n                            // default the language preference\n                            policy.set('languagePreference', 'en-us');\n                        }\n                        this.savePolicy(policy, true)\n                            .then(() => {\n                                this.saveGreeting(greetingData)\n                                    .then(() => {\n                                        resolve({\n                                            title: this.get('group.name'),\n                                            message: this.get('intl').lookup('notification.group.groupRingSuccess')\n                                        });\n                                    })\n                                    .catch(err => {\n                                        Ember.Logger.error('Error saving greeting', { err });\n\n                                        reject({\n                                            title: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.title'\n                                            ),\n                                            message: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.message'\n                                            )\n                                        });\n                                    });\n                            })\n                            .catch(err => {\n                                Ember.Logger.error('Error saving policy', { err });\n\n                                reject({\n                                    title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                                    message: this.get('intl').lookup('notification.group.groupRingError.message')\n                                });\n                            });\n                    });\n                })\n                .catch(err => {\n                    Ember.Logger.error('Error saving model data', { err });\n\n                    reject({\n                        title: this.get('group.name'),\n                        message: this.get('intl').lookup('notification.group.saveError')\n                    });\n                });\n        });\n\n        promise\n            .then(param => {\n                this.get('group').reload();\n                this.get('notification').success(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                this.sendAction('toggleEditing');\n                greetingData.callback(true);\n            })\n            .catch(param => {\n                this.get('notification').error(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                greetingData.callback(false);\n                return Ember.RSVP.reject();\n            })\n            .finally(() => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    this.set('loading', false);\n                });\n            });\n    },\n\n    savePolicy(policy, retry = false) {\n        return policy.save().catch(err => {\n            if (err && err.errors && err.errors.length > 0) {\n                let error = err.errors[0];\n                if (retry && error.status === 400 && error.title.indexOf('Referenced key') >= 0) {\n                    return new Ember.RSVP.Promise((resolve, reject) => {\n                        Ember.run.later(() => {\n                            this.savePolicy(policy, false).then(resolve).catch(reject);\n                        }, 750);\n                    });\n                }\n            }\n            return Ember.RSVP.reject(err);\n        });\n    },\n\n    saveGreeting(greetingData) {\n        return this.get('group.greeting')\n            .then(greeting => {\n                if (!greetingData.resetGreeting) {\n                    return Ember.RSVP.resolve();\n                }\n\n                let path = greeting.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').delete(url, { dataType: 'text' });\n            })\n            .then(() => {\n                let file = greetingData.recordingFile;\n                if (!file) {\n                    file = greetingData.voicemailFile;\n                }\n\n                return this.uploadGreeting(file);\n            })\n            .then(() => {\n                this.get('group').notifyPropertyChange('greeting');\n            });\n    },\n\n    saveModelData(ringSequenceData) {\n        const number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        const extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('group.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('group.contactInfo'))) {\n                this.set('group.contactInfo', {});\n            }\n\n            const valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            const emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('group.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('group.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('group.contactInfo.groupNumber.firstObject.value.extension', extension);\n\n        const group = this.get('group');\n\n        if (!group.get('individuals')) {\n            group.set('individuals', {});\n        }\n\n        if (!group.get('owners')) {\n            group.set('owners', {});\n        }\n\n        const { individuals, owners } = ringSequenceData;\n        return Ember.RSVP.all([individuals, owners]).then(([individuals, owners]) => {\n            group.set('owners.owners', [], { overwrite: true });\n            const orgIndividuals = group.get('individuals.individuals').map(i => {\n                return i.guid;\n            });\n            group.set('individuals.individuals', [], { overwrite: true });\n\n            const addedDelta = individuals.filter(i => !orgIndividuals.includes(i));\n            const removedDelta = orgIndividuals.filter(i => !individuals.includes(i));\n\n            individuals.forEach(id => {\n                group.set('individuals.individuals', id);\n            });\n            owners.forEach(id => {\n                group.set('owners.owners', id);\n            });\n\n            if (this.get('session.features.groupProileNoIndividualsSave')) {\n                return this.get('group')\n                    .save()\n                    .then(() => this.addIndividuals(group, addedDelta, this.get('application')))\n                    .then(() => this.deleteIndividuals(group, removedDelta, this.get('application')));\n            } else {\n                return this.get('group').save();\n            }\n        });\n    },\n\n    async uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        if (this.get('session.features.EC-760')) {\n            return await this.get('fileUpload').uploadGreetingWithPreSigned(file, this.get('group.guid'));\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('group.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    addIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'delete');\n    },\n\n    individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        let url;\n        if (this.get('session.features.groupProileNoIndividualsSave')) {\n            url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n            if (method.toLowerCase() === 'post') {\n                return this.get('ajax')\n                    .post(url, {\n                        dataType: 'json',\n                        data: {\n                            memberIds: individuals,\n                            version: group.get('version')\n                        }\n                    })\n                    .then(() => {\n                        return group;\n                    });\n            } else if (method.toLowerCase() === 'delete') {\n                url = url.concat('?ids=', individuals);\n                return this.get('ajax')\n                    .delete(url)\n                    .then(() => {\n                        return group;\n                    });\n            }\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = Ember.get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nconst DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE = 'en-us';\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-ring-settings'],\n\n    //---- SERVICES ----//\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    store: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressFormat: Ember.inject.service('addressformat'),\n\n    //---- CONTEXT & STATES ----//\n\n    entity: null,\n    number: null,\n    extension: null,\n    originalNumber: null,\n    originalExtension: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    voicemailFile: null,\n    showVoicemailGreetingOptions: false,\n    resetGreeting: false,\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n    pigeonEventHandler: null,\n\n    disableReplaceOverflowBtn: Ember.computed.not('canEditGroupTelephonySettings'),\n\n    disableRingInputs: Ember.computed('editing', 'canEditGroupTelephonySettings', function () {\n        return !this.get('editing') || !this.get('canEditGroupTelephonySettings');\n    }),\n\n    hasExtension: Ember.computed.notEmpty('extension'),\n\n    hasNumber: Ember.computed.notEmpty('number'),\n\n    numberOfRotations: Ember.computed.alias('entity.policy.stopRingingAfterRotations'),\n\n    rotateCallSeconds: Ember.computed.alias('entity.policy.rotateCallsSecs'),\n\n    forwardingOn: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            return DS.PromiseObject.create({\n                promise: this.get('overflowGroup').then(overflowGroup => !!overflowGroup)\n            });\n        },\n\n        set(key, value) {\n            return DS.PromiseObject.create({ promise: Ember.RSVP.resolve(value) });\n        }\n    }),\n\n    routeSelection: Ember.computed('entity.policy.groupAlertType', {\n        get() {\n            return this.get('entity.policy.groupAlertType') !== null\n                ? this.get('entity.policy.groupAlertType')\n                : 'RANDOM';\n        },\n\n        set(key, value) {\n            return this.set('entity.policy.groupAlertType', value);\n        }\n    }),\n\n    overflowGroup: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            let promise;\n            if (!this.get('entity.policy.overflowGroupId')) {\n                promise = Ember.RSVP.resolve(null);\n            } else {\n                promise = this.get('store').findRecord('group', this.get('entity.policy.overflowGroupId'));\n            }\n            return DS.PromiseObject.create({ promise });\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        'haveExtensionError',\n        'duplicateNumberError',\n        function () {\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (this.get('isEmpty')) {\n                return false;\n            }\n\n            if (!this.get('hasNumber')) {\n                return !(this.get('invalidExtension') || this.get('haveExtensionError'));\n            }\n\n            return !this.get('invalidPhoneNumber') && !this.get('duplicateNumberError');\n        }\n    ),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (!this.get('isValid')) {\n            if (this.get('isEmpty')) {\n                return this.get('intl').t('purecloud.callForwarding.missingNumberAndExtension');\n            } else if (this.get('haveNumberAndExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.numberAndExtension');\n            } else if (this.get('invalidExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.invalidExtension');\n            } else if (this.get('haveExtensionError')) {\n                if (this.get('isExtensionNotInPool')) {\n                    return this.get('intl').t('groups.groupRing.extensionError');\n                }\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('duplicateNumberError')) {\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('invalidPhoneNumber')) {\n                return this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidNumberFormat');\n            }\n        }\n    }),\n\n    duplicateNumberError: Ember.computed('entity.number.rel.errorCode', 'number', 'originalNumber', function () {\n        let number = this.get('number');\n        let originalNumber = this.get('originalNumber');\n\n        if (originalNumber && number !== originalNumber) {\n            return false;\n        }\n\n        return this.get('entity.number.rel.errorCode') === 'DUPLICATE_VALUE';\n    }),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if (originalExtension && extension !== originalExtension) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return !!code && code !== 'DUPLICATE_VALUE';\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        if (this.get('hasNumber')) {\n            const elem = this.$('.group-ring-phone-input');\n            if (!_.isEmpty(elem.val())) {\n                return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber');\n            }\n        }\n        return false;\n    }),\n\n    inputErrorClass: Ember.computed('haveNumberAndExtension', 'isEmpty', 'invalidPhoneNumber', function () {\n        if (this.get('haveNumberAndExtension') || this.get('isEmpty')) {\n            return 'field-error';\n        }\n\n        if (this.get('invalidPhoneNumber')) {\n            return 'field-warning';\n        }\n\n        return '';\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    routeTypes: Ember.computed(function () {\n        return [\n            {\n                value: 'RANDOM',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.broadcast')\n            },\n            {\n                value: 'SEQUENTIAL',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.sequential')\n            },\n            {\n                value: 'ROUND_ROBIN',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.rotary')\n            }\n        ];\n    }),\n\n    routeSelectionType: Ember.computed('routeSelection', function () {\n        switch (this.get('routeSelection')) {\n            case 'RANDOM':\n                return 'broadcast';\n            case 'SEQUENTIAL':\n                return 'sequential';\n            case 'ROUND_ROBIN':\n                return 'rotary';\n            default:\n                return 'broadcast';\n        }\n    }),\n\n    routeDescription: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeDescriptions.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    selectedRouteType: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeTypes.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    rotateCallsDisplayText: Ember.computed('rotateCallSeconds', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.rotateCalls', { value: this.get('rotateCallSeconds') });\n    }),\n\n    stopRingingDisplayText: Ember.computed('numberOfRotations', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.stopRinging', { value: this.get('numberOfRotations') });\n    }),\n\n    searchText: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.groupSearch');\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.content', {\n        get() {\n            const greeting = this.get('entity.greeting.content');\n            return !!greeting;\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                path = path.concat('/media');\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    displaySpinner: Ember.computed('entity.greeting.isFulfilled', 'waitingOnGreeting', function () {\n        return !this.get('entity.greeting.isFulfilled') || this.get('waitingOnGreeting');\n    }),\n\n    reasons: Ember.computed(\n        'entity.policy.{enabled,sendEmailNotifications,disableEmailPii}',\n        'orgVoicemailPolicy',\n        'session.org',\n        ///\n        function () {\n            return {\n                org: {\n                    isMissing: _.isEmpty(this.get('orgVoicemailPolicy')),\n                    enablesHipaa: this.get('session.org.hasHipaaEnabled'),\n                    // disablesVoicemails: !this.get('orgVoicemailPolicy.enabled'),\n                    // ^^^ NOTE(as-of-writing): This will always be `true` but we ignore it.\n                    disablesEmailNotifications: !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications: this.get('orgVoicemailPolicy.disableEmailPii'),\n                    disablesVMTranscription: !this.get('orgVoicemailPolicy.includeEmailTranscriptions')\n                },\n                group: {\n                    isMissing: _.isEmpty(this.get('entity.policy')),\n                    disablesVoicemails: !this.get('entity.policy.enabled'),\n                    disablesEmailNotifications:\n                        !this.get('entity.policy.sendEmailNotifications') ||\n                        !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications:\n                        this.get('entity.policy.disableEmailPii') || this.get('entity.policy.disableEmailPii')\n                }\n            };\n        }\n    ),\n\n    // NOTE(as-of-writing):\n    //   The property `orgVoicemailPolicy.enabled` exists, but it is unused, uneditable,\n    //   and its default value is `false`. Unless/until the org's setting affects\n    //   group policies or permissions for voicemails, we should ignore it.\n    voicemails: Ember.computed(\n        'entity.policy.enabled',\n        'reasons',\n        ///\n        function () {\n            let show;\n            // Always show it.\n            show = true;\n\n            let disable;\n            if (this.get('reasons.org.isMissing')) {\n                // Disable it if the org's policy is missing.\n                disable = true;\n            } else if (this.get('reasons.group.isMissing')) {\n                // Disable it if the group's policy is missing.\n                disable = true;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                // Disable it if the user cannot edit telephony settings\n                // Should not make it this far as the org policy will be missing\n                disable = true;\n            } else {\n                // Use the inverse of `show`.\n                disable = !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                // Default to `false` if it is disabled.\n                // only default the state to false when disabled and user has access to telephony settings\n                // if user does not have access to telephony settings, we will want to show the actual value\n                // of the voicemail toggle while it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.enabled');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionToggle: Ember.computed(\n        'entity.policy.includeEmailTranscriptions',\n        'reasons',\n        'emailNotifications.state',\n        ///\n        function () {\n            const show = this.get('emailNotifications.state');\n            let disable = false;\n            if (\n                this.get('reasons.org.enablesHipaa') ||\n                this.get('reasons.org.disablesPiiInEmailNotifications') ||\n                this.get('reasons.group.disablesPiiInEmailNotifications') ||\n                this.get('reasons.org.disablesVMTranscription') ||\n                !this.get('canEditGroupTelephonySettings')\n            ) {\n                disable = true;\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.includeEmailTranscriptions');\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionDropDown: Ember.computed(\n        'entity.policy.languagePreference',\n        'reasons',\n        'transcriptionToggle',\n        ///\n        function () {\n            const show = !this.get('transcriptionToggle.disable') && this.get('transcriptionToggle.state');\n            const disable = !this.get('canEditGroupTelephonySettings');\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (!this.get('entity.policy.languagePreference')) {\n                state = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n            } else {\n                state = this._getLanguagePreference(this.get('entity.policy'));\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionLanguages: Ember.computed(\n        'intl.languages',\n        ///\n        function () {\n            const languagesObj = this.get('intl').get('languages');\n            // Populate lanaguagesArr with languages and make the selected language the transcriptionDropDown state\n            return Object.keys(languagesObj).map(key => {\n                return {\n                    key: key,\n                    value: languagesObj[key]\n                };\n            });\n        }\n    ),\n\n    emailNotifications: Ember.computed(\n        'entity.policy.sendEmailNotifications',\n        'reasons',\n        'voicemails',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesVoicemails')) {\n                // Hide it if the group disables voicemails.\n                show = false;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                show = false;\n            } else {\n                // Inherit `voicemails.show`.\n                show = this.get('voicemails.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.disablesEmailNotifications')) {\n                // Disable it if the org disables email notifications.\n                disable = true;\n            } else {\n                // Inherit `voicemails.disable` or use the inverse of `show`.\n                disable = this.get('voicemails.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.sendEmailNotifications');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    piiInEmailNotifications: Ember.computed(\n        'emailNotifications',\n        'entity.policy.disableEmailPii',\n        'reasons',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesEmailNotifications')) {\n                // Hide it if the group disables email notifications.\n                show = false;\n            } else {\n                // Inherit `emailNotifications.show`.\n                show = this.get('emailNotifications.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.enablesHipaa')) {\n                // Disable it if the org enables HIPAA.\n                disable = true;\n            } else if (this.get('reasons.org.disablesPiiInEmailNotifications')) {\n                // Disable it if the org disables PII in email notifications.\n                disable = true;\n            } else {\n                // Inherit `emailNotifications.disable` or use the inverse of `show`.\n                disable = this.get('emailNotifications.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = !this.get('entity.policy.disableEmailPii');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n        this.get('disableSave')(!this.get('isValid'));\n        this.pigeonEventHandler = this.handlePigeonEvent.bind(this);\n        this.registerToPigeonTopic();\n        this.get('pigeon').on('greetings', this, this.pigeonEventHandler);\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        this._setupInputs();\n        this._setupToggleAriaLabels();\n    },\n\n    didUpdateAttrs(...args) {\n        this._super(...args);\n\n        this._setupInputs();\n    },\n\n    willDestroyElement(...args) {\n        this._super(...args);\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n        this.get('pigeon').off('greetings', this.pigeonEventHandler);\n    },\n\n    _getLanguagePreference(policy) {\n        let value = policy.get('languagePreference');\n        if (value === 'en_US') {\n            // backend stores it as en_US but we use en-us\n            value = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n        }\n        return value;\n    },\n\n    // `_setupInputs` is a helper method used exclusively in the lifecycle methods.\n    _setupInputs() {\n        const previousEntity = this.get('_entity');\n        const entity = this.get('entity');\n\n        if (entity !== previousEntity) {\n            Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n            Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n\n            this.set('_entity', entity);\n        }\n    },\n\n    // Set aria-labelledby attributes on toggle switches after DOM is rendered\n    _setupToggleAriaLabels() {\n        Ember.run.once(this, () => {\n            // Map of label IDs to their corresponding toggle switch selectors\n            const toggleMappings = [\n                {\n                    labelId: 'forward-call-label',\n                    toggleSelector: '.backup-container .switch-input'\n                },\n                {\n                    labelId: 'voicemails-label',\n                    toggleSelector: '.group-voicemail .switch-input'\n                },\n                {\n                    labelId: 'email-notifications-label',\n                    toggleSelector: '.email-notification .switch-input'\n                },\n                {\n                    labelId: 'pii-email-notifications-label',\n                    toggleSelector: '.email-notification-pii .switch-input'\n                },\n                {\n                    labelId: 'transcriptions-label',\n                    toggleSelector: '.voicemail-transcription .switch-input'\n                }\n            ];\n\n            toggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                }\n            });\n        });\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n                if (this.attrs.rotationsChanged) {\n                    this.attrs.rotationsChanged(number);\n                }\n            }\n        },\n\n        toggleCallForwarding() {\n            this.set('forwardingOn', !this.get('forwardingOn.content'));\n            if (!this.get('forwardingOn.content')) {\n                this.set('overflowGroup', null);\n            }\n        },\n\n        selectOverflowGroup(group) {\n            this.set('overflowGroup', group);\n        },\n\n        replaceOverflowGroup() {\n            this.set('overflowGroup', null);\n        },\n\n        toggleVoicemails() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.enabled');\n        },\n\n        toggleEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.sendEmailNotifications');\n        },\n\n        togglePiiInEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.disableEmailPii');\n        },\n\n        toggleTranscriptions() {\n            return this.toggleProperty('entity.policy.includeEmailTranscriptions');\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        selectTranscriptionLanguage(event) {\n            this.set('entity.policy.languagePreference', event.target.value);\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableSave(key, value) {\n            this.set(key, value);\n            this.get('disableSave')(value);\n        }\n    },\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        if (!this.get('isValid')) {\n            let badNumber = this.get('invalidPhoneNumber') || this.get('duplicateNumberError');\n            let badExtension =\n                this.get('invalidExtension') || this.get('haveExtensionError') || this.get('haveNumberAndExtension');\n            let isEmpty = this.get('isEmpty');\n            if (badExtension || isEmpty) {\n                this.get('disableSave')(true);\n            } else if (badNumber) {\n                // Don't disable save if the only issue is a bad number\n                this.get('disableSave')(false);\n            } else {\n                // Fall through to disable save\n                this.get('disableSave')(true);\n            }\n        } else {\n            this.get('disableSave')(false);\n        }\n    }),\n\n    editingObserver: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            this.set('voicemailFile', null);\n            this.set('recordingFile', null);\n            this.notifyPropertyChange('overflowGroup');\n            this.notifyPropertyChange('forwardingOn');\n            this.initNumber();\n        }\n    }),\n\n    registerToPigeonTopic() {\n        const groupId = this.get('entity.guid');\n        const groupTopic = `v2.groups.${groupId}.greetings`;\n        this.get('pigeon').registerPriorityTopic(groupTopic);\n    },\n\n    handlePigeonEvent() {\n        this.get('entity').notifyPropertyChange('greeting');\n        this.set('waitingOnGreeting', false);\n    },\n\n    setupInput() {\n        this.$('.group-ring-phone-input').intlTelInput({\n            nationalMode: false,\n            utilsScript: `${this.get('application.urlprefix')}assets/intltelinput/utils.js`\n        });\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n\n        const number = info && info.number ? info.number : '';\n        const extension = info && info.extension ? info.extension : '';\n\n        inputElem.intlTelInput('setNumber', number);\n        extElem.val(extension);\n\n        this.set('number', number);\n        this.set('extension', extension);\n\n        this.set('originalNumber', number);\n        this.set('originalExtension', extension);\n    },\n\n    save() {\n        const overflowGroupId = this.get('overflowGroup') === null ? null : this.get('overflowGroup.guid');\n        this.set('entity.policy.overflowGroupId', overflowGroupId);\n\n        this.set('originalExtension', this.get('extension'));\n        if (this.get('voicemailFile') || this.get('recordingFile')) {\n            this.set('waitingOnGreeting', true);\n        }\n\n        if (overflowGroupId === null) {\n            this.set('forwardingOn', false);\n        }\n\n        return {\n            type: 'group-ring-settings',\n            isExtensionResourceInUse: this.get('isExtensionResourceInUse'),\n            isExtensionNotInPool: this.get('isExtensionNotInPool'),\n            recordingFile: this.get('recordingFile'),\n            voicemailFile: this.get('voicemailFile'),\n            resetGreeting: this.get('resetGreeting'),\n            isEmpty: this.get('isEmpty'),\n            callback: this.finishedSaving.bind(this)\n        };\n    },\n\n    finishedSaving(succeeded) {\n        if (succeeded) {\n            this.set('resetGreeting', false);\n        } else {\n            this.set('waitingOnGreeting', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setAriaLabel);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableSave(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    },\n\n    setAriaLabel() {\n        const input = this.$('input');\n\n        if (input && input.length) {\n            // Find the closest parent with contact-info-group class for better context\n            const contactInfoGroup = input.closest('.contact-info-group');\n\n            if (contactInfoGroup && contactInfoGroup.length) {\n                // If contact-info-group doesn't have an ID, create one\n                let groupId = contactInfoGroup.attr('id');\n                if (!groupId) {\n                    groupId = `${this.get('elementId')}-contact-group`;\n                    contactInfoGroup.attr('id', groupId);\n                }\n                input.attr('aria-labelledby', groupId);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"MFx2gQuC\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"RL11fJHe\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasNumber\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label group-phone-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label group-phone-label\\\"],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"number phone-field \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasNumber\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[16,\\\"class\\\",[34,[\\\"group-ring-phone-input form-control \\\",[26,[\\\"inputErrorClass\\\"]]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"extension \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasExtension\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"input\\\",[]],[16,\\\"class\\\",[34,[\\\"group-ring-extension-input form-control\\\\n                        \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"invalidExtension\\\"]],[28,[\\\"haveNumberAndExtension\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"field-error\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[15,\\\"maxLength\\\",\\\"9\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"error-message \\\",[26,[\\\"inputErrorClass\\\"]]]]],[13],[1,[26,[\\\"errorMessage\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-type contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label\\\"],[15,\\\"for\\\",\\\"route-select\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.routeType\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-route-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"selectedRouteType\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"value\\\",\\\"disabled\\\",\\\"action\\\"],[\\\"route-select\\\",\\\"form-control\\\",[28,[\\\"routeSelection\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"routeSelection\\\"]]],null]],null]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"routeTypes\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"type\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"type\\\",\\\"translation\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"type\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"routeDescription\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"rotateCallsDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label route-setting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"stopRingingDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-setting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflow\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container backup-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-label\\\"],[15,\\\"id\\\",\\\"forward-call-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.forwardCall\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"forwardingOn\\\",\\\"content\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],\\\"toggleCallForwarding\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"forwardingOn\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"overflowGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"disabled\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"groups\\\",[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[28,[\\\"searchText\\\"]],\\\"selectOverflowGroup\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"has-group-number\\\"],[[28,[\\\"result\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowGroupNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-selected\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"overflowGroup\\\"]],false,false]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"disableReplaceOverflowBtn\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"replaceOverflowGroup\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.replace\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"overflow-notice\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowNotice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowDisabled\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"voicemails--input-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"voicemails-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemails.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]],[28,[\\\"voicemails\\\",\\\"disable\\\"]],\\\"toggleVoicemails\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"voicemails--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"voicemails--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label greeting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"displaySpinner\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link menu-selector\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n\\\\n                                        \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"email-notifications-label\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.label\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]],[28,[\\\"emailNotifications\\\",\\\"disable\\\"]],\\\"toggleEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesEmailNotifications\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification-pii contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"pii-email-notifications-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]],[28,[\\\"piiInEmailNotifications\\\",\\\"disable\\\"]],\\\"togglePiiInEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesPiiInEmailNotifications\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-transcription contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"transcriptions--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"transcriptions-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]],[28,[\\\"transcriptionToggle\\\",\\\"disable\\\"]],\\\"toggleTranscriptions\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"transcriptions--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesVMTranscription\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"transcriptions--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"transcriptionDropDown\\\",\\\"show\\\"]],[28,[\\\"transcriptionLanguages\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"transcriptionDropDown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                    \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"transcriptionDropDown\\\",\\\"state\\\"]],null],[15,\\\"filterable\\\",\\\"true\\\"],[15,\\\"slot\\\",\\\"dropdown\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTranscriptionLanguage\\\"],null],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.dropDown.placeholder\\\"],null]]]],[16,\\\"disabled\\\",[28,[\\\"transcriptionDropDown\\\",\\\"disable\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                        \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"transcriptionLanguages\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"language\\\",\\\"key\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                                    \\\"],[1,[28,[\\\"language\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                                                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"language\\\"]},null],[0,\\\"                                        \\\"]]}],[0,\\\"\\\\n                                    \\\"]]}],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BatchDataRequestMixin from 'connections-ui/mixins/batch-data-requests';\n\nimport { LIST_TYPES } from '../component';\n\nexport default Ember.Component.extend(BatchDataRequestMixin, {\n    classNames: ['ring-sequence'],\n\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    group: null,\n    searchInput: '',\n    searchQuery: '',\n    personSearch: false,\n    sequenceContainer: null,\n    resultsContainer: null,\n    resizeListener: null,\n    isSequential: false,\n    displayIndices: false,\n    editing: false,\n    listDirty: false,\n    ringRotations: null,\n    listType: null,\n\n    owners: Ember.computed.reads('group.owners.owners'),\n    individuals: Ember.computed.reads('group.individuals.individuals'),\n\n    _editing: false,\n\n    isOwners: Ember.computed.equal('listType', LIST_TYPES.OWNERS),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.sequenceContainer = this.$('.sequence-container');\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeListeners();\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n    },\n\n    didUpdateAttrs() {\n        const editing = this.get('editing');\n        const cachedEditing = this.get('_editing');\n        if (editing !== cachedEditing) {\n            this.set('_editing', editing);\n            this.notifyPropertyChange('owners');\n            this.notifyPropertyChange('individuals');\n        }\n    },\n\n    sequenceList: Ember.computed('isOwners', 'individualsSequenceList.[]', 'ownersSequenceList.[]', function () {\n        return this.get('isOwners') ? this.get('ownersSequenceList') : this.get('individualsSequenceList');\n    }),\n\n    individualsSequenceList: Ember.computed('individuals.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('individuals') || [])\n        });\n    }),\n\n    ownersSequenceList: Ember.computed('owners.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('owners') || [])\n        });\n    }),\n\n    renderedList: Ember.computed(\n        'sequenceList.[]',\n        'individualsSequenceList.[]',\n        'ownersSequenceList.[]',\n        'ringRotations',\n        function () {\n            return DS.PromiseArray.create({\n                promise: this._appendRotationListData()\n            });\n        }\n    ),\n\n    searchLabel: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.ownersSearch');\n        } else {\n            return this.get('intl').t('groups.groupRing.membersSearch');\n        }\n    }),\n\n    searchPlaceholder: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.searchPlaceholderOwners');\n        } else {\n            return this.get('intl').t('groups.groupRing.searchPlaceholder');\n        }\n    }),\n\n    addMemberPlaceholder: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.addMemberPlaceholder');\n    }),\n\n    clearSearch: Ember.observer('editing', function () {\n        this.set('searchInput', '');\n        this.set('searchQuery', '');\n    }),\n\n    actions: {\n        inputEntered() {\n            Ember.run.throttle(this, this._updateSearchQuery, 500, false);\n        },\n\n        togglePersonSearch() {\n            this.toggleProperty('personSearch');\n            this.handleListeners();\n        },\n\n        addPerson(person) {\n            return this.get('sequenceList').then(sequenceList => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                const index = sequenceList.get('length') + 1;\n                const listItem = Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: index\n                });\n                this.set('personSearch', false);\n                sequenceList.pushObject(listItem);\n                sequenceList.set('lastObject.scrollIntoView', true);\n                this.set('listDirty', true);\n            });\n        },\n\n        listModified() {\n            this.set('listDirty', true);\n        }\n    },\n\n    handleListeners() {\n        if (this.get('personSearch')) {\n            Ember.run.scheduleOnce('afterRender', this, () => {\n                this._attachListeners();\n                this._handleResizeEvent();\n            });\n        } else {\n            Ember.run.scheduleOnce('afterRender', this, this._removeListeners);\n        }\n    },\n\n    save() {\n        this.set('personSearch', false);\n\n        const owners = this.get('ownersSequenceList');\n        const individuals = this.get('individualsSequenceList');\n\n        return {\n            type: 'ring-sequence',\n            individuals: individuals.then(people => people.mapBy('person.id')),\n            owners: owners.then(people => people.mapBy('person.id'))\n        };\n    },\n\n    _appendRotationListData() {\n        return this.get('sequenceList').then(sequenceList => {\n            const ringRotations = this.get('ringRotations');\n            const listLength = sequenceList.get('length');\n            if (ringRotations !== null) {\n                sequenceList.forEach((listModel, index) => {\n                    listModel.setProperties({\n                        beginningOutOfRange: index === ringRotations,\n                        outOfRange: index >= ringRotations,\n                        endOutOfRange: index > ringRotations - 1 && index === listLength - 1,\n                        popupDismissed: false\n                    });\n                });\n            }\n            return sequenceList;\n        });\n    },\n\n    _sequenceListForPeople(people) {\n        const batchPromises = people.map(person => this.getUser(person.guid || person.value));\n        return Ember.RSVP.all(batchPromises).then(personArray => {\n            return personArray.map((person, index) => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                return Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: ++index\n                });\n            });\n        });\n    },\n\n    _updateSearchQuery() {\n        this.set('searchQuery', this.get('searchInput'));\n    },\n\n    _attachListeners() {\n        this.resizeListener = Ember.$(window).on(`resize.${this.get('elementId')}`, () => {\n            Ember.run.throttle(this, this._handleResizeEvent, 100, false);\n        });\n        this.resultsContainer = this.$('.results-container');\n    },\n\n    _removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n        this.resultsContainer = null;\n    },\n\n    _handleResizeEvent() {\n        const height = this.sequenceContainer.height();\n        this.resultsContainer.css('height', `${height - 4}px`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Mc0I3uIH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"list-search \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link add-person \\\",[33,[\\\"if\\\"],[[28,[\\\"personSearch\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePersonSearch\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-invite-user\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addOwner\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addMember\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"input-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-person-search\\\"]]],[13],[1,[26,[\\\"searchLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"type\\\",\\\"value\\\",\\\"key-up\\\",\\\"placeholder\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-person-search\\\"],null],\\\"search-input\\\",\\\"text\\\",[28,[\\\"searchInput\\\"]],\\\"inputEntered\\\",[28,[\\\"searchPlaceholder\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"people\\\",[28,[\\\"addMemberPlaceholder\\\"]],\\\"addPerson\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"can-add-group-ring-member\\\"],[[28,[\\\"result\\\"]],[28,[\\\"sequenceList\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.memberNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"sequence-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-profile/group-list\\\"],null,[[\\\"groupList\\\",\\\"searchQuery\\\",\\\"editing\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"listType\\\",\\\"listModified\\\"],[[28,[\\\"renderedList\\\"]],[28,[\\\"searchQuery\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"listModified\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-help\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inviteHelp\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"owners-note\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.ownersAsMembers\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"TD8PPWDT\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-content-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-left-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tab-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owners active\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"owners\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owners\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owners\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-members\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#members\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.members\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/ring-sequence\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"displayIndices\\\",\\\"isSequential\\\",\\\"ringRotations\\\",\\\"personSearch\\\",\\\"listType\\\",\\\"appendSave\\\",\\\"removeSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"ringRotations\\\"]],[28,[\\\"personSearch\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-right-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings\\\"],null,[[\\\"entity\\\",\\\"orgVoicemailPolicy\\\",\\\"canEditGroupTelephonySettings\\\",\\\"editing\\\",\\\"appendSave\\\",\\\"removeSave\\\",\\\"disableSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"orgVoicemailPolicy\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-wrapper\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport Fuse from 'npm:fuse.js';\n\nimport { LIST_TYPES } from '../group-contact-panel/component';\n\nconst fuseOptions = {\n    shouldSort: false,\n    threshold: 0.4,\n    location: 0,\n    distance: 100,\n    maxPatternLength: 32,\n    minMatchCharLength: 1,\n    keys: ['person.name'],\n    getFn(obj, path) {\n        return obj.get(path);\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['group-list'],\n\n    groupList: null,\n    selectedIndex: null,\n    searchQuery: '',\n    editing: false,\n    displayIndices: true,\n    listType: null,\n\n    queryAvailable: Ember.computed.gt('searchQuery.length', 0),\n\n    searchResults: Ember.computed('groupList', 'searchQuery', function () {\n        if (this.get('queryAvailable')) {\n            return DS.PromiseArray.create({\n                promise: this.get('groupList').then(data => new Fuse(data, fuseOptions).search(this.get('searchQuery')))\n            });\n        }\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve(Ember.A([]))\n        });\n    }),\n\n    renderedList: Ember.computed('searchResults.[]', 'groupList.[]', 'queryAvailable', function () {\n        if (this.get('queryAvailable')) {\n            return this.get('searchResults');\n        }\n        return this.get('groupList');\n    }),\n\n    canRemove: Ember.computed('renderedList.[]', 'listType', function () {\n        if (this.get('listType') !== LIST_TYPES.OWNERS) {\n            return true;\n        }\n        return this.get('renderedList.length') > 1;\n    }),\n\n    actions: {\n        removeItem(index) {\n            if (!this.get('canRemove')) {\n                return;\n            }\n\n            this.get('groupList').removeAt(index - 1);\n            this._recalculateIndices();\n            this.notifyParentOfListChange();\n        },\n\n        changePosition(from, to) {\n            Ember.run.debounce(this, this.changePosition, from, to, 100);\n        }\n    },\n\n    notifyParentOfListChange() {\n        if (this.attrs.listModified) {\n            this.attrs.listModified();\n        }\n    },\n\n    changePosition(from, to) {\n        this._changePosition(from, to);\n\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        this.set('selectedIndex', null);\n        this.notifyParentOfListChange();\n    },\n\n    _recalculateIndices() {\n        this.get('groupList').map((listModel, index) => {\n            listModel.set('index', ++index);\n        });\n    },\n\n    _changePosition(from, to) {\n        if (!Number.isInteger(to)) {\n            return;\n        }\n        const groupList = this.get('groupList');\n        to = Math.min(to, groupList.get('length'));\n        to = Math.max(to, 1);\n\n        groupList.then(groupArray => {\n            const item = groupArray.get(from - 1);\n            groupArray.removeAt(from - 1);\n            groupArray.insertAt(to - 1, item);\n            this._recalculateIndices();\n        });\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nexport default Ember.Component.extend({\n    classNames: ['list-item'],\n    classNameBindings: ['editing', 'outOfRotationRange:out-of-range', 'listModel.scrollIntoView:highlight'],\n\n    intl: Ember.inject.service(),\n\n    isSequential: false,\n    displayIndices: true,\n    listModel: null,\n    input_value: null,\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            pin: true\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    hovercardArrowOffset: 24,\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.get('listModel.scrollIntoView')) {\n            this.scrollIntoView();\n        }\n    },\n\n    index: Ember.computed.reads('listModel.index'),\n\n    outOfRotationRange: Ember.computed.and('listModel.outOfRange', 'isSequential'),\n\n    displayRotationRangePopup: Ember.computed(\n        'listModel.beginningOutOfRange',\n        'listModel.popupDismissed',\n        'isSequential',\n        'editing',\n        function () {\n            return (\n                this.get('listModel.beginningOutOfRange') &&\n                this.get('isSequential') &&\n                !this.get('listModel.popupDismissed') &&\n                this.get('editing')\n            );\n        }\n    ),\n\n    position: Ember.computed('index', function () {\n        return `${this.get('index')}.`;\n    }),\n\n    role: Ember.computed('listModel.isOwner', function () {\n        if (this.get('listModel.isOwner')) {\n            return this.get('intl').t('groups.memberTypes.owner');\n        }\n        return this.get('intl').t('groups.memberTypes.individual');\n    }),\n\n    newIndex: Ember.computed('input_value', function () {\n        return parseInt(this.get('input_value'));\n    }),\n\n    popupTarget: Ember.computed('elementId', function () {\n        return `list-item-popup-${this.elementId}`;\n    }),\n\n    actions: {\n        indexChanged() {\n            this.changeIndex();\n        },\n        dismissPopup() {\n            this.set('listModel.popupDismissed', true);\n        },\n        setIndexChanged(event) {\n            if (eventToString(event) !== 'ENTER') {\n                const value = parseInt(event.target.value, 10);\n                if (!isNaN(value)) {\n                    this.set('newIndex', value);\n                }\n            }\n        },\n        submitIndexChange(event) {\n            if (eventToString(event) === 'ENTER') {\n                this.changeIndex();\n            }\n        }\n    },\n\n    changeIndex() {\n        this.attrs.changePosition(this.get('index'), this.get('newIndex'));\n        this.set('input_value', null);\n    },\n\n    scrollIntoView() {\n        const parent = this.$().parent();\n        const scrollHeight = parent.prop('scrollHeight');\n        parent.animate(\n            {\n                scrollTop: scrollHeight\n            },\n            1000\n        );\n        Ember.run.later(\n            this,\n            () => {\n                this.set('listModel.scrollIntoView', false);\n            },\n            5000\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WWNJD4ST\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayIndices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"text\\\"],[15,\\\"class\\\",\\\"input\\\"],[16,\\\"placeholder\\\",[26,[\\\"index\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"index\\\"]],null],[16,\\\"value\\\",[26,[\\\"input_value\\\"]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"indexChanged\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"submitIndexChange\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setIndexChanged\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[1,[26,[\\\"position\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"enableMiniCard\\\"],[[28,[\\\"listModel\\\",\\\"person\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"listModel\\\",\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-right-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null],\\\"disabled\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"removeItem\\\"]],[28,[\\\"index\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.cannotRemoveAllOwners\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRotationRangePopup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"ember-tether\\\"],null,[[\\\"target\\\",\\\"targetAttachment\\\",\\\"attachment\\\",\\\"constraints\\\",\\\"classPrefix\\\",\\\"offset\\\"],[[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]]],null],\\\"top center\\\",\\\"bottom center\\\",[28,[\\\"tetherConstraints\\\"]],\\\"list-item-popup-tether\\\",[28,[\\\"hovercardOffset\\\"]]]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"popupTarget\\\"]]]]],[15,\\\"class\\\",\\\"list-item-popup\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-triangle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-description\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.popupDescription\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"dismissPopup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/list-item/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"ul9Fm8yu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"renderedList\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/group-list/list-item\\\"],null,[[\\\"editing\\\",\\\"listModel\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"canRemove\\\",\\\"removeItem\\\",\\\"changePosition\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"listModel\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"canRemove\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeItem\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"changePosition\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"listModel\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-entry'],\n\n    chat: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    attrs: {\n        person: null,\n        group: null,\n        individuals: [],\n        editing: false,\n        membership: [],\n        deletePerson: ''\n    },\n\n    actions: {\n        deletePerson() {\n            const group = this.get('group');\n            const person = this.get('person');\n            if (group.isPersonOwner(person) && this.get('group.owners.owners.length') === 1) {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.noOwners');\n                this.get('notification').info(title, message);\n            } else {\n                this.sendAction('deletePerson', person, this.get('memberTypeList'));\n            }\n        },\n\n        handleDeleteKeyDown(event) {\n            if (event.key === 'Enter' || event.key === ' ') {\n                event.preventDefault();\n                this.send('deletePerson');\n            }\n        }\n    },\n\n    showChat: computed('isLoggedInUser', 'chat.enabled', function () {\n        return !this.get('isLoggedInUser') && this.get('chat.enabled');\n    }),\n\n    isLoggedInUser: computed('person', 'session.person', function () {\n        const person = this.get('person');\n        const sessionPerson = this.get('session.person');\n        return person.get('id') === sessionPerson.get('id');\n    }),\n\n    cannotDeleteMember: computed('isLoggedInUser', 'group.owners.owners.@each.value', function () {\n        const person = this.get('person');\n        const group = this.get('group');\n        const isOwnerAndSelf = group.isPersonOwner(person) && this.get('isLoggedInUser');\n        const multipleOwners = group.get('owners.owners.length') > 1;\n        return isOwnerAndSelf && !multipleOwners;\n    }),\n\n    canViewRules: computed('group.membershipVisible', 'session.person', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return true;\n        }\n\n        const group = this.get('group');\n        const person = this.get('session.person');\n        const visible = this.get('group.membershipVisible');\n        const namedPermissions = person.get('namedPermissions');\n        const hasPermissions = namedPermissions.includes('admin') || namedPermissions.includes('group_administration');\n        if (!visible) {\n            return hasPermissions || group.isPersonOwner(person);\n        }\n        return true;\n    }),\n\n    memberType: computed('person', 'group', 'isCurrentMember', 'individuals.[]', 'group.isDynamicGroup', function () {\n        const intl = this.get('intl');\n        const group = this.get('group');\n        const person = this.get('person');\n        const individuals = this.get('individuals');\n        let translation = intl.lookup('common.removed');\n        if (this.get('isCurrentMember')) {\n            if (group.isPersonOwner(person)) {\n                translation = intl.lookup('groups.memberTypes.owner');\n            } else if (_.includes(individuals, person) || group.isPersonIndividual(person)) {\n                translation = intl.lookup('groups.memberTypes.individual');\n            } else if (this.get('group.isDynamicGroup')) {\n                translation = intl.lookup('groups.memberTypes.dynamic');\n            } else {\n                translation = intl.lookup('groups.memberTypes.rule');\n            }\n        }\n        return translation.toString();\n    }),\n\n    memberTypeList: computed('person', 'group', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        const paths = [];\n        if (group.isPersonOwner(person)) {\n            paths.push('owner');\n        }\n        if (group.isPersonIndividual(person)) {\n            paths.push('individual');\n        }\n        return paths;\n    }),\n\n    isRule: computed('person', 'group', 'isAddedIndividual', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        return !group.isPersonOwner(person) && !group.isPersonIndividual(person) && !this.get('isAddedIndividual');\n    }),\n\n    isLinkable: computed.not('editing'),\n    isAddedIndividual: computed('person', 'individuals.[]', 'membership.[]', function () {\n        const id = this.get('person.id');\n        const membership = this.get('membership').mapBy('guid');\n        return _.includes(membership, id);\n    }),\n\n    isCurrentMember: computed(\n        'group.owners.owners.@each.value',\n        'group.individuals.individuals.@each.value',\n        'isAddedIndividual',\n        function () {\n            const group = this.get('group');\n            const person = this.get('person');\n            return group.isPersonOwner(person) || group.isPersonIndividual(person) || this.get('isAddedIndividual');\n        }\n    ),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachTooltip();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.delete').tooltip('destroy');\n    },\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (newAttrs.editing.value !== oldAttrs.editing.value) {\n            this.attachTooltip();\n        }\n    },\n\n    attachTooltip() {\n        Ember.run.scheduleOnce('afterRender', () => {\n            if (this.get('editing') && this.get('isRule')) {\n                this.$('.delete').tooltip({\n                    title: this.get('intl').lookup('groups.cannotRemoveRuleEntry').toString(),\n                    placement: 'left'\n                });\n            }\n        });\n    },\n\n    click(event) {\n        const target = Ember.$(event.target);\n        if (target.is('.person-name')) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [this.get('person')]\n            });\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"4MOmVGd4\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"isLinkable\\\"],[[28,[\\\"person\\\"]],true,[28,[\\\"isLinkable\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"member-type \\\",[33,[\\\"unless\\\"],[[28,[\\\"isCurrentMember\\\"]],\\\"removed\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"memberType\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"member-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\",\\\"shouldTether\\\"],[[28,[\\\"person\\\"]],[28,[\\\"showChat\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"delete danger \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRule\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cannotDeleteMember\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleDeleteKeyDown\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"deletePerson\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-entry/template.hbs\"}});","import Ember from 'ember';\nimport request from 'ember-ajax';\nimport DS from 'ember-data';\nimport { singularize } from 'ember-inflector';\nimport _ from 'lodash';\nimport { task, timeout } from 'ember-concurrency';\nimport JobMixin from '../../../mixins/job';\nimport PagingMixin from '../../../mixins/paging';\nimport { BASE_PERSON } from '../../../models/person';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { set, get, inject, computed, observer, Component } = Ember;\n\nfunction equals(field, value, intl) {\n    return {\n        displayClassification: intl.lookup(field),\n        type: 'equals',\n        key: field,\n        value: value\n    };\n}\n\nfunction personQuery(rels, person) {\n    return {\n        rels: rels,\n        type: 'relationship',\n        value: person.get('_id') || person.get('id'),\n        guid: person.get('guid') || person.get('id'),\n        entity: 'people'\n    };\n}\n\nexport default Component.extend(PagingMixin, JobMixin, LoggerMixin, {\n    classNames: ['group-membership-listing', 'content'],\n    classNameBindings: ['editing', 'hunt-groups'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n    searchService: inject.service('search'),\n\n    phoneEnabled: computed.reads('permissions.phoneEnabled'),\n    group: null,\n    entityType: 'person',\n    fieldList: BASE_PERSON.fl,\n\n    filterChoices: [\n        {\n            key: 'all',\n            string: 'groups.dropdown.all',\n            active: false,\n            path: null\n        },\n        {\n            key: 'individuals',\n            string: 'groups.dropdown.individuals',\n            active: true,\n            path: 'individuals.individuals'\n        },\n        {\n            key: 'owners',\n            string: 'groups.dropdown.owners',\n            active: false,\n            path: 'owners.owners'\n        },\n        {\n            key: 'rules',\n            string: 'groups.dropdown.rules',\n            active: false,\n            path: null\n        }\n    ],\n\n    inclusionFilter: {\n        key: 'inclusions',\n        string: 'group_membership_inclusions_labelKey_inclusions',\n        active: false,\n        path: 'membership.inclusions'\n    },\n\n    exclusionFilter: {\n        key: 'exclusions',\n        string: 'group_membership_exclusions_labelKey_exclusions',\n        active: false,\n        path: 'membership.exclusions'\n    },\n\n    filter: null,\n    search: null,\n    editing: false,\n    showRules: false,\n    saving: false,\n    loadedAll: false,\n    loading: null,\n    ignoreScroll: false,\n    rateLimited: false,\n\n    currentlySearching: false,\n    currentMembershipRequest: null,\n    membershipQuery: null,\n\n    membership: null,\n    memberListLimitSize: 20,\n    retryTimeout: null,\n    retyTimeOutDuration: 10000,\n\n    actions: {\n        toggleRules() {\n            this.toggleProperty('showRules');\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            Ember.set(this, 'loadedAll', false);\n            if (this.get('showRules')) {\n                Ember.set(this, 'filter', this.inclusionFilter);\n            } else {\n                Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n            }\n            this.updateContentOnChange();\n        },\n\n        selectFilter(filter) {\n            this.set('ignoreScroll', true);\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'membership', []);\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', filter);\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'loadedAll', false);\n\n            this.updateContentOnChange();\n        },\n\n        updateSearch(search) {\n            Ember.set(this, 'search', search);\n            this.searchCriteriaChanged();\n        },\n\n        editMembership() {\n            Ember.set(this, 'editing', true);\n            Ember.set(this, 'showRules', false);\n            Ember.set(this, 'loadedAll', false);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'owners'));\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'membership', []);\n            this.updateContentOnChange();\n            Ember.run.scheduleOnce('afterRender', () => {\n                Ember.$('.add-member input').trigger('focus');\n            });\n            this.sendAction('changeEditing', true);\n        },\n\n        selectTab(tab) {\n            this.bubbleAction({\n                action: 'selectTab',\n                actionContext: tab\n            });\n        },\n\n        selectKeyword(keyword) {\n            this.addKeyword(keyword);\n        },\n\n        selectPerson(person) {\n            this.addPerson(person);\n        },\n\n        removeRule(rule) {\n            this.removeRule(rule);\n        },\n\n        removePerson(person, memberTypeList) {\n            this.removePerson(person, memberTypeList);\n        },\n\n        save() {\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'saving', true);\n            const application = this.get('application');\n            const group = this.get('group');\n            const addedIndividuals = this.get('addedIndividuals');\n            const removedIndividuals = this.get('removedIndividuals');\n            this.setRulesOnGroup();\n            group\n                .save()\n                .then(res => {\n                    const job = Ember.get(res, 'meta.job');\n                    if (job && job.jobId) {\n                        this.addJob(\n                            job,\n                            () => {\n                                this.handleJobFinish();\n                            },\n                            this\n                        );\n                    } else {\n                        return this.get('loadAll').perform();\n                    }\n                })\n                .then(() => this.saveIndividuals(group, addedIndividuals, application))\n                .then(() => this.deleteIndividuals(group, removedIndividuals, application))\n                .then(() => this.reload())\n                .then(() => {\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    this.sendAction('changeEditing', false);\n\n                    Ember.set(this, 'addedIndividuals', []);\n                    Ember.set(this, 'removedIndividuals', []);\n                    Ember.set(this, 'membershipQuery.offset', 0);\n\n                    Ember.set(this, 'loading', {\n                        add: false,\n                        search: false\n                    });\n\n                    this.setProperties({\n                        saving: false,\n                        editing: false,\n                        currentPage: 0,\n                        loadedAll: false\n                    });\n\n                    Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n                })\n                .then(() => {\n                    // Membership count is eventually consistent...\n                    // Check for membership count after some seconds...\n                    Ember.run.later(() => {\n                        this.reload();\n                    }, 5000);\n                })\n                .catch(err => {\n                    this.logger.error('There was an error saving the group', {\n                        err\n                    });\n\n                    const title = group.get('name');\n                    const message = this.get('intl').t('notification.group.saveError');\n                    this.get('notification').error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    Ember.set(this, 'saving', false);\n                });\n        },\n\n        cancel() {\n            const group = this.get('group');\n\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'editing', false);\n            Ember.set(this, 'loading.search', true);\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n\n            group.reload().then(() => {\n                group.rollbackAttributes();\n\n                Ember.set(this, 'loading.search', false);\n                Ember.set(this, 'membershipQuery.offset', 0);\n                Ember.set(this, 'currentPage', 0);\n                Ember.set(this, 'loadedAll', false);\n\n                this.initMembership();\n                this.get('loadAll').perform();\n\n                this.sendAction('changeEditing', false);\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initMembership();\n\n        this.set('filter', _.head(this.filterChoices));\n        this.set('membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.set('loading', {\n            add: false,\n            search: false\n        });\n\n        this.loadMembershipList().then(() => Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit));\n        this.get('reloadPageOnGroupChange').perform();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.$('.membership-listing').on(\n            'scroll',\n            Ember.run.bind(this, () => this.get('loadContentOnScroll').perform())\n        );\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.membership-listing').off('scroll');\n\n        if (this.get('retryTimeout')) {\n            Ember.run.cancel(timeout);\n        }\n    },\n\n    inclusionQueries: computed('group.membership.inclusions.[]', 'inclusions.[]', function () {\n        const addedInclusions = _.map(this.get('inclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.inclusions').concat(addedInclusions);\n    }),\n\n    exclusionQueries: computed('group.membership.exclusions.[]', 'exclusions.[]', function () {\n        const addedExclusions = _.map(this.get('exclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.exclusions').concat(addedExclusions);\n    }),\n\n    membershipRules: computed('filter.key', 'inclusionQueries', 'exclusionQueries', 'shouldShowRules', function () {\n        if (!this.get('shouldShowRules')) {\n            return;\n        }\n        const key = this.get('filter.key');\n        if (key === 'inclusions') {\n            return this.get('inclusionQueries');\n        }\n        if (key === 'exclusions') {\n            return this.get('exclusionQueries');\n        }\n    }),\n\n    canEdit: computed(\n        'group.id',\n        'session.user.isTrustee',\n        'session.person.namedPermissions',\n        'permissions.canEditGroups',\n        function () {\n            if (this.get('session.user.isTrustee')) {\n                return this.get('permissions.canEditGroups');\n            }\n            const person = this.get('session.person');\n            const permissions = person.get('namedPermissions');\n            return (\n                permissions.includes('admin') ||\n                permissions.includes('group_administration') ||\n                this.isOwner(person) ||\n                this.get('permissions.canEditGroups')\n            );\n        }\n    ),\n\n    canViewRules: computed('canEdit', 'group.membershipVisible', 'group.isDynamicGroup', function () {\n        return !this.get('group.isDynamicGroup') && (this.get('canEdit') || this.get('group.membershipVisible'));\n    }),\n\n    isEditingRules: computed('filter.key', 'editing', function () {\n        const key = this.get('filter.key');\n        return (key === 'inclusions' || key === 'exclusions') && this.get('editing');\n    }),\n\n    expressionDisplay: Ember.computed('group.expression', function () {\n        let output = '';\n        let expression = this.get('group.expression');\n        let invalid = false;\n\n        if (_.isEmpty(expression)) {\n            return this.get('intl').t('groups.expressions.empty');\n        }\n\n        expression.forEach(con => {\n            let display = '(';\n            let orWrap = false;\n\n            con.rules.forEach(rule => {\n                let valid = !!rule.skill && !!rule.comparator && !isNaN(rule.proficiency.value);\n                if (valid) {\n                    display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n                    if (rule.lastRule) {\n                        display += ')';\n                    } else if (!rule.opAnd) {\n                        display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                        orWrap = true;\n                    } else {\n                        display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                    }\n                } else {\n                    invalid = true;\n                }\n            });\n\n            if (orWrap) {\n                display = `(${display})`;\n            }\n\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n            output += display;\n        });\n\n        let empty = output.replaceAll('(', '').replaceAll(')', '').trim() === 0;\n\n        if (invalid) {\n            output = this.get('intl').t('groups.expressions.invalid');\n        } else if (empty) {\n            //has no valid rules\n            output = this.get('intl').t('groups.expressions.empty');\n        }\n        return output;\n    }),\n\n    displayEditingFooter: Ember.computed('group.allowPermissionGroup', 'filter.key', 'editing', function () {\n        const isEditingRules = this.get('isEditingRules');\n        const rolesEnabled = this.get('group.allowPermissionGroup');\n        const editing = this.get('editing');\n        if (!editing) {\n            return false;\n        } else {\n            return !(rolesEnabled && isEditingRules);\n        }\n    }),\n\n    isSearching: computed('search', function () {\n        return !_.isEmpty(this.get('search'));\n    }),\n\n    shouldShowRules: computed.or('isEditingRules', 'showRules'),\n\n    showingFilterChoices: computed('filterChoices.[]', 'shouldShowRules', 'group.isDynamicGroup', function () {\n        if (this.get('shouldShowRules') && !this.get('group.isDynamicGroup')) {\n            return [this.inclusionFilter, this.exclusionFilter];\n        } else if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key !== 'rules' && choice.key !== 'individuals';\n            });\n        }\n        return this.get('filterChoices');\n    }),\n\n    editingFilterChoices: computed('filterChoices.[]', 'group.isDynamicGroup', function () {\n        const choices = this.get('filterChoices').filter(choice => {\n            return choice && choice.key !== 'all' && choice.key !== 'rules';\n        });\n        if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key === 'owners';\n            });\n        } else {\n            return choices.concat([this.inclusionFilter, this.exclusionFilter]);\n        }\n    }),\n\n    dropdownTitle: computed('filter', function () {\n        const filter = this.get('filter');\n        return this.get('intl').lookup(filter.string).toString();\n    }),\n\n    membershipCount: computed('membership.length', 'group.memberCount', function () {\n        const memberCount = this.get('group.memberCount');\n        let promise = Ember.RSVP.resolve(memberCount);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    membershipHeader: computed('membershipCount', 'membershipCount.isFulfilled', function () {\n        const count = this.get('membershipCount.content') || 0;\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    extraParams: computed('group.{generalSearchQuery,membershipSearchQuery}', 'search', 'filter', function () {\n        const search = this.get('search');\n        const filter = this.get('filter');\n        const generalQuery = this.get('group.generalSearchQuery');\n        const membershipQuery = this.get('group.membershipSearchQuery');\n        let queryGroup = [];\n        if (search) {\n            queryGroup.push(search);\n        }\n        if (generalQuery) {\n            queryGroup.push(generalQuery);\n        }\n        if (membershipQuery && filter && filter.key === 'rules') {\n            queryGroup.push(membershipQuery);\n        }\n\n        return { q: queryGroup.join(' AND ') };\n    }),\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'group.value.id') !== get(oldAttrs, 'group.value.id')) {\n            this.cancelEditOnGroupChange();\n            this.get('reloadPageOnGroupChange').perform(true);\n        }\n    },\n\n    debouncedSearchCriteriaChanged: task(function* () {\n        yield timeout(400);\n        Ember.run(() => {\n            const search = this.get('search');\n            if (_.isEmpty(search)) {\n                Ember.set(this, 'currentPage', 0);\n                Ember.set(this, 'loadedAll', false);\n                this.updateContentOnChange();\n            } else {\n                this.get('loadRules').perform();\n            }\n        });\n    }).drop(),\n\n    cancelEditOnGroupChange() {\n        Ember.set(this, 'editing', false);\n        this.sendAction('changeEditing', false);\n    },\n\n    reloadPageOnGroupChange: task(function* (loadMore = false) {\n        if (!this.get('group.id')) {\n            return;\n        }\n\n        this.initMembership();\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        Ember.set(this, 'filter', this.get('filterChoices.0'));\n        Ember.set(this, 'search', '');\n        Ember.set(this, 'currentPage', 0);\n        Ember.set(this, 'loadedAll', false);\n\n        yield this.updateContentOnChange();\n\n        if (loadMore) {\n            Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit);\n        }\n    }),\n\n    updateContentOnChange() {\n        const filter = this.get('filter');\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        switch (filter.key) {\n            case 'owners':\n                return this.get('loadOwners').perform();\n            case 'individuals':\n                return this.get('loadIndividuals').perform();\n            case 'rules':\n                return this.get('loadRules').perform();\n            case 'inclusions':\n            case 'exclusions':\n                return function () {};\n            default:\n                return this.get('loadAll').perform();\n        }\n    },\n\n    searchCriteriaChanged() {\n        this.get('debouncedSearchCriteriaChanged').perform();\n    },\n\n    reload() {\n        this.get('group')\n            .reload()\n            .then(() => this.reloadPageOnGroupReload());\n    },\n\n    reloadPageOnGroupReload() {\n        if (this.get('group.isReloading')) {\n            return;\n        }\n        Ember.set(this, 'loading.search', false);\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.updateContentOnChange();\n    },\n\n    pageChanged: observer('page', function () {\n        this.get('page').then(() => {\n            Ember.set(this, 'loading.search', false);\n        });\n    }),\n\n    initMembership() {\n        Ember.set(this, 'addedIndividuals', []);\n        Ember.set(this, 'removedIndividuals', []);\n        Ember.set(this, 'inclusions', []);\n        Ember.set(this, 'exclusions', []);\n        Ember.set(this, 'membership', []);\n    },\n\n    _individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        const ids = [];\n        individuals.map(i => ids.push(`${i.id}`));\n\n        let url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n        if (method.toLowerCase() === 'post') {\n            return request(url, {\n                data: {\n                    memberIds: ids,\n                    version: group.get('version')\n                },\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        } else if (method.toLowerCase() === 'delete') {\n            url = url.concat('?ids=', ids);\n            return request(url, {\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    },\n\n    saveIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'delete');\n    },\n\n    loadOwners: task(function* () {\n        yield this.loadPathFieldMembers('owners.owners');\n    }).drop(),\n\n    loadIndividuals: task(function* () {\n        yield this.loadPathFieldMembers('individuals.individuals');\n        const addedIndividuals = this.get('addedIndividuals');\n        const membership = this.get('membership');\n\n        if (membership) {\n            membership.addObjects(addedIndividuals);\n        }\n    }).drop(),\n\n    addKeyword(keyword) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const query = equals(keyword.field, keyword.value, this.get('intl'));\n        const data = {\n            q: [query],\n            entity: ['people']\n        };\n        const path = `membership.${key}`;\n        group.set(path, data);\n    },\n\n    addPerson(person) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const data = person.get('id');\n        if (key === 'owners' && !this.isOwner(person)) {\n            group.set('owners.owners', data);\n            const latestAdded = group.get('owners.owners').findBy('value', data);\n            if (latestAdded) {\n                Ember.set(latestAdded, 'guid', data);\n            }\n            this.get('loadOwners').perform();\n        } else if (key === 'individuals' && !this.isIndividual(person)) {\n            const addedIndividuals = this.get('addedIndividuals');\n            if (addedIndividuals) {\n                addedIndividuals.addObject(person);\n            }\n            const removedIndividuals = this.get('removedIndividuals');\n            if (removedIndividuals) {\n                removedIndividuals.removeObject(person);\n            }\n            const membership = this.get('membership');\n            if (membership) {\n                membership.addObject(person);\n            }\n\n            this.get('loadIndividuals').perform();\n        } else if (key === 'inclusions' || key === 'exclusions') {\n            const addedRules = this.get(key);\n            const query = personQuery(['self'], person);\n            const data = {\n                q: [query],\n                entity: ['people']\n            };\n            addedRules.addObject(data);\n        }\n    },\n\n    removePerson(person, memberTypeList) {\n        if (_.isEmpty(memberTypeList)) {\n            memberTypeList = [singularize(this.get('filter.key'))];\n        }\n        memberTypeList.forEach(type => {\n            let path = null;\n            const currentFilter = this.get('filter').path;\n\n            if (type === 'owner') {\n                path = 'owners.owners';\n            }\n\n            if (currentFilter === 'individuals.individuals') {\n                // it is possible that an owner can also be an individual\n                path = 'individuals.individuals';\n                const removedIndividuals = this.get('removedIndividuals');\n                if (removedIndividuals) {\n                    removedIndividuals.addObject(person);\n                }\n                const addedIndividuals = this.get('addedIndividuals');\n                if (addedIndividuals) {\n                    addedIndividuals.removeObject(person);\n                }\n            }\n\n            if (!path) {\n                return;\n            }\n\n            const group = this.get('group');\n            const id = person.get('id');\n            const values = group.getFieldValue(path);\n            const index = _.findIndex(values, value => {\n                if (value.value.q) {\n                    const q = _.head(value.value.q);\n                    return q.value === id || q.guid === id;\n                }\n                return value.value === id || value.guid === id;\n            });\n            if (index > -1) {\n                values.removeAt(index);\n                group.notifyPropertyChange(path);\n            }\n        });\n\n        const membership = this.get('membership');\n        if (membership) {\n            membership.removeObject(person);\n        }\n    },\n\n    removeRule(rule) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const keypath = `membership.${key}`;\n        const values = group.getFieldValue(keypath);\n        const index = _.findIndex(values, value => {\n            if (value._id && rule._id) {\n                return value._id === rule._id;\n            } else {\n                const groupData = _.head(value.value.q);\n                const ruleData = _.head(rule.value.q);\n                return groupData.value === ruleData.value && groupData.key === ruleData.key;\n            }\n        });\n        this.get(key).removeObject(rule.value);\n        if (index > -1) {\n            return values.removeAt(index);\n        }\n    },\n\n    loadContentOnScroll: task(function* () {\n        if (this.get('rateLimited')) return;\n\n        if (this.get('ignoreScroll')) {\n            this.set('ignoreScroll', false);\n        } else {\n            yield timeout(200);\n            if (this.get('loading.search')) {\n                return;\n            }\n            const listing = this.$('.membership-listing');\n            const scroll = listing.scrollTop();\n            const height = listing.prop('scrollHeight') - listing.height();\n\n            if (height - scroll > 500) {\n                return;\n            }\n\n            const filterKey = this.get('filter.key');\n            const isSearching = this.get('isSearching') || filterKey === 'rules';\n            const isEditing = this.get('editing') && ['owners', 'individuals'].indexOf(filterKey) > -1;\n\n            let promise;\n            if (isSearching) {\n                promise = this.loadSearchMembers();\n            } else if (isEditing || filterKey === 'individuals' || filterKey === 'owners') {\n                const path = filterKey === 'owners' ? 'owners.owners' : 'individuals.individuals';\n                promise = this.loadPathFieldMembers(path);\n            } else {\n                promise = this.loadMembershipList();\n            }\n\n            return promise.then(newMembership => {\n                const meta = newMembership && newMembership._meta;\n                const isLastPage = meta && meta.pageCount === meta.pageNumber;\n                Ember.set(this, 'loadedAll', _.isEmpty(newMembership) || isLastPage);\n            });\n        }\n    }).drop(),\n\n    loadSearchMembers() {\n        const loading = this.get('loading.search');\n        const loadedAll = this.get('loadedAll');\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        this.set('currentlySearching', true);\n        this.set('loading.search', true);\n        return this.searchMembership(this.get('search')).then(content => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n            if (Array.isArray(content.content)) {\n                content = content.content.map(x => x.getRecord());\n            }\n            this.set('loading.search', false);\n            const key = this.get('filter.key');\n            if (key !== 'all' && key !== 'rules') {\n                const filter = this.get(`group.${key}.${key}`);\n                if (filter) {\n                    const peopleIds = filter.mapBy('guid');\n                    content = _.filter(content, person => {\n                        return _.includes(peopleIds, person.get('id'));\n                    });\n                }\n            } else if (key === 'rules' && _.isEmpty(this.get('inclusionQueries'))) {\n                content = [];\n            }\n            if (this.get('currentPage')) {\n                this.get('membership').pushObjects(content || []);\n            } else {\n                Ember.set(this, 'membership', content);\n            }\n            this.incrementProperty('currentPage');\n            return content;\n        });\n    },\n\n    loadMembershipList() {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n        const editing = this.get('editing');\n        if (loading || loadedAll || editing) {\n            return Ember.RSVP.resolve([]);\n        }\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n        Ember.set(this, 'loading.search', true);\n        const promise = this.get('store')\n            .findGroupMembership(this.get('group.id'), query)\n            .then(membership => {\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n\n                if (membership) {\n                    const promises = membership.map(member => {\n                        if (member.get('type') === 'user') {\n                            return member.get('profile').then(person => person);\n                        } else {\n                            return member\n                                .reload()\n                                .then(res => {\n                                    return res;\n                                })\n                                .catch(err => {\n                                    if (!this.isDestroying && !this.isDestroyed) {\n                                        if (err.errors[0].status === 429) {\n                                            if (!this.get('rateLimited')) {\n                                                this.set('membershipQuery.offset', query.offset - query.limit);\n                                                this.set('rateLimited', true);\n                                                this.get('notification').error(\n                                                    this.get('intl').t('notification.group.errors.rateLimit.title'),\n                                                    this.get('intl').t('notification.group.errors.rateLimit.message')\n                                                );\n\n                                                this.set(\n                                                    'retryTimeout',\n                                                    Ember.run.later(() => {\n                                                        this.set('rateLimited', false);\n                                                    }, this.get('retyTimeOutDuration'))\n                                                );\n                                            }\n                                        }\n                                    }\n                                });\n                        }\n                    });\n\n                    Ember.RSVP.allSettled(promises).then(results => {\n                        const filteredResults = results\n                            .map(r => r.value)\n                            .filter(r => {\n                                return r && r.isError !== true;\n                            });\n                        const allMemberships = _.uniqBy([...this.get('membership'), ...filteredResults], 'id');\n\n                        this.get('membership').setObjects(allMemberships);\n                    });\n                } else {\n                    this.get('membership').addObjects(membership);\n                }\n                Ember.set(this, 'loading.search', false);\n                return membership;\n            });\n        Ember.set(this, 'currentMembershipRequest', DS.PromiseArray.create({ promise }));\n\n        return promise;\n    },\n\n    setRulesOnGroup() {\n        const group = this.get('group');\n        _.forEach(this.get('inclusions'), rule => group.set('membership.inclusions', rule));\n        Ember.set(this, 'inclusions', []);\n\n        _.forEach(this.get('exclusions'), rule => group.set('membership.exclusions', rule));\n        Ember.set(this, 'exclusions', []);\n    },\n\n    isOwner(person) {\n        return this.get('group').isPersonOwner(person);\n    },\n\n    isIndividual(person) {\n        return this.get('group').isPersonIndividual(person);\n    },\n\n    loadPathFieldMembers(path) {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        let ids;\n        let fieldData = this.get(`group.${path}`);\n        if (fieldData) {\n            ids = fieldData.mapBy('guid');\n        }\n\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n\n        if (_.isEmpty(ids)) {\n            Ember.set(this, 'loading.search', false);\n            Ember.set(this, 'membership', []);\n            return Ember.RSVP.resolve([]);\n        }\n        if (!Array.isArray(ids)) {\n            ids = [ids];\n        }\n\n        const updateOffset = ids.length > this.memberListLimitSize;\n\n        ids = ids.slice(query.offset, query.offset + query.limit);\n\n        if (updateOffset) {\n            Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n        }\n        Ember.set(this, 'loading.search', true);\n\n        return this.get('store')\n            .findMany('person', ids, BASE_PERSON)\n            .then(content => {\n                if (this.isDestroying || this.isDestroyed) {\n                    return;\n                }\n\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                if (!Array.isArray(content)) {\n                    content = [content];\n                }\n\n                content = this.sort(content);\n\n                Ember.set(this, 'loading.search', false);\n                this.get('membership').addObjects(content);\n                return content;\n            });\n    },\n\n    sort(content) {\n        return content.sort((a, b) => {\n            const aName = a.get('name');\n            const bName = b.get('name');\n            if (aName > bName) {\n                return 1;\n            }\n            if (aName < bName) {\n                return -1;\n            }\n            return 0;\n        });\n    },\n\n    loadRules: task(function* () {\n        const isPending = this.get('page.isPending');\n        if (isPending) {\n            return;\n        }\n        Ember.set(this, 'currentPage', 0);\n        Ember.set(this, 'loadedAll', false);\n        yield this.loadSearchMembers();\n    }),\n\n    loadAll: task(function* () {\n        yield this.loadMembershipList();\n    }),\n\n    handleJobFinish() {\n        this.get('loadAll').perform();\n        this.get('group').reload();\n    },\n\n    searchMembership(search) {\n        if (search && search.length < 2) {\n            return Ember.RSVP.resolve([]);\n        }\n        const builder = this.get('searchService').requestBuilder();\n        const group = this.get('group');\n        const fieldPath = `${group.getFieldValue('general.groupType').value}.guid`;\n        builder.addQuery(group.get('guid'), 'AND', 'EXACT', [fieldPath]);\n        if (search) {\n            builder.addQuery(search);\n        }\n\n        // Add pagination support\n        const currentPage = this.get('currentPage') || 0;\n        const pageSize = 25; // Default search page size (matches search service default)\n        builder.setPaging(currentPage + 1, pageSize);\n        return this.get('searchService').performCustomSearch(builder);\n    },\n\n    loadMoreMembersOnInit() {\n        if (this.get('group.memberCount') <= 10) {\n            return;\n        }\n\n        let listingEl = this.$('.membership-listing');\n        if (!listingEl) {\n            return;\n        }\n\n        // Sometimes we've gotta load the second page depending on how much available screen\n        // space the user has. Otherwise they can't load more members!\n        let containerHeight = listingEl.height();\n        let heightPerEntry = 90;\n        if (containerHeight / heightPerEntry < this.get('membership.length')) {\n            return;\n        }\n\n        return this.get('loadContentOnScroll').perform();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"8dp6s8U+\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isDynamicGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn show-dynamic-rules\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"dynamicRules\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.edit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-header\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-5\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"small\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRules\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewMembership\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewRules\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-button-multi\\\",{\\\"attrs\\\":[[16,\\\"text\\\",[34,[[26,[\\\"dropdownTitle\\\"]]]]],[15,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"class\\\",\\\"group-profile-members-button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"showingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-list-item\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]],null],null],[16,\\\"class\\\",[34,[[28,[\\\"filter\\\",\\\"key\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editMembership\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"membershipToggleLabel\\\"],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-switch-wrapper\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleCallsEnabled\\\"]]],null]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"filter-tabs\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[15,\\\"role\\\",\\\"tablist\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"editingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"filter\\\",\\\"active\\\"]],\\\"active\\\"],null],\\\" \\\",[28,[\\\"filter\\\",\\\"key\\\"]],\\\"-tab\\\"]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[28,[\\\"filter\\\",\\\"active\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-search\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"editing\\\",\\\"updateSearch\\\",\\\"filter\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"search\\\"]],[28,[\\\"editing\\\"]],\\\"updateSearch\\\",[28,[\\\"filter\\\"]],\\\"search\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"membership-listing \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"allowPermissionGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"alert alert-warning roles-rules-info-message\\\"],[15,\\\"role\\\",\\\"alert\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-info-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.rulesDisabledMessage\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membershipRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/membership-rule-entry\\\"],null,[[\\\"rule\\\",\\\"group\\\",\\\"editing\\\",\\\"filter\\\",\\\"deleteRule\\\"],[[28,[\\\"rule\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"filter\\\"]],\\\"removeRule\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membership\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-entry\\\"],null,[[\\\"person\\\",\\\"group\\\",\\\"editing\\\",\\\"individuals\\\",\\\"membership\\\",\\\"deletePerson\\\"],[[28,[\\\"member\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"addedIndividuals\\\"]],[28,[\\\"membership\\\"]],\\\"removePerson\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"member\\\"]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"search\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center empty\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayEditingFooter\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"add-member \\\",[33,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]],\\\"col-sm-6\\\",\\\"col-sm-12\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"filter\\\",\\\"selectPerson\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"add\\\"]],[28,[\\\"filter\\\"]],\\\"selectPerson\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-keyword col-sm-6\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-tag-search\\\"],null,[[\\\"group\\\",\\\"filter\\\",\\\"selectKeyword\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"filter\\\"]],\\\"selectKeyword\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"submit col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-listing/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['group-membership-rule-entry'],\n\n    store: Ember.inject.service(),\n\n    rule: null,\n    group: null,\n    filter: null,\n    editing: false,\n\n    relationships: ['ancestors', 'parent', 'self', 'siblings', 'children', 'descendants'],\n    groupedRelationships: [\n        ['ancestors', 'parent'],\n        ['self', 'siblings'],\n        ['children', 'descendants']\n    ],\n\n    actions: {\n        toggleRelationship(relationship) {\n            const key = `graph.${relationship}`;\n            this.toggleProperty(key);\n            const value = this.get(key);\n            const field = this.get('rule');\n            const { rels } = _.last(Ember.get(field, 'value.q'));\n            if (value) {\n                rels.addObject(relationship);\n            } else {\n                rels.removeObject(relationship);\n            }\n        },\n\n        deleteRule() {\n            this.sendAction('deleteRule', this.get('rule'));\n        }\n    },\n\n    isKeyword: computed('rule.value.q.@each.type', function () {\n        const q = this.get('rule.value.q');\n        return _.head(q).type === 'equals';\n    }),\n\n    relationshipGroups: computed(\n        'groupedRelationships',\n        'graph.{self,parent,ancestors,siblings,children,descendants}',\n        function () {\n            const groupedRelationships = this.get('groupedRelationships');\n            return groupedRelationships.map(group => {\n                return group.map(relationship => {\n                    return {\n                        relationship,\n                        key: `person.graph.${relationship}`,\n                        selected: this.relationshipSelected(relationship)\n                    };\n                });\n            });\n        }\n    ),\n\n    field: computed('group', 'filter.key', function () {\n        const key = this.get('filter.key');\n        return this.get(`group.fieldConfig.membership.${key}`);\n    }),\n\n    person: computed('rule.value.q.@each.value', 'isKeyword', function () {\n        if (this.get('isKeyword')) {\n            return;\n        }\n        const q = this.get('rule.value.q');\n        let guid = _.head(q).guid;\n        let oid = _.head(q).value;\n        if (!guid && !!oid) {\n            // We've got a weird case where a guid value was not populated by directory\n            // Log and take these errors to directory team so they can migrate\n            this.logger.error('Found a group rule entry without a guid value', {\n                group: this.get('group.id')\n            });\n        }\n        return this.get('store').findRecord('person', guid || oid);\n    }),\n\n    graph: computed('rule.value.q.@each.rels', function () {\n        const q = this.get('rule.value.q');\n        return this.buildGraphFromRelationships(_.head(q).rels);\n    }),\n\n    name: computed('person.name', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).value;\n        }\n        return this.get('person.name');\n    }),\n\n    title: computed('person.title', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).key;\n        }\n        return this.get('person.title');\n    }),\n\n    relationshipSelected(relationship) {\n        return this.get('graph')[relationship];\n    },\n\n    buildGraphFromRelationships(rels) {\n        const graph = {};\n        _.forEach(rels, rel => {\n            graph[rel] = true;\n        });\n        const defaults = {\n            ancestors: false,\n            parent: false,\n            self: false,\n            siblings: false,\n            children: false,\n            descendants: false\n        };\n        const options = Object.assign({}, defaults, graph);\n        return Ember.Object.create(options);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // If this entry fails to load due to the person record\n        // not being found, let's log it\n        let person = this.get('person');\n        if (!person || !person.catch) {\n            return;\n        }\n        person.catch(error => {\n            this.logger.error('Error loading membership rule entry', {\n                error\n            });\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"+jW7/wZi\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null],true]],{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"title\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[26,[\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"relationships\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"relationshipGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-purecloud \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"selected\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRelationship\\\",[28,[\\\"relationship\\\",\\\"relationship\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"relationship\\\",\\\"key\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"graph\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"person-graph\\\"],null,[[\\\"person\\\",\\\"width\\\",\\\"height\\\",\\\"graph\\\",\\\"mini\\\"],[[28,[\\\"person\\\"]],50,50,[28,[\\\"graph\\\"]],true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete danger\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteRule\\\"]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-rule-entry/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { SearchMixin } from '../../../mixins/search';\n\nconst { get, run, inject, computed, observer, Component } = Ember;\n\nfunction removeDuplicates(group, key, results) {\n    let currentIds;\n    const current = group.getFieldValue(key);\n    if (current) {\n        currentIds = current.mapBy('value');\n    }\n    if (_.includes(key, 'membership')) {\n        currentIds = currentIds.map(id => {\n            const data = _.head(id.q) || {};\n            return Ember.get(data, 'value');\n        });\n    }\n    if (results && currentIds.length) {\n        return results.filter(result => {\n            const id = result.get('id');\n            return !currentIds.includes(id);\n        });\n    }\n    return results;\n}\n\nexport default Component.extend(SearchMixin, {\n    classNames: ['group-membership-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    entityFilter: 'people',\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    searchLimit: 6,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n            this.updateSearchOnChange();\n        },\n\n        select(person) {\n            this.sendAction('selectPerson', person);\n            this.resetPersonSearch();\n        },\n\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange();\n        },\n\n        handleKeyDown(index, event) {\n            const items = this.element.querySelectorAll('[role=\"menuitem\"]');\n            const totalItems = items.length;\n\n            switch (event.key) {\n                case 'ArrowDown':\n                    event.preventDefault();\n                    const nextIndex = (index + 1) % totalItems;\n                    this.updateTabIndex(items, nextIndex);\n                    items[nextIndex].focus();\n                    break;\n\n                case 'ArrowUp':\n                    event.preventDefault();\n                    const prevIndex = (index - 1 + totalItems) % totalItems;\n                    this.updateTabIndex(items, prevIndex);\n                    items[prevIndex].focus();\n                    break;\n\n                case 'Enter':\n                case ' ':\n                    event.preventDefault();\n                    const results = this.get('results');\n                    this.send('select', results.objectAt(index));\n                    break;\n\n                case 'Escape':\n                    event.preventDefault();\n                    this.resetPersonSearch();\n                    this.element.querySelector('input').focus();\n                    break;\n\n                case 'Home':\n                    event.preventDefault();\n                    this.updateTabIndex(items, 0);\n                    items[0].focus();\n                    break;\n\n                case 'End':\n                    event.preventDefault();\n                    this.updateTabIndex(items, totalItems - 1);\n                    items[totalItems - 1].focus();\n                    break;\n            }\n        }\n    },\n\n    isRules: computed('filter.key', function () {\n        const key = this.get('filter.key');\n        return key === 'inclusions' || key === 'exclusions';\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-moon pc-search';\n        }\n        return 'pc pc-add-person';\n    }),\n\n    searchText: computed('mode', function () {\n        const intl = this.get('intl');\n        if (this.get('mode') === 'search') {\n            return intl.lookup('groups.searchMembers').toString();\n        }\n        return intl.lookup('groups.addPerson').toString();\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    results: computed('searchResults.[]', function () {\n        const group = this.get('group');\n        const key = this.get('filter.path');\n        return removeDuplicates(group, key, this.get('searchResults'));\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    resultsChanged: observer('results.[]', function () {\n        run.scheduleOnce('afterRender', this, () => {\n            const results = this.get('results');\n            if (results && results.length > 0) {\n                const firstItem = this.element.querySelector('[role=\"menuitem\"]');\n                if (firstItem) {\n                    firstItem.focus();\n                }\n            }\n        });\n    }),\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'editing.value') !== get(oldAttrs, 'editing.value')) {\n            this.set('searchValue', null);\n        }\n    },\n\n    didReceiveAttrs() {\n        const filter = this.get('filter');\n        const previousFilter = this.get('_previousFilter');\n        if (previousFilter && filter !== previousFilter) {\n            this.set('searchValue', '');\n        }\n        this.set('_previousFilter', filter);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachOutsideHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeOutsideHandler();\n    },\n\n    updateSearchOnChange() {\n        if (this.get('mode') === 'search') {\n            this.sendAction('updateSearch', this.get('searchValue'));\n        } else {\n            run.debounce(this, this.performPersonSearch, 300);\n        }\n    },\n\n    attachOutsideHandler() {\n        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetPersonSearch();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    performPersonSearch() {\n        const search = this.get('searchValue');\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            this.get('search')\n                .performSearch(search, 0, 'users')\n                .then(({ results }) => {\n                    this.set('loading', false);\n                    this.set('searchResults', results);\n                });\n        } else {\n            this.set('searchResults', []);\n            this.set('searchMeta', {});\n        }\n    },\n\n    resetPersonSearch() {\n        this.set('searchValue', '');\n        this.set('searchResults', []);\n        this.set('searchMeta', {});\n    },\n\n    updateTabIndex(items, focusIndex) {\n        items.forEach((item, idx) => {\n            item.setAttribute('tabindex', idx === focusIndex ? '0' : '-1');\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"RCG3b8FL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMembers\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results show dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]],\\\"keyword\\\"],null]]]],[15,\\\"role\\\",\\\"menu\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[16,\\\"tabindex\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"index\\\"]],0],null],\\\"0\\\",\\\"-1\\\"],null]]]],[15,\\\"role\\\",\\\"menuitem\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\",[28,[\\\"index\\\"]]],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[28,[\\\"result\\\"]],true]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"result\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"department\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\",\\\"index\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-search/template.hbs\"}});","import Ember from 'ember';\n\nimport { SEARCH_FACET_KEYPATHS } from '../../../search/service';\nimport _ from 'lodash';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-search', 'tag-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    loading: false,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n        },\n\n        keyword(keyword) {\n            this.sendAction('selectKeyword', keyword);\n            this.resetSearch();\n        },\n\n        updateSearch(event) {\n            const value = event.target.value;\n            this.set('searchValue', value);\n            if (this.get('mode') === 'search') {\n                this.sendAction('updateSearch', value);\n            } else if (value === '') {\n                this.resetSearch();\n            } else {\n                Ember.run.debounce(this, this.performSearch, value, 250);\n            }\n        }\n    },\n\n    searchText: computed(function () {\n        return this.get('intl').lookup('groups.addKeyword').toString();\n    }),\n\n    results: computed('tagSearchResults.[]', function () {\n        return this.get('tagSearchResults');\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-search';\n        }\n        return 'pc-add-person';\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    editingStateChanged: observer('editing', function () {\n        if (!_.isEmpty(this.get('searchValue'))) {\n            this.set('searchValue', '');\n        }\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    attachOutsideHandler: on('didInsertElement', function () {\n        return Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetSearch();\n                }\n            });\n        });\n    }),\n\n    removeOutsideHandler: on('willDestroyElement', function () {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    }),\n\n    performSearch(search) {\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            const type = 'CONTAINS';\n            const builder = this.get('search').requestBuilder();\n            const fields = ['profileSkills', 'department', 'certifications', 'title'];\n            builder.addAggregations(\n                ['profileSkills', search, 'profileSkills', type, 5],\n                ['department', search, 'department', type, 5],\n                ['certifications', search, 'certifications', type, 5],\n                ['title', search, 'title', type, 5]\n            );\n            this.get('search')\n                .performCustomSearch(builder)\n                .then(data => {\n                    this.set('loading', false);\n                    const results = fields.map(field => {\n                        const aggregates = data[field];\n                        return aggregates.map(aggregate => {\n                            return {\n                                field: SEARCH_FACET_KEYPATHS[field],\n                                value: aggregate.key\n                            };\n                        });\n                    });\n                    this.set('results', _.flatten(results));\n                });\n        }\n    },\n\n    resetSearch() {\n        this.set('loading', false);\n        this.set('searchValue', '');\n        this.set('results', []);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"7cwxw4o7\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMemberTags\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateSearch\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu keyword\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"keyword\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"result\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"result\\\",\\\"field\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-tag-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport JobMixin from '../../../mixins/job';\n\nexport default Ember.Component.extend(JobMixin, {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    session: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n\n    isEditingRoles: false,\n    displayRoleRemoveModal: false,\n    rolesToDelete: [],\n    displayRulesRolesWarningModel: false,\n\n    // tracks all unsaved grant changes when editing roles for group\n    unsavedGrants: new Ember.Object({\n        roles: {}, //map of roles that contains a map of unsaved-grant objects\n        _hasUnsavedGrants: false,\n        parent: undefined, //pass reference after instantiation\n        hasUnsavedGrants: undefined, //create computed after instantiation\n        add({ grantId, roleId, divisionId }) {\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            //if grant already exists, then just make sure we don't delete it\n            if (grantModel) {\n                delete this.get('roles')[roleId][grantId];\n            } else {\n                this.get('roles')[roleId][grantId] = {\n                    action: 'save',\n                    roleId,\n                    divisionId\n                };\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        remove({ grantId, roleId }) {\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (grantModel) {\n                this.get('roles')[roleId][grantId] = { action: 'delete' };\n            } else {\n                delete this.get('roles')[roleId][grantId];\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        addAllFutureDivisions({ grantId, roleId }) {\n            this.get('roles')[roleId] = {};\n            this.add({ divisionId: '*', roleId, grantId });\n        },\n        removeAllFutureDivisions(roleId, grantId) {\n            this.remove({ roleId, grantId });\n        },\n        recalculateHasUnsavedGrants() {\n            const grantMaps = _.values(this.get('roles'));\n            let hasUnsavedGrants = false;\n            grantMaps.forEach(grantMap => {\n                if (Object.keys(grantMap).length) {\n                    hasUnsavedGrants = true;\n                }\n            });\n            this.set('_hasUnsavedGrants', hasUnsavedGrants);\n        },\n        clear() {\n            this.set('roles', {});\n            this.recalculateHasUnsavedGrants();\n        }\n    }),\n\n    groupRolesViewColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'role.name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-view'\n        };\n        const typeColumn = {\n            key: 'role.type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-view'\n        };\n        const descriptionColumn = {\n            key: 'role.description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-view'\n        };\n        const divisionsViewColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '255px',\n            component: 'group-profile/roles-edit/fixtable/division-view',\n            cellClass: 't-role-divisions-view'\n        };\n        const deleteColumn = {\n            header: 'delete button',\n            hideLabel: true,\n            component: 'group-profile/roles-edit/fixtable/list-remove',\n            iconClass: 'fa fa-times',\n            width: '1px',\n            class: 'list-remove-button'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsViewColumn, deleteColumn];\n    }),\n\n    groupRolesEditColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-edit'\n        };\n        const typeColumn = {\n            key: 'type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-edit'\n        };\n        const descriptionColumn = {\n            key: 'description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-edit'\n        };\n        const divisionsEditColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '350px',\n            component: 'group-profile/roles-edit/fixtable/division-select',\n            cellClass: 't-role-divisions-edit'\n        };\n        const assignmentColumn = {\n            header: this.get('intl').lookup('groups.roles.selection'),\n            component: 'group-profile/roles-edit/fixtable/is-assigned-toggle',\n            width: '1px',\n            cellClass: 't-role-is-assigned'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsEditColumn, assignmentColumn];\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    actions: {\n        editRoles() {\n            if (this.get('hasRules')) {\n                this.set('displayRulesRolesWarningModel', true);\n            } else {\n                this.set('isEditingRoles', true);\n                this.set('allRolesFiltered', this.get('allRoles'));\n            }\n        },\n\n        toggleRolesEnabled() {\n            this._toggleRolesEnabled();\n        },\n\n        confirmWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n            this._enableRoles();\n        },\n\n        closeRulesRolesWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n        },\n\n        getGroupRoles() {\n            this._getGroupRoles();\n        },\n\n        deleteRoles() {\n            this._deleteRoles();\n        },\n\n        openConfirmModelSingleRole(roleId) {\n            const grantRole = this.get('groupAssignedRoles.list').find(grantRoles => {\n                return Ember.get(grantRoles, 'id') === roleId;\n            });\n            this.set('rolesToDelete', [grantRole.role]);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        openConfirmModelMultipleRole(divisionRoles) {\n            let roles = divisionRoles.map(divisionRole => {\n                return divisionRole.role;\n            });\n            this.set('rolesToDelete', roles);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        save() {\n            this.set('isLoadingAllRoles', true);\n            let rolesToUpdate = {}; //map a role Id to a list of division ids to add that role for bulk save\n            let grantsToDelete = [];\n            let version = this.get('model.grantVersion');\n            _.values(this.get('unsavedGrants.roles')).forEach(grantMap => {\n                _.forOwn(grantMap, ({ action, roleId, divisionId }, grantId) => {\n                    if (action === 'save') {\n                        if (rolesToUpdate[roleId]) {\n                            rolesToUpdate[roleId].pushObject(divisionId);\n                        } else {\n                            rolesToUpdate[roleId] = [divisionId];\n                        }\n                    } else if (action === 'delete') {\n                        const undeletedGrant = this.get('store').peekRecord('grant', grantId);\n                        if (undeletedGrant) {\n                            grantsToDelete.pushObject(undeletedGrant);\n                        }\n                    } else {\n                        Ember.Logger.error('grant actions other than save or delete are not supported');\n                    }\n                });\n            });\n            // Make API calls sequentially to avoid api clobbering data\n            _.reduce(\n                rolesToUpdate,\n                (promise, divisionIds, roleId) => {\n                    return promise.then(() => {\n                        return this.get('store')\n                            .adapterFor('grant')\n                            .saveBulk(roleId, [this.get('model.guid')], divisionIds);\n                    });\n                },\n                Ember.RSVP.Promise.resolve()\n            )\n                .then(() => {\n                    return grantsToDelete.reduce((promise, undeletedGrant) => {\n                        return promise.then(() => {\n                            return undeletedGrant.destroyRecord();\n                        });\n                    }, Ember.RSVP.Promise.resolve());\n                })\n                .then(() => {\n                    this.get('unsavedGrants').clear();\n                    this._stopEditingRoles();\n                    this.get('notification').success(\n                        null,\n                        this.get('intl').lookup('groups.roles.roleAssignmentSaveSuccess')\n                    );\n                    return this._getGroupRoles(version);\n                })\n                .catch(err => {\n                    if (this._isTooManyGrantsError(err)) {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.tooManyGrantsSaveError')\n                        );\n                    } else {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.roleAssignmenSaveError')\n                        );\n                    }\n                    Ember.Logger.error('error saving grants', { error: err });\n                })\n                .finally(() => {\n                    this.set('isLoadingAllRoles', false);\n                });\n        },\n\n        searchAssignedRoles(query) {\n            const assignedRoles = this.get('groupAssignedRoles.list');\n            if (!assignedRoles) {\n                return;\n            }\n\n            if (query.length < 2) {\n                this.set('groupAssignedRolesFiltered', assignedRoles);\n            } else {\n                let filteredRoles = assignedRoles.filter(roleDivision => {\n                    return Ember.get(roleDivision, 'role.name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('groupAssignedRolesFiltered', filteredRoles);\n            }\n        },\n\n        searchAllRoles(query) {\n            const allRoles = this.get('allRoles');\n            if (!allRoles) {\n                return;\n            }\n\n            if (query.length < 2) {\n                this.set('allRolesFiltered', allRoles);\n            } else {\n                let filteredRoles = allRoles.filter(role => {\n                    return role.get('name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('allRolesFiltered', filteredRoles);\n            }\n        },\n\n        cancel() {\n            this._stopEditingRoles();\n        },\n\n        updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n            this._updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions);\n        },\n\n        closeWarningModal() {\n            this.set('rolesToDelete', []);\n            this.set('displayRoleRemoveModal', false);\n        },\n\n        confirmHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n            this._disableRoles();\n        },\n\n        closeHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n        },\n        toggleRoleAssignment(roleId, isAssigned) {\n            if (isAssigned) {\n                this.get('groupAssignedRoles').addRole(roleId, {});\n            } else {\n                this.get('groupAssignedRoles').removeRole(roleId);\n            }\n        }\n    },\n\n    _stopEditingRoles() {\n        this.get('unsavedGrants').clear();\n        this._getGroupRoles();\n        Ember.trySet(this, 'isEditingRoles', false);\n    },\n\n    _updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n        //add selected divisions to unsaved grants map\n        selectedDivisions.forEach(division => {\n            const grantId = this.get('model.guid') + roleId + division.id;\n            this.get('unsavedGrants').add({\n                grantId,\n                roleId,\n                divisionId: division.id\n            });\n        });\n        //remove unselected divisions\n        previouslySelectedDivisions.forEach(division => {\n            let stillSelectedDivision = selectedDivisions.find(stillSelectedDivision => {\n                return division.id === stillSelectedDivision.id;\n            });\n            if (!stillSelectedDivision) {\n                const grantId = this.get('model.guid') + roleId + division.id;\n                this.get('unsavedGrants').remove({ grantId, roleId });\n            }\n        });\n\n        //keep unsaved divisions change between role pages\n        if (selectedDivisions.length) {\n            this.get('groupAssignedRoles').addRole(roleId, {\n                id: roleId,\n                role: this.get('store').peekRecord('role', roleId),\n                divisions: selectedDivisions\n            });\n        } else {\n            this.get('groupAssignedRoles').removeRole(roleId);\n        }\n    },\n\n    _removeRole(role) {\n        let grantsToDelete = [];\n        let divisionRole = this.get('groupAssignedRoles').getRoleWithDivisions(role.id);\n        Ember.get(divisionRole, 'divisions').forEach(division => {\n            const grantId = this.get('model.guid') + Ember.get(role, 'id') + division.get('id');\n            let grantRecord = this.get('store').peekRecord('grant', grantId);\n            grantsToDelete.pushObject(grantRecord);\n        });\n        Ember.set(divisionRole, 'divisions', []);\n        // Make API calls sequentially to avoid api clobbering data\n        return grantsToDelete\n            .reduce((promise, undeletedGrant) => {\n                return promise.then(() => {\n                    return undeletedGrant.destroyRecord();\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(data => {\n                this.get('notification').success(null, this.get('intl').lookup('groups.roles.removeSuccess'));\n                return data;\n            })\n            .catch(err => {\n                this.get('notification').error(null, this.get('intl').lookup('groups.roles.removeError'));\n                return err;\n            });\n    },\n\n    _deleteRoles() {\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        let version = this.get('model.grantVersion');\n        // Make API calls sequentially to avoid api clobbering data\n        return this.get('rolesToDelete')\n            .reduce((promise, role) => {\n                return promise.then(() => {\n                    return this._removeRole(role);\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(() => {\n                return this._getGroupRoles(version);\n            })\n            .catch(err => {\n                Ember.Logger.error('error removing selected roles', { error: err });\n            })\n            .finally(() => {\n                this.set('rolesToDelete', []);\n                this.set('displayRoleRemoveModal', false);\n            });\n    },\n\n    _getGroupRoles(previousVersion, attempt = 0) {\n        if (attempt >= 10) {\n            return Ember.RSVP.reject('timed out waiting for group roles to update');\n        }\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        const group = this.get('model');\n        if (!group) {\n            Ember.Logger.error('no group for roles edit component. (expected if test)');\n            return;\n        }\n        group\n            .getGrants()\n            .then(grants => {\n                //TODO: Bulk Update Does not Increment Version Number https://inindca.atlassian.net/browse/PLAT-1953\n                // if (previousVersion && this.get('model.grantVersion') <= previousVersion) {\n                //     return new Ember.RSVP.Promise((resolve) => {\n                //         Ember.run.later(() => {\n                //             resolve(this._getGroupRoles(previousVersion, ++attempt));\n                //         }, 500);\n                //     });\n                // }\n                let assignedRolesMap = {};\n                this.get('store').unloadAll('grant');\n                grants.forEach(grant => {\n                    grant.subjectId = this.get('model.guid');\n                    // push grants, roles and divisions to the store\n                    this.get('store').push(this.get('store').normalize('grant', grant));\n                    const role = this.get('store').push(this.get('store').normalize('role', grant.role));\n                    const division = this.get('store').push(this.get('store').normalize('division', grant.division));\n                    if (!assignedRolesMap[grant.role.id]) {\n                        assignedRolesMap[grant.role.id] = {\n                            id: grant.role.id,\n                            role,\n                            divisions: [division]\n                        };\n                    } else {\n                        Ember.get(assignedRolesMap[grant.role.id], 'divisions').pushObject(division);\n                    }\n                });\n                this.get('groupAssignedRoles').setMap(assignedRolesMap);\n                this.set('groupAssignedRolesFiltered', this.get('groupAssignedRoles.list'));\n            })\n            .catch(err => {\n                Ember.Logger.error('failed to load grants', { error: err });\n            })\n            .finally(() => {\n                this.isDestroyed || Ember.trySet(this, 'isLoadingGroupRoles', false); // workaround trySet until we get this fix https://github.com/emberjs/ember.js/pull/13355\n            });\n    },\n\n    _isTooManyGrantsError(err) {\n        return (\n            err &&\n            err.errors &&\n            err.errors.length &&\n            err.errors[0].message &&\n            err.errors[0].message.includes('Too many grants of role')\n        );\n    },\n\n    _toggleRolesEnabled() {\n        const turnOnRoles = !this.get('model.allowPermissionGroup');\n        if (turnOnRoles) {\n            this._toggleRolesOn();\n        } else {\n            this._toggleRolesOff();\n        }\n    },\n\n    _toggleRolesOn() {\n        if (this.get('hasRules')) {\n            this.set('displayRulesRolesWarningModel', true);\n        } else {\n            this._enableRoles();\n        }\n    },\n\n    _toggleRolesOff() {\n        if (this.get('groupAssignedRoles.list.length')) {\n            this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n            this.set('displayHasRolesWarningModel', true);\n        } else {\n            this._disableRoles();\n        }\n    },\n\n    _enableRoles() {\n        let hadRules = false;\n        this.set('isLoadingGroupRoles', true);\n        if (this.get('hasRules')) {\n            hadRules = true;\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n        }\n        this.set('model.allowPermissionGroup', true);\n        return this.get('model')\n            .save()\n            .then(res => {\n                const job = Ember.get(res, 'meta.job');\n                if (hadRules) {\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(null, message, {\n                        forceBrowserNotification: true\n                    });\n                }\n                if (job && job.jobId) {\n                    this.addJob(\n                        job,\n                        () => {\n                            this.get('model').reload();\n                        },\n                        this\n                    );\n                }\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    _disableRoles() {\n        this.set('isLoadingGroupRoles', true);\n        this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n        return this._deleteRoles()\n            .then(() => {\n                this.set('model.allowPermissionGroup', false);\n                return this.get('model').save();\n            })\n            .then(() => {\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardNavigation();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeKeyboardNavigation();\n    },\n\n    didRender() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardNavigation();\n    },\n\n    // Re-run accessibility setup when table content changes\n    contentDidChange: Ember.observer(\n        'allRolesFiltered.[]',\n        'groupAssignedRolesFiltered.[]',\n        'isLoadingAllRoles',\n        'isLoadingGroupRoles',\n        'isEditingRoles',\n        function () {\n            if (\n                !this.get('isLoadingAllRoles') &&\n                !this.get('isLoadingGroupRoles') &&\n                this.get('allRolesFiltered') &&\n                this.get('groupAssignedRolesFiltered')\n            ) {\n                Ember.run.debounce(this, this._setupFixtableAccessibility, 100);\n            }\n        }\n    ),\n\n    _setupAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('.enable-roles-toggle .toggle-switch-container input');\n            const innerLabel = this.$('.enable-roles-toggle .toggle-switch-container .toggle-switch[title]');\n            const labelText = this.get('intl').lookup('groups.roles.enableRoles');\n\n            if (toggleInput.length && labelText) {\n                // Associate the input with the existing label\n                toggleInput.attr('aria-labelledby', 'enableRolesToggleLabel');\n                toggleInput.attr('aria-label', labelText);\n            }\n\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && labelText) {\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n\n            // Fix fixtable row selection checkboxes\n            this._setupFixtableAccessibility();\n        });\n    },\n\n    _setupFixtableAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            // Skip if component is destroyed or DOM not ready\n            if (this.isDestroyed || this.isDestroying || !this.$) {\n                return;\n            }\n\n            // Handle all checkboxes in fixtable\n            const allCheckboxes = this.$('.fixtable-grid input[type=\"checkbox\"]');\n\n            if (allCheckboxes && allCheckboxes.length) {\n                allCheckboxes.each((index, checkbox) => {\n                    const $checkbox = Ember.$(checkbox);\n\n                    // Skip if already has proper labeling\n                    if ($checkbox.attr('aria-label') || $checkbox.attr('aria-labelledby')) {\n                        return;\n                    }\n\n                    // Check if this is a header checkbox (select all)\n                    const $headerRow = $checkbox.closest('thead tr');\n                    if ($headerRow.length) {\n                        $checkbox.attr('aria-label', 'Select all roles');\n                        return;\n                    }\n\n                    // Check if this is in a toggle-switch component\n                    const $toggleSwitch = $checkbox.closest('.toggle-switch');\n                    if ($toggleSwitch.length) {\n                        // Find the row this toggle belongs to\n                        const $row = $checkbox.closest('tr');\n                        const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                        if ($roleNameCell.length) {\n                            const roleName = $roleNameCell.text().trim();\n                            if (roleName) {\n                                $checkbox.attr('aria-label', `Toggle assignment for role ${roleName}`);\n                            }\n                        }\n                        return;\n                    }\n\n                    // Handle row selection checkboxes\n                    const $row = $checkbox.closest('tr');\n                    const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                    if ($roleNameCell.length) {\n                        const roleName = $roleNameCell.text().trim();\n                        if (roleName) {\n                            $checkbox.attr('aria-label', `Select role ${roleName}`);\n                        }\n                    } else {\n                        // Fallback for checkboxes without identifiable context\n                        $checkbox.attr('aria-label', `Select table row ${index + 1}`);\n                    }\n                });\n\n                // Handle remove buttons accessibility\n                this._setupButtonAccessibility();\n\n                // Fix table headers for accessibility\n                this._setupTableHeaders();\n            }\n        });\n    },\n\n    _setupButtonAccessibility() {\n        // Skip if component is destroyed or DOM not ready\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n\n        // Handle remove buttons in fixtable\n        const $removeButtons = this.$('.fixtable-grid button[data-t=\"minus-button\"]');\n\n        if ($removeButtons && $removeButtons.length) {\n            $removeButtons.each((index, button) => {\n                const $button = Ember.$(button);\n\n                // Skip if already has proper labeling\n                if ($button.attr('aria-label') || $button.attr('aria-labelledby')) {\n                    return;\n                }\n\n                // Find the row this button belongs to\n                const $row = $button.closest('tr');\n                const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                if ($roleNameCell.length) {\n                    const roleName = $roleNameCell.text().trim();\n                    if (roleName) {\n                        $button.attr('aria-label', `Remove role ${roleName}`);\n                    } else {\n                        $button.attr('aria-label', 'Remove role');\n                    }\n                } else {\n                    // Fallback for buttons without identifiable context\n                    $button.attr('aria-label', `Remove item ${index + 1}`);\n                }\n            });\n        }\n\n        // Handle any other unlabeled buttons in the fixtable\n        const $otherButtons = this.$('.fixtable-grid button:not([aria-label]):not([aria-labelledby])');\n\n        if ($otherButtons && $otherButtons.length) {\n            $otherButtons.each((index, button) => {\n                const $button = Ember.$(button);\n                const buttonText = $button.text().trim();\n                const buttonTitle = $button.attr('title');\n\n                if (buttonText) {\n                    $button.attr('aria-label', buttonText);\n                } else if (buttonTitle) {\n                    $button.attr('aria-label', buttonTitle);\n                } else {\n                    // Check for common button patterns\n                    if ($button.find('.fa-times, .fa-remove, .fa-delete').length) {\n                        $button.attr('aria-label', 'Remove');\n                    } else if ($button.find('.fa-edit, .fa-pencil').length) {\n                        $button.attr('aria-label', 'Edit');\n                    } else {\n                        $button.attr('aria-label', `Action button ${index + 1}`);\n                    }\n                }\n            });\n        }\n    },\n\n    _setupTableHeaders() {\n        // Skip if component is destroyed or DOM not ready\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n\n        // Handle table headers in fixtable\n        const $table = this.$('.fixtable-grid table');\n\n        if ($table && $table.length) {\n            // Ensure table has proper role and accessibility attributes\n            if (!$table.attr('role')) {\n                $table.attr('role', 'table');\n            }\n\n            // Add aria-label if not present\n            if (!$table.attr('aria-label') && !$table.attr('aria-labelledby')) {\n                const isEditMode = this.get('isEditingRoles');\n                const tableLabel = isEditMode ? 'Roles assignment table' : 'Assigned roles table';\n                $table.attr('aria-label', tableLabel);\n            }\n            // Add scope attributes to all header cells (including filter headers)\n            const $allHeaderCells = $table.find('thead th');\n\n            $allHeaderCells.each((index, th) => {\n                const $th = Ember.$(th);\n\n                // Skip if already has scope attribute\n                if ($th.attr('scope')) {\n                    return;\n                }\n\n                // Add appropriate scope attribute\n                $th.attr('scope', 'col');\n\n                // Handle filter headers specifically\n                if ($th.hasClass('fixtable-column-filters') || $th.find('.fixtable-column-filters').length) {\n                    // Add role attribute for filter headers\n                    if (!$th.attr('role')) {\n                        $th.attr('role', 'columnheader');\n                    }\n                }\n            });\n\n            // Add headers attribute to data cells if needed for complex tables\n            const headerIds = [];\n\n            // Create unique IDs for headers if they don't exist\n            $allHeaderCells.each((index, th) => {\n                const $th = Ember.$(th);\n                let headerId = $th.attr('id');\n\n                if (!headerId) {\n                    headerId = `fixtable-header-${index}`;\n                    $th.attr('id', headerId);\n                }\n\n                headerIds.push(headerId);\n            });\n\n            // Associate data cells with their headers\n            $table.find('tbody tr').each((rowIndex, row) => {\n                const $row = Ember.$(row);\n                const $cells = $row.find('td');\n\n                $cells.each((cellIndex, cell) => {\n                    const $cell = Ember.$(cell);\n\n                    // Skip if already has headers attribute\n                    if ($cell.attr('headers')) {\n                        return;\n                    }\n\n                    // Associate with corresponding header\n                    if (headerIds[cellIndex]) {\n                        $cell.attr('headers', headerIds[cellIndex]);\n                    }\n                });\n            });\n\n            // Handle any filter inputs in headers\n            const $filterInputs = $table.find('thead input, thead select');\n            $filterInputs.each((index, input) => {\n                const $input = Ember.$(input);\n\n                if (!$input.attr('aria-label') && !$input.attr('aria-labelledby')) {\n                    const $headerCell = $input.closest('th');\n                    const headerText = $headerCell.text().trim().replace(/\\s+/g, ' ');\n\n                    if (headerText) {\n                        $input.attr('aria-label', `Filter by ${headerText}`);\n                    } else {\n                        $input.attr('aria-label', `Filter column ${index + 1}`);\n                    }\n                }\n            });\n        }\n    },\n\n    _setupKeyboardNavigation() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            // Remove any existing handlers first\n            this._removeKeyboardNavigation();\n\n            const $fixtable = this.$('.fixtable-grid');\n            if (!$fixtable || !$fixtable.length) {\n                return;\n            }\n\n            $fixtable.on('focusin.navigation', 'tbody tr.fixtable-row', function () {\n                Ember.$(this).addClass('row-focused');\n            });\n\n            $fixtable.on('focusout.navigation', 'tbody tr.fixtable-row', function () {\n                Ember.$(this).removeClass('row-focused');\n            });\n        });\n    },\n\n    _removeKeyboardNavigation() {\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n        const $fixtable = this.$('.fixtable-grid');\n        if ($fixtable && $fixtable.length) {\n            $fixtable.off('focusin.navigation');\n            $fixtable.off('focusout.navigation');\n        }\n    },\n\n    init() {\n        this.get('groupAssignedRoles').clear();\n        this.get('store').findAll('division'); //load divisions into the store for use in the fixtable table\n        this.get('unsavedGrants').parent = this; // pass parent reference into unsavedGrants object to provide access to injected properties\n        this.get('unsavedGrants').hasUnsavedGrants = Ember.computed('_hasUnsavedGrants', function () {\n            return this.get('_hasUnsavedGrants');\n        });\n        this.get('unsavedGrants').clear(); //in case the component didn't get the chance to clean itself up before it was destroyed\n        this._getGroupRoles();\n        //Load All Roles\n        this.set('isLoadingAllRoles', true);\n        this.get('store')\n            .findAll('role')\n            .then(roles => {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.set('allRoles', roles);\n                this.set('allRolesFiltered', roles);\n                this.set('isLoadingAllRoles', false);\n            });\n        this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    layout,\n    selectionIsEmpty: Ember.computed('selectedDataRows', function () {\n        let selectedDataRows = this.get('selectedDataRows');\n        return !selectedDataRows || !selectedDataRows.length;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"hXr4u8/q\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"selectionIsEmpty\\\"]],null],[16,\\\"data-t\\\",[34,[[26,[\\\"bulkActionTitle\\\"]]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"bulkAction\\\"]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null]]],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"bulkActionTitle\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-custom-footer'],\n    layout,\n\n    one: 1,\n    isFirstPage: Ember.computed.equal('currentPage', 1),\n    isLastPage: Ember.computed('currentPage', 'totalPages', function () {\n        return this.get('currentPage') === this.get('totalPages');\n    }),\n    listedPages: Ember.computed('currentPage', 'totalPages', function () {\n        let currentPage = this.get('currentPage');\n        let totalPages = this.get('totalPages');\n\n        // ideal number of pages to be linked on each side of current page\n        let neighbors = 3;\n\n        // determine how many pages \"short\" we are on each side\n        let pagesToFirst = currentPage - 1;\n        let pagesToLast = totalPages - currentPage;\n        let shortageL = pagesToFirst < neighbors ? neighbors - pagesToFirst : 0;\n        let shortageR = pagesToLast < neighbors ? neighbors - pagesToLast : 0;\n\n        // increase neighbors by the largest \"shortage\" value\n        neighbors += Math.max(shortageL, shortageR);\n\n        // calculate indices of first & last pages in range\n        let lowerIndex = currentPage - neighbors;\n        let upperIndex = currentPage + neighbors;\n        if (lowerIndex < 1) {\n            lowerIndex = 1;\n        }\n        if (upperIndex > totalPages) {\n            upperIndex = totalPages;\n        }\n\n        // build & return pages array\n        let pages = [];\n        for (let i = lowerIndex; i <= upperIndex; i++) {\n            pages.push({\n                index: i,\n                isCurrent: i === currentPage\n            });\n        }\n        return pages;\n    }),\n    firstPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(1) >= 0\n        );\n    }),\n    secondPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(2) >= 0\n        );\n    }),\n    penultimatePageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages') - 1) >= 0\n        );\n    }),\n    finalPageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages')) >= 0\n        );\n    }),\n    showPaginationControls: Ember.computed('listedPages', function () {\n        return this.get('listedPages').length > 1;\n    }),\n    showRangeLabel: Ember.computed.not('isLoading'),\n\n    actions: {\n        bulkAction(selectedDataRows, action) {\n            this.sendAction('bubbleAction', action, selectedDataRows);\n        },\n        showPage(pageNumber) {\n            this.set('currentPage', pageNumber);\n        },\n        showNextPage() {\n            this.sendAction('goToNextPage');\n        },\n        showPreviousPage() {\n            this.sendAction('goToPreviousPage');\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WPVwICVQ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-footer-bulk-actions\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"bulkActions\\\"]]],[[\\\"selectedDataRows\\\",\\\"bulkAction\\\",\\\"bulkActionTitle\\\"],[[28,[\\\"selectedDataRows\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null],[28,[\\\"bulkActionTitle\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRangeLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/item-range\\\"],null,[[\\\"currentPage\\\",\\\"pageSize\\\",\\\"totalPages\\\",\\\"totalRows\\\"],[[28,[\\\"currentPage\\\"]],[28,[\\\"pageSize\\\"]],[28,[\\\"totalPages\\\"]],[28,[\\\"totalRows\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPaginationControls\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-pagination-controls\\\"],[13],[0,\\\"\\\\n\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-prev\\\"],[16,\\\"disabled\\\",[26,[\\\"isFirstPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPreviousPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_previous\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"firstPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",1]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"one\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"secondPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"listedPages\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[16,\\\"disabled\\\",[28,[\\\"page\\\",\\\"isCurrent\\\"]],null],[16,\\\"data-page\\\",[28,[\\\"page\\\",\\\"index\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"page\\\",\\\"index\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"page\\\",\\\"index\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"page\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"finalPageListed\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"penultimatePageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"totalPages\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"totalPages\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-next\\\"],[16,\\\"disabled\\\",[26,[\\\"isLastPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showNextPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_next\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    rowHasToggled: Ember.observer('groupAssignedRoles.changeCount', function () {\n        const isAssigned = this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n        const wasAssigned = this.get('wasAssigned');\n\n        if (wasAssigned === isAssigned) {\n            return;\n        } else {\n            this.set('wasAssigned', isAssigned);\n        }\n\n        if (!isAssigned) {\n            const previouslySelected = this.get('selectedDivisions');\n            this.set('selectedDivisions', []);\n            this._updateDivisions([], previouslySelected);\n        } else {\n            const homeDivision = this.get('store')\n                .peekAll('division')\n                .find(division => {\n                    return division.get('homeDivision');\n                });\n            const selected = [homeDivision];\n            this.set('selectedDivisions', selected);\n            this._updateDivisions(selected, []);\n        }\n    }),\n\n    allFutureDivisionsSelected: false,\n\n    actions: {\n        updateDivisions(currentSelection, info) {\n            this._updateDivisions(currentSelection, info.selected);\n        }\n    },\n\n    _updateDivisions(currentSelection, previousSelection) {\n        const allFutureDivision = currentSelection.find(division => {\n            return division.id === '*';\n        });\n        //don't allow special division to exist with any other division\n        if (allFutureDivision) {\n            currentSelection = [allFutureDivision];\n        }\n        this.set('allFutureDivisionsSelected', !!allFutureDivision);\n        this.set('selectedDivisions', currentSelection);\n        const roleId = this.get('dataRow.id');\n        this.bubbleAction('updateDivisions', roleId, currentSelection, previousSelection);\n    },\n\n    _loadDivisions() {\n        this.set('divisions', this.get('store').peekAll('division'));\n    },\n\n    _setSelectedDivisions() {\n        // need to set selected divisions from the divisions array to make select work\n        const roleId = this.get('dataRow.id');\n        const roleDivisions = this.get('groupAssignedRoles').getRoleWithDivisions(roleId)\n            ? Ember.get(this.get('groupAssignedRoles').getRoleWithDivisions(roleId), 'divisions')\n            : [];\n        if (roleDivisions && roleDivisions.length) {\n            const allDivisions = this.get('divisions');\n            const allFutureDivisionsSelected = roleDivisions.some(division => {\n                return division.id === '*';\n            });\n            this.set('allFutureDivisionsSelected', allFutureDivisionsSelected);\n            let selectedDivisions = [];\n\n            roleDivisions.forEach(selectedDivision => {\n                selectedDivisions.push(\n                    allDivisions.find(division => {\n                        return division.id === selectedDivision.id;\n                    })\n                );\n            });\n            this.set('selectedDivisions', selectedDivisions);\n        }\n    },\n\n    init() {\n        this._loadDivisions();\n        this._setSelectedDivisions();\n        this.set('wasAssigned', this.get('groupAssignedRoles').containsRole(this.get('dataRow.id')));\n        //for passing into  custom components (e.g. select-footer)\n        this.set('extra', { rolesEditComponent: this });\n        return this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    allDivisionsSelected: Ember.computed('select.selected', function () {\n        let optionsWithoutSpecial = this.get('select.options').filter(division => {\n            return division.id !== '*';\n        });\n        return this.get('select.selected.length') === optionsWithoutSpecial.length;\n    }),\n    allFutureDivisions: undefined,\n\n    _allFutureDivisionsObserver() {\n        const allFutureDivisions = this.get('allFutureDivisions');\n        if (allFutureDivisions) {\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([{ id: '*' }], powerSelectAPI.selected);\n        } else {\n            this._selectAll();\n        }\n    },\n\n    actions: {\n        selectAll() {\n            this._selectAll();\n        },\n        deselectAll() {\n            if (this.get('allFutureDivisions')) {\n                this.removeObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n                this.set('allFutureDivisions', false);\n                this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n            }\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([], powerSelectAPI.selected);\n        }\n    },\n\n    _selectAll() {\n        if (this.get('allFutureDivisions')) {\n            return;\n        }\n        const powerSelectAPI = this.get('select');\n        const rolesEditComponent = this.get('extra.rolesEditComponent');\n        let optionsWithoutSpecial = powerSelectAPI.options.filter(division => {\n            return division.id !== '*';\n        });\n        rolesEditComponent._updateDivisions(optionsWithoutSpecial, powerSelectAPI.selected);\n    },\n\n    init() {\n        const powerSelectAPI = this.get('select');\n        const allFutureDivisions = powerSelectAPI.selected.some(division => {\n            return division.id === '*';\n        });\n        this.set('allFutureDivisions', allFutureDivisions);\n        this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n        return this._super(...arguments);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"NxGzYqOH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisions\\\"]],\\\"btn btn-link select-all-divisions disabled\\\",\\\"btn btn-link select-all-divisions\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.selectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        |\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"btn btn-link deselect-all-divisions\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deselectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.deselectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"type\\\",\\\"disabled\\\",\\\"checked\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-division-toggle\\\"],null],\\\"checkbox\\\",[33,[\\\"not\\\"],[[33,[\\\"or\\\"],[[28,[\\\"allFutureDivisions\\\"]],[28,[\\\"allDivisionsSelected\\\"]]],null]],null],[28,[\\\"allFutureDivisions\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-division-toggle\\\"],null]]]],[13],[0,\\\" \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.allFutureDivisions\\\"],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({});\n","export default Ember.HTMLBars.template({\"id\":\"AzDakxFC\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"option\\\",\\\"id\\\"]],\\\"*\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.allDivisions\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[28,[\\\"option\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"q65Ds8WH\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isAssigned\\\"]]],null,{\\\"statements\\\":[[6,[\\\"power-select-multiple\\\"],null,[[\\\"renderInPlace\\\",\\\"selected\\\",\\\"options\\\",\\\"searchField\\\",\\\"class\\\",\\\"placeholder\\\",\\\"onchange\\\",\\\"extra\\\",\\\"noMatchesMessage\\\",\\\"selectedItemComponent\\\",\\\"afterOptionsComponent\\\"],[true,[28,[\\\"selectedDivisions\\\"]],[28,[\\\"divisions\\\"]],\\\"name\\\",\\\"divisions-power-select\\\",[33,[\\\"t\\\"],[\\\"groups.roles.selectDivisions\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateDivisions\\\"],null],[28,[\\\"extra\\\"]],[33,[\\\"t\\\"],[\\\"groups.roles.noDivisionsFound\\\"],null],\\\"group-profile/roles-edit/fixtable/division-select/selected-division\\\",\\\"group-profile/roles-edit/fixtable/division-select/select-footer\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"division\\\",\\\"id\\\"]],\\\"*\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisionsSelected\\\"]],\\\"division-select-option disabled\\\",\\\"division-select-option\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-name\\\"],[13],[1,[28,[\\\"division\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-description\\\"],[13],[1,[28,[\\\"division\\\",\\\"description\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"division\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    divisionsDisplayList: Ember.computed('dataRow.divisions.[]', function () {\n        const divisions = this.get('dataRow.divisions');\n        let displayString = '';\n        if (divisions.length) {\n            for (var i = 0; i < divisions.length - 1; i++) {\n                displayString +=\n                    divisions.objectAt(i).id === '*'\n                        ? this.get('intl').lookup('groups.roles.allDivisions')\n                        : divisions.objectAt(i).get('name');\n                displayString += ', ';\n            }\n            displayString +=\n                divisions.objectAt(i).id === '*'\n                    ? this.get('intl').lookup('groups.roles.allDivisions')\n                    : divisions.objectAt(i).get('name');\n        }\n        return displayString;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"5snZkTTk\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"divisionsDisplayList\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    groupAssignedRoles: Ember.inject.service(),\n\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeKeyboardHandler();\n    },\n\n    _setupAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('input[type=\"checkbox\"]');\n            const innerLabel = this.$('.toggle-switch[title]');\n            const roleName = this.get('dataRow.name');\n\n            if (toggleInput.length && roleName) {\n                const labelText = `Toggle assignment for role ${roleName}`;\n                toggleInput.attr('aria-label', labelText);\n\n                // If there's no existing label association, add one\n                if (!toggleInput.attr('aria-labelledby') && !toggleInput.attr('id')) {\n                    const uniqueId = `role-toggle-${this.get('dataRow.id')}`;\n                    toggleInput.attr('id', uniqueId);\n                }\n            }\n\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && roleName) {\n                const labelText = `Toggle assignment for role ${roleName}`;\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n        });\n    },\n\n    _setupKeyboardHandler() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('input[type=\"checkbox\"]');\n            if (toggleInput.length) {\n                toggleInput.on('keydown.toggle', event => {\n                    if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n                        event.preventDefault();\n                        this.send('toggle');\n                    }\n                });\n            }\n        });\n    },\n\n    _removeKeyboardHandler() {\n        const toggleInput = this.$('input[type=\"checkbox\"]');\n        if (toggleInput && toggleInput.length) {\n            toggleInput.off('keydown.toggle');\n        }\n    },\n\n    actions: {\n        toggle() {\n            const isAssigned = !this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n            const roleId = this.get('dataRow.id');\n            this.bubbleAction('assignRole', roleId, isAssigned);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"tl06NBdl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"class\\\",\\\"check\\\",\\\"toggle\\\",\\\"aria-label\\\",\\\"title\\\"],[\\\"toggle-width\\\",[28,[\\\"isAssigned\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggle\\\"],null],[33,[\\\"concat\\\"],[\\\"Toggle assignment for role \\\",[28,[\\\"dataRow\\\",\\\"name\\\"]]],null],[33,[\\\"concat\\\"],[\\\"Toggle assignment for role \\\",[28,[\\\"dataRow\\\",\\\"name\\\"]]],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-item-range'],\n    layout,\n\n    dash: '-',\n    firstItemIndex: Ember.computed('currentPage', 'pageSize', function () {\n        return (this.get('currentPage') - 1) * this.get('pageSize') + 1;\n    }),\n    lastItemIndex: Ember.computed('currentPage', 'pageSize', 'totalPages', 'totalRows', function () {\n        if (this.get('currentPage') === this.get('totalPages')) {\n            return this.get('totalRows');\n        } else {\n            return this.get('currentPage') * this.get('pageSize');\n        }\n    }),\n    isSingleItem: Ember.computed('firstItemIndex', 'lastItemIndex', function () {\n        return this.get('firstItemIndex') === this.get('lastItemIndex');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"X1zLrc19\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"totalRows\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSingleItem\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[1,[26,[\\\"dash\\\"]],false],[1,[26,[\\\"lastItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.of\\\"],null],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[26,[\\\"totalRows\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    iconClass: Ember.computed('columnDef.iconClass', function () {\n        return this.get('columnDef.iconClass') || 'fa fa-minus';\n    }),\n    class: Ember.computed('columnDef.class', function () {\n        return this.get('columnDef.class') ? this.get('columnDef.class') : 'btn btn-danger btn-xs';\n    }),\n    disabledMessage: Ember.computed('columnDef.disabledMessage', 'dataRow.disabledMessage', function () {\n        return this.get('dataRow.disabledMessage') || this.get('columnDef.disabledMessage');\n    }),\n    actions: {\n        remove(id) {\n            if (!this.get('dataRow.isDeleteDisabled')) {\n                this.bubbleAction('remove', id);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"GtcE/MmX\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dataRow\\\",\\\"hideButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],\\\"disabled\\\"],null],\\\" \\\",[26,[\\\"class\\\"]]]]],[15,\\\"data-t\\\",\\\"minus-button\\\"],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"remove\\\",[28,[\\\"dataRow\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[26,[\\\"iconClass\\\"]],null],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"left\\\",[28,[\\\"disabledMessage\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.hbs\"}});","import { debounce } from '@ember/runloop';\nimport { observer, computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    classNames: ['search-field'],\n    classNameBindings: ['positionSubclass'],\n\n    debounce: 250,\n    query: '',\n    _isInitialized: false,\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.set('_isInitialized', true);\n    },\n\n    queryChanged: observer('query', function () {\n        if (this.get('_isInitialized')) {\n            debounce(this, this.triggerSearch, this.get('debounce'));\n        }\n    }),\n\n    positionSubclass: computed('position', function () {\n        let position = this.get('position');\n        return position ? `search-field-${this.get('position')}` : '';\n    }),\n\n    triggerSearch: function () {\n        this.sendAction('onChange', this.get('query'));\n    },\n\n    actions: {\n        reset() {\n            this.set('query', '');\n            this.triggerSearch();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"lNaKkjiL\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-field-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"query\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-times-circle search-field-reset\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reset\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-icon-magnifying-glass\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fill-between-floats\\\"],[15,\\\"data-t\\\",\\\"searchfieldparent\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[34,[[26,[\\\"query\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholder\\\"]]]]],[15,\\\"data-t\\\",\\\"input-search\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"groups.roles.roleSearch\\\"],null]]]],[16,\\\"onInput\\\",[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"query\\\"]]],null]],[[\\\"value\\\"],[\\\"target.value\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"lI4I0C0D\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"roles-edit\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"unsavedGrants\\\",\\\"hasUnsavedGrants\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"enableRolesToggleLabel\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[true,[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAllRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"updateDivisions\\\",\\\"assignRole\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesEditColumns\\\"]],[28,[\\\"allRolesFiltered\\\"]],true,[28,[\\\"isLoadingAllRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",\\\"updateUnsavedGrants\\\",\\\"toggleRoleAssignment\\\",[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn new-btn\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editRoles\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-edit\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.assignRoles\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"enableRolesToggleLabel\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAssignedRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"rowSelection\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"remove\\\",\\\"bulkAction\\\",\\\"emptyStateComponentValues\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesViewColumns\\\"]],[28,[\\\"groupAssignedRolesFiltered\\\"]],true,true,[28,[\\\"isLoadingGroupRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelSingleRole\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelMultipleRole\\\"],null],[33,[\\\"hash\\\"],null,[[\\\"nullMessage\\\"],[[33,[\\\"t\\\"],[\\\"groups.roles.noRolesAreAssigned\\\"],null]]]],[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],[[\\\"bulkActions\\\",\\\"bulkActionTitle\\\"],[\\\"group-profile/roles-edit/fixtable/bulk-actions/selected-elements\\\",[33,[\\\"t\\\"],[\\\"groups.roles.deleteAllSelected\\\"],null]]]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRoleRemoveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"rolesToDelete\\\",\\\"enforceModality\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.roles.confirmRemove\\\"],null],true,\\\"warning-modal\\\",\\\"deleteRoles\\\",\\\"closeWarningModal\\\",[28,[\\\"rolesToDelete\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"rolesToDelete\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRoleConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRolesConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"each\\\"],[[28,[\\\"rolesToDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"b\\\",[]],[13],[1,[28,[\\\"role\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"role\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRulesRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeRulesRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayHasRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmHasRolesWarningModal\\\",\\\"closeHasRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.thereAreRoles\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmRolesRemoval\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"J4JECv3L\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"container-fluid\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditLeftRailInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit dropdown\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"id\\\",\\\"group-profile-edit\\\"],[15,\\\"closeOnClickOutside\\\",\\\"true\\\"],[15,\\\"class\\\",\\\"btn btn-link dropdown-link\\\"],[15,\\\"data-toggle\\\",\\\"dropdown\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[6,[\\\"click-outside\\\"],null,[[\\\"action\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-popover\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"group-profile-edit-popover\\\"],[15,\\\"position\\\",\\\"bottom-end\\\"],[15,\\\"for\\\",\\\"group-profile-edit\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"popover-menu\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-general\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-general\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editGeneralInfo\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.generalInfo\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-picture\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-profile-picture-link group\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-rules\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-privacy-rules\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editPrivacyRules\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.edit.privacyRules\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"delete-group\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"delete-group text-danger\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteGroup\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.admin.delete\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-picture\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-8 col-xs-offset-2\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"model\\\"]],400]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"general\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row name\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row group-type\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isEditing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"groupTypeIcon\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupType\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"groupType\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"description-contact-info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row description\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"description\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"description\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"description\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupDescription\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewVideo\\\",\\\"canViewChat\\\",\\\"entity\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"canViewChat\\\"]],[28,[\\\"model\\\"]],[28,[\\\"favorites\\\",\\\"enabled\\\"]],\\\"viewLightGallery\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"meta\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row visibility\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"group_privacy_groupVisibility_labelKey_groupVisibility\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupVisibility\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"privacy\\\",\\\"groupVisibility\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLinks\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"tooltip.groupLink\\\"],null],true],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"ul\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"model\\\",\\\"general\\\",\\\"links\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-fields/weblink-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"link\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"links\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"link\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.phone\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneService\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[16,\\\"href\\\",[34,[\\\"mailto:\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],[13],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail tabsUI hunt-groups\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-tabs\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flex-left\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-membership-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"membershipHeader\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEditRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-roles-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"roles\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[26,[\\\"groupRolesHeader\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"callsEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link edit-button\\\"],[16,\\\"disabled\\\",[26,[\\\"isEditing\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleEditing\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"toggleLabel\\\"],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-switch-wrapper\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"disableToggleCalls\\\"]],[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"canEditGroupTelephonySettings\\\",\\\"changeEditing\\\",\\\"toggleEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],\\\"changeEditingMode\\\",\\\"toggleEditing\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12 field-section tabsUI\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"group-profile/membership-listing\\\"],null,[[\\\"group\\\",\\\"callsEnabled\\\",\\\"owners\\\",\\\"individuals\\\",\\\"toggleCallsEnabled\\\",\\\"changeEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"callsEnabled\\\"]],[28,[\\\"model\\\",\\\"owners\\\",\\\"owners\\\"]],[28,[\\\"model\\\",\\\"individuals\\\",\\\"individuals\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null],\\\"changeEditingMode\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/roles-edit\\\"],null,[[\\\"model\\\",\\\"class\\\"],[[28,[\\\"model\\\"]],\\\"roles-edit-container\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"dynamicRules\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/dynamicRules\\\"],null,[[\\\"group\\\",\\\"class\\\",\\\"selectTab\\\"],[[28,[\\\"model\\\"]],\\\"dynamic-rules\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\"],null]]]],false],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\",\\\"targetAttachment\\\"],[[28,[\\\"model\\\"]],[28,[\\\"editingPictures\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null],\\\"none\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showContactInfo\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"enforceModality\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\"],[true,\\\"cancelEditContactInfo\\\",[33,[\\\"t\\\"],[\\\"groups.modal.contact\\\"],null],[33,[\\\"t\\\"],[\\\"common.save\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-contact-modal\\\"],null,[[\\\"entity\\\",\\\"saveContactInfo\\\",\\\"disableModal\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditContactInfo\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingDeleteModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.admin.deleteHeader\\\"],[[\\\"name\\\"],[[33,[\\\"escape\\\"],[[28,[\\\"model\\\",\\\"name\\\"]]],null]]]],true,\\\"delete-group-confirmation-modal\\\",\\\"confirmDelete\\\",\\\"cancelDelete\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.admin.deleteConfirmation\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingGeneralModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"generalFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditProfile\\\",\\\"canEditSection\\\",\\\"excludedFields\\\",\\\"disableModal\\\"],[[28,[\\\"model\\\"]],[28,[\\\"generalFieldConfigSection\\\"]],true,true,true,true,true,[28,[\\\"generalExcludedEditingFields\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"_confirm\\\",\\\"_cancel\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingPrivacyModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"privacyFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditSection\\\",\\\"canEditProfile\\\"],[[28,[\\\"model\\\"]],[28,[\\\"privacyFieldConfigSection\\\"]],true,true,true,true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayWarningModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['grouped-facet-term'],\n    classNameBindings: ['label'],\n\n    intl: Ember.inject.service(),\n\n    group: null,\n\n    showDropdown: false,\n\n    actions: {\n        removeSelectedTerm: function () {\n            var terms = this.get('group.terms');\n            var term = terms.objectAt(0);\n\n            this.send('removeSingleTerm', term);\n        },\n\n        removeSingleTerm: function (term) {\n            var facet = this.get('group.facet');\n            this.bubbleAction({\n                action: 'removeSelectedTerm',\n                actionContext: [term, facet]\n            });\n        },\n\n        toggleDropdown: function () {\n            if (!this.get('isSingleTerm')) {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    isSingleTerm: Ember.computed('group.terms.[]', function () {\n        return this.get('group.terms.length') === 1;\n    }),\n\n    label: Ember.computed('group.facet.facetName', function () {\n        var facetName = this.get('group.facet.facetName');\n        if (facetName) {\n            return facetName.toLowerCase().replace(/\\./gi, '_');\n        }\n    }),\n\n    value: Ember.computed('isSingleTerm', function () {\n        var terms = this.get('group.terms');\n        if (this.get('isSingleTerm')) {\n            var term = terms.objectAt(0);\n            return term.term;\n        } else {\n            return this.get('intl').lookup('search.multipleFacetsSelected', { count: terms.length }).toString();\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"l2Nsz1vc\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"grouped-facet-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSingleTerm\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"facet\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"value\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSelectedTerm\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"terms-dropdown-button\\\"],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[16,\\\"aria-controls\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"facet \\\",[33,[\\\"unless\\\"],[[28,[\\\"isSingleTerm\\\"]],\\\"clickable\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"value\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"toggle-dropdown clickable\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"ul\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[15,\\\"class\\\",\\\"terms-dropdown list-unstyled\\\"],[15,\\\"role\\\",\\\"region\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"t\\\",\\\"term\\\"]]],null]]]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSingleTerm\\\",[28,[\\\"t\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"t\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/grouped-facet-term/template.hbs\"}});","define(\"connections-ui/components/headset-status/component\", [\"exports\", \"ember-softphone-integration/components/headset-status/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/headset-vendor-picker/component\", [\"exports\", \"ember-softphone-integration/components/headset-vendor-picker/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/horizontal-collection\", [\"exports\", \"smoke-and-mirrors/components/horizontal-collection\"], function (_exports, _horizontalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _horizontalCollection.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    session: Ember.inject.service(),\n\n    bootstrapIcons: Ember.computed.reads('session.isAuthenticated')\n});\n","export default Ember.HTMLBars.template({\"id\":\"dekSi0FY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"bootstrapIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-chevron-right invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-email invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading invisible\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/icon-bootstrap/template.hbs\"}});","define(\"connections-ui/components/in-viewport\", [\"exports\", \"smoke-and-mirrors/components/in-viewport\"], function (_exports, _inViewport) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inViewport.default;\n    }\n  });\n});\n","import Component from '@ember/component';\nimport Ember from 'ember';\nimport LoggerMixin from '../../mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['infinite-scroll'],\n    classNameBindings: ['hideScrollbars'],\n\n    /**\n     * @Input\n     * `true` if the component should be showing a loading state\n     */\n    loading: false,\n    /**\n     * `true` if the component should not invoke any infinite scroll\n     * interactions\n     */\n    disabled: false,\n    /**\n     * `true` if the scrollbar display should be visually hidden\n     */\n    hideScrollbars: false,\n\n    /**\n     * The amount of space in pixels that when the user scrolls within\n     * it will trigger the infinite scroll event for the parent to\n     * react to.\n     * !! If possible do not override this value with an inputted value.\n     * The functionality and UX should be consistent so if the threshold\n     * needs to increase it should increase everywhere.\n     */\n    scrollBottomThreshold: 100,\n\n    /**\n     * Lifecycle hook triggered when the element is rendered and inserted\n     * into the DOM\n     */\n    didInsertElement() {\n        const element: HTMLDivElement = this.get('element');\n        element.onscroll = () => {\n            this.onScroll();\n        };\n    },\n\n    /**\n     * Invoked when the infinite scroll component has detected scrolling\n     * behavior within its main element\n     */\n    onScroll() {\n        const element: HTMLDivElement = this.get('element');\n        const scrollBottom = element.scrollTop + element.clientHeight;\n        const scrollThreshold = scrollBottom + this.get('scrollBottomThreshold');\n        if (scrollThreshold >= element.scrollHeight) {\n            this.checkInfiniteScroll();\n        }\n    },\n\n    /**\n     * Checks if infinite scrolling can be invoked based on other factors and properties\n     */\n    checkInfiniteScroll() {\n        if (!this.get('loading') && !this.get('disabled')) {\n            this.infiniteScroll();\n        }\n    },\n\n    /**\n     * @Action\n     * Invoked when the scroll container has reached the scroll threshold to load more data\n     */\n    infiniteScroll() {\n        Ember.Logger.warn('Infinite scroll event closure action has not been set up.');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"x6vvnuBv\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"infinite-scroll-loader\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/infinite-scroll/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['integration-badge'],\n    tagName: 'span',\n\n    intl: inject.service(),\n\n    // represents what integration we want to show\n    integration: null,\n    isSmall: false,\n    useLightIcon: false,\n\n    iconUri: computed('integration.icon', 'isSmall', 'useLightIcon', function () {\n        if (this.get('isSmall')) {\n            return this.get('useLightIcon')\n                ? this.get('integration.badgeIcons.light')\n                : this.get('integration.badgeIcons.dark');\n        }\n        return this.get('integration.icon');\n    }),\n\n    translation: computed.reads('integration.translation')\n});\n","export default Ember.HTMLBars.template({\"id\":\"isG4X8WY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"integration\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"class\\\",[34,[\\\"integration-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"mini-icon\\\"],null]]]],[16,\\\"src\\\",[26,[\\\"iconUri\\\"]],null],[16,\\\"alt\\\",[26,[\\\"translation\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badge/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['integration-badges'],\n\n    phoneIntegrations: Ember.inject.service(),\n\n    entity: null,\n    size: null,\n    useLightIcon: false,\n    isSmall: Ember.computed.equal('size', 'small')\n});\n","export default Ember.HTMLBars.template({\"id\":\"lSIuV8JS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entity\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"small-integration-badge\\\",\\\"\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"phone-integrations\\\"],[[28,[\\\"entity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badge\\\"],null,[[\\\"integration\\\",\\\"isSmall\\\",\\\"useLightIcon\\\"],[[28,[\\\"phoneIntegration\\\"]],[28,[\\\"isSmall\\\"]],[28,[\\\"useLightIcon\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phoneIntegration\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badges/template.hbs\"}});","define(\"connections-ui/components/interaction-annotation/component\", [\"exports\", \"ember-purecloud-components/components/interaction-annotation/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar LightGalleryModal = Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    entity: null,\n    showing: false,\n    escaped: false,\n\n    gallery: Ember.computed('entity.images.informal', 'entity.images.gallery', function () {\n        if (this.get('entity.type') === 'group') {\n            return this.get('entity.images.gallery');\n        }\n        return this.get('entity.images.informal');\n    }),\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        }\n    },\n\n    initGallery: Ember.observer('showing', function () {\n        if (this.get('showing')) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                const gallery = Ember.$('#lightGallery');\n                const images = gallery.children('li');\n\n                images.each((index /*, image */) => {\n                    const caption =\n                        '<div class=\"customHtml\"><h3>' + this.get('gallery')[index].labelKey + '</h3></div>';\n                    Ember.$(this).attr('data-sub-html', caption);\n                });\n\n                gallery.lightGallery({\n                    caption: true,\n                    loop: true,\n                    speed: 1,\n                    closable: false,\n                    escKey: true,\n                    lang: { allPhotos: this.get('intl').lookup('images.allPhotos') }\n                });\n            });\n        }\n    })\n});\n\nexport default LightGalleryModal;\n","export default Ember.HTMLBars.template({\"id\":\"BWEPhqLd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirmText\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"cancelText\\\"],[null,\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.viewPictures\\\"],null],[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"light-gallery-modal\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"id\\\",\\\"lightGallery\\\"],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"gallery\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"data-src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/light-gallery-modal/template.hbs\"}});","define(\"connections-ui/components/link-to-external\", [\"exports\", \"ember-engines/components/link-to-external-component\"], function (_exports, _linkToExternalComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _linkToExternalComponent.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['loading-indicator']\n});\n","export default Ember.HTMLBars.template({\"id\":\"Tx//k/3u\",\"block\":\"{\\\"statements\\\":[[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/loading-indicator/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['location-display', 'location'],\n\n    entity: null,\n    location: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"fewxU3+t\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],200]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h5\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/location-display/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['login-oauth'],\n\n    session: inject.service(),\n\n    isAuthenticated: computed.reads('session.isAuthenticated'),\n\n    // attrs\n    offerMobileApp: false,\n    // Expected Actions: mobileOfferDenied, authenticate\n\n    onMobileOfferDecline() {\n        return this.attrs.mobileOfferDeclined().then(this.attrs.authenticate);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!this.get('offerMobileApp')) {\n            this.attrs.authenticate();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"dq/ukkxL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isAuthenticated\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/login-oauth/template.hbs\"}});","define(\"connections-ui/components/logoff-link/component\", [\"exports\", \"ember-purecloud-components/components/logoff-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nexport default Ember.Component.extend({\n    tagName: 'ul',\n    classNames: ['media-provider-video-dropdown'],\n    classNameBindings: ['displayDropdown:display-dropdown:hide'],\n\n    webrtc: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    user: null,\n    room: null,\n    attachTo: null,\n    attachClickHandler: false,\n\n    _displayDropdown: true,\n\n    // Default implementation is to just run the provider action in Web-Directory\n    selectProvider(provider) {\n        const personId = this.get('user').get('id');\n        const providerId = provider.get('id');\n        this.get('embedded').launchVideoProviderWithPersonById(personId, providerId);\n        this.send('hide');\n    },\n\n    _popper: null,\n    _targetEl: null,\n\n    actions: {\n        hide() {\n            this.set('_displayDropdown', false);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        Ember.assert(!!this.get('user'), '`user` is required');\n        Ember.assert(!!this.get('attachTo'), '`attachTo` is required');\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        Ember.run.scheduleOnce('afterRender', this, this.setup);\n    },\n\n    willDestroyElement() {\n        if (this._popper) {\n            this._popper.destroy();\n            this._popper = null;\n        }\n\n        const targetEl = this._targetEl;\n        const ev = `click.${this.elementId}`;\n\n        Ember.$(window).off(ev);\n        if (targetEl) {\n            Ember.$(targetEl).off(ev);\n        }\n\n        this._super(...arguments);\n    },\n\n    setup() {\n        const targetEl = document.querySelector(this.get('attachTo'));\n        if (!targetEl) {\n            // Let's wait for a bit and check again...\n            // This might happen when we are waiting on asynchronous helpers\n            Ember.run.later(() => this.setup(), 250);\n\n            return;\n        }\n\n        if (this._targetEl) {\n            // We've already setup, dont try again\n            return;\n        }\n\n        this._targetEl = targetEl;\n\n        const popoverEl = this.element;\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            arrowElement: this.$('.media-provider-arrow')[0],\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        // Attach a click handler to the target so that we can control the dropdown\n        // internally instead of externally\n        if (this.get('attachClickHandler')) {\n            this.set('_displayDropdown', false);\n\n            Ember.$(targetEl).on(\n                `click.${this.elementId}`,\n                Ember.run.bind(this, () => Ember.run.once(this, this.handleClick))\n            );\n\n            Ember.$(window).on(`click.${this.elementId}`, Ember.run.bind(this, this.handleOutsideClick));\n        }\n    },\n\n    handleClick() {\n        this.toggleProperty('_displayDropdown');\n\n        Ember.run.join(() =>\n            Ember.run.scheduleOnce('afterRender', this, () => this._popper && this._popper.scheduleUpdate())\n        );\n    },\n\n    handleOutsideClick(event) {\n        if (!this.get('displayDropdown')) {\n            return;\n        }\n\n        let target = event.target;\n        let isAttachTarget = Ember.$(this.attachTo).is(target);\n        let componentParents = Ember.$(target).parent(this.elementId);\n        let attachTargetParents = Ember.$(target).parents(this.attachTo);\n\n        if (!isAttachTarget && componentParents.length === 0 && attachTargetParents.length === 0) {\n            this.send('hide');\n        }\n    },\n\n    showingVideo: Ember.computed(\n        'webrtc.activeRoom.{showingVideo,isAcdRoom}',\n        'mediaProviders.usingVideoProvider',\n        function () {\n            const showingPurecloudVideo =\n                this.get('webrtc.activeRoom.showingVideo') && !this.get('webrtc.activeRoom.isAcdRoom');\n            const showingMediaProvider = this.get('mediaProviders.usingVideoProvider');\n            return showingPurecloudVideo || showingMediaProvider;\n        }\n    ),\n\n    providers: Ember.computed('user', 'room', 'webrtc.activeRoom.oneToOneTarget.presence', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'), this.get('room'));\n    }),\n\n    displayDropdown: Ember.computed(\n        '_displayDropdown',\n        'attachTo',\n        'user.profile.content.isOffline',\n        'showingVideo',\n        'room',\n        function () {\n            let targetEl = this._targetEl;\n            if (!targetEl || this.get('showingVideo')) {\n                return false;\n            }\n\n            let chatRoom = this.get('room');\n            if (chatRoom && chatRoom.isGroupRoom()) {\n                return this._displayDropdown;\n            }\n\n            return this._displayDropdown;\n        }\n    )\n});\n","export default Ember.HTMLBars.template({\"id\":\"VTG6SUhQ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"providers\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"provider\\\",\\\"haveAccess\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],\\\"disabled\\\"],null]]]],[16,\\\"aria-disabled\\\",[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],null],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectProvider\\\"]],[28,[\\\"provider\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"provider\\\",\\\"label\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"right\\\",[33,[\\\"t\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabledMessage\\\"]]],null]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"provider\\\"]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-provider-arrow\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/media-providers/video-dropdown/template.hbs\"}});","import Ember from 'ember';\n\nvar MiniCardComponent = Ember.Component.extend({\n    tagName: 'a',\n    attributeBindings: ['href'],\n    classNameBindings: [':mini-card', 'isManager:manager-card:'],\n\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n\n    entity: null,\n    currentPerson: null,\n    managerCount: null,\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    isManager: Ember.computed('entity', 'currentPerson', function () {\n        return this.get('entity.id') === this.get('currentPerson.manager.id');\n    }),\n\n    managerCountText: Ember.computed('managerCount', function () {\n        const intl = this.get('intl');\n        const count = this.get('managerCount');\n        if (count === 1) {\n            return intl.lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return intl.lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    click: function () {\n        this.sendAction('action', this.get('entity'));\n    },\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    })\n});\n\nexport default MiniCardComponent;\n","export default Ember.HTMLBars.template({\"id\":\"PTNBkxes\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4 profile-pic\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"showPresence\\\"],[[28,[\\\"entity\\\"]],200,false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-8 col-md-8 col-lg-8 profile-general\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"managerCount\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"managers\\\"],[13],[0,\\\"(\\\"],[1,[26,[\\\"managerCountText\\\"]],false],[0,\\\")\\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/mini-card/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\nimport * as focusTrap from 'focus-trap';\n\nexport default Ember.Component.extend({\n    layout: layout,\n    translucentOverlay: true,\n    containerClassNames: ['modal-component', 'modal', 'in', 'fade'].join(' '),\n    overlayClassNames: 'translucent',\n\n    intl: Ember.inject.service(),\n\n    headerText: '',\n    confirmText: '',\n    cancelText: '',\n\n    cancel: null,\n    confirm: null,\n\n    showHeader: true,\n    showFooter: true,\n    wrapContent: true,\n    enforceModality: false,\n\n    extraClassNames: '',\n\n    confirmDisabled: false,\n    noCancel: false,\n\n    trap: null,\n\n    actions: {\n        sendClose() {\n            this.send('sendCancel');\n        },\n\n        sendConfirm() {\n            if (typeof this.get('confirm') === 'function') {\n                let ret = this.get('confirm')();\n                if (ret && ret.then) {\n                    this.set('loading', true);\n                    ret.then(() => {\n                        this.set('loading', false);\n                    });\n                }\n            } else {\n                this.sendAction('confirm');\n            }\n        },\n\n        sendCancel() {\n            if (typeof this.attrs.cancel === 'function') {\n                this.attrs.cancel();\n            } else {\n                this.sendAction('cancel');\n            }\n        },\n\n        backdropDismiss() {\n            if (!this.get('enforceModality')) {\n                this.send('sendClose');\n            }\n        },\n\n        setAttribute(key, value) {\n            this.set(key, value);\n        }\n    },\n\n    setText: Ember.on('init', function () {\n        const intl = this.get('intl');\n        let { headerText, confirmText, cancelText } = this.getProperties('headerText', 'confirmText', 'cancelText');\n\n        if (headerText === '') {\n            headerText = intl.lookup('components.modal.header').toString();\n        }\n\n        if (confirmText === '') {\n            confirmText = intl.lookup('common.confirm').toString();\n        }\n\n        if (cancelText === '') {\n            cancelText = intl.lookup('common.cancel').toString();\n        }\n\n        this.setProperties({\n            headerText,\n            confirmText,\n            cancelText\n        });\n    }),\n\n    confirmAction: Ember.computed({\n        get() {\n            return this.get('confirm');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('confirm', value);\n            }\n            return value;\n        }\n    }),\n\n    cancelAction: Ember.computed({\n        get() {\n            return this.get('cancel');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('cancel', value);\n            }\n            return value;\n        }\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    attachClassToBody: Ember.on('didInsertElement', function () {\n        Ember.$('body').addClass('modal-open');\n\n        const modalContainerElement = this.$('.modal-dialog .modal-content')[0];\n        this.trap = focusTrap.createFocusTrap(modalContainerElement, {\n            escapeDeactivates: false,\n            allowOutsideClick: true\n        });\n        if (this.trap) {\n            this.trap.activate();\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        Ember.$('body').removeClass('modal-open');\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    }),\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"vbH6Zjnv\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"overlayClassNames\\\",\\\"containerClassNames\\\",\\\"targetAttachment\\\",\\\"onClose\\\"],[[28,[\\\"overlayClassNames\\\"]],[28,[\\\"containerClassNames\\\"]],\\\"center\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"modal-dialog \\\",[26,[\\\"extraClassNames\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[15,\\\"role\\\",\\\"dialog\\\"],[16,\\\"aria-label\\\",[26,[\\\"headerText\\\"]],null],[15,\\\"aria-modal\\\",\\\"true\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"wrapContent\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showHeader\\\"]],[28,[\\\"headerText\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"modal-title\\\"],[13],[1,[26,[\\\"headerText\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.close\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n                    \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setAttribute\\\"],null],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showFooter\\\"]],[33,[\\\"or\\\"],[[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"confirmText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"confirmDisabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendConfirm\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"confirmText\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cancelText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendCancel\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"cancelText\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"modal-button-close\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null],null],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[15,\\\"accent\\\",\\\"ghost\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"close\\\"],[16,\\\"screenreader-text\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n                \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/modal-component/template.hbs\"}});","define(\"connections-ui/components/modal-dialog-overlay\", [\"exports\", \"ember-modal-dialog/components/modal-dialog-overlay\"], function (_exports, _modalDialogOverlay) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialogOverlay.default;\n    }\n  });\n});\n","define(\"connections-ui/components/modal-dialog\", [\"exports\", \"ember-modal-dialog/components/modal-dialog\"], function (_exports, _modalDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialog.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport ModalDialog from 'ember-modal-dialog/components/modal-dialog';\n\n// This is a wrapper for the modal-dialog in the ember-modal-dialog library\nexport default ModalDialog.extend({\n    didInsertElement() {\n        this._super(...arguments);\n        this._initEscListener();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$('body').off('keyup.modal-dialog');\n    },\n\n    _initEscListener() {\n        const closeOnEscapeKey = ev => {\n            if (ev.key === 'Escape' || ev.key === 'Esc') {\n                this.sendAction('onClose');\n            }\n        };\n\n        Ember.$('body').on('keyup.modal-dialog', closeOnEscapeKey);\n    }\n});\n","define(\"connections-ui/components/navigation-sub-menu/component\", [\"exports\", \"ember-purecloud-components/components/navigation-sub-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nimport CreateGroupMixin from '../../mixins/create-group';\n\nconst { inject, Component } = Ember;\n\nexport default Component.extend(CreateGroupMixin, {\n    classNames: ['new-group'],\n\n    intl: inject.service(),\n\n    attrs: {\n        confirm() {},\n        cancel() {},\n        setAttribute() {}\n    },\n\n    setHandlers: Ember.on('init', function () {\n        const setAttr = this.get('setAttribute');\n        setAttr('confirm', this.createGroup.bind(this));\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.$('.form-control:first').focus();\n        });\n    }),\n\n    checkNameLength: Ember.observer('groupName', function () {\n        let isTooLong = this.get('groupName.length') > 140;\n\n        if (isTooLong) {\n            this.attrs.disable(true);\n            this.$('input.form-control').tooltip({\n                placement: 'bottom',\n                title: this.get('intl').lookup('groups.admin.nameLengthTooltip'),\n                trigger: 'manual'\n            });\n            this.$('input.form-control').tooltip('show');\n        } else {\n            this.attrs.disable(false);\n            this.$('input.form-control').tooltip('destroy');\n        }\n\n        this.set('nameLengthExceeded', isTooLong);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"PP2l++Ax\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-name\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.name\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"value\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-name\\\"],null],\\\"form-control\\\",[28,[\\\"groupName\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-type\\\"]]],[13],[1,[26,[\\\"groupTypeI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-type\\\"],null],[28,[\\\"groupType\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupType\\\"]]],null]],null],[28,[\\\"groupTypeDefault\\\"]],\\\"form-control group-type\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupTypeChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupTypeChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupTypeChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupTypeChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-visibility\\\"]]],[13],[1,[26,[\\\"groupVisibilityI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-visibility\\\"],null],[28,[\\\"groupVisibility\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupVisibility\\\"]]],null]],null],[28,[\\\"groupVisibilityDefault\\\"]],\\\"form-control group-visibility\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupVisibilityChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupVisibilityChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupVisibilityChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupVisibilityChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/new-group/template.hbs\"}});","define(\"connections-ui/components/occludable-area\", [\"exports\", \"smoke-and-mirrors/components/occludable-area\"], function (_exports, _occludableArea) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _occludableArea.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pc-style-icon-example\", [\"exports\", \"ember-purecloud-style/components/pc-style-icon-example\"], function (_exports, _pcStyleIconExample) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pcStyleIconExample.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport WebrtcActionUtilsMixin from 'connections-ui/mixins/webrtc-action-utils';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\nimport DS from 'ember-data';\nimport Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed, observer } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport default Component.extend(WebrtcActionUtilsMixin, EntityImageDefaults, {\n    classNameBindings: ['isActive:current:sibling', 'isActive:col-sm-6:col-sm-3', ':card'],\n    attributeBindings: ['entity.id:data-entity-id'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    entity: null,\n\n    phone: inject(),\n\n    needsServices: ['chat'],\n    excludedFields: ['chat'],\n\n    init() {\n        this._super(...arguments);\n        this.checkUnusedFields();\n    },\n\n    emailEnabled: computed.notEmpty('entity.email'),\n    showPhone: computed.bool('phoneServiceEnabled'),\n\n    phoneNumber: computed('phoneNumber', function () {\n        let entity = this.get('entity');\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n\n        let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n        if (phone && phone.value && phone.value.fieldPath) {\n            return entity.getFieldValue(phone.value.fieldPath);\n        }\n\n        if (phone.rel) {\n            return phone.rel.e164;\n        }\n    }),\n\n    isSelf: Ember.computed('entity.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityContactGroupData: computed('entity.email', 'entity.phone.number', function () {\n        return {\n            isPerson: true,\n            isChatEnabled: true,\n            videoTooltipTitle: this.get('videoTooltipTitle'),\n            isWebrtcEnabled: this.get('isWebrtcEnabled'),\n            emailEnabled: this.get('emailEnabled'),\n            linkToProfile: 'person.detail',\n            phoneServiceEnabled: this.get('phoneServiceEnabled'),\n            phoneAvailable: this.get('phone.enabled'),\n            emailAddress: this.entity.get('email'),\n            telephoneNumber: this.entity.get('phone.number'),\n            showPhone: this.get('showPhone'),\n            isVideoButtonEnabled: this.get('isVideoButtonEnabled'),\n            canViewChat: this.get('canViewChat'),\n            canViewVideo: this.get('canViewVideo')\n        };\n    }),\n\n    checkUnusedFields: observer('entity', function () {\n        this.set('excludedFields', ['chat']);\n\n        if (this.get('entity.fieldConfig.sections') !== undefined) {\n            var fields = this.get('entity.fieldConfig.sections')[7].get('fieldList');\n\n            for (var i = 0; i < fields.length; i++) {\n                var value = this.get('entity.data.contactInfo.' + fields[i].key);\n\n                if (value === undefined || value[0].value === '') {\n                    this.get('excludedFields').push(fields[i].key);\n                }\n            }\n        }\n    }),\n\n    initialFieldsCheck: Ember.on('init', function () {\n        this.checkUnusedFields();\n    }),\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    actions: {\n        startChat: function (jid) {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [jid]\n            });\n        },\n\n        moveToPerson: function () {\n            this.sendAction('setPerson', this.get('entity'));\n        }\n    },\n\n    async toggleFavorite() {\n        await this.get('favorites').toggleFavorite(this.entity);\n        this.setEntityContactGroupData();\n    },\n\n    navigateToProfileEvent() {\n        try {\n            const router = getOwner(this).lookup('router:main');\n            const profileId = this.entity.get('id');\n            if (router && profileId) router.transitionTo('person.detail', profileId);\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    },\n\n    contactEvent(e) {\n        try {\n            const openChat = this.get('actionOpenChatRoom');\n            const openVideo = this.get('actionOpenVideoCall');\n\n            switch (e.detail) {\n                case 'call':\n                    this.callEntity(this.entity);\n                    break;\n                case 'chat':\n                    if (openChat) {\n                        openChat(this.entity.get('jid'));\n                    }\n                    break;\n                case 'video':\n                    if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                        return;\n                    }\n                    if (openVideo) {\n                        openVideo(this.entity.get('jid'), this.get('useMediaProviders'));\n                    }\n                    break;\n                case 'navigateToProfile':\n                    this.navigateToProfileEvent();\n                    break;\n                default:\n                    Ember.Logger.error('Error: contact event not found.');\n                    break;\n            }\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"PAQ203B5\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-image\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"moveToPerson\\\"]],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],400,true,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-info\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h2\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-location-container\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location align-center\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"tooltip.person.profile\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"entity\\\",\\\"linkProfile\\\",\\\"showImages\\\",\\\"useMediaProviders\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"entity\\\"]],true,false,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-card/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonGraphComponent = Ember.Component.extend({\n    classNames: ['person-graph'],\n    classNameBindings: ['mini:mini'],\n    attributeBindings: ['width', 'height'],\n\n    person: null,\n\n    graph: null,\n    paper: null,\n\n    mini: false,\n\n    trueColor: '#66f',\n    trueStrokeColor: 'white',\n\n    falseColor: '#ddd',\n    falseStrokeColor: 'white',\n\n    disabledColor: 'transparent',\n    disabledStrokeColor: 'transparent',\n\n    disabledSegments: null,\n\n    paths: null,\n    baseAttrForPath: {},\n\n    segmentChanged: Ember.observer(\n        'graph',\n        'graph.{ancestors,parent,self,siblings,children,descendants}',\n        function (sender, key) {\n            if (this.get('paths')) {\n                var segName = key.split('.').reverse()[0];\n                var segment = this.get('paths.' + segName);\n                if (segment) {\n                    segment.attr(this.attrForSegment(segName));\n                }\n            }\n        }\n    ),\n\n    disabledSegmentsChanged: Ember.observer('disabledSegments.[]', function () {\n        var segs = this.get('disabledSegments');\n        var graph = this.get('graph');\n        if (segs && graph) {\n            for (var i = 0; i < segs.length; i++) {\n                graph.set(segs[i], false);\n                this.segmentChanged(this, 'graph.' + segs[i]);\n            }\n        }\n    }),\n\n    setupGraph: Ember.on('didInsertElement', function () {\n        this.set('paths', {});\n\n        if (!this.get('graph')) {\n            this.set(\n                'graph',\n                Ember.Object.create({\n                    ancestors: false,\n                    parent: false,\n                    self: false,\n                    siblings: false,\n                    children: false,\n                    descendants: false\n                })\n            );\n        }\n\n        this.drawGraphics();\n    }),\n\n    destroyGraphics: Ember.on('willDestroyElement', function () {\n        if (this.get('paper')) {\n            this.get('paper').remove();\n            this.set('paper', null);\n        }\n    }),\n\n    click: function (event) {\n        if (this.get('mini')) {\n            return;\n        }\n\n        var target = Ember.$(event.target);\n\n        if (target.is('path')) {\n            var segment = target.data('segmentName');\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: segment\n            });\n        } else if (target.is('img') || target.is('.entity-image')) {\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: 'self'\n            });\n        }\n    },\n\n    isDisabled: function (segment) {\n        return this.get('disabledSegments') && this.get('disabledSegments').indexOf(segment) > -1;\n    },\n\n    drawGraphics: function () {\n        this.destroyGraphics();\n\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var paper = new window.Raphael(this.get('element'), width, height);\n        this.set('paper', paper);\n\n        this.drawSegment('ancestors');\n        this.drawSegment('parent');\n        this.drawSegment('self');\n        this.drawSegment('siblings');\n        this.drawSegment('children');\n        this.drawSegment('descendants');\n\n        paper.renderfix();\n        paper.safari();\n    },\n\n    drawSegment: function (segment) {\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var xform = ['s', width, ',', height, ',0,0'];\n\n        var path = this.get('paper').path(this.pathForSegment(segment));\n        var attr = $.extend(this.get('baseAttrForPath'), this.attrForSegment(segment), { 'stroke-width': 0.5 });\n\n        path.transform(xform.join('')).attr(attr);\n        Ember.$(path.node).data('segmentName', segment);\n\n        this.set('paths.' + segment, path);\n    },\n\n    attrForSegment: function (segment) {\n        var attr = {};\n        attr.cursor = 'pointer';\n\n        if (this.isDisabled(segment)) {\n            attr.fill = this.get('disabledColor');\n            attr.stroke = this.get('disabledStrokeColor');\n            attr.cursor = 'default';\n        } else if (this.get('graph.' + segment)) {\n            attr.fill = this.get('trueColor');\n            attr.stroke = this.get('trueStrokeColor');\n        } else {\n            attr.fill = this.get('falseColor');\n            attr.stroke = this.get('falseStrokeColor');\n        }\n\n        if (this.get('mini')) {\n            attr.cursor = 'default';\n        }\n\n        return attr;\n    },\n\n    pathForSegment: function (segment) {\n        if (this.get('mini')) {\n            return this.get(segment + 'SmallPath');\n        } else {\n            return this.get(segment + 'Path');\n        }\n    },\n\n    ancestorsPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentPath:\n        'M0.439,0.299C0.458,0.294,0.478,0.29,0.499,0.29c0.022,0,0.043,0.004,0.064,0.011V0.258h0.062L0.499,0.133L0.374,0.258h0.065V0.299z',\n    selfPath:\n        'M0.499,0.313c-0.103,0-0.186,0.083-0.186,0.186s0.083,0.186,0.186,0.186s0.186-0.083,0.186-0.186S0.602,0.313,0.499,0.313z  M0.499,0.624c-0.069,0-0.125-0.056-0.125-0.125c0-0.069,0.056-0.125,0.125-0.125c0.069,0,0.125,0.056,0.125,0.125C0.624,0.568,0.568,0.624,0.499,0.624z',\n    siblingsPath:\n        'M0.298,0.559C0.293,0.54,0.289,0.52,0.289,0.5c0-0.022,0.004-0.044,0.011-0.064H0.173V0.374L0.049,0.5l0.125,0.125V0.559H0.298z M0.698,0.438c0.005,0.019,0.009,0.039,0.009,0.059c0,0.023-0.004,0.044-0.011,0.064h0.126v0.062l0.125-0.126L0.823,0.372v0.065H0.698z',\n    childrenPath:\n        'M0.56,0.699C0.541,0.705,0.521,0.708,0.5,0.708c-0.022,0-0.044-0.004-0.064-0.011v0.043H0.374L0.5,0.865l0.125-0.125H0.56V0.699z',\n    descendantsPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z',\n\n    ancestorsSmallPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentSmallPath:\n        'M0.439,0.343c0.019-0.007,0.039-0.011,0.06-0.011c0.022,0,0.044,0.004,0.064,0.013V0.291h0.062L0.499,0.167L0.374,0.291h0.065V0.343z',\n    selfSmallPath:\n        'M0.499,0.374c-0.069,0-0.125,0.056-0.125,0.125c0,0.069,0.056,0.125,0.125,0.125c0.069,0,0.125-0.057,0.125-0.125c0-0.038-0.017-0.072-0.043-0.095C0.559,0.385,0.53,0.374,0.499,0.374z',\n    siblingsSmallPath:\n        'M0.332,0.499c0-0.023,0.004-0.044,0.013-0.063H0.208V0.374L0.083,0.5l0.125,0.125V0.559h0.136C0.336,0.54,0.332,0.52,0.332,0.499z M0.916,0.498L0.791,0.374v0.065H0.654c0.007,0.019,0.012,0.039,0.012,0.06c0,0.022-0.004,0.043-0.013,0.063h0.138v0.062L0.916,0.498z',\n    childrenSmallPath:\n        'M0.56,0.654L0.56,0.654C0.55,0.658,0.541,0.661,0.53,0.663S0.51,0.666,0.499,0.666c-0.011,0-0.022-0.001-0.033-0.003c-0.01-0.002-0.021-0.005-0.03-0.009v0.054H0.374L0.5,0.833l0.125-0.125H0.56V0.654z',\n    descendantsSmallPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z'\n});\nexport default PersonGraphComponent;\n","export default Ember.HTMLBars.template({\"id\":\"fmI57xbg\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"mini\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-graph/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonIconComponent = Ember.Component.extend({\n    classNames: ['person-icon'],\n\n    favorites: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    canViewChat: Ember.computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.reads('permissions.canViewCollaborateVideo'),\n    person: null,\n\n    actions: {\n        noop: () => {}\n    }\n});\n\nexport default PersonIconComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Vh8AiTYZ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"useInitialsPlaceholder\\\",\\\"enableMiniCard\\\",\\\"isLinkable\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"subscribeToPresence\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"componentUpdated\\\",\\\"onContact\\\"],[[28,[\\\"person\\\"]],48,true,true,true,true,[28,[\\\"favorites\\\",\\\"enabled\\\"]],true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"noop\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-icon/template.hbs\"}});","import Ember from 'ember';\r\nimport PikadayInputComponent from 'ember-pikaday/components/pikaday-input';\r\n\r\nexport default PikadayInputComponent;\r\n","define(\"connections-ui/components/pikaday-inputless\", [\"exports\", \"ember-pikaday/components/pikaday-inputless\"], function (_exports, _pikadayInputless) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pikadayInputless.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-component\", [\"exports\", \"ember-tooltips/components/popover-on-component\"], function (_exports, _popoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-element\", [\"exports\", \"ember-tooltips/components/popover-on-element\"], function (_exports, _popoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple\", [\"exports\", \"ember-power-select/components/power-select-multiple\"], function (_exports, _powerSelectMultiple) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectMultiple.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple/trigger\", [\"exports\", \"ember-power-select/components/power-select-multiple/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select\", [\"exports\", \"ember-power-select/components/power-select\"], function (_exports, _powerSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelect.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/before-options\", [\"exports\", \"ember-power-select/components/power-select/before-options\"], function (_exports, _beforeOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _beforeOptions.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/options\", [\"exports\", \"ember-power-select/components/power-select/options\"], function (_exports, _options) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _options.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/placeholder\", [\"exports\", \"ember-power-select/components/power-select/placeholder\"], function (_exports, _placeholder) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _placeholder.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/power-select-group\", [\"exports\", \"ember-power-select/components/power-select/power-select-group\"], function (_exports, _powerSelectGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectGroup.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/search-message\", [\"exports\", \"ember-power-select/components/power-select/search-message\"], function (_exports, _searchMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _searchMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/trigger\", [\"exports\", \"ember-power-select/components/power-select/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pre-render\", [\"exports\", \"smoke-and-mirrors/components/pre-render\"], function (_exports, _preRender) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _preRender.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/person-activity/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/person-activity/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/profile-dropdown-menu/component\", [\"exports\", \"ember-webrtc-components/components/profile-dropdown-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/progress-underlay/component\", [\"exports\", \"ember-purecloud-components/components/progress-underlay/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/queue-toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/queue-toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'input',\n\n    attributeBindings: [\n        'type',\n        'disabled',\n        'isChecked:checked',\n        'name',\n        'ariaLabel:aria-label',\n        'ariaLabelledBy:aria-labelledby',\n        'ariaDescribedBy:aria-describedby'\n    ],\n\n    checked: false,\n    disabled: false,\n    onClick: () => {},\n\n    type: 'radio',\n    name: 'radio',\n    ariaLabel: null,\n    ariaLabelledBy: null,\n    ariaDescribedBy: null,\n    isChecked: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('isChecked', this.get('checked'));\n    },\n\n    didUpdateAttrs() {\n        this.set('isChecked', this.get('checked'));\n    },\n\n    click(event) {\n        this.set('isChecked', true);\n\n        this.get('onClick')();\n\n        event.stopPropagation();\n    }\n});\n","import Ember from 'ember';\n\nconst { on, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNameBindings: [':resizable-content', 'minimized:minimized:maximized'],\n\n    isMouseDown: false,\n    minimized: true,\n\n    minHeight: 0,\n    maxHeight: null,\n    actions: {\n        toggleSize() {\n            this.toggleProperty('minimized');\n        }\n    },\n\n    attachCurrentHeight: on('didInsertElement', function () {\n        this.$().css('min-height', this.get('minHeight'));\n    }),\n\n    minimizedChanged: observer('minimized', function () {\n        if (this.get('minimized')) {\n            this.$().css('min-height', this.get('minHeight'));\n        } else {\n            let maxHeight = this.get('maxHeight');\n            if (!maxHeight) {\n                maxHeight = 'calc(100% - 8px)';\n                this.set('maxHeight', maxHeight);\n            }\n            this.$().css('min-height', maxHeight);\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O1G95mNX\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"resize-handle btn btn-purecloud\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleSize\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"minimized\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.expand\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.collapse\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/resizable-content/template.hbs\"}});","define(\"connections-ui/components/resize-detector\", [\"exports\", \"ember-element-resize-detector/components/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-group', 'panel', 'panel-default'],\n    classNameBindings: ['panelId'],\n\n    facet: null,\n    parentId: null,\n\n    selectedTerms: [],\n\n    accordianParentId: Ember.computed('parentId', function () {\n        return '#' + this.get('parentId');\n    }),\n\n    panelId: Ember.computed('facet.facetName', function () {\n        return this.get('facet.facetName').replace(/\\./g, '_');\n    }),\n\n    href: Ember.computed('panelId', function () {\n        return '#' + this.get('panelId');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"4Rob5zmU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"facet-label panel-heading\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"panel-title\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"role\\\",\\\"button\\\"],[15,\\\"data-toggle\\\",\\\"collapse\\\"],[16,\\\"data-parent\\\",[26,[\\\"parentId\\\"]],null],[16,\\\"href\\\",[26,[\\\"href\\\"]],null],[15,\\\"aria-expanded\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"facet\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"terms panel-collapse collapse in\\\"],[16,\\\"id\\\",[26,[\\\"panelId\\\"]],null],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-body\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"facet\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"term \\\",[33,[\\\"css-classify\\\"],[[28,[\\\"term\\\",\\\"term\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"search-facet-term\\\"],null,[[\\\"facet\\\",\\\"term\\\",\\\"selectedTerms\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\"]],[28,[\\\"selectedTerms\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"term\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-group/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-term'],\n\n    facet: null,\n    term: null,\n\n    selectedTerms: [],\n\n    isSelected: false,\n\n    actions: {\n        selectTerm: function () {\n            var term = this.get('term');\n            var facet = this.get('facet');\n            var action = 'selectTerm';\n\n            this.bubbleAction({\n                action: action,\n                actionContext: [term, facet]\n            });\n        }\n    },\n\n    selectedTermsChanged: Ember.observer('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var term = terms.findBy('term', this.get('term'));\n        this.set('isSelected', term !== undefined);\n    })\n\n    //    isSelectedChanged: Ember.observer('isSelected', function () {\n    //        var selected = this.get('isSelected');\n    //        if (!selected) {\n    //            this.send('selectTerm');\n    //        }\n    //    })\n\n    //    isSelected: Ember.computed('selectedTerms.[]', function () {\n    //        var terms = this.get('selectedTerms');\n    //        var term = terms.findBy('term', this.get('term'));\n    //        return term !== undefined;\n    //    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"8+SnBQn/\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"term\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTerm\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"count\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[28,[\\\"term\\\",\\\"count\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-term/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../../utils/newrelic';\nimport { BASE_GROUP_FIELDS } from '../../models/group';\nimport { BASE_LOCATION_FIELDS } from '../../models/location';\nimport { BASE_PERSON, BASE_PERSON_EXPANDS, BASE_PERSON_FIELDS } from '../../models/person';\nimport { MULTI_ENTITY_FIELDS } from '../../utils/entity-fields';\n\nconst FAVORITE_LIMIT = 200;\nconst FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA = 50;\n\nconst PAGE_SIZE = 15;\nconst FACET_COUNT = 10;\nconst PAGE_LIMIT = 4;\nconst keypathRegex = /[\\w+.]+:\"?.[^\"]+([\\w\\s]+)?\"?/gi;\n\nexport const SEARCH_FACET_KEYPATHS = {\n    profileSkills: 'skills.skills',\n    department: 'general.department',\n    title: 'general.title',\n    hobbies: 'bio.hobbies',\n    interests: 'bio.interests',\n    certifications: 'skills.certs',\n    languages: 'languages.name'\n};\n\nfunction reverseLookup(obj, value) {\n    for (const key in obj) {\n        if (obj[key] === value) {\n            return key;\n        }\n    }\n}\n\nconst FacetTerm = Ember.Object.extend({\n    facet: null,\n    term: null,\n    isKeyword: false,\n\n    searchField: Ember.computed('facet.facetName', function () {\n        return reverseLookup(SEARCH_FACET_KEYPATHS, this.get('facet.facetName'));\n    }),\n\n    toString: function () {\n        if (this.get('isKeyword')) {\n            return this.get('term.term');\n        }\n\n        const name = this.get('facet.facetName');\n        const term = this.get('term.term');\n        return `${name}:\"${term}\"`;\n    }\n});\n\nconst View = {\n    classNames: ['container-fluid', 'search-results-page'],\n\n    attachScrollListener: Ember.on('didInsertElement', function () {\n        this.$().on('scroll.' + this.get('elementId'), () => {\n            this.loadNextPage();\n        });\n    }),\n\n    removeListeners: Ember.on('willDestroyElement', function () {\n        this.$().off('.' + this.get('elementId'));\n    }),\n\n    createDebouncedLoadNextPage: Ember.on('init', function () {\n        this.loadNextPage = _.debounce(function () {\n            Ember.run(() => {\n                // model.isPending\n                if (this.get('model._state') === 0 || this.get('_state') !== 'inDOM') {\n                    return;\n                }\n\n                var scroll = this.$().scrollTop();\n                var height = this.$('.search-content').height() - this.$().height();\n\n                if (height - scroll <= 500) {\n                    this.send('loadMore');\n                }\n            });\n        }, 150);\n    }),\n\n    // Keep loading pages of results until the page is filled with items.\n    // The reason this was added was because when permissions are at play,\n    // search results can come back with limited data.\n    loadResultsToFillPage: Ember.observer('model._state', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            this.loadNextPage();\n        }\n    }),\n\n    scrollToTopOnPageZero: Ember.observer('page', function () {\n        if (this.get('_state') === 'inDOM' && this.get('page') === 0) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                let $el = this.$();\n                if ($el && $el.scrollTop) {\n                    $el.scrollTop(0);\n                }\n            });\n        }\n    })\n};\n\nconst Controller = {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    search: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    integrationsPresence: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n\n    _searchQuery: null,\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true,\n\n    page: 0,\n\n    loading: {\n        searchResults: false,\n        facets: false\n    },\n\n    selectedTerms: [],\n    searchResults: [],\n    facets: null,\n    totalResults: 0,\n    lastSearchFavoritesCount: 0,\n\n    init(...args) {\n        this._super(...args);\n        this.get('favorites').on('favoriteChange', this, this.onFavoriteChanged);\n    },\n    willDestroyElement(...args) {\n        this._super(...args);\n        this.get('favorites').off('favoriteChange', this, this.onFavoriteChanged);\n    },\n\n    onFavoriteChanged() {\n        if (this.get('entity') === 'favorites') {\n            Ember.run.debounce(this, this.runSearchQuery, 300);\n        }\n    },\n\n    actions: {\n        changeSearchType: function (type) {\n            var currentActive = this.get('entity');\n\n            if (currentActive === type) {\n                return false;\n            }\n\n            this.set('entity', type || 'all');\n        },\n\n        selectTerm: function (term, facet) {\n            var terms = this.get('selectedTerms');\n            var termObj = terms.findBy('term', term);\n\n            if (terms && terms.length === 10) {\n                this.notifyTooManySearchFilters();\n                return;\n            }\n\n            if (termObj !== undefined) {\n                this.get('selectedTerms').removeObject(termObj);\n            } else {\n                termObj = FacetTerm.create({\n                    term: term,\n                    facet: facet\n                });\n\n                this.get('selectedTerms').addObject(termObj);\n            }\n\n            this.updateQueryOnTermsChange();\n        },\n\n        removeSelectedTerm: function (term /*, facet*/) {\n            var termObj = this.get('selectedTerms').findBy('term', term);\n\n            if (termObj) {\n                this.get('selectedTerms').removeObject(termObj);\n                this.updateQueryOnTermsChange();\n            }\n        },\n\n        loadMore: function () {\n            if (this.get('hasMoreResults')) {\n                this.runSearchQuery(true);\n            }\n        }\n    },\n\n    changeTabButtons: Ember.on('didRender', function () {\n        this.$('.entity-type-filter .gux-tab-button').attr('aria-controls', 'search-results');\n    }),\n\n    atPageLimit: Ember.computed.equal('page', PAGE_LIMIT),\n    remainingResults: Ember.computed('totalResults', 'page', function () {\n        return this.get('totalResults') - this.get('page') * PAGE_SIZE;\n    }),\n\n    hasMoreResults: Ember.computed('remainingResults', 'loading.searchResults', function () {\n        const moreResults = this.get('remainingResults') > 0;\n        const loading = this.get('loading.searchResults');\n        return !loading && moreResults;\n    }),\n\n    groupedSelectedTerms: Ember.computed('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var data = [];\n\n        terms.forEach(function (termObj) {\n            var term = termObj.get('term');\n            var facet = termObj.get('facet');\n            var currentGroup = data.findBy('facet.facetName', facet.facetName);\n\n            if (!currentGroup) {\n                currentGroup = {\n                    facet: facet,\n                    terms: [term]\n                };\n\n                data.addObject(currentGroup);\n            } else {\n                currentGroup.terms.addObject(term);\n            }\n        });\n\n        return data;\n    }),\n\n    isEmpty: Ember.computed('model._state', 'loading.searchResults', 'loading.facets', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            return this.get('totalResults') === 0;\n        } else if (this.get('model._state') === 2) {\n            // model.isRejected\n            return true;\n        }\n        return false;\n    }),\n\n    isGroups: Ember.computed.equal('entity', 'groups'),\n    isLocations: Ember.computed.equal('entity', 'locations'),\n    isExternalContacts: Ember.computed.equal('entity', 'externalContacts'),\n\n    isExternalContactsEmpty: Ember.computed('isExternalContacts', 'totalResults', 'query', function () {\n        return this.get('isExternalContacts') && this.get('totalResults') === 0 && !this.get('query');\n    }),\n\n    isFavorite: Ember.computed.equal('entity', 'favorites'),\n    isFavoritesEmpty: Ember.computed('isFavorite', 'lastSearchFavoritesCount', function () {\n        return this.get('isFavorite') && this.get('lastSearchFavoritesCount') === 0;\n    }),\n\n    haveSelectedTerms: Ember.computed.notEmpty('selectedTerms'),\n\n    displayFacets: Ember.computed('facets', 'selectedTerms', function () {\n        const facets = this.get('facets');\n        if (!Array.isArray(facets)) {\n            return facets;\n        }\n\n        // remove facets which are selected terms\n        const selectedTerms = this.get('selectedTerms');\n        facets.forEach(facet => {\n            const { facetName, terms } = facet;\n            facet.terms = terms.filter(\n                ({ term }) =>\n                    !selectedTerms.find(\n                        selected => selected.get('facet.facetName') === facetName && selected.get('term.term') === term\n                    )\n            );\n        });\n\n        // remove empty facets\n        return facets.filter(({ terms }) => !_.isEmpty(terms));\n    }),\n\n    updateQueryParameters() {\n        let queryParameters = '';\n        const params = [];\n        if (this.get('entity')) {\n            params.push(`entity=${encodeURIComponent(this.get('entity'))}`);\n        }\n        if (this.get('query')) {\n            params.push(`query=${encodeURIComponent(this.get('query'))}`);\n        }\n        if (this.get('queryFacets')) {\n            params.push(`queryFacets=${encodeURIComponent(this.get('queryFacets'))}`);\n        }\n        if (params.length) {\n            queryParameters = `?${params.join('&')}`;\n        }\n        const newHash = `#/search-v2${queryParameters}`;\n        if (newHash !== this.lastHash) {\n            this.lastHash = newHash;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n            return true;\n        }\n        return false;\n    },\n\n    searchInitial: Ember.on('didInsertElement', function () {\n        if (!this.get('entity')) {\n            this.set('entity', 'all'); // This will trigger a new /search (via searchOnChange() observer)\n        } else {\n            Ember.run.next(this, this.runSearchQuery);\n        }\n    }),\n\n    searchOnChange: Ember.observer('entity', 'query', 'queryFacets', function () {\n        if (window.top.location.hash.startsWith('#/search-v2') && this.updateQueryParameters()) {\n            Ember.run.next(this, this.runSearchQuery);\n        }\n    }),\n\n    updateQueryOnTermsChange() {\n        var terms = this.get('selectedTerms');\n\n        var termStrings = _.chain(terms)\n            .filter(term => !term.get('isKeyword'))\n            .map(term => term.toString())\n            .value();\n        var queryFacets = termStrings.join(' ');\n\n        var keywordStrings = _.map(\n            _.filter(terms, function (term) {\n                return term.get('isKeyword');\n            }),\n            function (term) {\n                return term.toString();\n            }\n        );\n        var query = keywordStrings.join(' ');\n\n        this.setProperties({\n            query,\n            queryFacets\n        });\n    },\n\n    _baseSearch() {\n        return {\n            pageSize: PAGE_SIZE,\n            sortOrder: 'SCORE'\n        };\n    },\n\n    _baseAggregations() {\n        const terms = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        const aggregateTerm = name => ({\n            name,\n            field: name,\n            type: 'TERM',\n            size: FACET_COUNT,\n            order: ['COUNT_DESC', 'VALUE_ASC']\n        });\n        return terms.map(aggregateTerm);\n    },\n\n    _valueQuery(value) {\n        if (value) {\n            return [\n                {\n                    type: 'QUERY_STRING',\n                    value\n                }\n            ];\n        }\n        return [{ type: 'MATCH_ALL' }];\n    },\n\n    _facetQuery(facets) {\n        return facets\n            .filter(facet => !facet.get('isKeyword'))\n            .map(facet => {\n                const value = facet.get('term.term');\n                const fields = [facet.get('searchField')];\n                return {\n                    value,\n                    fields,\n                    type: 'EXACT'\n                };\n            });\n    },\n\n    _baseSearchForEntity(entityType) {\n        if (entityType === 'people') {\n            entityType = 'users';\n        }\n        if (entityType === 'externalContacts') {\n            entityType = 'external_contacts';\n        }\n\n        if (entityType === 'all') {\n            let types = ['users', 'groups', 'locations'];\n            return {\n                types,\n                aggregations: this._baseAggregations(),\n                returnFields: MULTI_ENTITY_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'users') {\n            return {\n                types: ['users'],\n                aggregations: this._baseAggregations(),\n                returnFields: BASE_PERSON_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'locations') {\n            return {\n                types: ['locations'],\n                returnFields: BASE_LOCATION_FIELDS\n            };\n        }\n\n        if (entityType === 'groups') {\n            return {\n                types: ['groups'],\n                returnFields: BASE_GROUP_FIELDS\n            };\n        }\n\n        if (entityType === 'external_contacts') {\n            return {\n                types: ['external_contacts'],\n                returnFields: BASE_PERSON_FIELDS\n            };\n        }\n\n        // Unsafe to assert because the `entity` query param could\n        // be manually modified and blow up the page without warning.\n        Ember.Logger.warn(`_baseSearchForEntity(): Invalid entityType \"${entityType}\"`);\n        return this._baseSearchForEntity('all');\n    },\n\n    _buildSearch(entityType, search, facets, favoriteIds) {\n        let query = [...this._facetQuery(facets)];\n        const valueQuery = this._valueQuery(search);\n        if (search || _.isEmpty(facets)) {\n            query = [].concat([], query, valueQuery);\n        }\n        if (favoriteIds) {\n            if (favoriteIds.length > FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA) {\n                const chunks = _.chunk(favoriteIds, FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA);\n                query.push({\n                    group: chunks.map(chunk => ({\n                        operator: 'OR',\n                        type: 'EXACT',\n                        fields: ['id'],\n                        values: chunk\n                    }))\n                });\n            } else {\n                query.push({\n                    type: 'EXACT',\n                    fields: ['id'],\n                    values: favoriteIds\n                });\n            }\n        }\n\n        let base = this._baseSearch();\n        if (!valueQuery[0].value) {\n            base = Object.assign({}, base, {\n                sortBy: 'name',\n                sortOrder: 'ASC'\n            });\n        }\n\n        return Object.assign(\n            {\n                query\n            },\n            base,\n            this._baseSearchForEntity(entityType)\n        );\n    },\n\n    _normalizeSearch(data) {\n        const { total, aggregations, results } = data;\n        const models = this.get('search').modelResults(results);\n        const facets = this._processFacets(aggregations);\n        return { results: models, total, facets };\n    },\n\n    _processFacets(rawFacets) {\n        const facets = _.chain(rawFacets)\n            .map((terms, key) => {\n                if (!Object.prototype.hasOwnProperty.call(SEARCH_FACET_KEYPATHS, key)) {\n                    return null;\n                }\n\n                return {\n                    key,\n                    facetName: SEARCH_FACET_KEYPATHS[key],\n                    terms: _.map(terms, ({ key: term, count }) => ({ term, count }))\n                };\n            })\n            .filter()\n            .value();\n        const keyOrder = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => keyOrder.indexOf(key));\n    },\n\n    async getFavoriteIds() {\n        const favorites = await this.get('favorites').getLoadedFavorites();\n        return favorites.map(favorite => favorite.id).slice(0, FAVORITE_LIMIT);\n    },\n\n    async runSearchQuery(isLoadMore) {\n        // Wait for any existing search to complete (max 20 iterations * 50ms = 1 second)\n        let iterations = 0;\n        while (this.get('loading.searchResults') && iterations++ < 20) {\n            await new Promise(resolve => setTimeout(resolve, 50));\n        }\n\n        let nextPage = 1;\n        if (isLoadMore) {\n            nextPage = this.get('page') + 1;\n        }\n        this.set('loading.searchResults', true);\n        this.set('loading.facets', !isLoadMore);\n\n        let entity = this.get('entity') || 'all';\n        const query = this.get('query');\n        const queryFacets = this.get('queryFacets');\n        const selectedTerms = this.buildSelectedTerms(query, queryFacets);\n        let favoriteIds = null;\n        if (entity == 'favorites') {\n            entity = 'all';\n            try {\n                favoriteIds = await this.getFavoriteIds();\n            } catch (e) {\n                Ember.Logger.warn(`search::runSearchQuery() Cannot find favorites: ${e.message}`);\n                favoriteIds = [];\n            }\n            const numberOfFavoriteToSearch = favoriteIds ? favoriteIds.length : 0;\n            this.set('lastSearchFavoritesCount', numberOfFavoriteToSearch);\n            addPageAction('conn-ui-fav-disp', {\n                'conn-ui-fav-nb': numberOfFavoriteToSearch\n            });\n            if (favoriteIds && !favoriteIds.length) {\n                // There is no favorite at all, abort the search request!\n                const searchResults = this.get('searchResults');\n                searchResults.clear();\n                this.set('page', nextPage);\n                this.set('totalResults', 0);\n                this.set('facets', []);\n                this.set('selectedTerms', selectedTerms);\n                this.set('model', Ember.RSVP.resolve());\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                return;\n            }\n        }\n\n        const search = this._buildSearch(entity, query, selectedTerms, favoriteIds);\n        search.pageNumber = nextPage;\n\n        const fetch = this.get('search')\n            .search(search)\n            .then(data => this._normalizeSearch(data));\n\n        await fetch\n            .then(({ results, total, facets }) => {\n                const searchResults = this.get('searchResults');\n                if (!isLoadMore) {\n                    searchResults.clear();\n                }\n                searchResults.pushObjects(results);\n                this.set('page', nextPage);\n                this.set('totalResults', total);\n                this.set('facets', facets);\n                this.set('selectedTerms', selectedTerms);\n                return results;\n            })\n            .then((results = []) => {\n                const people = results.filterBy('type', 'person');\n                const ids = people.mapBy('id');\n                if (ids) {\n                    return this.get('store')\n                        .findMany('person', ids, BASE_PERSON)\n                        .then(userResults => {\n                            const integrationsPresence = this.get('integrationsPresence');\n                            if (\n                                integrationsPresence &&\n                                integrationsPresence.get('useIntegrationPresenceDirectorySearch')\n                            ) {\n                                return integrationsPresence.alterUsersWithIntegration(userResults);\n                            }\n                            return userResults;\n                        });\n                }\n            })\n            .catch(reason => {\n                let code = Ember.get(reason, 'payload.details.0.errorCode');\n                if (code === 'TOO_MANY_SEARCH_CRITERIA') {\n                    this.notifyTooManySearchFilters();\n                    throw reason;\n                }\n                this.set('searchResults', []);\n                throw reason;\n            })\n            .finally(() => {\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                this.set('model', fetch);\n            });\n    },\n\n    searchKeywords(query) {\n        const intoQuoteSegments = /(\".*?\"|'.*?'|[^\"\\s]+)+(?=\\s*|\\s*$)/g;\n        return query.split(intoQuoteSegments).filter(keyword => keyword && keyword.trim());\n    },\n\n    buildSelectedTerms(query, queryFacets) {\n        if (!query) {\n            query = '';\n        }\n        if (!queryFacets) {\n            queryFacets = '';\n        }\n\n        const selectedTerms = [];\n        const addSelectedTerm = (facetName, term, isKeyword) => {\n            selectedTerms.push(\n                FacetTerm.create({\n                    isKeyword,\n                    facet: { facetName },\n                    term: { term }\n                })\n            );\n        };\n\n        const keywordFacetName = this.get('intl').t('search.keyword');\n        this.searchKeywords(query).forEach(keyword => {\n            addSelectedTerm(keywordFacetName, keyword, true);\n        });\n\n        const directedSearchTerms = queryFacets.match(keypathRegex);\n        _.forEach(directedSearchTerms, directedSearch => {\n            const [facetName, ...searchSplit] = directedSearch.split(':');\n            const value = searchSplit.join(':');\n            if (value) {\n                const term = value.replace(/\"/g, '');\n                addSelectedTerm(facetName, term);\n            }\n        });\n\n        return selectedTerms;\n    },\n\n    notifyTooManySearchFilters() {\n        let title = this.get('intl').t('search.errors.tooManyFilters.title');\n        let message = this.get('intl').t('search.errors.tooManyFilters.message');\n        this.get('notification').error(title, message);\n    }\n};\n\nexport default Ember.Component.extend(Controller, View);\n","export default Ember.HTMLBars.template({\"id\":\"DE//2wWE\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail facets\\\"],[15,\\\"role\\\",\\\"complementary\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filtersLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isGroups\\\"]],[28,[\\\"isLocations\\\"]],[28,[\\\"isExternalContacts\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.loading\\\"],null]]]],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-group\\\"],[15,\\\"id\\\",\\\"facets\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringGroups\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFiltering\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContacts\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringContacts\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResults\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"displayFacets\\\"]]],[[\\\"key\\\"],[\\\"facetName\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"search-facet-group\\\"],null,[[\\\"facet\\\",\\\"selectedTerms\\\",\\\"parentId\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"selectedTerms\\\"]],\\\"facets\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"facet\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail results\\\"],[15,\\\"role\\\",\\\"main\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.resultsLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.loading\\\"],null]]]],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-type-filter\\\"],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tabs-advanced\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"col-tabs\\\"],[16,\\\"active-tab\\\",[34,[\\\"tab-filter-\\\",[28,[null,\\\"entity\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-tab-advanced-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"show-new-tab-button\\\",\\\"false\\\"],[15,\\\"allow-sort\\\",\\\"false\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-all\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"all\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-all\\\"],[15,\\\"class\\\",\\\"filter all\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-search-all\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-people\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"people\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-people\\\"],[15,\\\"class\\\",\\\"filter people\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-groups\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"groups\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-groups\\\"],[15,\\\"class\\\",\\\"filter groups\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"PURE-7064_search_favorites\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-favorites\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"favorites\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-favorites\\\"],[15,\\\"class\\\",\\\"filter favorites\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"rating-active\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null],false],[14],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-locations\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"locations\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-locations\\\"],[15,\\\"class\\\",\\\"filter locations\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\\n            \\\"],[1,[26,[\\\"create-entity-menu\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"current-facets \\\",[33,[\\\"unless\\\"],[[28,[\\\"haveSelectedTerms\\\"]],\\\"no-selected-facets\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedSelectedTerms\\\"]]],[[\\\"key\\\"],[\\\"facet.facetName\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"grouped-facet-term\\\"],null,[[\\\"group\\\"],[[28,[\\\"group\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[26,[\\\"entity\\\"]]]]],[15,\\\"id\\\",\\\"search-results\\\"],[15,\\\"role\\\",\\\"region\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.resultsLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFavoritesEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-search-results-icon-favorite\\\"],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-background pc-moon\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-full\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-foreground pc-moon not-favorite favorite outline-favorite\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-alpha\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results-with-icon\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"strong\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"search.noFavorite\\\"],null],false],[14],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFavoriteLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContactsEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noContacts\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResultsLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"isSearchResult\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"entity\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"atPageLimit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasMoreResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"text-center page-limit entity-mini\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.reachedPageLimit\\\"],[[\\\"count\\\"],[[28,[\\\"remainingResults\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-page/template.hbs\"}});","import Ember from 'ember';\n\nconst SearchResultContextComponent = Ember.Component.extend({\n    classNameBindings: ['searchResultContextVisible:search-result-context-area'],\n    searchResultContextVisible: false,\n\n    _scrollToPreviousTop(messages, $messagePane, $lastMessage) {\n        if (messages.length > 0) {\n            Ember.run.scheduleOnce('afterRender', null, () => {\n                let targetHeight =\n                    $lastMessage.position().top - $lastMessage.height() - this.$('.history-bar').outerHeight();\n                $messagePane.animate({ scrollTop: targetHeight });\n            });\n        }\n    },\n\n    closeOnContextSwitch: Ember.observer('chatService.activeRoom', function () {\n        this.send('close');\n    }),\n\n    actions: {\n        close() {\n            this.attrs.close();\n        },\n\n        replyToMessage(message) {\n            this.attrs.close();\n            this.attrs.replyToMessage(message);\n        },\n\n        loadHistoryAfterLast() {\n            const promise = this.attrs.loadMoreHistoryAfter(this.get('historyRoom'));\n            promise.then(messages => messages);\n        },\n\n        loadHistoryBeforeFirst() {\n            let $messagePane = this.$('.search-result-context-messages');\n            let $lastMessage = this.$('.search-result-context .chat-message').first();\n            const promise = this.attrs.loadMoreHistoryBefore(this.get('historyRoom'));\n            promise.then(messages => {\n                this._scrollToPreviousTop(messages, $messagePane, $lastMessage);\n                return messages;\n            });\n        }\n    }\n});\n\nexport default SearchResultContextComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Z/9pIjDO\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"close\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"chat.history\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-messages\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],false,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryBeforeFirst\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/messages\\\"],null,[[\\\"room\\\",\\\"replyToMessage\\\",\\\"isMediaCollapsed\\\",\\\"openMentionWarning\\\"],[[28,[\\\"historyRoom\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"replyToMessage\\\"],null],true,[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"openMentionWarning\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryAfterLast\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-result-context/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['sms-message-icon'],\n    classNameBindings: ['subMessageTypeClass'],\n\n    subMessageTypeClass: computed('subMessageType', function () {\n        return `sms-message-type-${this.get('subMessageType')}`;\n    }),\n\n    subMessageType: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"swD2LZfy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"line\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"line-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"facebook\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"facebook-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"twitter\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"twitter\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"viber\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"viber\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"wechat\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"wechat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"telegram\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"telegram\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"whatsapp\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"whatsapp\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"webmessaging\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"chat-multi\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"open\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"comment-ellipsis\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"sms\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/sms-message-icon/template.hbs\"}});","define(\"connections-ui/components/station-disassociate-link/component\", [\"exports\", \"ember-purecloud-components/components/station-disassociate-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"kFbO6UNm\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tags-input-label\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"tags-input__tag\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-truncate-beta\\\",{\\\"attrs\\\":[[15,\\\"max-lines\\\",\\\"1\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/tags-input/label/template.hbs\"}});","define(\"connections-ui/components/telephone-input/component\", [\"exports\", \"ember-purecloud-components/components/telephone-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-dialog\", [\"exports\", \"ember-modal-dialog/components/deprecated-tether-dialog\"], function (_exports, _deprecatedTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deprecatedTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-component\", [\"exports\", \"ember-tooltips/components/tether-popover-on-component\"], function (_exports, _tetherPopoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-element\", [\"exports\", \"ember-tooltips/components/tether-popover-on-element\"], function (_exports, _tetherPopoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-component\"], function (_exports, _tetherTooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-element\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-element\"], function (_exports, _tetherTooltipOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnElement.default;\n    }\n  });\n});\n","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport moment from 'connections-ui/utils/dates';\nimport layout from './template';\n\nconst MINUTE = 1000 * 60;\nconst HOUR = MINUTE * 60;\nconst DAY = HOUR * 24;\n\nexport default Component.extend({\n    classNames: ['time-elapsed'],\n    tagName: 'span',\n    layout,\n\n    clock: service(),\n    intl: service(),\n\n    timeSince: null,\n\n    _calculateElapsedTime(durationInMs) {\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n\n        const duration = moment.duration(durationInMs);\n        const days = duration.asDays();\n        const hours = duration.hours();\n        const minutes = duration.minutes();\n\n        if (days) {\n            if (hours) {\n                return this.get('intl').t('components.timeElapsed.detail.daysHours', {\n                    days: days,\n                    hours: hours\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.days', {\n                days: days\n            });\n        } else if (hours) {\n            if (minutes) {\n                return this.get('intl').t('components.timeElapsed.detail.hoursMinutes', {\n                    hours: hours,\n                    minutes: minutes\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.hours', {\n                hours: hours\n            });\n        }\n\n        return this.get('intl').t('components.timeElapsed.detail.minutes', {\n            minutes: minutes || '0'\n        });\n    },\n\n    _formatDuration: function () {\n        const timeSince = this.get('timeSince');\n        const msSince = moment().diff(moment(timeSince));\n        let unit, cnt;\n\n        if (msSince > DAY) {\n            unit = 'days';\n        } else if (msSince > HOUR) {\n            unit = 'hours';\n        } else if (msSince > MINUTE) {\n            unit = 'minutes';\n        } else {\n            return this.get('intl').t('components.timeElapsed.now');\n        }\n\n        cnt = moment().diff(moment(timeSince), unit);\n\n        if (cnt < 2) {\n            return this.get('intl').t(`components.timeElapsed.singular.${unit}`);\n        }\n\n        return this.get('intl').t(`components.timeElapsed.plural.${unit}`, { count: cnt });\n    },\n\n    tickingDuration: computed('timeSince', 'clock.second', function () {\n        return this._formatDuration();\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"fP6V7Isp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[13],[1,[26,[\\\"tickingDuration\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-elapsed/template.hbs\"}});","import Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst CLOCK_MODE_DURATION = 10000;\n\nexport default Ember.Component.extend({\n    classNames: 'time-machine-confirmation',\n\n    // Expose attrs as direct properties for modern Ember\n    cancel: Ember.computed.reads('attrs.cancel'),\n    confirm: Ember.computed.reads('attrs.confirm'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('primaryDirection', Math.random() < 0.5 ? 1 : -1);\n        this.set('minuteDirection', this.get('primaryDirection') * -1);\n        // Set to undefined to init the clock with the current time and tick as normal\n        this.set('_clockStandardMode', true);\n        this.set('randomTime', undefined);\n    },\n\n    willDestroyElement() {\n        let timer = this.get('_updInterval');\n        if (timer) {\n            Ember.run.cancel(timer);\n            this.set('_updInterval', null);\n        }\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n    },\n\n    escapedBuildTag: Ember.computed('buildTag', function () {\n        let result = '';\n\n        let rawBuildTag = this.get('buildTag');\n        if (typeof rawBuildTag === 'string' && Ember.isPresent(rawBuildTag)) {\n            result = Ember.Handlebars.Utils.escapeExpression(rawBuildTag);\n        }\n\n        return result;\n    }),\n\n    updRandTime() {\n        if (this.get('_clockStandardMode')) {\n            this.set('_clockStandardMode', false);\n            this.set('_randomModeStart', Date.now());\n        } else if (Date.now() - this.get('_randomModeStart') > CLOCK_MODE_DURATION) {\n            this.set('_clockStandardMode', true);\n            this.set('randomTime', undefined);\n            this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n            return;\n        }\n\n        let currTime = moment(this.get('randomTime'));\n\n        try {\n            let currMinutes = currTime.get('minutes');\n            let currBin = Math.floor(currMinutes / 5);\n            currTime.add(5 * this.get('minuteDirection'), 'minutes');\n            currTime.add(10 * this.get('primaryDirection'), 'seconds');\n            let nextMinutes = currTime.get('minutes');\n            let nextBin = Math.floor(nextMinutes / 5);\n\n            let hourMultiplier = 1;\n            if (Math.abs(nextBin - currBin) === 11) {\n                // Prevents jitter caused by minutes rolling hours\n                hourMultiplier++;\n            }\n            currTime.add(hourMultiplier * this.get('primaryDirection'), 'hours');\n\n            if (isNaN(currTime) || !currTime.isValid()) {\n                // Protect against overflow\n                currTime = moment();\n            }\n        } catch (e) {\n            currTime = moment();\n        }\n\n        this.set('randomTime', currTime);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', 100));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"14qtFvIN\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"attachment\\\",\\\"targetAttachment\\\",\\\"translucentOverlay\\\",\\\"overlay-class\\\",\\\"container-class\\\",\\\"destinationElementId\\\"],[\\\"top center\\\",\\\"top center\\\",true,\\\"dark\\\",\\\"modal-dialog time-machine-confirm-dialog\\\",\\\"modal-overlays\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"header\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"analog-clock\\\"],null,[[\\\"class\\\",\\\"showSecondHand\\\",\\\"staticMoment\\\"],[\\\"random-clock\\\",true,[28,[\\\"randomTime\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"h1\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"timemachine.title\\\"],null],false],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close cancel-time-machine-nav\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"intended-destination\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.intendedDestination\\\"],[[\\\"buildNumber\\\"],[[28,[\\\"escapedBuildTag\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"disclaimer\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.disclaimer\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"actions\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default confirm-time-machine-nav\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.confirm.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extra-links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"https://www.genesys.com/company/careers\\\"],[15,\\\"class\\\",\\\"hiring-link\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.hiring\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-machine-confirmation/template.hbs\"}});","define(\"connections-ui/components/toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tooltip-on-component\"], function (_exports, _tooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tooltipOnComponent.default;\n    }\n  });\n});\n","import config from '../config/environment';\nimport TooltipOnElement from 'ember-tooltips/components/tooltip-on-element';\n\nlet _didUpdateTimeoutLength = config.environment === 'test' ? 0 : 1000;\n\nexport default TooltipOnElement.extend({ _didUpdateTimeoutLength });\n","/* global File */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nimport PromiseLoadingMixin from 'connections-ui/mixins/promise-loading';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\n\nimport FileAPI from 'fileapi';\nimport { uploadImageUrl } from './helpers';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, observer } = Ember;\nconst webcamWidth = 640;\nconst webcamHeight = 480;\n\nexport default Ember.Component.extend(PromiseLoadingMixin, AutoSaveDevicesMixin, {\n    classNames: ['upload-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    fileUpload: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    currentFile: null,\n    currentFileInfo: null,\n    currentCoords: null,\n    currentXHR: null,\n    currentImageId: null,\n\n    selectedCamera: null,\n    cameraPending: false,\n    cameraError: false,\n    startingMedia: false,\n\n    imageUrl: null,\n    imageUrlData: null,\n    uploadingImageUrl: false,\n\n    attrs: {\n        confirm() {},\n\n        upload: null,\n        autoTakePicture: false,\n\n        entity: null,\n        uploadType: null\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.send('cancelCamera');\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n    },\n\n    actions: {\n        uploadError() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('cameraError'));\n            }\n        },\n\n        uploadImage() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('currentFile'));\n                return;\n            }\n\n            let file = this.get('currentFile');\n            let promise;\n\n            if (this.get('uploadingImageUrl')) {\n                promise = Ember.RSVP.resolve(this.get('imageUrlData'));\n            } else {\n                promise = this.upload(file);\n            }\n\n            let coords = this.get('currentCoords');\n            let left = coords.x + (coords.x2 - coords.x) / 2 - 21;\n            let top = coords.y + (coords.y2 - coords.y) / 2 - 21;\n            const entityType = Ember.get(this, 'attrs.entity.value.type');\n\n            if (entityType === 'group') {\n                // using the public api group image requests we don't need to worry\n                // about linking an image.\n                promise\n                    .then(result => {\n                        // set image Id\n                        this.set('currentImageId', result.id);\n                        return;\n                    })\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const groupId = this.get('entity').guid;\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for group ${groupId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            } else {\n                const userId = this.get('entity').id;\n                promise\n                    .then(this.get('entity').reload())\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for user ${userId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            }\n\n            this.addIndicatorForPromise(promise, `#${this.get('elementId')} .image`);\n            this.$('.loading-indicator i').css({ top, left });\n        },\n\n        uploadImageUrl() {\n            let application = this.get('application');\n            let imageUrl = this.get('imageUrl');\n\n            if (!imageUrl) {\n                return;\n            }\n\n            this.set('uploadingImageUrl', true);\n\n            uploadImageUrl(application, imageUrl)\n                .then(data => {\n                    this.set('imageUrlData', data);\n\n                    this.displayImage(data);\n                    this.setupFileFromUrl();\n                })\n                .catch(err => {\n                    const intl = this.get('intl');\n\n                    const groupId = this.get('entity').guid;\n                    const orgId = this.get('entity').orgId;\n                    this.get('logger').error(`upload ImageUrl failed for group ${groupId} of organization ${orgId}`, {\n                        error: err\n                    });\n\n                    this.get('notification').error(\n                        intl.t('notification.titles.profileSaveError').toString(),\n                        intl.t('notification.fieldSection.error').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'image-upload'\n                        }\n                    );\n\n                    this.set('uploadingImageUrl', false);\n                    this.set('imageUrl', '');\n                });\n        },\n\n        clearImage() {\n            this.$('.image').empty();\n\n            this.set('currentFile', null);\n            this.set('currentFileInfo', null);\n            this.set('currentFileCoords', null);\n            this.set('currentImageId', null);\n\n            this.set('uploadingImageUrl', false);\n\n            Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n        },\n\n        startCamera() {\n            if (this.get('startingMedia')) {\n                return;\n            }\n\n            this.send('cancelCamera');\n            this.set('startingMedia', true);\n            this.set('cameraPending', true);\n\n            let options = {\n                audio: false,\n                video: true\n            };\n            return navigator.mediaDevices\n                .getUserMedia(options)\n                .then(stream => {\n                    this.set('cameraStream', stream);\n                    this.attachMediaStream(stream, this.$('.camera-preview')[0], {\n                        muted: true,\n                        mirror: true\n                    });\n                    this.set('startingMedia', false);\n                    if (this.get('autoTakePicture')) {\n                        this.send('takePicture');\n                    }\n                })\n                .catch(err => {\n                    this.set('cameraError', this.get('intl').lookup(`images.error.${err.name}`).toString());\n                    if (this.get('autoTakePicture')) {\n                        this.send('uploadError');\n                    }\n                });\n        },\n\n        takePicture() {\n            this.set('countdown', true);\n            Ember.run.later(() => {\n                let video = this.$('video')[0];\n                this.set('countdown', false);\n                let canvas = document.createElement('canvas');\n                canvas.width = video.videoWidth;\n                canvas.height = video.videoHeight;\n                let ctx = canvas.getContext('2d');\n                ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n                //convert to desired file format\n                let dataUrl = canvas.toDataURL('image/jpeg');\n                let asBlob = window.dataURLtoBlob(dataUrl);\n                let pictureInfo = { width: webcamWidth, height: webcamHeight, type: 'image/jpeg' };\n\n                let fileName = 'webcam';\n                if (this.get('autoTakePicture')) {\n                    fileName = this.get('intl').lookup('chat.commands.selfie.command').toString();\n                }\n\n                let asFile = new File([asBlob], `${fileName}.jpeg`, pictureInfo);\n                this.onTookPicture(dataUrl, asFile, pictureInfo);\n                this.send('cancelCamera');\n            }, 3000);\n        },\n\n        cancelCamera() {\n            let cameraStream = this.get('cameraStream');\n            try {\n                if (cameraStream && cameraStream.getTracks) {\n                    cameraStream.getTracks().forEach(track => {\n                        track.stop();\n                    });\n                }\n            } catch (e) {\n                const groupId = this.get('entity').guid;\n                const orgId = this.get('entity').orgId;\n                this.get('logger').error(`Error stopping camera stream for group ${groupId} of organization ${orgId}`, {\n                    error: e\n                });\n            }\n            this.set('cameraPending', false);\n            this.set('cameraStream', null);\n        }\n    },\n\n    switchCamera: observer('selectedCamera', function () {\n        if (this.get('cameraPending')) {\n            this.send('startCamera');\n            this.get('webrtc').updateDefaultDevices({\n                camera: this.get('selectedCamera')\n            });\n        }\n    }),\n\n    canUseCamera: computed('webrtc.hasCamera', function () {\n        return (\n            this.get('webrtc.hasCamera') &&\n            (window.navigator.getUserMedia ||\n                (window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia))\n        );\n    }),\n\n    init() {\n        this._super(...arguments);\n        // Calling enumerateDevices will conduct translation PCM-316\n        this.get('webrtc').enumerateDevices();\n        if (this.get('autoTakePicture')) {\n            this.send('startCamera');\n        }\n    },\n\n    getImageDataFromXhr(xhr) {\n        if (xhr) {\n            if (typeof xhr.responseText === 'string') {\n                return JSON.parse(xhr.responseText);\n            } else if (typeof xhr.responseText === 'object') {\n                return xhr.responseText;\n            } else if (typeof xhr === 'string') {\n                return JSON.parse(xhr);\n            }\n        }\n        return xhr;\n    },\n\n    initCrop() {\n        let aspectRatio = 1;\n        let size = this.get('currentFileInfo.height');\n        let type = this.get('entity.type');\n        let uploadType = this.get('uploadType');\n\n        if (type === 'floor' || uploadType === 'informal') {\n            aspectRatio = null;\n        }\n\n        if (this.get('currentFileInfo').width <= this.get('currentFileInfo').height) {\n            size = this.get('currentFileInfo').width;\n        }\n        this.$('img').Jcrop({\n            onSelect: this.handleCropChange.bind(this),\n            onChange: this.handleCropChange.bind(this),\n            aspectRatio: aspectRatio, // TODO: get this ratio from field config.\n            setSelect: [0, 0, size, size]\n        });\n    },\n\n    showPictures() {\n        const entity = this.get('entity');\n        if (!entity) {\n            throw new Error('Missing entity for component');\n        }\n\n        if (entity.get('type') === 'group') {\n            /*\n               https://github.com/emberjs/data/issues/3704\n               I hit what I believe is an ember-data 2.16 bug where the store was not being\n               updated after a findRecord request (even with reload: true specified).\n               As a result we make the request ourselves and update the store.\n            */\n            const store = this.get('store');\n            let serializer = store.serializerFor('group');\n            let model = store.modelFor('group');\n            let adapter = store.adapterFor('group');\n\n            const url = adapter.urlForFindRecord(entity.id);\n            const fieldsObj = { fl: '*' };\n            const data = Object.assign({}, data, fieldsObj);\n\n            const traditional = true;\n\n            this.get('ajax')\n                .request(url, { method: 'GET', data, traditional })\n                .then(result => {\n                    const santizedResult = serializer.normalizeSingleResponse(\n                        store,\n                        model,\n                        result,\n                        entity.id,\n                        'findRecord'\n                    );\n                    entity.set('version', santizedResult.data.attributes.version);\n                    entity.set('images', santizedResult.data.attributes.images);\n                    this.attrs.confirm();\n                });\n        } else {\n            entity.reload().then(() => {\n                this.attrs.confirm();\n            });\n        }\n    },\n\n    handleCropChange(coords) {\n        if (coords.x === coords.x2 && coords.y === coords.y2) {\n            let ratio = this.get('currentFileInfo.ratio');\n            coords = {\n                x: 0,\n                y: 0,\n                x2: this.get('currentFileInfo.width') * ratio,\n                y2: this.get('currentFileInfo.height') * ratio\n            };\n        }\n\n        this.set('currentCoords', coords);\n    },\n\n    displayImage(xhr) {\n        let data = this.getImageDataFromXhr(xhr);\n        let container = this.$('div.image');\n\n        let width = container.width();\n        let ratio = width / data.dimensions.x;\n        let height = data.dimensions.y * ratio;\n\n        let image = $(`<img src=\"${data.url}\" />`).css({ width: width, height: height });\n        container.html(image);\n\n        let currentFileInfo = this.get('currentFileInfo');\n        if (_.isEmpty(currentFileInfo) || !currentFileInfo.ratio) {\n            if (!width) {\n                width = 100;\n            }\n\n            if (!height) {\n                height = 100;\n            }\n\n            let fileInfo = {\n                ratio: ratio,\n                width,\n                height\n            };\n\n            this.set('currentFileInfo', fileInfo);\n        }\n\n        return xhr;\n    },\n\n    setupFileFromUrl() {\n        let container = this.$('div.image');\n        let $image = this.$('div.image img');\n        let image = $image[0];\n        let currentFile = FileAPI.Image(image);\n        this.set('currentFile', currentFile);\n\n        $image.on('load', () => {\n            Ember.run(() => {\n                let ratio = container.width() / image.naturalWidth;\n                let width = container.width();\n                let height = image.naturalHeight * ratio;\n                this.set('currentFileInfo', {\n                    ratio,\n                    width: image.naturalWidth,\n                    height: image.naturalHeight\n                });\n                $image.width(width);\n                $image.height(height);\n\n                this.initCrop();\n            });\n        });\n    },\n\n    upload(file) {\n        const entityType = this.attrs.entity.value.get('type');\n\n        let uploadType = this.get('uploadType');\n        let imageCategory = uploadType === 'informal' ? 'gallery' : 'profile';\n        const coords = this.get('currentCoords');\n        const displaywidth = this.$('img').width();\n        const cropProportion = file.name === 'webcam.jpeg' ? webcamWidth / displaywidth : file.width / displaywidth; // webcam files are always 640 * 480\n\n        if (entityType === 'group') {\n            const gId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                groupImageType: imageCategory\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'groupImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/groups/${gId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        } else {\n            const uId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                userImageType: uploadType\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'userImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/users/${uId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        }\n    },\n\n    onTookPicture(dataUri, file) {\n        this.set('currentFile', file);\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const container = this.$('div.image');\n            const width = container.width();\n\n            let image = $(`<img src=\"${dataUri}\" />`);\n            container.html(image);\n            image.width(width);\n\n            image.one('load', () => {\n                const width = image.width();\n                const ratio = width / image[0].naturalWidth;\n                this.set('currentFileInfo', {\n                    width: width,\n                    height: image.height(),\n                    ratio\n                });\n\n                this.initCrop();\n            });\n\n            if (this.get('autoTakePicture')) {\n                this.send('uploadImage');\n            }\n        });\n    },\n\n    onChange(file) {\n        let container = this.$('div.image');\n\n        if (/^image/.test(file.type)) {\n            FileAPI.getInfo(file, (err, info) => {\n                this.handleFileInfo(err, info, file);\n            });\n        } else {\n            if (file) {\n                container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n            }\n\n            FileAPI.reset(event.currentTarget);\n        }\n    },\n\n    handleFileInfo(err, info, file) {\n        let container = this.$('div.image');\n        if (!err) {\n            let image = FileAPI.Image(file);\n\n            let ratio = container.width() / info.width;\n\n            this.set('currentFile', file);\n            this.set('currentFileInfo', info);\n            this.set('currentFileInfo.ratio', ratio);\n\n            let width = container.width();\n            let height = info.height * ratio;\n\n            image.preview(width, height).get((err, img) => {\n                if (width && height) {\n                    let uri = img.toDataURL();\n                    let image = $(`<img src=\"${uri}\" />`);\n                    container.html(image);\n\n                    this.initCrop();\n                }\n            });\n        } else {\n            container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n        }\n        FileAPI.reset(event.currentTarget);\n    },\n\n    createDropZone: function () {\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n        const dropzone = new window.Dropzone(`#${this.get('elementId')} .dropzone`, {\n            acceptedFiles: 'image/*',\n            url: '/file/post',\n            uploadMultiple: false,\n            maxFiles: 1,\n            clickable: '.browse',\n            autoProcessQueue: false,\n            addRemoveLinks: true,\n            maxFilesize: 10,\n            dictInvalidFileType: this.get('intl').t('images.genericFileTypeMessage').toString(),\n            dictRemoveFile: this.get('intl').t('common.remove').toString(),\n            dictFileTooBig: this.get('intl').t('images.fileTooLarge').toString(),\n            dictCancelUpload: this.get('intl').t('images.cancelUpload').toString(),\n            dictUploadCanceled: this.get('intl').t('images.uploadCanceled').toString()\n        });\n\n        dropzone.on('thumbnail', file => {\n            Ember.run(() => this.onChange(file));\n        });\n\n        dropzone.on('addedfile', function () {\n            Ember.run(() => {\n                if (this.files.length > 1) {\n                    this.removeFile(this.files[0]);\n                }\n            });\n        });\n        this.set('dropzone', dropzone);\n    },\n\n    attachMediaStream: function (stream, element, options) {\n        const opts = {\n            autoplay: true,\n            mirror: false,\n            muted: false,\n            audio: false,\n            disableContextMenu: false\n        };\n\n        if (options) {\n            Object.keys(options).forEach(key => {\n                opts[key] = options[key];\n            });\n        }\n\n        if (opts.disableContextMenu) {\n            element.oncontextmenu = function (e) {\n                e.preventDefault();\n            };\n        }\n\n        if (opts.autoplay) element.autoplay = 'autoplay';\n        element.muted = !!opts.muted;\n        if (!opts.audio) {\n            ['', 'moz', 'webkit', 'o', 'ms'].forEach(function (prefix) {\n                const styleName = prefix ? prefix + 'Transform' : 'transform';\n                element.style[styleName] = opts.mirror ? 'scaleX(-1)' : 'scaleX(1)';\n            });\n        }\n\n        if (BrowserUtils.isSafari) {\n            element.setAttribute('playsinline', true);\n        }\n\n        element.srcObject = stream;\n        return element;\n    }\n});\n","import ajax from 'ember-ajax';\n\nexport function uploadImageUrl(application, url) {\n    let formData = new window.FormData();\n    formData.append('imageUrl', url);\n    return ajax(application.uri('api/v2/images'), {\n        method: 'post',\n        data: formData,\n        contentType: false,\n        processData: false\n    });\n}\n","export default Ember.HTMLBars.template({\"id\":\"K6YT0VqB\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"uploads \\\",[33,[\\\"if\\\"],[[28,[\\\"autoTakePicture\\\"]],\\\"hide\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]],\\\"have-file\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary upload-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-danger clear-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.clearImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"webrtc\\\",\\\"hasCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-block camera-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-with-icon\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"camera-select\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"webrtcDevices.videoSource\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"class\\\",\\\"aria-label\\\"],[\\\"camera-select\\\",[28,[\\\"selectedCamera\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"selectedCamera\\\"]]],null]],null],\\\"form-control with-icon\\\",\\\"{{t \\\\\\\"webrtcDevices.videoSource\\\\\\\"}}\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"webrtc\\\",\\\"cameraList\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"camera\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"camera\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"camera\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-video select-icon\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary take-picture-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"takePicture\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dropzone\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dz-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"glyphicon glyphicon-cloud-upload\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.drop\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"browse\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"images.browseFile\\\"],null],false],[0,\\\".\\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picture-options\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canUseCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-default take-picture-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startCamera\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"camera \\\",[33,[\\\"unless\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cameraError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"h4\\\",[]],[13],[1,[26,[\\\"cameraError\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[11,\\\"video\\\",[]],[15,\\\"class\\\",\\\"camera-preview\\\"],[15,\\\"mute\\\",\\\"true\\\"],[15,\\\"autoplay\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"countdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-3\\\"],[13],[0,\\\"3\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-2\\\"],[13],[0,\\\"2\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-1\\\"],[13],[0,\\\"1\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/upload-picture/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nlet profilePaths = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nexport default Ember.Component.extend(LoggerMixin, {\n    classNames: ['uploaded-image'],\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    image: null,\n    entity: null,\n    size: '128',\n    labelKey: '',\n    editingCaption: false,\n    canAddCaption: false,\n\n    type: 'profile',\n\n    attrs: {\n        select() {},\n        delete() {},\n\n        editing: false,\n        canEdit: false,\n        showingInformal: false\n    },\n\n    actions: {\n        selectUploadedImage(event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n\n            let selectUploadedImage = this.attrs.select;\n\n            if (this.get('editing') && this.get('canEdit') && this.get('type') === 'profile') {\n                selectUploadedImage(type, image, active);\n            } else {\n                let current = this.get('currentInformal');\n                if (current !== this.get('image')) {\n                    this.set('currentInformal', this.get('image'));\n                    this.showImage(image, type);\n                } else {\n                    this.set('currentInformal', null);\n                }\n            }\n        },\n        deleteUploadedImage(event) {\n            //action executed on click, kb Space, kb Enter\n            if (event) {\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n            let deleteUploadedImage = this.attrs.delete;\n\n            if (this.get('canDelete')) {\n                const entityType = Ember.get(this, 'entity.type');\n\n                if (entityType === 'group' || entityType === 'person') {\n                    const id = Ember.get(this, 'entity.id');\n                    const imageId = Ember.get(this, 'image._id');\n                    const url =\n                        entityType === 'group'\n                            ? `api/v2/groups/${id}/images/${imageId}`\n                            : `api/v2/users/${id}/images/${imageId}`;\n\n                    return this.get('ajax')\n                        .delete(Ember.get(this, 'application').pcV2Uri(url))\n                        .then(() => {\n                            deleteUploadedImage(type, image, false);\n                            return;\n                        })\n                        .catch(err => {\n                            const intl = this.get('intl');\n\n                            this.logger.error('failed to upload image', { error: err });\n\n                            this.get('notification').error(\n                                intl.lookup('notification.titles.profileSaveError').toString(),\n                                intl.lookup('notification.fieldSection.error').toString(),\n                                {\n                                    forceBrowserNotification: true,\n                                    tag: 'image-upload'\n                                }\n                            );\n                            return;\n                        });\n                } else {\n                    this.get('delete')(type, image, active);\n                }\n            }\n        }\n    },\n\n    addCaption() {\n        this.set('openCaption', this);\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            this.$('.caption textarea').focus();\n        });\n    },\n\n    saveCaption() {\n        this.set('openCaption', null);\n\n        let imageList = this.get('entity').getFieldValue('images.informal');\n        let image = imageList.findBy('_id', this.get('image._id'));\n\n        Ember.set(image, 'labelKey', this.get('labelKey'));\n        this.get('entity').save();\n    },\n\n    initCaption: Ember.on('init', function () {\n        this.set('canAddCaption', this.get('type') === 'informal' && this.get('entity.type') === 'person');\n        this.set('labelKey', this.get('image.labelKey'));\n    }),\n\n    ownImage: Ember.computed('entity', 'entity.id', function () {\n        if (!this.get('canEdit')) {\n            return false;\n        }\n\n        let isPerson = this.get('entity.id') === this.get('session.person.id');\n        let isGroupOwner = false;\n\n        if (this.get('entity.type') === 'group') {\n            let owners = this.get('entity').getFieldValue('owners.owners') || [];\n            isGroupOwner = _.find(owners, owner => {\n                return owner.value === this.get('session.person.id');\n            });\n        }\n\n        return isPerson || isGroupOwner;\n    }),\n\n    closeCaption: Ember.observer('openCaption', function () {\n        if (this.get('openCaption') !== this) {\n            this.set('editingCaption', false);\n        } else {\n            this.set('editingCaption', true);\n        }\n    }),\n\n    canDelete: Ember.computed('entity.uploadedProfilePictures.length', function () {\n        const entityType = this.get('entity.type');\n        if (entityType === 'group') {\n            let isEditing = this.get('editing');\n            return isEditing;\n        }\n\n        let type = this.get('type') === 'informal';\n        let populated = this.get('entity.uploadedProfilePictures.length') !== 1;\n        let isEditing = this.get('editing');\n        return (type || populated) && isEditing;\n    }),\n\n    src: Ember.computed('image', 'entity', 'size', function () {\n        let image = this.get('image.value');\n        let size = `x${this.get('size')}`;\n\n        if (image) {\n            return image[size];\n        }\n\n        return '';\n    }),\n\n    isActive: Ember.computed('image', 'entity', 'entity.profilePicture', function () {\n        let image = this.get('image');\n        let type = this.get('type');\n        let imagePath = profilePaths[this.get('entity.type')];\n\n        if (type === 'profile') {\n            let currentImage = this.get('entity').getReferencedField(imagePath);\n\n            if (!_.isEmpty(currentImage)) {\n                return image._id === currentImage._id;\n            }\n        }\n\n        return false;\n    }),\n\n    showImage: function (/*image, type*/) {\n        this.bubbleAction({\n            action: 'viewLightGallery',\n            actionContext: [this.get('image')]\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kplgeCU/\",\"block\":\"{\\\"statements\\\":[[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"class\\\",[34,[\\\"clickable \\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],\\\"active\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"can-edit\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],[33,[\\\"concat\\\"],[[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],\\\" (selected)\\\"],null],[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"src\\\",[26,[\\\"src\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"]],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"delete \\\",[33,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]],\\\"informal-delete\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-close-circled\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editingCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"classNames\\\",\\\"value\\\",\\\"aria-label\\\"],[\\\"form-control\\\",[28,[\\\"labelKey\\\"]],[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.save\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"saveCaption\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption clickable\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"addCaption\\\",[28,[\\\"image\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption own-caption\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"edit\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-edit\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showingInformal\\\"]],[28,[\\\"labelKey\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption\\\"],[16,\\\"title\\\",[26,[\\\"labelKey\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/uploaded-image/template.hbs\"}});","define(\"connections-ui/components/vertical-collection\", [\"exports\", \"smoke-and-mirrors/components/vertical-collection\"], function (_exports, _verticalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalCollection.default;\n    }\n  });\n});\n","define(\"connections-ui/components/vertical-item\", [\"exports\", \"smoke-and-mirrors/components/vertical-item\"], function (_exports, _verticalItem) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalItem.default;\n    }\n  });\n});\n","define(\"connections-ui/components/volume-input/component\", [\"exports\", \"ember-purecloud-components/components/volume-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-debug-modal/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-debug-modal/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-issues/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-issues/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-settings/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-settings/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls\", [\"exports\", \"ember-wrap-urls/components/wrap-urls\"], function (_exports, _wrapUrls) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _wrapUrls.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/link\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/link\"], function (_exports, _link) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _link.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/url\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/url\"], function (_exports, _url) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _url.default;\n    }\n  });\n});\n","import XOption from 'emberx-select/components/x-option';\nexport default XOption;\n","import XSelect from 'emberx-select/components/x-select';\nexport default XSelect;\n","import require from 'require';\nimport environment from './environment';\n\nconst modulePrefix = environment.modulePrefix;\nconst metaName = `${modulePrefix}/config/asset-manifest`;\nconst nodeName = `${modulePrefix}/config/node-asset-manifest`;\n\nlet config = {};\n\ntry {\n  // If we have a Node version of the asset manifest, use that for FastBoot and\n  // similar environments.\n  if (require.has(nodeName)) {\n    config = require(nodeName).default; // eslint-disable-line\n  } else {\n    const rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n    config = JSON.parse(unescape(rawConfig));\n  }\n} catch(err) {\n  throw new Error('Failed to load asset manifest. For browser environments, verify the meta tag with name \"'+ metaName +\n    '\" is present. For non-browser environments, verify that you included the node-asset-manifest module.');\n}\n\nexport default config;\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['path'],\n    path: ''\n});\n","import Ember from 'ember';\n\nconst isNonEmptyStringQueryParam = paramStr => {\n    return (\n        typeof paramStr === 'string' &&\n        !Ember.isBlank(paramStr) &&\n        // Handles 'https://wikipedia.org/?param' case.\n        // Ember parses as the literal string 'true'\n        paramStr !== 'true'\n    );\n};\n\nexport default Ember.Controller.extend({\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    appsService: Ember.inject.service('apps'),\n    webrtc: Ember.inject.service('webrtc'),\n\n    queryParams: ['mobile', 'panels', 'initialPanel'],\n    panels: null,\n    initialPanel: null,\n\n    updateCurrentRouteName: Ember.observer('currentRouteName', function () {\n        Ember.run.once(this, this.set, 'application.currentRouteName', this.get('currentRouteName'));\n    }),\n\n    panelsOverrideObject: Ember.computed('panels', 'initialPanel', function () {\n        const panelsOverrideObject = {};\n        const panelsOverride = this.get('panels');\n        const initialPanelOverride = this.get('initialPanel');\n        if (isNonEmptyStringQueryParam(panelsOverride)) {\n            panelsOverrideObject.panelsOverride = panelsOverride.split(',');\n        } else if (panelsOverride === '') {\n            panelsOverrideObject.panelsOverride = [];\n        }\n        if (isNonEmptyStringQueryParam(initialPanelOverride)) {\n            panelsOverrideObject.initialPanelOverride = initialPanelOverride;\n        }\n        return panelsOverrideObject;\n    }),\n\n    actions: {\n        reportError(notification) {\n            if (notification) {\n                notification.hide();\n            }\n\n            this.transitionToRoute('feedback');\n        },\n\n        openPreferencesModal() {\n            this.get('settings').open();\n        }\n    }\n});\n","define(\"connections-ui/controllers/array\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.reads('model'),\n\n    currentPerson: null,\n\n    actions: {\n        setCurrentPerson(person) {\n            this.set('currentPerson', person);\n        }\n    }\n});\n","import Ember from 'ember';\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    permissions: Ember.inject.service()\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    chat: Ember.inject.service(),\n\n    managePresenceSubscriptions: Ember.observer('model.participantsVisible', function () {\n        const subscribeTo = this.get('model.participantsVisible') ? this.get('model.participants') : null;\n        return this.get('presenceSubscription').autoSubscribe(subscribeTo, this);\n    }),\n\n    actions: {\n        inviteUserToRoom(person) {\n            const room = this.get('model');\n            if (room.isOneToOneRoom()) {\n                return this.promoteToAdhocRoom(person);\n            } else {\n                return this.get('chat').inviteToRoom(room, person);\n            }\n        },\n\n        toggleParticipants() {\n            this.toggleProperty('model.participantsVisible');\n        },\n\n        collapseChat() {}\n    },\n\n    promoteToAdhocRoom(person) {\n        const chat = this.get('chat');\n        const oneToOneTarget = this.get('model.oneToOneTarget');\n        return chat.makeNewEmptyRoom().then(room => {\n            chat.inviteToRoom(room, oneToOneTarget);\n            return chat.inviteToRoom(room, person);\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nimport PersonModel from '../models/person';\n\nvar ContactsController = Ember.Controller.extend({\n    favoritesNameFilter: null,\n\n    personBinding: 'session.person',\n    isOnlyFavorite: false,\n    canSearch: false,\n\n    actions: {\n        removeFavorite: function (person) {\n            var path = this.get('applicationService').uri([\n                'api/v2/people',\n                this.get('person.id'),\n                'favorites',\n                person.get('id')\n            ]);\n\n            $.ajax({\n                url: path,\n                type: 'delete',\n                dataType: 'json'\n            }).then(() => {\n                this.get('person').reload();\n                this.get('filteredFavorites').removeObject(person);\n            });\n        },\n\n        addFavorite: function (person) {\n            this.get('filteredFavorites').addObject(person);\n        },\n\n        toggleFavorite: function (person, isFavorite) {\n            if (person.content) {\n                person = person.content;\n            }\n\n            if (isFavorite) {\n                this.send('addFavorite', person);\n            } else {\n                this.send('removeFavorite', person);\n            }\n        }\n    },\n\n    recents: Ember.computed('person', 'model', function () {\n        var apiEndpoint = PersonModel.apiEndpoint;\n        var url = `/api/${apiEndpoint}/${this.get('person.id')}/recents`;\n\n        var promise = new Ember.RSVP.Promise(function (resolve) {\n            $.getJSON(url, { idOnly: true }).then(function (data) {\n                resolve(data.res);\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    setLocalFavorites: Ember.observer('model', 'person', function () {\n        var favorites = this.get('model');\n        if (!_.isEmpty(favorites)) {\n            this.set('filteredFavorites', favorites);\n        }\n    }),\n\n    favoritesFilterChanged: Ember.observer('favoritesNameFilter', function () {\n        this.debouncedFavoritesFilterChanged();\n    }),\n\n    createDebouncedFavoritesFilterChanged: Ember.on('init', function () {\n        this.debouncedFavoritesFilterChanged = _.debounce(() => {\n            Ember.run(() => this._filterChanged());\n        }, 250);\n    }),\n\n    _filterChanged: function () {\n        var filter = this.get('favoritesNameFilter');\n        var favorites = this.get('model');\n\n        if (filter) {\n            var filtered = this.get('model').filter(function (person) {\n                return _.includes(person.get('name').toLowerCase(), filter.toLowerCase());\n            });\n\n            this.setFavorites(filtered);\n        } else {\n            this.setFavorites(favorites);\n        }\n    },\n\n    countFavorites: Ember.observer('filteredFavorites', 'person.favorites.content', 'view', function () {\n        try {\n            var list = this.get('filteredFavorites');\n            this.set('isOnlyFavorite', list.length === 1);\n        } catch (err) {\n            this.set('isOnlyFavorite', false);\n        }\n    }),\n\n    checkSearchVisibility: Ember.observer('filteredFavorites', 'person.favorites.content', function () {\n        var list = this.get('filteredFavorites');\n\n        if (list !== null && list !== undefined) {\n            var value = list.length > 0;\n            this.set('canSearch', value);\n        }\n    }),\n\n    setFavorites: function (favorites) {\n        this.set('filteredFavorites', favorites);\n    }\n});\n\nexport default ContactsController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar EngageController = Ember.Controller.extend(LoggerMixin, {\n    engageService: Ember.inject.service('engage'),\n\n    // Overridden to preserve hash query parameters.\n    transitionToRoute(route) {\n        window.location.hash = route;\n    },\n\n    // Overridden to preserve hash query parameters.\n    replaceRoute(route) {\n        const search = window.location.search;\n        window.location.replace(`${window.location.pathname}${search}#${route}`);\n    },\n\n    setEngageActive() {\n        this.set('engageService.route', this.get('model.engagePath'));\n        this.set('engageService.isEngageActive', true);\n    },\n\n    setEngageInactive() {\n        this.set('engageService.isEngageActive', false);\n    },\n\n    navigationEvent: Ember.observer('engageService.navigationRoute', function () {\n        const navRoute = this.get('engageService.navigationRoute');\n        if (navRoute) {\n            const route = engageRouteToCollaborateRoute(navRoute);\n            this.logger.debug('Transitioning to', route);\n            this.transitionToRoute(route); //see override above\n            this.set('engageService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: Ember.observer('engageService.redirectRoute', function () {\n        const route = engageRouteToCollaborateRoute(this.get('engageService.redirectRoute'));\n        this.replaceRoute(route); //see override above\n        this.logger.debug('Redirecting to', route);\n    })\n});\n\nfunction engageRouteToCollaborateRoute(route) {\n    // Content management routes live under their own top-level position in collaborate\n    let newRoute = route.replace(/^#contentManagement/, '/content-management');\n    // Everything else is mapped to the /engage/... routes\n    if (!/^\\/content-management/.test(newRoute)) {\n        newRoute = route.replace(/^#\\/?/, '/engage/');\n    }\n    return newRoute;\n}\n\nexport default EngageController;\n","import Ember from 'ember';\n\nconst { Controller } = Ember;\n\nexport default Controller.extend();\n","import Ember from 'ember';\n\nconst { Controller, computed, inject } = Ember;\n\ntype MaintenanceModeMessageKeys = {\n    titleKey: string;\n    descKey?: string;\n    actionKey: string;\n};\n\nconst MaintenanceController = Controller.extend({\n    intl: inject.service(),\n\n    hasDesc: false,\n\n    messageKeys: computed('model', function (): MaintenanceModeMessageKeys {\n        // Always return the same generic error in the maintenance page.\n        // Newrelic will still report the specific error.\n        return {\n            titleKey: 'unrecoverableAppFailure.unknownFailure.title',\n            descKey: 'unrecoverableAppFailure.unknownFailure.desc',\n            actionKey: 'unrecoverableAppFailure.unknownFailure.action'\n        };\n    })\n});\n\nexport default MaintenanceController;\n\n// DO NOT DELETE: This registers controllers by key with the Ember Container allowing TS to know the types of items in the container\ndeclare module '@ember/controller' {\n    interface Registry {\n        maintenance: typeof MaintenanceController;\n    }\n}\n","define(\"connections-ui/controllers/object\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.alias('model.person'),\n    embedded: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    queryParams: ['editing', 'editEmergencyLocation'],\n\n    editing: true,\n    editEmergencyLocation: false,\n    showMobile: false,\n    showDropdown: false,\n\n    loadingFieldSections: false,\n\n    editingProfile: computed.alias('editing'),\n    editingSection: false,\n\n    actions: {\n        toggleEditing() {\n            this.toggleProperty('editingProfile');\n        },\n\n        setEditingSection(value) {\n            this.set('editingSection', value);\n        },\n\n        showGridMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: true,\n                treeMode: false\n            });\n        },\n\n        showStackedMode() {\n            this.setProperties({\n                stackedMode: true,\n                gridMode: false,\n                treeMode: false\n            });\n        },\n\n        showTreeMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: false,\n                treeMode: true\n            });\n        },\n\n        toggleLeftRail() {\n            this.toggleProperty('showMobile');\n        },\n\n        noop() {}\n    },\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    onOwnProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    /**\n     * Observes query parameter changes and notifies the host application\n     */\n    queryParamObserver: Ember.observer('editing', 'editEmergencyLocation', function () {\n        Ember.run.debounce(this, this.syncQueryParamsWithHost, 100);\n    }),\n\n    /**\n     * Syncs current query parameters with the host application URL\n     */\n    syncQueryParamsWithHost() {\n        if (!this.get('embedded')) return;\n\n        if (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        ) {\n            return; // Do not navigate when embedded in the Users-UI.\n        }\n\n        const currentLocalHash = window.location.hash;\n        const currentHostHash = window.top.location.hash;\n        if (!currentLocalHash.startsWith('#/person')) return;\n\n        const updatedHostHash = currentLocalHash.replace(/person/, 'person-v2');\n\n        // Send navigation event to host application, if different from current\n        if (currentHostHash !== updatedHostHash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: updatedHostHash\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport { PUBLIC_ENVS } from '../utils/net';\n\nconst { Controller, inject } = Ember;\n\nexport default Controller.extend({\n    application: inject.service(),\n    intl: inject.service(),\n\n    desktopRegionId: null,\n\n    actions: {\n        chooseRegion() {\n            const context = this.get('application.hostedContext');\n            if (context.isHosted()) {\n                context.sendRegionToDesktop(this.get('desktopRegionId'));\n            }\n        }\n    },\n\n    init: function () {\n        this._super(...arguments);\n\n        // Set Initial/Default Region\n        let defaultDesktopRegionId = 'global';\n\n        const locale = this.get('intl.systemLocale');\n        if (_.includes(locale, 'au')) {\n            defaultDesktopRegionId = 'au';\n        } else if (_.includes(locale, 'ja') || _.includes(locale, 'zh')) {\n            defaultDesktopRegionId = 'jp';\n        }\n\n        this.set(\n            'desktopRegionId',\n            _.find(PUBLIC_ENVS, { desktopId: defaultDesktopRegionId })\n                ? defaultDesktopRegionId\n                : PUBLIC_ENVS[0].desktopId\n        );\n    }\n});\n","import IndexController from './index';\n\nvar RelateExternalContactController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalContactController;\n","import IndexController from './index';\n\nvar RelateExternalOrganizationController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalOrganizationController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar IndexController = Ember.Controller.extend(LoggerMixin, {\n    session: Ember.inject.service(),\n    relateService: Ember.inject.service('relate'),\n\n    // Overridden to preserve hash query parameters.\n    transitionToRoute(route) {\n        window.location.hash = route;\n    },\n\n    // Overridden to preserve hash query parameters.\n    replaceRoute(route) {\n        const search = window.location.search;\n        window.location.replace(`${window.location.pathname}${search}#${route}`);\n    },\n\n    navigationEvent: Ember.observer('relateService.navigationRoute', function () {\n        var navRoute = this.get('relateService.navigationRoute');\n        if (navRoute) {\n            this.logger.debug('Transitioning to', navRoute);\n            this.transitionToRoute(navRoute); //see override above\n            this.set('relateService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: Ember.observer('relateService.redirectRoute', function () {\n        let redirectRoute = this.get('relateService.redirectRoute');\n        this.logger.debug('Redirecting to', redirectRoute.route);\n        this.replaceRoute(redirectRoute.route); //see override above\n    }),\n\n    init: function () {\n        this._super.apply(this, arguments);\n        this.get('relateService.redirectRoute');\n    }\n});\n\nexport default IndexController;\n","import Ember from 'ember';\nimport SignupController from './signup';\n\nexport default SignupController.extend({\n    intl: Ember.inject.service(),\n\n    _heading: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    }),\n\n    _button: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['entity', 'query', 'queryFacets', 'saveHistory'],\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['targetRoute']\n});\n","define(\"connections-ui/enums/plantronics-call-events\", [\"exports\", \"ember-softphone-integration/enums/plantronics-call-events\"], function (_exports, _plantronicsCallEvents) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronicsCallEvents.default;\n    }\n  });\n});\n","import FieldConfig from '../field-config';\nimport ExternalContactModel from '../../models/external-contact';\n\nexport default FieldConfig.extend({\n    modelClass: ExternalContactModel\n}).reopenClass({\n    modelClass: ExternalContactModel\n});\n","import FieldConfig from '../field-config';\nimport GroupModel from '../../models/group';\n\nexport default FieldConfig.extend({\n    modelClass: GroupModel\n}).reopenClass({\n    modelClass: GroupModel\n});\n","import FieldConfig from '../field-config';\nimport OrgModel from '../../models/org';\n\nexport default FieldConfig.extend({\n    modelClass: OrgModel\n}).reopenClass({\n    modelClass: OrgModel\n});\n","import FieldConfig from '../field-config';\nimport PersonModel from '../../models/person';\n\nexport default FieldConfig.extend({\n    modelClass: PersonModel\n}).reopenClass({\n    modelClass: PersonModel\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldSection from './field-section';\n\nexport const KEY_BLACKLIST = [\n    'id',\n    '_id',\n    'guid',\n    'store',\n    'data',\n    'currentState',\n    'name',\n    'type',\n    'group',\n    'title',\n    'department',\n    'phone',\n    'email',\n    'description',\n    'organization'\n];\nconst GROUP_BLACKLIST = [...KEY_BLACKLIST, 'expression', 'groupType'];\nconst ORG_BLACKLIST = [...KEY_BLACKLIST, 'orgPreferences', 'shortName'];\nconst PROFILE_BLACKLIST = [\n    ...KEY_BLACKLIST,\n    'activities',\n    'profile',\n    'emptySections',\n    'fieldSections',\n    'emptyWriteableSections'\n];\n\nconst FieldConfig = Ember.Object.extend({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    id: Ember.computed.alias('_id'),\n\n    _id: null,\n    orgId: null,\n    entityType: null,\n    version: null,\n    sections: [],\n\n    _initModelWithType: function () {\n        const type = this.get('entityType');\n        const modelClass = this.modelClass;\n\n        let blacklist;\n        switch (type) {\n            case 'person':\n                blacklist = [...PROFILE_BLACKLIST];\n                break;\n            case 'org':\n                blacklist = [...ORG_BLACKLIST];\n                break;\n            case 'group':\n                blacklist = [...GROUP_BLACKLIST];\n                break;\n            case 'externalContact':\n            default:\n                blacklist = [...KEY_BLACKLIST];\n                break;\n        }\n\n        let fields = {};\n\n        this.get('sections').forEach(function (section) {\n            if (!Ember.A(blacklist).includes(section.key)) {\n                fields[section.key] = DS.attr();\n            }\n        });\n\n        modelClass\n            .reopenClass({\n                fieldConfig: this\n            })\n            .reopen(fields, {\n                fieldConfig: this\n            });\n\n        if (type === 'group') {\n            var allowedValues = this.getFieldByKey('general.groupType').get('params.allowedValues') || [];\n            allowedValues = allowedValues.filter(value => {\n                return value !== 'purecloud.distributionGroups';\n            });\n            this.set('groupTypes', allowedValues);\n        }\n    },\n\n    unknownProperty: function (property) {\n        var sections = this.get('sections');\n\n        if (_.map(sections, 'key').indexOf(property) > -1) {\n            return this.getSectionByKey(property);\n        }\n\n        return this._super();\n    },\n\n    splitFieldPath: function (path) {\n        var split = path.replace(/^\\w+\\.\\s/gi, '').split('.');\n        return {\n            sectionKey: split[0],\n            fieldKey: split[1]\n        };\n    },\n\n    getSectionByKey: function (key) {\n        return this.sections.findBy('key', key);\n    },\n\n    getFieldByKey: function (key) {\n        var splitField = this.splitFieldPath(key);\n        var section = this.getSectionByKey(splitField.sectionKey);\n        if (splitField.fieldKey && section) {\n            return section.getFieldByKey(splitField.fieldKey);\n        }\n\n        return undefined;\n    },\n\n    getFieldListByType: function (type) {\n        var fieldList = this.sections\n            .map(function (section) {\n                return section.getFieldsByType(type);\n            })\n            .filter(function (field) {\n                return field !== undefined && field.length > 0;\n            });\n\n        return _.flatten(fieldList);\n    },\n\n    getFieldsByType: function () {\n        this.getFieldListByType.apply(this, arguments);\n    },\n\n    getAllowedValues: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).params.allowedValues;\n    },\n\n    isFieldRepeatable: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.repeatable;\n        }\n\n        return false;\n    },\n\n    isFieldReference: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.type === 'reference';\n        }\n\n        return false;\n    },\n\n    isFieldChoice: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).type === 'select';\n    },\n\n    groupFieldConfig: Ember.computed(function () {\n        return this.getFieldConfig('group', Ember.getOwner(this));\n    }),\n\n    personFieldConfig: Ember.computed(function () {\n        return this.getFieldConfig('person', Ember.getOwner(this));\n    })\n});\n\nvar extra = {\n    getFieldConfig: function (type, owner) {\n        return owner.lookup('field-config:' + type);\n    }\n};\n\nFieldConfig.reopenClass({\n    createFieldConfig: function (attributes, container) {\n        // Ensure that sections are the proper object\n        attributes.sections = attributes.sections.map(function (section) {\n            return FieldSection.create(section);\n        });\n\n        var instance = container.lookup('field-config:' + attributes.entityType);\n        if (instance) {\n            instance.setProperties(attributes);\n\n            instance.sections.forEach(function (section) {\n                section.set('fieldConfig', instance);\n            });\n\n            instance._initModelWithType();\n\n            return instance;\n        }\n        Ember.Logger.warn('Unknown field-config type:', { type: attributes.entityType });\n    }\n})\n    .reopenClass(extra)\n    .reopen(extra);\n\nexport default FieldConfig;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default Ember.Object.extend({\n    entity: null,\n    field: null,\n\n    entries: [],\n\n    attachComputedEntries: Ember.on('init', function () {\n        var fieldPath = this.get('field').getFieldPath();\n        if (typeof fieldPath === 'string') {\n            fieldPath = fieldPath.trim();\n\n            var boundTo = `entity.${fieldPath}`;\n            var boundToEach = `entity.${fieldPath}.[]`;\n\n            Ember.defineProperty(this, 'entries', Ember.computed(boundTo, boundToEach, this.getEntriesFromEntity));\n        }\n    }),\n\n    fieldPath: Ember.computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed('fieldPath', function () {\n        var fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    isEmpty: Ember.computed('field', 'entries', 'entries.[]', function () {\n        return this.isFieldEmpty(this.get('field'), this.get('entries'));\n    }),\n\n    writeable: Ember.computed('entity.readWritePermissions', 'entries.[]', function () {\n        var path = this.get('field').getFieldPath();\n        var readWritePermissions = this.get('entity.readWritePermissions');\n        var promise = Ember.RSVP.resolve(true);\n\n        if (this.get('entity.type') !== 'group') {\n            promise = new Ember.RSVP.Promise(function (resolve) {\n                readWritePermissions.then(function (permissions) {\n                    resolve(_.includes(permissions.write, path));\n                });\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    getEntriesFromEntity: function () {\n        var path = this.get('field').getFieldPath();\n        var value = this.get('entity').getFieldValue(path);\n        if (value === undefined) {\n            return [];\n        }\n\n        return value;\n    },\n\n    isFieldEmpty: function (field, entry) {\n        if (entry === undefined) {\n            return true;\n        }\n\n        if (field.repeatable) {\n            return _.isEmpty(entry) || entry.length <= 0;\n        } else {\n            return !(entry && entry.value);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport Field from './field';\n\nvar FieldSection = Ember.Object.extend({\n    intl: Ember.computed.reads('fieldConfig.intl'),\n    application: Ember.computed.reads('fieldConfig.application'),\n\n    fieldConfig: null,\n\n    key: null,\n    state: null,\n    instructionText: null,\n    fieldList: [],\n\n    getFieldByKey: function (key) {\n        return this.fieldList.findBy('key', key);\n    },\n\n    getFieldsByType: function (type) {\n        return this.fieldList.filterBy('type', type);\n    },\n\n    getEntityType: function () {\n        return this.fieldConfig.entityType;\n    },\n\n    getI18nKey: function () {\n        var type = this.getEntityType();\n        return `${type}_${this.key}`;\n    },\n\n    unknownProperty: function (property) {\n        var fieldList = this.get('fieldList');\n\n        if (_.map(fieldList, 'key').indexOf(property) > -1) {\n            return this.getFieldByKey(property);\n        }\n\n        return null;\n    },\n\n    sectionName: Ember.computed(function () {\n        const intl = this.get('intl');\n        const key = this.getI18nKey();\n        const serverKey = `server_translations.${key}`;\n        if (!intl.exists(serverKey)) {\n            return key;\n        }\n        return intl.t(serverKey, null, true).toString();\n    })\n});\n\nFieldSection.reopenClass({\n    create: function (attributes) {\n        attributes.fieldList = attributes.fieldList\n            .filter(field => {\n                return field.state !== 'deleted';\n            })\n            .map(field => {\n                return Field.create(field);\n            });\n\n        var instance = this._super(attributes);\n        instance.fieldList.forEach(function (field) {\n            field.section = instance;\n        });\n\n        return instance;\n    }\n});\n\nexport default FieldSection;\n","/* global requirejs */\n\nimport Ember from 'ember';\n\nvar Field = Ember.Object.extend({\n    intl: Ember.computed.reads('section.intl'),\n    application: Ember.computed.reads('section.application'),\n\n    section: null,\n\n    key: null,\n    type: null,\n    labelKeys: [],\n    instructionText: '',\n    customLabels: false,\n    repeatable: false,\n    params: null,\n\n    maxRepeat: Ember.computed.reads('params.maxRepeat'),\n\n    i18nLabel: Ember.computed(function () {\n        let intl = this.get('intl');\n        let key = `server_translations.${this.getI18nKey()}`;\n        let labelKey = `server_translations.${this.getI18nLabelKey()}`;\n        if (intl.exists(labelKey)) {\n            return intl.t(labelKey).toString();\n        }\n        if (intl.exists(key)) {\n            return intl.t(key).toString();\n        }\n        return this.get('key');\n    }),\n\n    i18nKey: Ember.computed(function () {\n        return this.getI18nKey();\n    }),\n\n    elemId: Ember.computed(function () {\n        return `#${this.get('key')}`;\n    }),\n\n    fieldPath: Ember.computed(function () {\n        return this.getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed(function () {\n        let path = this.getFieldPath();\n        return path.replace(/\\./gi, '-');\n    }),\n\n    componentName: Ember.computed('type', function () {\n        var type = this.get('type');\n        return `entity-fields/${type}-field`;\n    }),\n\n    getI18nKey() {\n        return `${this.section.getI18nKey()}_${this.key}`;\n    },\n\n    getI18nLabelKey() {\n        return `${this.getI18nKey()}_labelKey_${this.key}`;\n    },\n\n    getFieldPath() {\n        return this.section.key + '.' + this.key;\n    },\n\n    getEntityType() {\n        return this.section.getEntityType();\n    },\n\n    cleanForEntity(entity) {\n        Ember.Logger.warn('DEPRECATION: Stop using this method please...it breaks a lot of rules...');\n\n        var name = this.get('componentName');\n        if (requirejs._eak_seen[name]) {\n            var module = requirejs(name);\n            if (module.cleanFieldForEntity) {\n                return module.cleanFieldForEntity(entity, this, entity.getFieldValue(this.getFieldPath()));\n            }\n        }\n    },\n\n    component: Ember.computed(function () {\n        Ember.Logger.warn(\n            'DEPRECATION: Use component helper and `field.componentName` property to use field components'\n        );\n\n        // We have fields with hyphens (multiline-text). Make sure they get Ember-ized.\n        var className = this.get('componentName');\n\n        var factory = this.get('application.container').lookupFactory('component:' + className);\n        if (factory) {\n            return factory;\n        }\n\n        Ember.Logger.warn('Could not find view for:', { className });\n\n        return this.get('application.container').lookupFactory('component:text-field');\n    })\n});\n\nexport default Field;\n","export default {\n    time: {\n        hhmmss: {\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric'\n        }\n    },\n    date: {\n        hhmmss: {\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric'\n        }\n    },\n    number: {\n        EUR: {\n            style: 'currency',\n            currency: 'EUR',\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        },\n        USD: {\n            style: 'currency',\n            currency: 'USD',\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        }\n    }\n};\n","import Ember from 'ember';\n\nconst { Mixin, RSVP } = Ember;\n\nconst DEFAULT_PARAMETERS = {\n    offset: 0,\n    limit: 15\n};\n\nexport default Mixin.create({\n    findGroupMembership(id, parameters = DEFAULT_PARAMETERS) {\n        const label = 'Adapter#findGroupMembership';\n        const adapter = this.adapterFor('group');\n\n        const serializer = this.serializerFor('person');\n        const modelClass = this.modelFor('person');\n        let promise = adapter.findGroupMembership(id, parameters);\n        promise = RSVP.Promise.resolve(promise, label);\n\n        return promise.then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(this, modelClass, payload, null, 'findMany');\n                const records = this.push(payload);\n                return records;\n            },\n            null,\n            'Store#findGroupMembership'\n        );\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst activityMessages = {\n    sms: 'components.recentContact.sms',\n    voice: 'components.recentContact.voice',\n    email: 'components.recentContact.email',\n    chat: 'components.recentContact.chat'\n};\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const activity = params[0];\n        const message = activityMessages[activity.method];\n        const date = moment(activity.ts * 1000);\n        return this.get('intl').lookup(message, { date: date.format('L') });\n    }\n});\n","define(\"connections-ui/helpers/abs\", [\"exports\", \"ember-math-helpers/helpers/abs\"], function (_exports, _abs) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"abs\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.abs;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acos\", [\"exports\", \"ember-math-helpers/helpers/acos\"], function (_exports, _acos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acos\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.acos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acosh\", [\"exports\", \"ember-math-helpers/helpers/acosh\"], function (_exports, _acosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acosh\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.acosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/add\", [\"exports\", \"ember-math-helpers/helpers/add\"], function (_exports, _add) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"add\", {\n    enumerable: true,\n    get: function get() {\n      return _add.add;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _add.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    addressformat: Ember.inject.service(),\n\n    compute: function (params) {\n        if (!params || params.length !== 1) {\n            Ember.Logger.warn('addressformat helper called with bad arguments');\n            return '';\n        }\n        return this.get('addressformat').formatOrLookupAddressForDisplay(params[0]);\n    }\n});\n","define(\"connections-ui/helpers/and\", [\"exports\", \"ember-truth-helpers/helpers/and\"], function (_exports, _and) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"and\", {\n    enumerable: true,\n    get: function get() {\n      return _and.and;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _and.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport { shaRegExp, versionRegExp } from 'ember-cli-app-version/utils/regexp';\n\nconst {\n  APP: {\n    version\n  }\n} = config;\n\nexport function appVersion(_, hash = {}) {\n  if (hash.hideSha) {\n    return version.match(versionRegExp)[0];\n  }\n\n  if (hash.hideVersion) {\n    return version.match(shaRegExp)[0];\n  }\n\n  return version;\n}\n\nexport default Ember.Helper.helper(appVersion);\n","define(\"connections-ui/helpers/array-contains\", [\"exports\", \"ember-array-contains-helper/helpers/array-contains\"], function (_exports, _arrayContains) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"arrayContains\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.arrayContains;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asin\", [\"exports\", \"ember-math-helpers/helpers/asin\"], function (_exports, _asin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asin\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.asin;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asinh\", [\"exports\", \"ember-math-helpers/helpers/asinh\"], function (_exports, _asinh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asinh\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.asinh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan\", [\"exports\", \"ember-math-helpers/helpers/atan\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan2\", [\"exports\", \"ember-math-helpers/helpers/atan2\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan2\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan2;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atanh\", [\"exports\", \"ember-math-helpers/helpers/atanh\"], function (_exports, _atanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atanh\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.atanh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/await\", [\"exports\", \"ember-promise-helpers/helpers/await\"], function (_exports, _await) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _await.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default Ember.Helper.extend({\n    compute([person, promiseArray]) {\n        return DS.PromiseObject.create({\n            promise: promiseArray.then(sequenceList => {\n                const people = sequenceList.filter(listItem => listItem.person === person);\n                return people.get('length') === 0;\n            })\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    permissionsService: Ember.inject.service('permissions'),\n\n    permissions: null,\n\n    compute([entity, fieldPath]) {\n        if (!entity || !fieldPath) {\n            return false;\n        }\n\n        const permissionsService = this.get('permissionsService');\n        return permissionsService.get('canEditProfiles');\n    }\n});\n","define(\"connections-ui/helpers/cancel-all\", [\"exports\", \"ember-concurrency/helpers/cancel-all\"], function (_exports, _cancelAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cancelAll\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.cancelAll;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cbrt\", [\"exports\", \"ember-math-helpers/helpers/cbrt\"], function (_exports, _cbrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cbrt\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.cbrt;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ceil\", [\"exports\", \"ember-math-helpers/helpers/ceil\"], function (_exports, _ceil) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"ceil\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.ceil;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return time.format('LLLL');\n});\n","define(\"connections-ui/helpers/clz32\", [\"exports\", \"ember-math-helpers/helpers/clz32\"], function (_exports, _clz) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"clz32\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.clz32;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cos\", [\"exports\", \"ember-math-helpers/helpers/cos\"], function (_exports, _cos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cos\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.cos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cosh\", [\"exports\", \"ember-math-helpers/helpers/cosh\"], function (_exports, _cosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cosh\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.cosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { dasherize } = Ember.String;\n\nexport function cssClassify([string]) {\n    if (string) {\n        string = string.replace(/[,\\(\\)]/g, '');\n        return dasherize(string);\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(cssClassify);\n","define(\"connections-ui/helpers/dasherize\", [\"exports\", \"ember-purecloud-components/helpers/dasherize\"], function (_exports, _dasherize) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"dasherize\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.dasherize;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/div\", [\"exports\", \"ember-math-helpers/helpers/div\"], function (_exports, _div) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _div.default;\n    }\n  });\n  Object.defineProperty(_exports, \"div\", {\n    enumerable: true,\n    get: function get() {\n      return _div.div;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-group\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-group\"], function (_exports, _emberPowerSelectIsGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsGroup\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.emberPowerSelectIsGroup;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-selected\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-selected\"], function (_exports, _emberPowerSelectIsSelected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsSelected\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.emberPowerSelectIsSelected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-true-string-if-present\", [\"exports\", \"ember-power-select/helpers/ember-power-select-true-string-if-present\"], function (_exports, _emberPowerSelectTrueStringIfPresent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectTrueStringIfPresent\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.emberPowerSelectTrueStringIfPresent;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { emojifyString } from 'ember-purecloud-components/utils/emoji';\n\nconst { Handlebars, Helper } = Ember;\n\nexport default Helper.helper(function (params) {\n    let text = _.head(params);\n    if (text) {\n        text = emojifyString(Handlebars.Utils.escapeExpression(text));\n        return Ember.String.htmlSafe(text);\n    }\n    return text;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nEmber.Handlebars.helper('highlight', function (context, options) {\n    return _.isEmpty(options.context) ? options.fn(this) : null;\n});\n","define(\"connections-ui/helpers/eq\", [\"exports\", \"ember-truth-helpers/helpers/equal\"], function (_exports, _equal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equal\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.equal;\n    }\n  });\n});\n","define(\"connections-ui/helpers/equals\", [\"exports\", \"fixtable-ember/helpers/equals\"], function (_exports, _equals) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equals\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.equals;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return _.escape(params[0]);\n});\n","define(\"connections-ui/helpers/exp\", [\"exports\", \"ember-math-helpers/helpers/exp\"], function (_exports, _exp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.default;\n    }\n  });\n  Object.defineProperty(_exports, \"exp\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.exp;\n    }\n  });\n});\n","import Ember from 'ember';\nimport escape from 'connections-ui/utils/escape';\n\nconst { Helper } = Ember;\n\nexport default Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute([text]) {\n        if (!text) {\n            text = '';\n        }\n\n        // Check for promise\n        if (typeof text !== 'string' && typeof text.then === 'function' && !text.get('content')) {\n            text.then(() => this.recompute());\n        } else if (typeof text === 'object' && typeof text.get === 'function') {\n            text = text.get('content') || '';\n        }\n\n        // Check if we've got a POJO\n        if (typeof text === 'object' && typeof text.get !== 'function') {\n            return this.get('intl')\n                .t('entity.fieldTypes.location.address', {\n                    street1: text.street1,\n                    street2: text.street2,\n                    city: text.city,\n                    state: text.state,\n                    country: text.country,\n                    zipcode: text.zipcode\n                })\n                .toString();\n        }\n        return Ember.String.htmlSafe(escape(text).replace(/\\n/g, '<br>'));\n    }\n});\n","define(\"connections-ui/helpers/expm1\", [\"exports\", \"ember-math-helpers/helpers/expm1\"], function (_exports, _expm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"expm1\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.expm1;\n    }\n  });\n});\n","import Ember from 'ember';\nimport FieldConfig from '../field-config/field-config';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        const facetName = facet.facetName;\n        const splitName = facetName.split('.');\n        const section = splitName[0];\n        const field = splitName[1];\n\n        if (section && field) {\n            const owner = Ember.getOwner(this);\n            let fieldObj = FieldConfig.getFieldConfig('person', owner).getSectionByKey(section).getFieldByKey(field);\n\n            if (fieldObj === undefined) {\n                const section = FieldConfig.getFieldConfig('group', owner).getSectionByKey(section);\n                if (!!section) {\n                    fieldObj = section.getFieldByKey(field);\n                } else {\n                    return field;\n                }\n            }\n\n            if (fieldObj !== undefined) {\n                const intl = this.get('intl');\n                const path = fieldObj.getFieldPath();\n                const lookupPath = path.replace(/\\./g, '_');\n                let i18nKey;\n\n                if (facet.total > 1) {\n                    i18nKey = `directedSearch_${lookupPath}_plural`;\n                } else {\n                    i18nKey = `directedSearch_${lookupPath}_singular`;\n                }\n\n                if (intl.query(i18nKey)) {\n                    return intl.lookup(i18nKey);\n                } else {\n                    return fieldObj.get('i18nLabel');\n                }\n            }\n        }\n\n        return facetName;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        let term = namedArgs.term;\n        let facetName = facet.facetName;\n        if (term && facetName === 'general.groupType') {\n            facetName = facetName.replace(/[\\. ]/g, '_');\n            term = term.replace(/[\\. ]/g, '_');\n            const intl = this.get('intl');\n            const i18nKey = ['group', facetName, 'value', term].join('_');\n            if (intl.query(i18nKey)) {\n                return intl.lookup(i18nKey);\n            }\n        }\n        return term;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function ([arr]) {\n    if (arr && arr.length) {\n        return arr[0];\n    }\n\n    return {};\n});\n","import Ember from 'ember';\nimport { emojifyString } from 'ember-purecloud-components/utils/emoji';\n\nconst _flairRegEx = new RegExp(/^(flair:)(#[0-9a-f]{3}:|#[0-9a-f]{6}:){0,1}(.+)/i); // flair:[#hex:]message\n\nexport default Ember.Helper.extend({\n    compute(params, namedArgs) {\n        const status = params[0];\n        const hideIfText = namedArgs.hideIfText;\n\n        let color = '#aaaaaa';\n\n        let match = _flairRegEx.exec(status);\n        if (match) {\n            if (match[2]) {\n                color = match[2].substring(0, match[2].length - 1);\n            }\n            let emojiText = emojifyString(Ember.Handlebars.Utils.escapeExpression(match[3]));\n            return `<div class=\"flair\" style=\"background-color: ${color}\"> ${emojiText} </div>`;\n        } else if (hideIfText) {\n            return '';\n        } else {\n            return emojifyString(Ember.Handlebars.Utils.escapeExpression(status));\n        }\n    }\n});\n","define(\"connections-ui/helpers/floor\", [\"exports\", \"ember-math-helpers/helpers/floor\"], function (_exports, _floor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"floor\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.floor;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-date\", [\"exports\", \"ember-intl/helpers/format-date\"], function (_exports, _formatDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatDate.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute: function (params) {\n        let bytes = params[0];\n        let units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n        for (var i = units.length - 1; i >= 0; i--) {\n            var converted = bytes / Math.pow(1000, i);\n            if (converted >= 1 && converted < 1000) {\n                var decimals = i === 0 ? 0 : 1;\n                return `${converted.toFixed(decimals)} ${units[i]}`;\n            }\n        }\n    }\n});\n","define(\"connections-ui/helpers/format-html-message\", [\"exports\", \"ember-intl/helpers/format-html-message\"], function (_exports, _formatHtmlMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatHtmlMessage.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const link = params[0];\n    return link.replace('http://', '').replace('https://', '').replace('www.', '');\n});\n","define(\"connections-ui/helpers/format-message\", [\"exports\", \"ember-intl/helpers/format-message\"], function (_exports, _formatMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-number\", [\"exports\", \"ember-intl/helpers/format-number\"], function (_exports, _formatNumber) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatNumber.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-relative\", [\"exports\", \"ember-intl/helpers/format-relative\"], function (_exports, _formatRelative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatRelative.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-time\", [\"exports\", \"ember-intl/helpers/format-time\"], function (_exports, _formatTime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatTime.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/fround\", [\"exports\", \"ember-math-helpers/helpers/fround\"], function (_exports, _fround) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.default;\n    }\n  });\n  Object.defineProperty(_exports, \"fround\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.fround;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst fullNameHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    names: Ember.inject.service(),\n\n    compute(params) {\n        const externalProfile = params[0];\n        if (externalProfile) {\n            return this.get('names').fullName(externalProfile) || Ember.get(externalProfile, 'firstName');\n        }\n        return this.get('intl').lookup('purecloud.unknown');\n    }\n});\n\nexport default fullNameHelper;\n","define(\"connections-ui/helpers/gcd\", [\"exports\", \"ember-math-helpers/helpers/gcd\"], function (_exports, _gcd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gcd\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.gcd;\n    }\n  });\n});\n","define(\"connections-ui/helpers/get-select-options\", [\"exports\", \"fixtable-ember/helpers/get-select-options\"], function (_exports, _getSelectOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.default;\n    }\n  });\n  Object.defineProperty(_exports, \"getSelectOptions\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.getSelectOptions;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    name: '',\n    compute(params) {\n        const groupId = params[0];\n        if (!this.get('name')) {\n            if (this.get('store').hasRecordForId('group', groupId)) {\n                let group = this.get('store').recordForId('group', groupId);\n                if (group && group.get('name')) {\n                    this.set('name', group.get('name'));\n                    this.recompute();\n                }\n            } else {\n                this.get('store')\n                    .find('group', groupId)\n                    .then(group => {\n                        this.set('name', group.get('name'));\n                        this.recompute();\n                    });\n            }\n        }\n\n        return this.get('name');\n    }\n});\n","define(\"connections-ui/helpers/gt\", [\"exports\", \"ember-truth-helpers/helpers/gt\"], function (_exports, _gt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gt\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.gt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/gte\", [\"exports\", \"ember-truth-helpers/helpers/gte\"], function (_exports, _gte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gte\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.gte;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute(params) {\n        const group = params[0];\n        return !!Ember.get(group, 'contactInfo.groupNumber.firstObject.rel.e164');\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(params => {\n    const type = params[0];\n\n    switch (type) {\n        case 'faq':\n            return 'faq';\n        case 'article':\n            return 'article';\n        case 'glossary':\n            return 'glossary';\n        case 'video':\n            return 'video-camera';\n        case 'post':\n            return 'post';\n        case 'releasenote':\n            return 'releasenote';\n        case 'page':\n            return 'page';\n        default:\n            return '';\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return Ember.String.htmlSafe(params[0]);\n});\n","define(\"connections-ui/helpers/hypot\", [\"exports\", \"ember-math-helpers/helpers/hypot\"], function (_exports, _hypot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.default;\n    }\n  });\n  Object.defineProperty(_exports, \"hypot\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.hypot;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst activityIcons = {\n    sms: 'ion-iphone',\n    voice: 'ion-ios-telephone',\n    email: 'ion-email',\n    chat: 'ion-chatboxes'\n};\n\nexport default Ember.Helper.helper(params => {\n    const activity = params[0];\n    return Ember.String.htmlSafe(`<i class='${activityIcons[activity.method]}'></i>`);\n});\n","define(\"connections-ui/helpers/ignore-children\", [\"exports\", \"ember-ignore-children-helper/helpers/ignore-children\"], function (_exports, _ignoreChildren) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ignoreChildren\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.ignoreChildren;\n    }\n  });\n});\n","define(\"connections-ui/helpers/imul\", [\"exports\", \"ember-math-helpers/helpers/imul\"], function (_exports, _imul) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.default;\n    }\n  });\n  Object.defineProperty(_exports, \"imul\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.imul;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const string = typeof params[0] === 'undefined' ? '' : params[0];\n    return string.charAt(0);\n});\n","define(\"connections-ui/helpers/intl-get\", [\"exports\", \"ember-intl/helpers/intl-get\"], function (_exports, _intlGet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _intlGet.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-after\", [\"exports\", \"ember-moment/helpers/is-after\"], function (_exports, _isAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-array\", [\"exports\", \"ember-truth-helpers/helpers/is-array\"], function (_exports, _isArray) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isArray\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.isArray;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-before\", [\"exports\", \"ember-moment/helpers/is-before\"], function (_exports, _isBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-between\", [\"exports\", \"ember-moment/helpers/is-between\"], function (_exports, _isBetween) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBetween.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-empty\", [\"exports\", \"ember-truth-helpers/helpers/is-empty\"], function (_exports, _isEmpty) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isEmpty.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Helper } = Ember;\n\nexport default Helper.helper(function (params) {\n    const left = params[0];\n    const right = params[1];\n    return left === right;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params) {\n    const user = params[0];\n    const entity = params[1];\n    const favorites = user.get('_favorites');\n    const isFavorite = !!favorites && !_.isEmpty(favorites.findBy('id', entity.get('id')));\n\n    if (isFavorite) {\n        return 'favorite';\n    } else {\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/is-fulfilled\", [\"exports\", \"ember-promise-helpers/helpers/is-fulfilled\"], function (_exports, _isFulfilled) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isFulfilled\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.isFulfilled;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-pending\", [\"exports\", \"ember-promise-helpers/helpers/is-pending\"], function (_exports, _isPending) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isPending\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.isPending;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-rejected\", [\"exports\", \"ember-promise-helpers/helpers/is-rejected\"], function (_exports, _isRejected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isRejected\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.isRejected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-after\", [\"exports\", \"ember-moment/helpers/is-same-or-after\"], function (_exports, _isSameOrAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-before\", [\"exports\", \"ember-moment/helpers/is-same-or-before\"], function (_exports, _isSameOrBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same\", [\"exports\", \"ember-moment/helpers/is-same\"], function (_exports, _isSame) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSame.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function ([routes, station]) {\n    if (!routes || !station) {\n        return false;\n    }\n    const routeIds = routes.filterBy('isStation').mapBy('station.id');\n    return routeIds.indexOf(station.get('id')) > -1;\n});\n","import Ember from 'ember';\n\nexport function joinStrings(params /*, hash*/) {\n    const [joinCharacter, ...rest] = params || [];\n    return rest.join(joinCharacter);\n}\n\nexport default Ember.Helper.helper(joinStrings);\n","define(\"connections-ui/helpers/l\", [\"exports\", \"ember-intl/helpers/l\"], function (_exports, _l) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _l.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lcm\", [\"exports\", \"ember-math-helpers/helpers/lcm\"], function (_exports, _lcm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lcm\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.lcm;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    presence: Ember.inject.service(),\n\n    compute(params) {\n        return this.get('presence').localizePresence(...params);\n    }\n});\n","define(\"connections-ui/helpers/log-e\", [\"exports\", \"ember-math-helpers/helpers/log-e\"], function (_exports, _logE) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.default;\n    }\n  });\n  Object.defineProperty(_exports, \"logE\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.logE;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log10\", [\"exports\", \"ember-math-helpers/helpers/log10\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log10\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log10;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log1p\", [\"exports\", \"ember-math-helpers/helpers/log1p\"], function (_exports, _log1p) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log1p\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.log1p;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log2\", [\"exports\", \"ember-math-helpers/helpers/log2\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log2\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log2;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lt\", [\"exports\", \"ember-truth-helpers/helpers/lt\"], function (_exports, _lt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lt\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.lt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lte\", [\"exports\", \"ember-truth-helpers/helpers/lte\"], function (_exports, _lte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lte\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.lte;\n    }\n  });\n});\n","define(\"connections-ui/helpers/max\", [\"exports\", \"ember-math-helpers/helpers/max\"], function (_exports, _max) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _max.default;\n    }\n  });\n  Object.defineProperty(_exports, \"max\", {\n    enumerable: true,\n    get: function get() {\n      return _max.max;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from 'moment';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute(date) {\n        let locale = this.get('intl.isoLocale');\n        if (moment(date, 'YYYY-MM-DD').isSame(new Date(), 'day')) {\n            return `TODAY: ${moment(date, 'YYYY-MM-DD').locale(locale).format('dddd MMMM DD')}`;\n        } else {\n            return moment(date, 'YYYY-MM-DD').locale(locale).format('MMMM DD');\n        }\n    }\n});\n","define(\"connections-ui/helpers/min\", [\"exports\", \"ember-math-helpers/helpers/min\"], function (_exports, _min) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _min.default;\n    }\n  });\n  Object.defineProperty(_exports, \"min\", {\n    enumerable: true,\n    get: function get() {\n      return _min.min;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mod\", [\"exports\", \"ember-math-helpers/helpers/mod\"], function (_exports, _mod) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mod\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.mod;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-add\", [\"exports\", \"ember-moment/helpers/moment-add\"], function (_exports, _momentAdd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentAdd.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-calendar\", [\"exports\", \"ember-moment/helpers/moment-calendar\"], function (_exports, _momentCalendar) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentCalendar.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-diff\", [\"exports\", \"ember-moment/helpers/moment-diff\"], function (_exports, _momentDiff) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDiff.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-duration\", [\"exports\", \"ember-moment/helpers/moment-duration\"], function (_exports, _momentDuration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDuration.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-format\", [\"exports\", \"ember-moment/helpers/moment-format\"], function (_exports, _momentFormat) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFormat.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from-now\", [\"exports\", \"ember-moment/helpers/moment-from-now\"], function (_exports, _momentFromNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFromNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from\", [\"exports\", \"ember-moment/helpers/moment-from\"], function (_exports, _momentFrom) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFrom.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-subtract\", [\"exports\", \"ember-moment/helpers/moment-subtract\"], function (_exports, _momentSubtract) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentSubtract.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-date\", [\"exports\", \"ember-moment/helpers/moment-to-date\"], function (_exports, _momentToDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToDate.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-now\", [\"exports\", \"ember-moment/helpers/moment-to-now\"], function (_exports, _momentToNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to\", [\"exports\", \"ember-moment/helpers/moment-to\"], function (_exports, _momentTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentTo.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment\", [\"exports\", \"ember-moment/helpers/moment\"], function (_exports, _moment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _moment.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mult\", [\"exports\", \"ember-math-helpers/helpers/mult\"], function (_exports, _mult) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mult\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.mult;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport default Ember.Helper.helper(function (params) {\n    if (params && params[0]) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n});\n","define(\"connections-ui/helpers/not-eq\", [\"exports\", \"ember-truth-helpers/helpers/not-equal\"], function (_exports, _notEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.default;\n    }\n  });\n  Object.defineProperty(_exports, \"notEq\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.notEq;\n    }\n  });\n});\n","define(\"connections-ui/helpers/not\", [\"exports\", \"ember-truth-helpers/helpers/not\"], function (_exports, _not) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _not.default;\n    }\n  });\n  Object.defineProperty(_exports, \"not\", {\n    enumerable: true,\n    get: function get() {\n      return _not.not;\n    }\n  });\n});\n","define(\"connections-ui/helpers/now\", [\"exports\", \"ember-moment/helpers/now\"], function (_exports, _now) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _now.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/or\", [\"exports\", \"ember-truth-helpers/helpers/or\"], function (_exports, _or) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _or.default;\n    }\n  });\n  Object.defineProperty(_exports, \"or\", {\n    enumerable: true,\n    get: function get() {\n      return _or.or;\n    }\n  });\n});\n","define(\"connections-ui/helpers/perform\", [\"exports\", \"ember-concurrency/helpers/perform\"], function (_exports, _perform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.default;\n    }\n  });\n  Object.defineProperty(_exports, \"perform\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.perform;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default Ember.Helper.extend({\n    phoneIntegrations: inject.service(),\n\n    onIntegrationConfigChange: Ember.observer('phoneIntegrations.integrationConfigs.[]', function () {\n        this.recompute();\n    }),\n\n    compute([person]) {\n        if (person.integrationContactInfo === undefined) {\n            return [];\n        }\n        const phoneIntegrations = this.get('phoneIntegrations');\n        const integrationConfigs = phoneIntegrations.get('integrationConfigs');\n        return integrationConfigs.filter(\n            config =>\n                !!person.integrationContactInfo(config.key) &&\n                (config.includeBadge === undefined ||\n                    (config.includeBadge !== undefined && config.includeBadge === true))\n        );\n    }\n});\n","import Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\n\nexport default Ember.Helper.helper(function (params) {\n    const count = params[1] || 1;\n    const text = params[0];\n    if (count !== 1) {\n        return pluralize(text);\n    }\n    return text;\n});\n","import pluralize from 'ember-inflector/lib/helpers/pluralize';\nexport default pluralize;\n","define(\"connections-ui/helpers/pow\", [\"exports\", \"ember-math-helpers/helpers/pow\"], function (_exports, _pow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.default;\n    }\n  });\n  Object.defineProperty(_exports, \"pow\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.pow;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-all\", [\"exports\", \"ember-promise-helpers/helpers/promise-all\"], function (_exports, _promiseAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseAll\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.promiseAll;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-hash\", [\"exports\", \"ember-promise-helpers/helpers/promise-hash\"], function (_exports, _promiseHash) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseHash\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.promiseHash;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-rejected-reason\", [\"exports\", \"ember-promise-helpers/helpers/promise-rejected-reason\"], function (_exports, _promiseRejectedReason) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseRejectedReason.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/random\", [\"exports\", \"ember-math-helpers/helpers/random\"], function (_exports, _random) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _random.default;\n    }\n  });\n  Object.defineProperty(_exports, \"random\", {\n    enumerable: true,\n    get: function get() {\n      return _random.random;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport function renderMarkdown(params /*, hash*/) {\n    if (params && params.length > 0) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(renderMarkdown);\n","define(\"connections-ui/helpers/round\", [\"exports\", \"ember-math-helpers/helpers/round\"], function (_exports, _round) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _round.default;\n    }\n  });\n  Object.defineProperty(_exports, \"round\", {\n    enumerable: true,\n    get: function get() {\n      return _round.round;\n    }\n  });\n});\n","define(\"connections-ui/helpers/route-action\", [\"exports\", \"ember-route-action-helper/helpers/route-action\"], function (_exports, _routeAction) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeAction.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return moment(time).format('h:mm a');\n});\n","import Ember from 'ember';\nimport { emojifyStringUnicode } from 'ember-purecloud-components/utils/emoji';\n\nexport default Ember.Helper.helper(params => {\n    const emoji = params[0];\n    const isUnicode = params.length > 1 ? params[1] : false;\n    const isUnicodeLookAhead = params[1] === 'isUnicodeLookAhead' ? true : false;\n    if (isUnicodeLookAhead) {\n        return emojifyStringUnicode(`:${emoji}:`);\n    }\n    return /:\\w+:/.test(emoji) || isUnicode ? emoji : `:${emoji}:`;\n});\n","define(\"connections-ui/helpers/sign\", [\"exports\", \"ember-math-helpers/helpers/sign\"], function (_exports, _sign) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sign\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.sign;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sin\", [\"exports\", \"ember-math-helpers/helpers/sin\"], function (_exports, _sin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sin\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.sin;\n    }\n  });\n});\n","import singularize from 'ember-inflector/lib/helpers/singularize';\nexport default singularize;\n","import Ember from 'ember';\nimport orderBy from 'lodash/orderBy';\nimport moment from '../utils/dates';\n\nexport function sortFieldData([data], { group }) {\n    let key = group.key;\n    if (key === 'workHistory' || key === 'education') {\n        return orderBy(\n            data,\n            function (fieldData) {\n                let value = fieldData.get('value.value.startDate');\n                if (value) {\n                    let { month, year } = value;\n                    if (month) {\n                        month -= 1;\n                    }\n\n                    return moment({ month, year }).valueOf();\n                }\n            },\n            ['desc']\n        );\n    }\n\n    return data;\n}\n\nexport default Ember.Helper.helper(sortFieldData);\n","define(\"connections-ui/helpers/sqrt\", [\"exports\", \"ember-math-helpers/helpers/sqrt\"], function (_exports, _sqrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sqrt\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.sqrt;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute([value, placeholder] /*, hash*/) {\n        if (typeof value === 'string') {\n            return value;\n        }\n        if (!value) {\n            return '';\n        }\n        if (Ember.get(value, 'promise')) {\n            if (Ember.get(value, 'isFulfilled')) {\n                return Ember.get(value, 'content');\n            }\n            return placeholder || this.get('intl').t('common.loading');\n        }\n        return 'stringOrPromiseError';\n    }\n});\n","define(\"connections-ui/helpers/sub\", [\"exports\", \"ember-math-helpers/helpers/sub\"], function (_exports, _sub) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sub\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.sub;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sum\", [\"exports\", \"ember-math-helpers/helpers/sum\"], function (_exports, _sum) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sum\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.sum;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute: function (params, hash) {\n        return this.get('intl').lookup(params[0], hash);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        var field = params[0];\n        var tag = field;\n        if (field) {\n            var section = field.replace('.', '_');\n            var key = section.substring(section.indexOf('_') + 1);\n            tag = this.get('intl').lookup(`person_${section}_labelKey_${key}`);\n        }\n\n        return tag;\n    }\n});\n","define(\"connections-ui/helpers/tan\", [\"exports\", \"ember-math-helpers/helpers/tan\"], function (_exports, _tan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tan\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.tan;\n    }\n  });\n});\n","define(\"connections-ui/helpers/tanh\", [\"exports\", \"ember-math-helpers/helpers/tanh\"], function (_exports, _tanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tanh\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.tanh;\n    }\n  });\n});\n","define(\"connections-ui/helpers/task\", [\"exports\", \"ember-concurrency/helpers/task\"], function (_exports, _task) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _task.default;\n    }\n  });\n  Object.defineProperty(_exports, \"task\", {\n    enumerable: true,\n    get: function get() {\n      return _task.task;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst { run, inject, addObserver, removeObserver, Helper } = Ember;\n\nfunction padZero(num) {\n    return num.toString().length === 1 ? `0${num}` : num;\n}\n\n// clone of duration format\n\nexport default Helper.extend({\n    clock: inject.service(),\n\n    willDestroy() {\n        removeObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this._super(...arguments);\n    },\n\n    compute(params, { startTime, endTime, durationInMs }) {\n        const shouldTick = (startTime || endTime) && !durationInMs;\n\n        this.set('startTime', startTime);\n        this.set('endTime', endTime);\n        this.set('durationInMs', durationInMs);\n\n        if (shouldTick) {\n            this._setupObserver();\n        }\n\n        return this._formatDuration();\n    },\n\n    _formatDuration: function () {\n        const startTime = this.get('startTime');\n        const endTime = this.get('endTime');\n\n        let durationInMs;\n        if (startTime && endTime) {\n            durationInMs = endTime.diff(startTime);\n        } else if (startTime) {\n            durationInMs = moment().diff(startTime);\n        } else if (endTime) {\n            durationInMs = endTime.diff(moment());\n        } else {\n            durationInMs = this.get('durationInMs');\n        }\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n        const duration = moment.duration(durationInMs);\n        const days = duration.days();\n\n        let hours = duration.hours() + days * 24;\n        let minutes = '';\n        if (hours) {\n            hours = `${hours}:`;\n            minutes = duration.minutes() ? `${padZero(duration.minutes())}:` : '00:';\n        } else {\n            hours = '';\n            minutes = duration.minutes() ? `${duration.minutes()}:` : '0:';\n        }\n\n        const seconds = duration.seconds() ? `${padZero(duration.seconds())}` : '00';\n\n        return `${hours}${minutes}${seconds}`;\n    },\n\n    _setupObserver() {\n        addObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this.get('clock.second'); // start observation\n    },\n\n    _scheduleRecompute() {\n        run.next(this, this.recompute);\n    }\n});\n","import Ember from 'ember';\n\nconst titleForEntityPropertyHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const entity = params[0];\n        const entityType = params[1];\n        const entityPropertyType = params[2];\n        if (entityType === 'phone') {\n            return entity.getPhoneTitleFor(entityPropertyType);\n        }\n        if (entityType === 'email') {\n            return entity.getEmailTitleFor(entityPropertyType);\n        }\n        return '';\n    }\n});\n\nexport default titleForEntityPropertyHelper;\n","define(\"connections-ui/helpers/trunc\", [\"exports\", \"ember-math-helpers/helpers/trunc\"], function (_exports, _trunc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"trunc\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.trunc;\n    }\n  });\n});\n","define(\"connections-ui/helpers/unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/utc\", [\"exports\", \"ember-moment/helpers/utc\"], function (_exports, _utc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"utc\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.utc;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const intl = this.get('intl');\n        const value = params[0];\n        const type = params[1];\n        if (type === 'location') {\n            return intl.lookup('geolocation.formattedLocationName', value);\n        }\n        if (!value || !value.value) {\n            return '';\n        }\n        if (type === 'email') {\n            return value.value;\n        }\n        if (type === 'voice' || type === 'sms') {\n            const number = value.value.number;\n            const ext = value.value.extension;\n            const html = `<span class='number'>${number}</span>`;\n            const extLabel = intl.lookup('entity.fieldTypes.phone.extension');\n            return Ember.String.htmlSafe(\n                ext ? `${html} <span>${extLabel}</span> <span class='extension'>${ext}</span>` : html\n            );\n        }\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/xor\", [\"exports\", \"ember-truth-helpers/helpers/xor\"], function (_exports, _xor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"xor\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.xor;\n    }\n  });\n});\n","export var EVENTS = {\n    INCOMING_CALL: 'incomingCall',\n    TERMINATED_CALL: 'terminatedCall',\n    MISSED_CALL: 'missedCall',\n    STOPPED_RINGING: 'stoppedRinging',\n    PHONE_CONNECTED: 'phoneConnected',\n    WEBRTC_CONNECTION_INCOMING: 'webrtcConnectionIncoming',\n    WEBRTC_CONNECTION_ANSWERED: 'webrtcConnectionAnswered',\n    WEBRTC_CONNECTION_DECLINED: 'webrtcConnectionDeclined',\n    WEBRTC_CONNECTION_STARTED: 'webrtcConnectionStarted',\n    WEBRTC_CONNECTION_ENDED: 'webrtcConnectionEnded'\n};\n","define(\"connections-ui/index\", [\"exports\", \"ember-uuid\"], function (_exports, _emberUuid) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v4;\n    }\n  });\n});\n","import initialize from 'ember-modal-dialog/initializers/add-modals-container';\n\nexport default {\n  name: 'add-modals-container',\n  initialize: initialize\n};\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n  name = config.APP.name;\n  version = config.APP.version;\n}\n\nexport default {\n  name: 'App Version',\n  initialize: initializerFactory(name, version)\n};\n","import ApplicationService from '../services/application';\n\nexport default {\n    name: 'setupApplicationService',\n    after: 'orgspan',\n    initialize(application) {\n        application.register('service:application', ApplicationService);\n        application.inject('controller', 'applicationService', 'service:application');\n        application.inject('route', 'applicationService', 'service:application');\n        application.inject('component', 'applicationService', 'service:application');\n        application.inject('model', 'applicationService', 'service:application');\n    }\n};\n","import Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\nimport AuthenticatedAuthorizedRouteMixin from '../mixins/authenticated-authorized-route-mixin';\n\nexport default {\n    name: 'authenticationSetup',\n    after: 'orgspan',\n    before: 'authenticators',\n\n    initialize: function () {\n        /*\n         * Protecting ALL routes with ember-simple-auth by default\n         *\n         * Use unprotected or unauthenticated route mixins to relax\n         * permissions on your routes\n         */\n        Ember.Route.reopen(AuthenticatedAuthorizedRouteMixin);\n\n        UnauthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n\n        AuthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (!this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport netUtils from '../utils/net';\n\nfunction loadOauthProps() {\n    const { oauthProps } = config;\n    if (oauthProps && typeof oauthProps === 'object' && !Object.prototype.hasOwnProperty.call(oauthProps, 'clientId')) {\n        try {\n            const { runtime } = netUtils.getEnvDetails();\n            // Authenticator will handle `null` from a UI perspective\n            return runtime.name in oauthProps ? oauthProps[runtime.name] : null;\n        } catch (e) {\n            return null;\n        }\n    }\n    return oauthProps;\n}\n\nexport function deprecateJqueryCookie() {\n    const jQueryCookieDeprecation = {\n        id: 'directory-core.deprecate-jquery-cookie',\n        until: '8.0.0',\n        url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md#markdown-header-jquery-cookie'\n    };\n\n    if (Ember.$.cookie) {\n        const cookie = Ember.$.cookie;\n        Ember.$.cookie = function _overrideCookie(name, value) {\n            let message = 'Please use `service:ember-cookies`.read(name) instead of jQuery.$.cookie';\n            if (value) {\n                message = 'Please use `service:ember-cookies`.write(name, value, [opts]) instead of jQuery.$.cookie';\n            }\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return cookie.apply(Ember.$, arguments);\n        };\n    }\n\n    if (Ember.$.removeCookie) {\n        const removeCookie = Ember.$.removeCookie;\n        Ember.$.removeCookie = function _overrideRemoveCookie() {\n            const message = 'Please use `service:ember-cookies`.clear(name) instead of jQuery.$.removeCookie';\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return removeCookie.apply(Ember.$, arguments);\n        };\n    }\n}\n\nexport default {\n    name: 'authenticators',\n    before: 'ember-simple-auth',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        deprecateJqueryCookie();\n\n        application.register('authenticator:oauthProps', Ember.Object.extend(loadOauthProps() || {}));\n        application.inject('authenticator:directory', 'oauthProps', 'authenticator:oauthProps');\n    }\n};\n","import ChatService from '../services/chat';\n\nexport default {\n    name: 'setupChatService',\n    after: 'setupPhoneService',\n    initialize: function (application) {\n        application.register('service:chat', ChatService, { singleton: true, initialize: true });\n        application.inject('service:chat', 'store', 'service:store');\n        application.inject('service:chat', 'session', 'service:session');\n        application.inject('service:chat', 'preferences', 'service:preferences');\n        application.inject('service:chat', 'applicationService', 'service:application');\n        application.inject('service:chat', 'phoneService', 'service:phone');\n\n        application.inject('controller', 'chatService', 'service:chat');\n        application.inject('route', 'chatService', 'service:chat');\n        application.inject('component', 'chatService', 'service:chat');\n    }\n};\n","import Clock from '../services/clock';\n\nexport default {\n  name: 'clock',\n  initialize: function() {\n    var app = arguments[1] || arguments[0];\n    app.register('clock:main', Clock);\n    app.inject('controller', 'clock', 'clock:main');\n    app.inject('component', 'clock', 'clock:main');\n  }\n};\n","export { default, initialize } from 'ember-component-css/initializers/component-styles';\n\nimport Ember from 'ember';\n\nimport StyleNamespacingExtras from '../mixins/style-namespacing-extras';\n\n// eslint-disable-next-line ember/new-module-imports\nEmber.Component.reopen(StyleNamespacingExtras);\n","import ContainerDebugAdapter from 'ember-resolver/resolvers/classic/container-debug-adapter';\n\nexport default {\n  name: 'container-debug-adapter',\n\n  initialize() {\n    let app = arguments[1] || arguments[0];\n\n    app.register('container-debug-adapter:main', ContainerDebugAdapter);\n    app.inject('container-debug-adapter:main', 'namespace', 'application:main');\n  }\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `data-adapter` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'data-adapter',\n  before: 'store',\n  initialize() {}\n};\n","import WebrtcSdkService from '../services/device-profiles-v2';\n\nexport default {\n    name: 'setupDeviceProfilesService',\n    after: 'setupWebrtcSdkService',\n    initialize: function (application) {\n        application.register('service:device-profiles-v2', WebrtcSdkService);\n        application.inject('controller', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('route', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('component', 'device-profiles-v2', 'service:device-profiles-v2');\n    }\n};\n","define(\"connections-ui/initializers/ember-concurrency\", [\"exports\", \"ember-concurrency/initializers/ember-concurrency\"], function (_exports, _emberConcurrency) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.initialize;\n    }\n  });\n});\n","import {initializer as initialize} from 'ember-data-change-tracker';\n\nexport default {\n  name: 'ember-data-change-tracker',\n  after: 'ember-data',\n  initialize\n};\n","import setupContainer from 'ember-data/setup-container';\nimport 'ember-data';\n\n/*\n\n  This code initializes Ember-Data onto an Ember application.\n\n  If an Ember.js developer defines a subclass of DS.Store on their application,\n  as `App.StoreService` (or via a module system that resolves to `service:store`)\n  this code will automatically instantiate it and make it available on the\n  router.\n\n  Additionally, after an application's controllers have been injected, they will\n  each have the store made available to them.\n\n  For example, imagine an Ember.js application with the following classes:\n\n  App.StoreService = DS.Store.extend({\n    adapter: 'custom'\n  });\n\n  App.PostsController = Ember.Controller.extend({\n    // ...\n  });\n\n  When the application is initialized, `App.ApplicationStore` will automatically be\n  instantiated, and the instance of `App.PostsController` will have its `store`\n  property set to that instance.\n\n  Note that this code will only be run if the `ember-application` package is\n  loaded. If Ember Data is being used in an environment other than a\n  typical application (e.g., node.js where only `ember-runtime` is available),\n  this code will be ignored.\n*/\n\nexport default {\n  name: 'ember-data',\n  initialize: setupContainer\n};\n","import ENV from '../config/environment';\nimport Configuration from 'ember-simple-auth/configuration';\nimport setupSession from 'ember-simple-auth/initializers/setup-session';\nimport setupSessionService from 'ember-simple-auth/initializers/setup-session-service';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(registry) {\n    const config = ENV['ember-simple-auth'] || {};\n    config.baseURL = ENV.rootURL || ENV.baseURL;\n    Configuration.load(config);\n\n    setupSession(registry);\n    setupSessionService(registry);\n  }\n};\n","define(\"connections-ui/initializers/engines\", [\"exports\", \"ember-engines/initializers/engines\"], function (_exports, _engines) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.initialize;\n    }\n  });\n});\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nexport function initialize() {\n  var application = arguments[1] || arguments[0];\n  if (config.exportApplicationGlobal !== false) {\n    var theGlobal;\n    if (typeof window !== 'undefined') {\n        theGlobal = window;\n    } else if (typeof global !== 'undefined') {\n        theGlobal = global\n    } else if (typeof self !== 'undefined') {\n        theGlobal = self;\n    } else {\n       // no reasonable global, just bail\n       return;\n    }\n\n    var value = config.exportApplicationGlobal;\n    var globalName;\n\n    if (typeof value === 'string') {\n      globalName = value;\n    } else {\n      globalName = Ember.String.classify(config.modulePrefix);\n    }\n\n    if (!theGlobal[globalName]) {\n      theGlobal[globalName] = application;\n\n      application.reopen({\n        willDestroy: function() {\n          this._super.apply(this, arguments);\n          delete theGlobal[globalName];\n        }\n      });\n    }\n  }\n}\n\nexport default {\n  name: 'export-application-global',\n\n  initialize: initialize\n};\n","import throttled from \"rate-limit-computed/throttled\";\nimport debounced from \"rate-limit-computed/debounced\";\n\nexport default {\n  name: 'extend-ember-computed',\n  initialize: function() {\n    Ember.computed.throttle = throttled;\n    Ember.computed.debounce = debounced;\n  }\n};\n","import FieldConfig from '../field-config/field-config';\n\nimport PersonFieldConfig from '../field-config/entities/person';\nimport GroupFieldConfig from '../field-config/entities/group';\nimport OrgFieldConfig from '../field-config/entities/org';\nimport ExternalContactFieldConfig from '../field-config/entities/external-contact';\n\nfunction _register(application, id, config) {\n    application.register(id, config);\n}\n\nfunction initialize(application) {\n    _register(application, 'field-config:base', FieldConfig);\n    _register(application, 'field-config:person', PersonFieldConfig);\n    _register(application, 'field-config:group', GroupFieldConfig);\n    _register(application, 'field-config:org', OrgFieldConfig);\n    _register(application, 'field-config:externalContact', ExternalContactFieldConfig);\n}\n\nexport default {\n    name: 'setupFieldConfig',\n    after: 'orgspan',\n    initialize\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `injectStore` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'injectStore',\n  before: 'store',\n  initialize() {}\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nconst MainInitializer = {\n    name: 'orgspan',\n    after: 'ember-data',\n\n    initialize: function (application) {\n        // TODO: THIS IS BAD...remove later\n        window.Orgspan = application;\n\n        application.inject('component', 'store', 'service:store');\n\n        /*\n         * Ember is supposed to noop Ember.deprecate calls in production builds:\n         * http://emberjs.com/api/classes/Ember.html#method_deprecate\n         * However, this is a WIP:\n         * https://github.com/ember-cli/rfcs/pull/50\n         *\n         * Until this RFC is implemented, kill the deprecation chain which will\n         * result in noop (e.g. no logging) in non-dev environments.\n         */\n        if (config.environment !== 'development') {\n            // Register an empty function to break the deprecation chain call\n            Ember.Debug.registerDeprecationHandler(function () {});\n        }\n    }\n};\n\nif (config.environment === 'test') {\n    MainInitializer.after = ['ember-data'];\n}\n\nexport default MainInitializer;\n","import Provider from '../media-providers/provider';\nimport ZoomProvider from '../media-providers/zoom';\nimport PureCloudProvider from '../media-providers/purecloud';\nimport TeamsProvider from '../media-providers/teams';\n\nfunction _register(application, id, config) {\n    application.register(id, config, { singleton: false });\n}\n\nfunction initialize(application) {\n    _register(application, 'media-provider:base', Provider);\n    _register(application, 'media-provider:zoom', ZoomProvider);\n    _register(application, 'media-provider:purecloud', PureCloudProvider);\n    _register(application, 'media-provider:teams', TeamsProvider);\n}\n\nexport default {\n    name: 'setupMediaProviders',\n    after: 'orgspan',\n    initialize\n};\n","import PhoneService from '../services/phone';\n\nexport default {\n    name: 'setupPhoneService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:phone', PhoneService, { singleton: true, initialize: true });\n        application.inject('service:phone', 'store', 'service:store');\n        application.inject('service:phone', 'session', 'service:session');\n        application.inject('service:phone', 'preferences', 'service:preferences');\n        application.inject('service:phone', 'applicationService', 'service:application');\n\n        application.inject('route', 'phoneService', 'service:phone');\n        application.inject('component', 'phoneService', 'service:phone');\n    }\n};\n","import PreferencesService from '../services/preferences';\n\nexport default {\n    name: 'setupPreferencesService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:preferences', PreferencesService);\n        application.inject('controller', 'preferences', 'service:preferences');\n        application.inject('route', 'preferences', 'service:preferences');\n        application.inject('component', 'preferences', 'service:preferences');\n    }\n};\n","define(\"connections-ui/initializers/route-styles\", [\"exports\", \"ember-component-css/initializers/route-styles\"], function (_exports, _routeStyles) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.initialize;\n    }\n  });\n});\n","import ApplicationService from 'connections-ui/services/application';\nimport netUtils from '../utils/net';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nexport default {\n    name: 'service-discovery',\n\n    initialize: function (application) {\n        application.deferReadiness();\n        if (isTesting) {\n            ApplicationService.reopen({\n                authUri: null\n            });\n        } else {\n            const instanceProperties = {};\n            const runtimePublicDomainName = netUtils.getEnvDetails().runtime\n                ? netUtils.getEnvDetails().runtime.publicDomainName\n                : null;\n            if (runtimePublicDomainName) {\n                instanceProperties.authUri = 'https://login.' + runtimePublicDomainName;\n                instanceProperties.purecloudV2BaseUri = 'https://api.' + runtimePublicDomainName;\n                instanceProperties.cobrowseUri = 'https://cobrowse.' + runtimePublicDomainName;\n                instanceProperties.purecloudAppsUri = 'https://apps.' + runtimePublicDomainName + '/';\n                instanceProperties.streamingServiceUri = 'wss://streaming.' + runtimePublicDomainName;\n            } else {\n                instanceProperties.authUri = null;\n            }\n            ApplicationService.reopen(instanceProperties);\n            application.advanceReadiness();\n        }\n    }\n};\n","import SessionService from '../services/session';\n\nexport default {\n    name: 'setupSessionService',\n    after: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:session', SessionService);\n        application.inject('service:session', 'application', 'service:application');\n        application.inject('controller', 'session', 'service:session');\n        application.inject('route', 'session', 'service:session');\n        application.inject('component', 'session', 'service:session');\n        application.inject('adapter', 'session', 'service:session');\n    }\n};\n","import { loadTheme, setThemeClass } from '../utils/theme-loader';\n\nexport default {\n    name: 'set-application-theme',\n    before: 'orgspan',\n    /**\n     * Sets the theme to an out-of-the-box supported theme until FT's load in, and then will update the theme\n     * of the application to the actual cached theme if the FT is supported in the Environment. That way the\n     * theme will never show until it's confirmed to be supported no matter the value of the theme cookie.\n     */\n    initialize: () => setThemeClass(loadTheme())\n};\n","const require = window.requirejs;\n\nexport function initialize(instance) {\n    const regex = /^ember-webrtc-components\\/components\\/([\\w\\-/]+)\\/component/;\n    const packages = Object.keys(require._eak_seen);\n    const paths = packages.filter(path => regex.test(path));\n    paths.forEach(path => {\n        const matches = path.match(regex);\n        const name = matches && matches.length && matches[matches.length - 1];\n        instance.register(`component:${name}`, require(path).default);\n    });\n}\n\nexport default {\n    name: 'setup-webrtc-components',\n    initialize\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `store` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'store',\n  after: 'ember-data',\n  initialize() {}\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `transforms` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'transforms',\n  before: 'store',\n  initialize() {}\n};\n","import WebrtcSdkService from '../services/webrtc-sdk';\nimport 'genesys-cloud-webrtc-sdk';\n\nexport default {\n    name: 'setupWebrtcSdkService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:webrtc-sdk', WebrtcSdkService);\n        application.inject('controller', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('route', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('component', 'webrtc-sdk', 'service:webrtc-sdk');\n    }\n};\n","import WebrtcService from 'ember-webrtc-components/services/webrtc';\n\nexport default {\n    name: 'setupWebrtcService',\n    after: 'setupChatService',\n    initialize: function (application) {\n        application.register('service:webrtc', WebrtcService, { singleton: true, initialize: true });\n        application.inject('service:webrtc', 'store', 'service:store');\n        application.inject('service:webrtc', 'session', 'service:session');\n        application.inject('service:webrtc', 'preferences', 'service:preferences');\n        application.inject('service:webrtc', 'applicationService', 'service:application');\n        application.inject('service:webrtc', 'phoneService', 'service:phone');\n        application.inject('service:webrtc', 'chatService', 'service:chat');\n\n        application.inject('controller', 'webrtcService', 'service:webrtc');\n        application.inject('route', 'webrtcService', 'service:webrtc');\n        application.inject('component', 'webrtcService', 'service:webrtc');\n    }\n};\n","import WebrtcSettings from '../services/webrtc-settings';\n\nexport default {\n    name: 'setupWebrtcSettingsService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:webrtc-settings', WebrtcSettings);\n        application.inject('controller', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('route', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('component', 'webrtc-settings', 'service:webrtc-settings');\n    }\n};\n","export function initialize(instance) {\n    instance.lookup('controller:application');\n}\n\nexport default {\n    name: 'attach-application-controller',\n    initialize\n};\n","export default {\n    name: 'attach-application-session',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('session', instance.lookup('service:session'));\n    }\n};\n","define(\"connections-ui/instance-initializers/backburner-debug\", [\"exports\", \"ember-purecloud-components/instance-initializers/backburner-debug\"], function (_exports, _backburnerDebug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.initialize;\n    }\n  });\n});\n","define(\"connections-ui/instance-initializers/conversation-service\", [\"exports\", \"ember-purecloud-components/instance-initializers/conversation-service\"], function (_exports, _conversationService) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.initialize;\n    }\n  });\n});\n","export function initialize(applicationInstance) {\n    applicationInstance.lookup('service:embedded');\n}\n\nexport default {\n    name: 'embedded',\n    initialize: initialize\n};\n","import initializeStoreService from 'ember-data/instance-initializers/initialize-store-service';\n\nexport default {\n  name: \"ember-data\",\n  initialize: initializeStoreService\n};\n","/* globals requirejs, Intl */\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nimport Ember from 'ember';\nimport ENV from '../config/environment';\nimport links from 'ember-intl/utils/links';\n\nconst { warn } = Ember;\n\nfunction filterBy(type) {\n  return Object.keys(requirejs._eak_seen).filter((key) => {\n    return key.indexOf(`${ENV.modulePrefix}\\/${type}\\/`) === 0;\n  });\n}\n\nexport function instanceInitializer(instance) {\n  let service;\n\n  if (typeof instance.lookup === 'function') {\n    service = instance.lookup('service:intl');\n  } else {\n    service = instance.container.lookup('service:intl');\n  }\n\n  if (typeof Intl === 'undefined') {\n    warn(`[ember-intl] Intl API is unavailable in this environment.\\nSee: ${links.polyfill}`, false, {\n      id: 'ember-intl-undefined-intljs'\n    });\n  }\n\n  const cldrs = filterBy('cldrs');\n\n  if (!cldrs.length) {\n    warn('[ember-intl] project is missing CLDR data\\nIf you are asynchronously loading translation, see: ${links.asyncTranslations}.', false, {\n      id: 'ember-intl-missing-cldr-data'\n    });\n  } else {\n    cldrs.map((moduleName) => requirejs(moduleName, null, null, true)['default'])\n      .forEach((locale) => locale.forEach(service.addLocaleData));\n  }\n\n  filterBy('translations').forEach((moduleName) => {\n    const localeSplit = moduleName.split('\\/');\n    const localeName = localeSplit[localeSplit.length - 1];\n    service.addTranslations(localeName, requirejs(moduleName, null, null, true)['default']);\n  });\n}\n\nexport default {\n  name: 'ember-intl',\n  initialize: instanceInitializer\n}\n","import setupSessionRestoration from 'ember-simple-auth/instance-initializers/setup-session-restoration';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(instance) {\n    setupSessionRestoration(instance);\n  }\n};\n","import LazyRenderWrapper from 'ember-tooltips/components/lazy-render-wrapper';\n\nexport function initialize() {\n    // this can be removed after ember-tooltips version is bumped to 3.0.\n    // 2.5 defaults this property to off.\n    LazyRenderWrapper.reopen({\n        enableLazyRendering: true\n    });\n}\n\nexport default {\n    name: 'ember-tooltips',\n    initialize\n};\n","import EntityContactGroupComponent from '../components/entity-contact-group-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityContactGroupComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-contact-group-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityFavoriteComponent from 'ember-purecloud-components/components/entity-favorite/component';\n\nexport function initialize() {\n    EntityFavoriteComponent.reopen({\n        favorites: Ember.inject.service(),\n        toggleFavorite(entity) {\n            this.get('favorites').toggleFavorite(entity);\n        }\n    });\n}\n\nexport default {\n    name: 'entity-favorite',\n    initialize\n};\n","import EntityHoverCard from '../components/entity-hover-card-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityHoverCard.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-hover-card-v2',\n    initialize\n};\n","import EntityImageComponent from '../components/entity-image-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityImageComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-image-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityLocationComponent from 'ember-purecloud-components/components/entity-location/component';\n\nexport function initialize() {\n    EntityLocationComponent.reopen({\n        session: Ember.inject.service(),\n        geolocation: Ember.inject.service(),\n\n        self: Ember.computed.reads('session.person'),\n        isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled')\n    });\n}\n\nexport default {\n    name: 'entity-location',\n    initialize\n};\n","import Validators from '../components/entity-fields/validators';\n\nexport function initialize(application) {\n    Validators.reopen(application.ownerInjection());\n}\n\nexport default {\n    name: 'inject-owner',\n    initialize\n};\n","import manifest from '../config/asset-manifest';\n\n/**\n * Initializes the AssetLoader service with a generated asset-manifest.\n */\nexport function initialize(instance) {\n  const service = instance.lookup('service:asset-loader');\n  service.pushManifest(manifest);\n}\n\nexport default {\n  name: 'load-asset-manifest',\n  initialize\n};\n","import Ember from 'ember';\nimport PresenceLabelComponent from 'ember-purecloud-components/components/presence-label/component';\n\nexport function initialize() {\n    PresenceLabelComponent.reopen({\n        chat: Ember.inject.service(),\n        isChatEnabled: Ember.computed.reads('chat.enabled')\n    });\n}\n\nexport default {\n    name: 'presence-label',\n    initialize\n};\n","export default {\n  name: 'setupRecordingService',\n  initialize (instance) {\n    instance.lookup('service:recording');\n  }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    name: 'reopen-component',\n\n    initialize(instance) {\n        const session = instance.lookup('service:session');\n        const preferences = instance.lookup('service:preferences');\n\n        Ember.Component.reopen({\n            bubbleAction(data) {\n                try {\n                    this.triggerAction(data);\n                } catch (e) {\n                    // Turn on to debug component stack\n                    // Ember.Logger.warn(e.message, e.stack);\n                }\n\n                const parentView = this.get('parentView');\n                if (parentView && parentView.bubbleAction) {\n                    parentView.bubbleAction(data);\n                }\n            }\n        });\n\n        Ember.Component.reopen({\n            init() {\n                this._super();\n\n                var services = this.get('needsServices');\n                if (!services) {\n                    services = [];\n                }\n\n                var current = this.get('services');\n                if (!current) {\n                    current = {};\n                }\n\n                _.each(services, function (name) {\n                    var service = instance.lookup('service:' + name);\n                    Ember.set(current, name, service);\n                });\n\n                this.set('services', current);\n\n                if (!this.get('session')) {\n                    this.set('session', session);\n                }\n\n                if (!this.get('preferences')) {\n                    this.set('preferences', preferences);\n                }\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nconst { inject, observer, Route } = Ember;\n\nexport default {\n    name: 'reopen-route',\n\n    initialize() {\n        Route.reopen({\n            intl: inject.service(),\n            application: inject.service(),\n\n            routeTitle: '',\n\n            updateRouteTitle: observer(\n                'routeName',\n                'routeTitle',\n                'application.{orgName,currentRouteName}',\n                function () {\n                    let parts = [];\n                    let routeName = this.get('routeName');\n                    let routeTitle = this.get('routeTitle');\n                    let appRoute = this.get('application.currentRouteName') || '';\n                    let orgName = this.get('application.orgName');\n\n                    if (!routeTitle || appRoute.indexOf(routeName) === -1) {\n                        return;\n                    }\n\n                    parts.push(typeof routeTitle === 'function' ? routeTitle.call(this) : routeTitle);\n\n                    if (orgName) {\n                        parts.push(orgName);\n                    }\n\n                    window.top.document.title = parts.join(' - ');\n                }\n            )\n        });\n    }\n};\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport HostedContext from '../utils/hosted-context';\nimport { parseRuntimeCustom } from '../utils/net';\n\nexport default {\n    name: 'set-application-service-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        const service = instance.lookup('service:application');\n        service.setProperties(application.getProperties('urlprefix', 'semver', 'version', 'context'));\n        const context = HostedContext.create(instance.ownerInjection());\n        service.set('hostedContext', context);\n        service.set('store', instance.lookup('service:store'));\n        if (isTesting) {\n            // Runtime will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n            service.set('runtime', null);\n        } else {\n            try {\n                const runtime = parseRuntimeCustom();\n                if (runtime) service.set('runtime', parseRuntimeCustom());\n                else {\n                    throw new Error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js');\n                }\n            } catch (error) {\n                Ember.Logger.error(error);\n                // Setting the errorState on the applicaiton service will route to the maintenance mode page.\n                service.set('errorState', { type: 'invalidEnv' });\n                service.set('runtime', null);\n            }\n        }\n        application.set('applicationService', service);\n    }\n};\n","export default {\n    name: 'set-application-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('instance', instance);\n        application.set('ajax', instance.lookup('ajax:application'));\n        application.set('permissions', instance.lookup('permissions:application'));\n\n        // Probably shouldn't access these this way...might be one of those separation of concerns problems\n        application.set('store', instance.lookup('service:store'));\n        application.set('router', instance.lookup('router:main'));\n    }\n};\n","import Ember from 'ember';\nimport { initializeMarkdownRendering } from '../utils/markdown';\nimport { initializeEmojiRendering } from 'ember-purecloud-components/utils/emoji';\n\nexport default {\n    name: 'setup-application',\n    initialize: function (instance) {\n        const application = instance.lookup('application:main');\n        // looking up sound service here loads all of the sounds and creates handlers for onplay and onstop events.\n        // see PCDWEBK-3861 for more info.\n        const sound = instance.lookup('service:sound'); // eslint-disable-line no-unused-vars\n\n        Ember.$(window).on('beforeunload', function (event) {\n            return Ember.run(() => {\n                // mailto: links cause beforeunload to fire.\n                let isLink = false;\n                let $target = Ember.$(Ember.get(event, 'target.activeElement'));\n                let href = $target.attr('href');\n                if (!href) {\n                    $target = Ember.$($target).closest('a');\n                    href = $target.attr('href');\n                }\n                if (href) {\n                    isLink = href.indexOf('mailto') > -1 || href.indexOf('tel') > -1;\n                }\n                if (isLink) {\n                    return;\n                }\n            });\n        });\n\n        const urlPrefix = application.get('urlprefix');\n\n        initializeEmojiRendering(urlPrefix);\n\n        const isApplicationRoute = function (href) {\n            return !!/^\\/?#\\/.*\\/[a-f0-9]{24}/.test(href) || !!/^\\/?#\\/.*\\/[a-z0-9-]{36}$/i.test(href);\n        };\n\n        initializeMarkdownRendering(isApplicationRoute);\n    }\n};\n","export default {\n    name: 'setup-apps-api-handlers',\n    initialize(instance) {\n        let apiHandlers = [];\n        let apiHandlerKeys = instance.lookup('apps-api-handler:keys');\n        if (apiHandlerKeys && apiHandlerKeys.length) {\n            apiHandlerKeys.forEach(currHandlerKey => {\n                apiHandlers.push(instance.lookup(currHandlerKey));\n            });\n        }\n\n        instance.lookup('service:apps').set('globalApiHandlers', apiHandlers);\n    }\n};\n","import Ember from 'ember';\n\nexport function initialize(instance) {\n    const stashLogger = instance.lookup('service:stash-logger');\n    Ember.Logger = stashLogger;\n    Ember.onerror = function (error) {\n        const status = error ? Ember.get(error, 'status') : null;\n        if (status === 200) {\n            return null;\n        } else if (status === 418) {\n            const applicationService = instance.lookup('service:application');\n            const session = applicationService.get('session');\n            if (session) {\n                session.logout();\n            }\n        }\n\n        // Sometimes Ember RSVP triggers the onError, and sometimes it doesn't,\n        // so this will prevent the same error being logged multiple times\n        if (error._logged === true || error === 'Request Cancelled') {\n            return;\n        }\n\n        if (typeof error === 'object') {\n            error._logged = true;\n        }\n\n        return stashLogger.error(`Global Error Caught: ${error}`);\n    };\n\n    Ember.RSVP.on('error', function (error) {\n        if (!error) {\n            return; // https://github.com/simplabs/ember-simple-auth/issues/439\n        }\n        if (!instance.isDestroyed) {\n            Ember.onerror(error);\n        }\n    });\n\n    const nrOnError = window.onerror;\n    window.onerror = function () {\n        if (nrOnError) {\n            nrOnError.apply(nrOnError, arguments);\n        }\n        stashLogger.error(arguments);\n        return true; // stash logger will handle and log it\n    };\n}\n\nexport default {\n    name: 'setup-error-handling',\n    initialize: initialize\n};\n","function hasQueryParam(param) {\n    const search = window.location.search;\n\n    if (!search) {\n        return false;\n    }\n\n    const params = new URLSearchParams(window.location.search);\n\n    return params.get(param) === 'true';\n}\n\nexport function initialize(instance) {\n    ['disableSoftphone', 'disableProactiveDevicePermissions'].forEach(param => {\n        if (hasQueryParam(param)) {\n            const webrtc = instance.lookup('service:webrtc');\n            webrtc.logger.info(`Setting webrtc.${param} to true based on query param`);\n            webrtc.set(param, true);\n        }\n    });\n}\n\nexport default {\n    name: 'webrtc',\n    initialize\n};\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst TARGET_PRESENCE = Object.freeze({\n    BUSY: 'busy',\n    MEETING: 'meeting',\n    OFFLINE: 'offline'\n});\n\nexport default Ember.Object.extend(LoggerMixin, {\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    // Required props\n\n    /**\n     * User associated with this media provider instance (usually the current UI session user)\n     */\n    user: null,\n\n    /**\n     * Type of media provider\n     * Currently only \"video\"\n     */\n    type: null,\n\n    /**\n     * Unique id among the video provider implementations\n     */\n    id: null,\n\n    /**\n     * Label for the media provider (can be a computed property)\n     */\n    label: null,\n\n    /**\n     * Used to store stateful data that can be used in the UI\n     */\n    data: null,\n\n    /**\n     * Path to an image used to launch a video chat inside of the video panel\n     */\n    launchVideoImage: Ember.computed(function () {\n        return '';\n    }),\n\n    disabled: Ember.computed(\n        'user',\n        'room.oneToOneTarget',\n        'room.oneToOneTarget.activities.{presence}',\n        'user.activities.{presence}',\n        function () {\n            let presence = this.getTargetPresence();\n            return (\n                presence === TARGET_PRESENCE.BUSY ||\n                presence === TARGET_PRESENCE.MEETING ||\n                presence === TARGET_PRESENCE.OFFLINE\n            );\n        }\n    ),\n\n    disabledMessage: Ember.computed('disabled', 'user.name', 'room.oneToOneTarget.name', function () {\n        let presence = this.getTargetPresence();\n        let name = this.get('user.name') || this.get('room.oneToOneTarget.name');\n        if (presence === TARGET_PRESENCE.OFFLINE) {\n            return this.get('intl').t('ewc.userOffline', { name });\n        }\n        if (presence === TARGET_PRESENCE.BUSY || presence === TARGET_PRESENCE.MEETING) {\n            return this.get('intl').t('ewc.userBusy', { name });\n        }\n        return this.get('intl').t('common.disabled');\n    }),\n\n    getTargetPresence() {\n        let user = this.get('user');\n        let room = this.get('room');\n\n        if (user) {\n            const gcPresence = user.get('primaryPresence');\n            if (gcPresence) {\n                return (Ember.get(gcPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        if (room && room.get('oneToOneTarget')) {\n            const profile = room.get('oneToOneTarget');\n            const chatUserPresence = profile.get('primaryPresence');\n            if (chatUserPresence) {\n                return (Ember.get(chatUserPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        return '';\n    },\n\n    // Optional props\n\n    /**\n     * Optional chat room\n     * If you have a media provider that associates itself with a room (video),\n     * you can set this property to hold that state\n     */\n    room: null,\n\n    /**\n     * Optional handler (can be async)\n     * If the provider needs to handle user action (clicking something in the interface)\n     * then you can provider that function here\n     */\n    action: () => {},\n\n    /**\n     * Optional data loader\n     */\n    loadData: () => {},\n\n    /**\n     * Optional handler\n     * If your media provider action could not be run, this handler will be called\n     * It can be used to show an error notification\n     */\n    showRunErrorNotification: () => {},\n\n    /**\n     * Indicates if this provider is available as a feature to the current user.\n     * Implementations can utilize feature toggles, org settings, user access controls, etc.\n     * as needed.\n     *\n     * Used to provide access to various parts of the UI for a media provider\n     * Currently mostly used for chat widget rendering and video dropdowns\n     */\n    haveAccess: Ember.computed(function () {\n        return true;\n    }),\n\n    isActive: Ember.computed('id', 'mediaProviders.activeProvider', function () {\n        const active = this.get('mediaProviders.activeProvider');\n        return active && active.get('id') === this.get('id');\n    }),\n\n    notification: Ember.computed(function () {\n        return null;\n    }),\n\n    // Internal API below\n\n    /**\n     * Check if we can run an action based on current provider state\n     * For example, you cannot join a second video call while on video\n     */\n    canRunAction(options) {\n        if (this.type !== 'video') {\n            return true;\n        }\n\n        if (this.get('mediaProviders.usingVideoProvider') || this.get('webrtc.activeRoom.showingVideo')) {\n            if (options.allowMultipleMeetings) {\n                return true;\n            }\n            this.logger.warn('Media Provider: Cannot run video action while on video', {\n                provider: this\n            });\n            return false;\n        } else if (this.get('application.isPopout')) {\n            this.logger.warn('Media Provider: Cannot run video action while in popout', {\n                provider: this\n            });\n            return false;\n        }\n\n        return true;\n    },\n\n    /**\n     * Grabs the jid for a user or room. Method is used in the purecloud, teams, and zoom provider\n     * classes.\n     * @param {*} options\n     * @returns string (jid) or undefined\n     */\n    getJid(options) {\n        let user = this.get('user');\n        if (!user && options) {\n            user = options.user;\n        }\n        let jid;\n        if (user) {\n            // user could be different types of entities, so access jid both ways\n            jid = user.get('chat.jabberId') || user.get('jid');\n        } else if (this.get('room')) {\n            jid = this.get('room.jid');\n        }\n        return jid;\n    },\n\n    init() {\n        this._super(...arguments);\n\n        const originalAction = this.action;\n        this.action = async function action(options = {}) {\n            const _options = Object.assign(options, {\n                user: this.get('user')\n            });\n\n            if (!this.canRunAction(options) && this.showRunErrorNotification) {\n                this.showRunErrorNotification(options);\n                return;\n            }\n\n            if (this.get('haveEmbeddedClientAccess')) {\n                this.get('mediaProviders').set('activeProvider', this);\n            }\n            try {\n                await originalAction.apply(this, [_options]);\n            } catch (err) {\n                this.get('mediaProviders').set('activeProvider', null);\n                this.logger.error('Media Provider: Error running video action', {\n                    err,\n                    provider: this.get('id')\n                });\n            }\n        }.bind(this);\n    }\n});\n","import Ember from 'ember';\nimport Provider from './provider';\n\nexport const PROVIDER_ID = 'purecloud';\n\nexport default Provider.extend({\n    intl: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: PROVIDER_ID,\n    data: {},\n    type: 'video',\n    component: 'webrtc-panel',\n\n    init() {\n        this._super(...arguments);\n\n        this.get('webrtc.activeRoom.showingVideo');\n    },\n\n    launchVideoImage: Ember.computed('application.urlprefix', function () {\n        return `${this.get('application.urlprefix')}assets/images/svg/Genesys_Cloud-Expanded-landscape-color.svg`;\n    }),\n\n    haveAccess: Ember.computed('user.profile.content', 'room', 'webrtc.videoCallCapable', function () {\n        if (!this.get('webrtc.videoCallCapable')) {\n            return false;\n        }\n\n        let user = this.get('room.oneToOneTarget') || this.get('user.profile.content');\n        if (!user) {\n            // GC video should just generally always be available\n            return true;\n        }\n\n        return !user.get('isOffline');\n    }),\n\n    action(options) {\n        let jid = this.getJid(options);\n        this.get('application').openChatRoomWithVideo(jid, false);\n    },\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.purecloud.label').toString();\n    }),\n\n    showingVideoChanged: Ember.observer('webrtc.activeRoom.showingVideo', function () {\n        if (!this.get('webrtc.activeRoom.showingVideo') && this.get('isActive')) {\n            this.set('mediaProviders.activeProvider', null);\n        }\n    })\n});\n","import Ember from 'ember';\nimport LoggerMixin from '../mixins/logger';\nimport Provider from './provider';\n\nexport default Provider.extend(LoggerMixin, {\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    /**\n     * Teams provider id.\n     * Will be used in chat service's sendVideoProviderNotification method. 'id' will\n     * be the stanza name which will render the teams-notification component for Teams in ember-chat-components.\n     */\n    id: 'teams',\n    type: 'video',\n    /**\n     * web-directory component that will render the Teams client app in an iframe that we will use\n     * for communicating from web-directory -> Teams client app. Will allow us to create Teams meetings\n     * from '/teams' command and the media-providers/video-dropdown component. This component is rendered\n     * in the video-panel\n     */\n    component: 'teams-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\n\n    /**\n     * Provider launch image. Would be rendered in webrtc panel.\n     * Note: we are not currently supporting 3rd Party embedded video, therefore, this\n     * property is not technically needed but may be required in the future.\n     */\n    launchVideoImage: Ember.computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/msteams-integration/msteams-icon.png';\n    }),\n\n    /**\n     * Provider label\n     */\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.teams.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.readOnly('permissions.canViewTeamsMeetings'),\n\n    /**\n     * This is remnant from Zoom provider. Leaving it here and defaulting as false as we\n     * may implement a MS Teams Meeting embedded within Genesys Cloud.\n     */\n    haveEmbeddedClientAccess: false,\n\n    /**\n     * Data is used in chat service's sendVideoProviderNotification method to build stanza.\n     * This is set during runtime.\n     */\n    data: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.teams.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\n    })\n});\n","export function queryParamsToObject(params) {\n    if (!params) {\n        return {};\n    }\n\n    return params.split('&').reduce((acc, param) => {\n        let keyValue = param.split('=');\n        if (keyValue.length === 2) {\n            let [key, value] = keyValue;\n            acc[key] = value;\n        }\n        return acc;\n    }, {});\n}\n\nexport function buildAuthUrl(baseUrl, authConfig) {\n    let query = Object.keys(authConfig)\n        .map(key => {\n            let value = authConfig[key];\n            return `${key}=${value}`;\n        })\n        .join('&');\n    return `${baseUrl}?${query}`;\n}\n\nexport function performIframeAuth(authUrl, authConfig) {\n    return new Promise((resolve, reject) => {\n        let url = buildAuthUrl(authUrl, authConfig);\n\n        let iframe = document.createElement('iframe');\n        iframe.style = 'height:0;width:0;position:absolute;z-index:0';\n        iframe.src = url;\n        document.body.appendChild(iframe);\n\n        let timer, cancelTimer;\n\n        timer = setInterval(function () {\n            try {\n                if (iframe) {\n                    let hash = iframe.contentWindow.location.hash;\n                    let search = iframe.contentWindow.location.search;\n                    if (hash) {\n                        let params = queryParamsToObject(hash.substring(1));\n                        let accessToken = params['access_token'];\n                        if (accessToken) {\n                            document.body.removeChild(iframe);\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            resolve(accessToken);\n                        }\n                    }\n                    if (search) {\n                        let params = queryParamsToObject(search.substring(1));\n                        let code = params['code'];\n                        if (code) {\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            document.body.removeChild(iframe);\n                            resolve(code);\n                        }\n                    }\n                }\n            } catch (e) {\n                // Ignore for now\n            }\n        }, 20);\n\n        // After 5 seconds, if we havent resolved, exit\n        // A properly authed client shouldnt take long on the redirect\n        cancelTimer = setTimeout(function () {\n            window.clearTimeout(cancelTimer);\n            window.clearInterval(timer);\n            reject(new Error('Timeout'));\n        }, 5000);\n    });\n}\n","import Ember from 'ember';\nimport Provider from './provider';\n\nexport default Provider.extend({\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: 'zoom',\n    type: 'video',\n    component: 'zoom-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    launchVideoImage: Ember.computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/zoom-integration/zoom-lg.png';\n    }),\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.zoom.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\n\n    haveEmbeddedClientAccess: false,\n\n    // Data is used by the chat widget sender to build stanza\n    // This is set during runtime\n    data: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.zoom.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\n    })\n});\n","import Ember from 'ember';\nimport netUtils from 'ember-purecloud-components/utils/net';\n\nconst { inject } = Ember;\nconst INTERNAL_DL_MATCHER = /\\/api\\/v[12]\\/downloads\\/([\\w-+]+).*$/i;\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n\n    embeddedUrl: function (imageUrl) {\n        const url = imageUrl;\n        const isLocal = this.get('application.runtime.local');\n\n        if (!url || isLocal) {\n            return url;\n        }\n\n        try {\n            // Only transform internal PC urls\n            if (!netUtils.isExternalDomain(url)) {\n                const matches = INTERNAL_DL_MATCHER.exec(url);\n                if (matches && matches[1]) {\n                    const id = matches[1];\n                    return `${this.get('application').pcV2Uri([\n                        'api/v2/apps/downloads',\n                        id\n                    ])}?contentDisposition=INLINE`;\n                }\n            }\n        } catch (error) {\n            // Failed to check URL, returning unmodified url below\n            this.get('logger').info(`ACD embeddedUrl`, {\n                error,\n                imageUrl: url\n            });\n            return url;\n        }\n        return url;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'connections-ui/utils/dates';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    personGuid: Ember.computed.reads('session.person.guid'),\n\n    // TODO: Ultimately, we need to store these values somewhere other\n    // than the model. We may introduce a persistance service that will\n    // allow us to store interaction properties by id and persist them\n    // back to the public API via the preference API.\n    modelSet(model, property, value) {\n        if (model && !Ember.get(model, 'isDestroyed') && !Ember.get(model, 'isDestroying')) {\n            model.set(property, value);\n        }\n    },\n\n    _displayApiError(error, fallbackMessageKey) {\n        const code = _.get(error, 'responseJSON.code');\n        const key = code && `error.${code}`;\n        this._displayError(key && this.get('intl').exists(key) ? key : fallbackMessageKey);\n    },\n\n    _displayError(messageKey, messageKeyOption) {\n        const message = this.get('intl').t(messageKey, messageKeyOption).toString();\n        this.get('notification').error(null, message, {});\n    },\n\n    _displayNotification(titleKey, messageKey) {\n        let title = null;\n        let message = null;\n\n        if (titleKey) {\n            title = this.get('intl').t(titleKey).toString();\n        }\n\n        if (messageKey) {\n            message = this.get('intl').t(messageKey).toString();\n        }\n\n        this.get('notification').info(title, message);\n    },\n\n    _isInDOM() {\n        const isDestroyed =\n            this.get('isDestroyed') ||\n            this.get('isDestroying') ||\n            !this.get('interaction') ||\n            this.get('interaction.isDestroyed') ||\n            this.get('interaction.isDestroying');\n\n        if (isDestroyed) {\n            return false;\n        } else if (this.get('interaction.isCall')) {\n            const conversation = this.get('interaction.conversation');\n            const conversationIsDestroyed =\n                !conversation || conversation.get('isDestroying') || conversation.get('isDestroyed');\n            if (conversationIsDestroyed) {\n                return false;\n            }\n        }\n\n        return true;\n    },\n\n    getInteractionTypeFromCP(interaction) {\n        let type = {\n            isCall: false,\n            isFax: false,\n            isChat: false,\n            isEmail: false,\n            isCallback: false,\n            isSms: false\n        };\n        const myselfAgent = _.findLast(interaction.participants, party => {\n            let partyIsUser = _.has(party, 'userId') ? party.userId === this.get('personGuid') : false;\n            let partyIsAgent = _.has(party, 'purpose') ? party.purpose.toLowerCase() === 'agent' : false;\n            return partyIsUser && partyIsAgent;\n        });\n        type.isCallback = myselfAgent ? _.has(myselfAgent, 'callbacks') && myselfAgent.callbacks.length : false;\n        type.isCall = _.some(interaction.participants, party => !_.isEmpty(party.calls));\n        type.isFax = _.some(interaction.participants, party =>\n            _.has(party, 'purpose') ? party.purpose === 'fax' : false\n        );\n        type.isChat = _.some(interaction.participants, party => !_.isEmpty(party.chats));\n        type.isEmail = _.some(interaction.participants, party => !_.isEmpty(party.emails));\n        type.isSms = _.some(interaction.participants, party => !_.isEmpty(party.messages));\n\n        return type;\n    },\n\n    handleMissedTimedBoxTimer(ctx, payload, Interaction, conversationModel) {\n        try {\n            const tmpInteractionModel = Interaction.create(payload, Ember.getOwner(ctx).ownerInjection());\n\n            if (tmpInteractionModel && conversationModel) {\n                Ember.set(tmpInteractionModel, 'conversation', conversationModel);\n            }\n\n            const interactionHasMissedTimer = Ember.get(tmpInteractionModel, 'hasMissedTimer');\n\n            if (tmpInteractionModel && interactionHasMissedTimer) {\n                const titleKey = 'purecloud.acdInteraction.aftercallworkTitleMessage';\n                const messageKey = 'purecloud.acdInteraction.aftercallworkTimerExpiredBodyMessage';\n                this._displayNotification(titleKey, messageKey);\n            }\n            if (tmpInteractionModel) {\n                Ember.run.later(() => {\n                    tmpInteractionModel.destroy();\n                });\n            }\n        } catch (error) {\n            this.logger.info('ACD: handleMissedBoxTimer error', { error });\n        }\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return document.hasFocus();\n        }\n    },\n\n    timeDiff(timeCreated) {\n        const diff = moment().diff(timeCreated);\n        if (diff < 500) {\n            this.logger.info('ACD: interaction create destroy diff', { diff });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Mixin.create({\n    notes: null,\n    selectedWrapupCode: null,\n    wrapupNotSaved: true,\n    oldWrapupCode: null,\n    skipAfterCallWork: false,\n    isAfterCallWorkTimerExpired: false,\n\n    isWrapupCodeSet: computed.notEmpty('selectedWrapupCode'),\n    isNotesSet: computed.notEmpty('notes'),\n    activeCallWorkCompleted: computed.reads('participantForCurrentUser.wrapup.code'),\n\n    activeCallWorkNeeded: computed('activeCallWorkCompleted', 'participantForCurrentUser.wrapupRequired', function () {\n        return !this.get('activeCallWorkCompleted') && this.get('participantForCurrentUser.wrapupRequired');\n    }),\n\n    canUseCommunicationACW: false,\n\n    canAgentRequestACW: computed.and('canUseCommunicationACW', 'useCommunicationACW', 'isWrapupPromptAgentRequested'),\n\n    useCommunicationACW: computed('canUseCommunicationACW', 'isWrapupPromptAgentRequested', function () {\n        if (this.get('canUseCommunicationACW') && this.get('isWrapupPromptAgentRequested')) {\n            return true;\n        }\n\n        return this.get('canUseCommunicationACW');\n    }),\n\n    isAfterCallWorkCompleted: computed(\n        'participantForCurrentUser.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'isCommunicationAfterCallWorkCompleted',\n        'useCommunicationACW',\n        function () {\n            if (this.get('useCommunicationACW')) {\n                return this.get('isCommunicationAfterCallWorkCompleted');\n            }\n\n            if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            } else if (this.get('participantForCurrentUser.wrapup') || this.get('skipAfterCallWork')) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    communicationMedia: computed(\n        'participantForCurrentUser.calls.firstObject.wrapup',\n        'participantForCurrentUser.chats.firstObject.wrapup',\n        'participantForCurrentUser.emails.firstObject.wrapup',\n        'participantForCurrentUser.messages.firstObject.wrapup',\n        'participantForCurrentUser.callbacks.firstObject.wrapup',\n        'isChat',\n        'isCall',\n        'isCallback',\n        'isEmail',\n        'isSms',\n        function () {\n            let communicationObj = null;\n            if (this.get('isCall')) {\n                communicationObj = this.get('participantForCurrentUser.calls.firstObject');\n            } else if (this.get('isChat')) {\n                communicationObj = this.get('participantForCurrentUser.chats.firstObject');\n            } else if (this.get('isEmail')) {\n                communicationObj = this.get('participantForCurrentUser.emails.firstObject');\n            } else if (this.get('isSms')) {\n                communicationObj = this.get('participantForCurrentUser.messages.firstObject');\n            } else if (this.get('isCallback')) {\n                communicationObj = this.get('participantForCurrentUser.callbacks.firstObject');\n            }\n            return communicationObj;\n        }\n    ),\n\n    isCommunicationAfterCallWorkCompleted: computed(\n        'communicationMedia.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'canAgentRequestACW',\n        function () {\n            if (this.get('canAgentRequestACW')) {\n                if (!this.get('communicationMedia.afterCallWorkRequired')) {\n                    return true;\n                }\n            } else if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            }\n\n            return !!this.get('communicationMedia.wrapup') || this.get('skipAfterCallWork');\n        }\n    ),\n\n    isCommunicationAfterCallWorkRequested: computed.bool('connectedCommunication.afterCallWorkRequired'),\n\n    isAfterCallWorkMandatory: computed(\n        'isCall',\n        'conversation.isAfterCallWorkMandatory',\n        'isCallback',\n        'participantForCurrentUser.wrapupPrompt',\n        'isNonDiscretionaryCompletion',\n        'canUseCommunicationACW',\n        'dialerPreview',\n        function () {\n            const wrapupPrompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n            if (this.get('isCallback')) {\n                return wrapupPrompt === 'mandatory' || this.get('dialerPreview');\n            } else if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkMandatory');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return wrapupPrompt === 'mandatory' || this.get('isNonDiscretionaryCompletion');\n                }\n                return wrapupPrompt === 'mandatory' || wrapupPrompt === 'timeout' || wrapupPrompt === 'forcedtimeout';\n            }\n        }\n    ),\n\n    isAfterCallWorkForcedTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkForcedTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkForcedTimeout');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isAfterCallWorkTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkTimeout');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'timeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: computed(\n        'isCall',\n        'conversation.isNonDiscretionaryCompletion',\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isNonDiscretionaryCompletion');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return (\n                        this.get('isAfterCallWorkForcedTimeout') ||\n                        this.get('isAfterCallWorkTimeout') ||\n                        this.get('isWrapupPromptAgentRequested')\n                    );\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isWrapupPromptAgentRequested: computed('participantForCurrentUser.wrapupPrompt', function () {\n        const wrapupPrompt = maybeLowerCase(this.get('participantForCurrentUser.wrapupPrompt'));\n        return wrapupPrompt === 'agentrequested';\n    }),\n\n    hasMissedTimer: computed('participantForCurrentUser.wrapup.code', 'isNonDiscretionaryCompletion', function () {\n        return (\n            this.get('participantForCurrentUser.wrapup.code') === 'ININ-WRAP-UP-TIMEOUT' &&\n            this.get('isNonDiscretionaryCompletion')\n        );\n    })\n});\n","import { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport { inject } from '@ember/service';\nimport findLast from 'lodash/findLast';\nimport last from 'lodash/last';\nimport reject from 'lodash/reject';\nimport { getTrueCustomerIfMultipleCustomersExist } from 'connections-ui/utils/acd';\n\nconst MACHINE_PARTICIPANTS = ['acd', 'ivr', 'dialer.system'];\n\nconst CUSTOMER_PARTICIPANTS = ['manual', 'inbound', 'dialer', 'customer', 'external'];\n\nconst MEDIA_TYPES = ['chats', 'calls', 'callbacks', 'emails', 'screenshares', 'cobrowsesessions', 'videos'];\n\nexport default Mixin.create({\n    session: inject('session'),\n\n    isCustomerParticipant(participant) {\n        return CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isMachineParticipant(participant) {\n        return MACHINE_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isAgentParticipant(participant) {\n        return participant.purpose === 'agent';\n    },\n\n    isCurrentUserOrMachineParticipant(participant) {\n        return (\n            ((participant.purpose === 'user' || participant.purpose === 'agent') &&\n                participant.userId === this.get('participantForCurrentUser.userId')) ||\n            participant.userId === this.get('session.person.guid') ||\n            this.isMachineParticipant(participant)\n        );\n    },\n\n    /**\n     * Determines who the host participant should be based on the participant array order\n     * and if the participant is an agent and is also human and connected.\n     *\n     * Currently returning `null` to eliminate any role assumptions for participants.\n     * Keeping this around to expand upon when the backend implements participant roles\n     * for a conversation.\n     */\n    hostParticipant: computed('allHumanConnectedParticipants.[]', function () {\n        return null;\n\n        // TODO: Update when the backend provides the participant roles\n        // const participants = this.get('allHumanConnectedParticipants') || [];\n        // for (const participant of participants) {\n        //     const isAgent = participant.purpose === 'agent';\n        //     if (isAgent) {\n        //         return participant;\n        //     }\n        // }\n    }),\n\n    // Human Participants with purpose 'manual', 'inbound', 'dialer', 'customer', or 'external\n    customerParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => this.isCustomerParticipant(participant));\n    }),\n\n    agentParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => this.isAgentParticipant(participant));\n    }),\n\n    // Human participants that are not the current user\n    otherParticipants: computed('participants.@each.{purpose,userId}', function () {\n        return reject(this.get('participants'), participant => {\n            return this.isCurrentUserOrMachineParticipant(participant);\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    otherConnectedParticipants: computed('otherParticipants.@each.endTime', function () {\n        return reject(this.get('otherParticipants'), participant => {\n            // Reject participant if disconnected or a monitoring\n            // participant and not a customer.\n            const isDisconnected = !!participant.endTime;\n\n            // TODO: The public api will eventually filter these out.\n            // This can be removed when that is done.\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            const isBarged = !!participant.bargedParticipantId;\n\n            return isDisconnected || isMonitored || isCoached || isBarged;\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    allHumanConnectedParticipants: computed('participants.@each.{purpose,userId,endTime}', function () {\n        return reject(this.get('participants'), participant => {\n            const isDisconnected = !!participant.endTime;\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            return isDisconnected || isMonitored || isCoached || this.isMachineParticipant(participant);\n        });\n    }),\n\n    /**\n     * All participants that should be showing up in a potential conference.\n     * Note that the participant that is being connecting should not show up if they are being connected\n     * through and queue that is also connected.\n     */\n    allConferenceParticipants: computed(\n        'participants.[]',\n        'participants.@each.{purpose,userId,endTime,queueId,coachedParticipantId,monitoredParticipantId}',\n        function () {\n            const participants = this.get('participants') || [];\n            const connectingQueue = new Map();\n            return participants.filter(participant => {\n                if (this.isMachineParticipant(participant)) {\n                    // Filter out any callback typed machine participants\n                    if (participant['callbacks']) {\n                        return false;\n                    } else if (participant.endTime) {\n                        connectingQueue.delete(participant.queueId);\n                    } else if (!connectingQueue.has(participant.queueId)) {\n                        connectingQueue.set(participant.queueId, participant);\n                        return true;\n                    }\n                }\n\n                if (participant.endTime || participant.monitoredParticipantId || participant.coachedParticipantId) {\n                    return false;\n                } else if (connectingQueue.has(participant.queueId)) {\n                    return false;\n                }\n\n                return true;\n            });\n        }\n    ),\n\n    participantForCustomer: computed(\n        'participants.@each.{purpose,userId,endTime,monitoredParticipantId,coachedParticipantId,bargedParticipantId}',\n        'session.person.guid',\n        'onConsult',\n        'consultParticipant',\n        'otherConnectedParticipants.[]',\n        'isDisconnected',\n        'isTerminated',\n        'isCall',\n        function () {\n            const consultParticipantId = this.get('consultParticipantId');\n            if (consultParticipantId) {\n                const participants = this.get('participants') || [];\n                const trueCustomerParticipant = participants.findBy('id', consultParticipantId);\n                if (trueCustomerParticipant) {\n                    return trueCustomerParticipant;\n                }\n            }\n\n            if (this.get('onConsult') && this.get('consultParticipant')) {\n                return this.get('consultParticipant');\n            }\n\n            let participantCaller = null;\n\n            const customer = findLast(this.get('participants'), participant => {\n                const isCurrentUser = this.get('session.person.guid') === participant.userId;\n\n                /**\n                 * Solely used for determining the edge-case of a queue calling a queue.\n                 * We do not want to return the current user\n                 */\n                // TODO: Remove the `else if` portion of this statement when the `if` feature toggle is removed.\n                if (!isCurrentUser) {\n                    if (\n                        (this.get('session.features.interactionNameQueueCallingQueue') &&\n                            participant.purpose === 'acd' &&\n                            get(participant, 'calls.firstObject.direction') === 'inbound') ||\n                        (participant.purpose === 'agent' &&\n                            get(participant, 'calls.firstObject.direction') === 'outbound')\n                    ) {\n                        participantCaller = participant;\n                    }\n                }\n\n                const isExternalCustomer = CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n                const isInternalCustomer = !isCurrentUser && participant.purpose === 'user';\n\n                return (\n                    !participant.monitoredParticipantId &&\n                    !participant.coachedParticipantId &&\n                    !participant.bargedParticipantId &&\n                    (isExternalCustomer || isInternalCustomer)\n                );\n            });\n\n            if (customer && customer.endTime) {\n                const nextConnectedParticipant = this.get('otherConnectedParticipants.firstObject');\n                const isDisconnected = this.get('isDisconnected') || this.get('isTerminated');\n\n                if (nextConnectedParticipant && !isDisconnected) {\n                    return nextConnectedParticipant;\n                }\n            }\n\n            /**\n             * If we still don't have a customer at this point\n             * then consider the scenario where this may be an agent\n             * calling a queue on behalf of a queue so we are identifying\n             * the caller as the `customer`\n             */\n            if (!customer && this.get('isCall') && participantCaller) {\n                return participantCaller;\n            }\n\n            if (customer) {\n                /**\n                 * if there are multiple customers in the participants list the customer returned above is likely incorrect\n                 * if it is not a user participant. In that case the getTrueCustomerIfMultipleCustomersExist will return the\n                 * last connected true customer participant - if there is only one customer participant - getTrueCustomerIfMultipleCustomersExist\n                 * returns nothing and the value of customer falls through\n                 */\n                const customerParticipant = getTrueCustomerIfMultipleCustomersExist(this);\n                if (customer.purpose !== 'user' && customerParticipant) {\n                    return customerParticipant;\n                }\n            }\n\n            return customer;\n        }\n    ),\n\n    /**\n     * Returns all of the active participants. Active is described as trying to connect or connected.\n     * It does not include any participants who have an endTime.\n     * The id's returned supported external, user, or queue with a regular `id` fallback.\n     *\n     * [ACE-3276] If an incoming customer who is not associated with an external contact yet may not have\n     * any other form of id other than the base `id` or `queueId` it came from.\n     */\n    activeParticipantIds: computed('participants.[]', function () {\n        const participants = this.get('participants') || [];\n        return participants.reduce((filtered, participant) => {\n            const { endTime, externalContactId, userId, queueId, id, purpose } = participant;\n            if (!endTime) {\n                if (['agent', 'user'].includes(purpose) && userId) {\n                    filtered.push(userId);\n                } else if (['acd'].includes(purpose) && queueId) {\n                    filtered.push(queueId);\n                } else if (CUSTOMER_PARTICIPANTS.includes(purpose) && externalContactId) {\n                    filtered.push(externalContactId);\n                } else {\n                    filtered.push(id);\n                }\n            }\n            return filtered;\n        }, []);\n    }),\n\n    participantsForCurrentUser: computed('participants.@each.{purpose,userId}', 'session.person.guid', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => {\n            const purpose = participant.purpose;\n            const participantUserId = participant.userId;\n            const userId = this.get('session.person.guid');\n            return userId === participantUserId && (purpose === 'user' || purpose === 'agent');\n        });\n    }),\n\n    getFirstStuckParticipant: function () {\n        const currentUserParticipants = this.get('participantsForCurrentUser');\n\n        const stuckParticipant = currentUserParticipants.find(participant => {\n            const hasActivePrimary = this._doesParticipantHaveActivePrimaryMedia(participant);\n            const hasActiveSessionShare = this._doesParticipantHaveActiveSessionShare(participant);\n            return !hasActivePrimary && hasActiveSessionShare;\n        });\n        return stuckParticipant;\n    },\n\n    participantForCurrentUser: computed('participantsForCurrentUser.@each.wrapup', function () {\n        const currentUserParticipants = this.get('participantsForCurrentUser');\n\n        // alerting interactions\n\n        const lastAlertingParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return media.state.toLowerCase() === 'alerting';\n                    });\n                }\n            });\n        });\n\n        if (lastAlertingParticipant) {\n            return lastAlertingParticipant;\n        }\n\n        // non-disconnected interactions\n\n        const lastNonDisconnectedParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return (\n                            media.state.toLowerCase() !== 'disconnected' && media.state.toLowerCase() !== 'terminated'\n                        );\n                    });\n                }\n            });\n        });\n\n        if (lastNonDisconnectedParticipant) {\n            return lastNonDisconnectedParticipant;\n        }\n\n        // disconnected interactions\n\n        const lastCurrentUserNeedingWrapup = findLast(currentUserParticipants, participant => {\n            return participant.wrapupRequired && !participant.wrapup;\n        });\n\n        // If everyone has a wrapup code\n        if (!lastCurrentUserNeedingWrapup) {\n            return last(currentUserParticipants);\n        }\n\n        // If participant needs wrapup\n        // return lastCurrentUserNeedingWrapup;\n\n        // If we reach this point then this means that:\n        // 1) All agent participants have wrapped up and therefore should be disconnected\n        // 2) All agent participants have no active callbacks\n        // In this case we are (may be) dealing with a stuck interaction that conversation service still believes is active.\n\n        // Let's get the first participant for the agent with a stuck interaction\n        // TODO: confirm that first object is latest added by conversation service.\n        return lastCurrentUserNeedingWrapup || this.getFirstStuckParticipant();\n    }),\n\n    participantsForACD: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => participant.purpose === 'acd');\n    }),\n\n    participantForQueue: computed.alias('participantsForACD.lastObject'),\n\n    dialerParticipant: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.find(participant => participant.purpose === 'dialer');\n    }),\n\n    /**\n     * Iterates through the participants in reverse to find the last/newest participant that is\n     * considered either a machine or agent. Used to determine if the interaction is being transferred.\n     * The return breaks the for loop in this instance to it will only iterates as long as it needs to.\n     */\n    transferringToParticipant: computed('participants.[]', 'activeAttendedTransfer', function () {\n        const activeTransfer = this.get('activeAttendedTransfer');\n        const destination = activeTransfer ? activeTransfer.destination : null;\n        if (!destination) return null;\n\n        const participants = this.get('participants') || [];\n        // we want to look at the participants in reverse order to find newest reference\n        for (let i = participants.length - 1; i >= 0; i--) {\n            const participant = participants[i];\n            if (participant.userId === destination.userId) {\n                return participant;\n            }\n        }\n        // participant not found.\n        return null;\n    })\n});\n","import Ember from 'ember';\nimport { isRoomJid } from 'ember-purecloud-components/utils/jid-helpers';\nimport isEmpty from 'lodash/isEmpty';\nimport maxBy from 'lodash/maxBy';\nimport moment from 'connections-ui/utils/dates';\n\nconst { computed } = Ember;\n\nconst PROVIDER_MEDIATYPE = {\n    COBROWSE: 'PureCloud Co-browse',\n    SCREENSHARE: 'PureCloud WebRTC screen-share',\n    VIDEO: 'PureCloud WebRTC video'\n};\n\nfunction aggregateMedia(screenShares, cobrowsesessions, videos) {\n    // Ensure provider is identified in array items.\n    // This step could be skipped if backend does not remove provider info\n    (screenShares || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.SCREENSHARE;\n        }\n    });\n\n    (cobrowsesessions || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.COBROWSE;\n        }\n    });\n\n    (videos || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.VIDEO;\n        }\n    });\n\n    let allMedia = [];\n    if (screenShares) {\n        allMedia = allMedia.concat(screenShares);\n    }\n    if (cobrowsesessions) {\n        allMedia = allMedia.concat(cobrowsesessions);\n    }\n    if (videos) {\n        allMedia = allMedia.concat(videos);\n    }\n\n    return allMedia;\n}\n\nfunction getMediaObject(mediaArray) {\n    // This function identifies the current active media\n    // object from mediaArray mediaArray is expected to contain\n    // the secondary media types within a participant i.e screenShares,\n    // cobrowseSessions, videos etc.\n\n    // Get media with latest connected Time\n    const mediaWithlatestConnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.connectedTime) {\n            return moment(mediaObj.connectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get media with latest disconnected time\n    const mediaWithlatestDisconnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.disconnectedTime) {\n            return moment(mediaObj.disconnectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get latest active media\n    const maxConnectedTime = moment(\n        mediaWithlatestConnectedTime && mediaWithlatestConnectedTime.connectedTime\n            ? mediaWithlatestConnectedTime.connectedTime\n            : 0\n    );\n    const maxDisconnectedTime = moment(\n        mediaWithlatestDisconnectedTime && mediaWithlatestDisconnectedTime.disconnectedTime\n            ? mediaWithlatestDisconnectedTime.disconnectedTime\n            : 0\n    );\n\n    const activeMedia = maxConnectedTime.isAfter(maxDisconnectedTime)\n        ? mediaWithlatestConnectedTime\n        : mediaWithlatestDisconnectedTime;\n\n    return activeMedia;\n}\n\nexport default Ember.Mixin.create({\n    ajax: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    sessionShareCode: null,\n    isSessionCodeRequired: false,\n\n    isSessionSharing: false,\n    isRequestingEndSessionShare: false,\n\n    sessionShareDisconnectTimer: null,\n    sessionShareExplicitlyInitiated: false,\n    sessionShareActiveOnLoad: false,\n    isCobrowseV2Disconnected: false,\n    isCobrowseV2: false,\n\n    // feature toggles & permissions\n\n    canScreenShareOnCall: computed.and('isCall', 'permissions.canViewAcdScreenShare'),\n    canScreenShareOnChat: computed.and('isChat', 'permissions.canViewAcdScreenShare'),\n    canCobrowseOnCall: computed.and('isCall', 'permissions.canViewAcdCoBrowseForCall'),\n    canCobrowseOnChat: computed.and('isChat', 'permissions.canViewAcdCoBrowseForChat'),\n\n    // State\n\n    isRequestingScreenShareOrCoBrowse: false,\n    isRequestingVideo: false,\n\n    sessionShareState: computed.reads('mostRecentAgentSessionShare.state'),\n    customerShareState: computed.reads('mostRecentCustomerSessionShare.state'),\n    hasSessionShareCode: computed.notEmpty('sessionShareCode'),\n    sessionShareActive: computed.or('isRequestingSessionShare', 'hasSessionShareCode', 'isSessionSharing'),\n    isRequestingSessionShare: computed.or('isRequestingScreenShareOrCoBrowse', 'isRequestingVideo'),\n\n    isSessionShareConnected: computed('sessionShareState', 'isV2Provider', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    isSessionShareDisconnected: computed('sessionShareState', 'isRequestingNewSessionShare', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'disconnected' && !this.get('isRequestingNewSessionShare');\n    }),\n\n    isCustomerInSessionShare: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'connected';\n    }),\n\n    isCustomerDisconnectedFromSharedSession: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'disconnected';\n    }),\n\n    isAgentDisconnectedFromSharedSession: computed(\n        'sessionShareState',\n        'isSessionSharing',\n        'isRequestingNewSessionShare',\n        function () {\n            const state = this.get('sessionShareState') || '';\n            return (\n                this.get('isSessionSharing') &&\n                state.toLowerCase() === 'disconnected' &&\n                !this.get('isRequestingNewSessionShare')\n            );\n        }\n    ),\n\n    isWaitingForAgentToConnect: computed(\n        'isSessionShareConnected',\n        'isAgentDisconnectedFromSharedSession',\n        'sessionShareState',\n        'isV2Provider',\n        function () {\n            return !this.get('isSessionShareConnected') && !this.get('isAgentDisconnectedFromSharedSession');\n        }\n    ),\n\n    isWaitingForCustomerToConnect: computed(\n        'isSessionCodeRequired',\n        'isCustomerInSessionShare',\n        'isCustomerDisconnectedFromSharedSession',\n        'isV2Provider',\n        function () {\n            return (\n                this.get('isSessionCodeRequired') &&\n                !this.get('isCustomerInSessionShare') &&\n                !this.get('isCustomerDisconnectedFromSharedSession')\n            );\n        }\n    ),\n\n    hasCustomerJoinedSessionShareRoom: computed('customerShareState', function () {\n        const state = this.get('customerShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    hasAgentJoinedSessionShareRoom: computed('sessionShareState', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    sessionShareRoomJid: computed('mostRecentCustomerSessionShare.context', function () {\n        const context = this.get('mostRecentCustomerSessionShare.context');\n        if (context && context.indexOf(':') >= 0) {\n            return context.substring(context.indexOf(':') + 1);\n        } else if (context && isRoomJid(context)) {\n            return context;\n        }\n        return null;\n    }),\n\n    // media objects\n\n    mostRecentAgentSessionShare: computed(\n        'participantForCurrentUser.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCurrentUser.screenShares') ||\n                this.get('participantForCurrentUser.screenshares');\n            let cobrowsesessions = this.get('participantForCurrentUser.cobrowsesessions');\n            let videos = this.get('participantForCurrentUser.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.get('logger').info('getMediaObject for agent', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    mostRecentCustomerSessionShare: computed(\n        'participantForCustomer.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCustomer.screenShares') || this.get('participantForCustomer.screenshares');\n            let cobrowsesessions = this.get('participantForCustomer.cobrowsesessions');\n            let videos = this.get('participantForCustomer.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.get('logger').info('getMediaObject for customer', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    // type\n\n    sessionShareType: computed('isScreenShare', 'isVideoShare', 'isCoBrowse', function () {\n        if (this.get('isScreenShare')) {\n            return 'screen-share';\n        } else if (this.get('isVideoShare')) {\n            return 'video';\n        } else if (this.get('isCoBrowse')) {\n            return 'co-browse';\n        }\n        return null;\n    }),\n\n    canScreenShare: computed.or('canScreenShareOnCall', 'canScreenShareOnChat'),\n    canCobrowse: computed.or('canCobrowseOnCall', 'canCobrowseOnChat'),\n\n    mediaTypeIsScreenShare: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.SCREENSHARE),\n    mediaTypeIsCobrowse: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.COBROWSE),\n    mediaTypeIsVideo: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.VIDEO),\n\n    isScreenShare: computed(\n        'isRequestingScreenShareOrCoBrowse',\n        'isRequestingVideo',\n        'canScreenShare',\n        'mediaTypeIsScreenShare',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse')) {\n                return true;\n            }\n\n            if (this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canScreenShare') && this.get('mediaTypeIsScreenShare');\n        }\n    ),\n\n    isCoBrowse: computed(\n        'isRequestingVideo',\n        'isRequestingScreenShareOrCoBrowse',\n        'mediaTypeIsCobrowse',\n        'canCobrowse',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse') || this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canCobrowse') && this.get('mediaTypeIsCobrowse');\n        }\n    ),\n\n    isVideoShare: computed('isRequestingVideo', 'isRequestingScreenShareOrCoBrowse', 'mediaTypeIsVideo', function () {\n        return this.get('isRequestingVideo') && !this.get('isRequestingScreenShareOrCoBrowse');\n    }),\n\n    // permission errors\n\n    hasScreenSharePermissionError: computed.or(\n        'hasCobrowsePermissionError',\n        'hasVideoPermissionError',\n        'hasShareError'\n    ),\n\n    hasCobrowsePermissionError: computed('mediaTypeIsCobrowse', 'canCobrowse', function () {\n        if (this.get('mediaTypeIsCobrowse') && !this.get('canCobrowse')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Co-Browse: Permissions or feature toggle missing to process acd co-browse events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasVideoPermissionError: computed('mediaTypeIsVideo', function () {\n        if (this.get('mediaTypeIsVideo')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Video: Permissions or feature toggle missing to process acd video events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasShareError: computed('mediaTypeIsScreenShare', 'canScreenShare', function () {\n        if (this.get('mediaTypeIsScreenShare') && !this.get('canScreenShare')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Screen-share: Permissions or feature toggle missing to process acd screen-share events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    // Timers\n\n    sessionShareConnectedTime: computed(\n        'mostRecentAgentSessionShare.connectedTime',\n        'participantForCurrentUser.connectedTime',\n        function () {\n            if (this.get('mostRecentAgentSessionShare.connectedTime')) {\n                return moment(this.get('mostRecentAgentSessionShare.connectedTime'));\n            } else if (this.get('participantForCurrentUser.connectedTime')) {\n                return moment(this.get('participantForCurrentUser.connectedTime'));\n            }\n            return moment();\n        }\n    ),\n\n    sessionShareDuration: computed('mostRecentAgentSessionShare.{disconnectedTime,connectedTime}', function () {\n        const connectedTime = this.get('mostRecentAgentSessionShare.connectedTime');\n        const endTime = this.get('mostRecentAgentSessionShare.disconnectedTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    _privacyStatement: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('chrome.privacyStatement');\n    }),\n\n    _securityDisclaimer: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('signIn.securityDisclaimer');\n    })\n});\n","import Ember from 'ember';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\n\nexport default Ember.Mixin.create(AuthenticatedRouteMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive) {\n            // Authenticated by Simple Auth\n            result = Ember.RSVP.resolve(result).then(() => {\n                // Authorizing the route\n                if (!this.get('session.hasAppAccess')) {\n                    transition.abort();\n                    this.transitionTo('no-access');\n                    return Ember.RSVP.reject();\n                }\n\n                return true;\n            });\n        }\n\n        return result;\n    }\n});\n","import Ember from 'ember';\n\nconst BatchDataRequestsMixin = Ember.Mixin.create({\n    batchDataRequests: Ember.inject.service(),\n\n    getUser(id) {\n        return this.get('batchDataRequests').getUser(id);\n    },\n\n    refreshUser(id) {\n        return this.get('batchDataRequests').refreshUser(id);\n    },\n\n    getChatUser(jid) {\n        return this.get('batchDataRequests').getChatUser(jid);\n    },\n\n    getGroup(jid) {\n        return this.get('batchDataRequests').getGroup(jid);\n    }\n});\n\nexport default BatchDataRequestsMixin;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ChatRoom from '../models/chat-room';\nimport {\n    getEntityObjectId,\n    isPersonJid,\n    isGroupJid,\n    isSupervisorJid\n} from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP, getOwner } = Ember;\n\nexport default Ember.Mixin.create({\n    presenceSubscription: Ember.inject.service(),\n    batchDataRequests: Ember.inject.service(),\n\n    // this is set in chat service\n    useChatBetaCleanUp: false,\n\n    initRoomCaching: Ember.on('init', function () {\n        return this.set('rooms', Ember.Object.create());\n    }),\n\n    getChatRoom(jid) {\n        return new RSVP.Promise(resolve => {\n            const objectId = getEntityObjectId(jid);\n            let room = this.get(`rooms.${objectId}`);\n            if (room) {\n                if (this.get('useChatBetaCleanUp')) {\n                    const isGroupRoom = !isPersonJid(room.get('jid'));\n                    const passedInJidIsPerson = isPersonJid(jid) && !isSupervisorJid(jid);\n                    if (passedInJidIsPerson && isGroupRoom) {\n                        this.logger.debug(\n                            `<cache-chat-rooms-mixin> Found incorrect chat room with jid\n                            ${room.get('jid')}. Closing the room. Passed in jid is ${jid}`\n                        );\n                        // bad jid from early chat beta\n                        // need to leave the room so it will be deleted on realtime side\n                        this.closeActiveRoom(room);\n\n                        // create the correct 1-1 chat room and store in `rooms` dictionary\n                        const personRoom = ChatRoom.create({ jid, objectId }, getOwner(this).ownerInjection());\n                        Ember.set(this.rooms, objectId, personRoom, true);\n\n                        // shouldn't need to run this feature toggle check but to be safe\n                        if (this.get('useCollaborateChat')) {\n                            return resolve(this.setupRoomContextV2(personRoom));\n                        }\n                        return resolve(this.setupRoomContext(personRoom));\n                    }\n                }\n                return resolve(room);\n            }\n\n            room = ChatRoom.create({ jid, objectId }, getOwner(this).ownerInjection());\n            Ember.set(this.rooms, objectId, room, true);\n\n            return resolve(this.setupRoomContext(room));\n        });\n    },\n\n    setupRoomContext(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return Ember.RSVP.resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            return this.addChatTargetAsParticipant(room);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return Ember.RSVP.resolve(room);\n    },\n    setupRoomContextV2(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return Ember.RSVP.resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            room.set('oneToOneTarget', jid);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return Ember.RSVP.resolve(room);\n    },\n\n    addChatTargetAsParticipant(room) {\n        const jid = room.get('jid');\n        const user = this.get('session.person');\n        return this.get('batchDataRequests')\n            .getChatUser(jid)\n            .then(person => {\n                room.set('oneToOneTarget', person);\n                this.addParticipantToRoom(room, person);\n                this.addParticipantToRoom(room, user);\n                this.get('presenceSubscription').subscribeToPresence(person);\n                person.set('oneToOneRoom', room);\n                return room;\n            });\n    },\n\n    loadRoomSubject(room) {\n        if (room.isOneToOneRoom() || room.get('rawSubject')) {\n            return Ember.RSVP.resolve(room);\n        }\n\n        const roomJid = room.get('jid');\n        return this.getStreamingRoomInfo(roomJid).then(({ subject }) => {\n            this.updateRoomSubject(room, subject);\n            return room;\n        });\n    },\n\n    addRoomToCache(room) {\n        const objectId = getEntityObjectId(room.jid);\n        Ember.set(this.rooms, objectId, room, true);\n    },\n\n    addAllParticipantsToRoom(room, participantJids) {\n        const cachedParticipants = room.get('participants');\n\n        _.forEach(cachedParticipants, cachedParticipant => {\n            const cachedParticipantJid = cachedParticipant && cachedParticipant.get('jid');\n            if (participantJids.indexOf(cachedParticipantJid) === -1) {\n                this.removeParticipantFromRoom(room, cachedParticipant);\n            } else {\n                participantJids.removeObject(cachedParticipantJid);\n            }\n        });\n\n        _.forEach(participantJids, jid => {\n            this.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    return this.addParticipantToRoom(room, person);\n                });\n        });\n    },\n\n    loadGroup(room) {\n        if (!room.isGroupRoom()) {\n            return Ember.RSVP.resolve(room);\n        }\n\n        return this.get('batchDataRequests')\n            .getGroup(room.get('objectId'))\n            .then(group => {\n                room.set('group', group);\n                if (group && _.isEmpty(group.get('name'))) {\n                    this.loadRoomSubject(room);\n                }\n                return room;\n            });\n    }\n});\n","define(\"connections-ui/mixins/change-serializer\", [\"exports\", \"ember-data-change-tracker/mixins/keep-only-changed\"], function (_exports, _keepOnlyChanged) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _keepOnlyChanged.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport GithubItemModel from '../models/github-item';\n\nconst { computed, generateGuid } = Ember;\n\nconst imageRegex = /\\.(jpe?g|gifv?|png)(\\?.*)?(#.*)?$/i;\nconst timeStampRegex = /(\\d+h)?(\\d+m)?(\\d+s)?$/i;\n\nconst audioRegex = /\\.(mp3|aac|wav)(\\?.*)?(#.*)?$/i;\n\n/*\nhttps://media4.giphy.com/media/R06WhFXLF1Fmw/200w.gif\nhttp://i.giphy.com/R06WhFXLF1Fmw.gif\nhttp://giphy.com/embed/R06WhFXLF1Fmw\nhttp://giphy.com/gifs/christmas-cat-R06WhFXLF1Fmw\nhttp://giphy.com/gifs/R06WhFXLF1Fmw\n*/\nconst giphyRegex = /^https?:\\/\\/.*?giphy\\.com\\/.*?([0-9a-z]{13,}).*?$/i;\nconst giphyIdIndex = 1;\n\nconst imgurRegex = /^(http:\\/\\/)?.{1}\\.imgur\\.com\\/([0-9a-z]{0,})\\..*$/i;\n\n// regex for identifying youtube links\n// adapted from http://stackoverflow.com/a/10315969\n// + revised to include additional timestamp param\nconst youtubeRegex =\n    /^(?:https?:\\/\\/)?(?:www\\.|gaming\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|))((\\w|-){11})(?:[&])?(?:t=)?([^&]+)?$/;\nconst youtubeIdIndex = 1; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst youtubeTimeStampIndex = 3;\n\n// adapted from http://stackoverflow.com/questions/13286785/get-video-id-from-vimeo-url\n// + revised to include additional timestamp param\nconst vimeoRegex =\n    /https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?|#)?(?:t=)?([^&]+)?$/i;\nconst vimeoIdIndex = 3; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst vimeoTimeStampIndex = 4;\n\nconst ghGistRegex = /http(?:s)?:\\/\\/gist.github\\.com\\/([a-zA-Z0-9_]+)\\/([a-zA-Z0-9]+)(?:\\.js)?/i;\nconst ghRepoRegex = /http(?:s)?:\\/\\/github\\.com\\/([a-zA-Z0-9_\\-.]+)\\/([a-zA-Z0-9\\-.]+)\\/?(?:\\/issues\\/[0-9]+)?$/i;\nconst twitterRegex = /http(?:s)?:\\/\\/(?:mobile.)?twitter\\.com\\/(?:#!\\/)?[a-zA-Z0-9_]+\\/status\\/([0-9]+)/i;\nconst googleSlidesRegex = /https?:\\/\\/docs.google.com\\/presentation\\/d\\/[a-zA-Z0-9_-]*\\//i;\nconst soundcloudRegex = /https?:\\/\\/soundcloud\\.com\\/(?!(stream|you)).+/i;\n\nfunction getImageShortName(url = '') {\n    const pattern = /([A-Z0-9_-]{1,}\\.(?:png|jpg|gif|jpeg))/i;\n    const match = pattern.exec(url);\n    if (match) {\n        return window.decodeURI(match.shift());\n    }\n    return window.decodeURI(url.split('/').pop());\n}\n\n// convert timestamp (1m30s) to parseable integer (90).\nfunction parseTimeStamp(timeStamp) {\n    if (timeStamp.indexOf('h') < 0 && timeStamp.indexOf('m') < 0 && timeStamp.indexOf('s') < 0) {\n        return parseInt(timeStamp);\n    }\n    timeStamp = timeStampRegex.exec(timeStamp);\n    timeStamp =\n        (timeStamp[1] ? parseInt(timeStamp[1]) * 360 : 0) +\n        (timeStamp[2] ? parseInt(timeStamp[2]) * 60 : 0) +\n        (timeStamp[3] ? parseInt(timeStamp[3]) : 0);\n    return timeStamp;\n}\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n\n    mediaItems: computed('images', 'videos', 'gists', 'githubRepos', 'tweets', function () {\n        const images = this.get('images');\n        const videos = this.get('videos');\n        const giphies = this.get('giphies');\n        const audios = this.get('audios');\n        const gists = this.get('gists');\n        const repos = this.get('githubRepos');\n        const tweets = this.get('tweets');\n        const googleSlides = this.get('googleSlides');\n        const soundcloud = this.get('soundcloud');\n\n        return _.union(images, videos, giphies, gists, repos, tweets, googleSlides, soundcloud, audios).map(item => {\n            item.set(\n                'mediaRenderer',\n                'chat-panel/conversation/conversation-pane/messages/widgets/media-item/' + item.get('mediaType')\n            );\n            return item;\n        });\n    }),\n\n    getLinks() {\n        return this.get('links') || [];\n    },\n\n    /***********\n    exampleMediaType: computed('links', function () {\n        The 'links' property can sometimes be null/undefined, so use this.getLinks() to safely get a non-null array\n\n        map and filter links to match your media type\n        items are required have the following base properties:\n        {\n            mediaType,\n            title\n        }\n        other properties can be used to render the 'body' of the media\n    }),\n    ************/\n\n    images: computed('links', function () {\n        const links = _.filter(this.getLinks(), link => {\n            if (!link.match(imageRegex)) {\n                return false; // don't return any links not matching images\n            }\n            if (link.match(giphyRegex)) {\n                return false; // don't match giphy images here\n            }\n            if (link.startsWith('http://')) {\n                return link.match(imgurRegex); // if it's http, only return if it's imgur (can be upgraded to https)\n            }\n            return true; // all conditions met\n        });\n\n        return _.map(links, url => {\n            let gifv;\n            let match = imgurRegex.test(url);\n            if (url.endsWith('gifv')) {\n                gifv = {\n                    webm: url.replace('.gifv', '.webm'),\n                    mp4: url.replace('.gifv', '.mp4')\n                };\n            }\n            if (match) {\n                if (url.startsWith('http://')) {\n                    url = url.replace('http://', 'https://');\n                }\n            }\n            return Ember.Object.create({\n                mediaType: 'inline-image',\n                url,\n                gifv: gifv,\n                title: getImageShortName(url),\n                identifier: generateGuid(null, 'inline-image')\n            });\n        });\n    }),\n\n    videos: computed('links', function () {\n        const links = this.getLinks();\n\n        let youtubeLinks = links\n            .map(link => youtubeRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[youtubeIdIndex];\n                let timeStamp = match[youtubeTimeStampIndex]\n                    ? `?start=${parseTimeStamp(match[youtubeTimeStampIndex])}`\n                    : '';\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.youtube').toString(),\n                    id: id,\n                    videoUrl: `https://www.youtube.com/embed/${id}${timeStamp}`\n                });\n            });\n\n        let vimeoLinks = links\n            .map(link => vimeoRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[vimeoIdIndex];\n                let timeStamp = match[vimeoTimeStampIndex] ? `#t=${parseTimeStamp(match[vimeoTimeStampIndex])}` : '';\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.vimeo').toString(),\n                    id: id,\n                    videoUrl: `//player.vimeo.com/video/${id}${timeStamp}`\n                });\n            });\n\n        return _.union(youtubeLinks, vimeoLinks);\n    }),\n\n    giphies: computed('links', function () {\n        return this.getLinks()\n            .map(link => giphyRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                const id = match[giphyIdIndex];\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.giphy').toString(),\n                    id,\n                    videoUrl: `https://giphy.com/embed/${id}?html5=true`\n                });\n            });\n    }),\n\n    gists: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghGistRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-gist',\n                        username: matches[1],\n                        url: `https://gist.github.com/${matches[1]}/${matches[2]}.json?callback=?`\n                    };\n\n                    Ember.setOwner(modelData, Ember.getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n                return undefined;\n            })\n            .filter(gist => !!gist);\n    }),\n\n    githubRepos: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghRepoRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-repo',\n                        username: matches[1],\n                        repo: matches[2],\n                        link: link,\n                        url: `https://api.github.com/repos/${matches[1]}/${matches[2]}`\n                    };\n\n                    Ember.setOwner(modelData, Ember.getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n\n                return undefined;\n            })\n            .filter(repo => !!repo);\n    }),\n\n    tweets: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = twitterRegex.exec(link);\n                if (matches && matches.length === 2) {\n                    return Ember.Object.create({\n                        mediaType: 'twitter-card',\n                        title: this.get('intl').lookup('chat.inlineMedia.tweet'),\n                        tweetId: matches[1],\n                        url: link,\n                        tweetInfo: null\n                    });\n                }\n                return undefined;\n            })\n            .filter(tweet => !!tweet);\n    }),\n\n    googleSlides: computed('links', function () {\n        return this.getLinks()\n            .map(link => googleSlidesRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return Ember.Object.create({\n                    mediaType: 'google-slides',\n                    title: this.get('intl').lookup('chat.inlineMedia.googleSlides').toString(),\n                    url: `${url}embed?start=false&loop=false&delayms=3000`\n                });\n            });\n    }),\n\n    soundcloud: computed('links', function () {\n        return this.getLinks()\n            .map(link => soundcloudRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return Ember.Object.create({\n                    mediaType: 'soundcloud',\n                    title: this.get('intl').lookup('chat.inlineMedia.soundcloud').toString(),\n                    url: url\n                });\n            });\n    }),\n\n    audios: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                return {\n                    match: !!audioRegex.exec(link),\n                    link\n                };\n            })\n            .filter(res => res.match)\n            .map(res => {\n                return Ember.Object.create({\n                    mediaType: 'inline-audio',\n                    title: this.get('intl').lookup('chat.inlineMedia.audio').toString(),\n                    url: res.link\n                });\n            });\n    })\n});\n","import Ember from 'ember';\nimport { displayDateRelativeToToday } from '../utils/dates';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport { getEntityObjectId } from 'ember-purecloud-components/utils/jid-helpers';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    acdChatUser: Ember.computed.alias('room.acdCustomerParticipant'),\n\n    isYou: Ember.computed('chatUser.jid', 'session.person.jid', function () {\n        return compareJids(this.get('chatUser.jid'), this.get('session.person.jid'));\n    }),\n\n    isAcdChatUser: Ember.computed('chatUser.id', 'acdChatUser.id', function () {\n        const chatUserId = getEntityObjectId(this.get('chatUser.id'));\n        const acdChatUserId = getEntityObjectId(this.get('acdChatUser.id'));\n        return chatUserId === acdChatUserId;\n    }),\n\n    isLastMessage: Ember.computed('room.messages.lastObject.id', function () {\n        return this.get('id') === this.get('room.messages.lastObject.id');\n    }),\n\n    messageTime: Ember.computed('time', function () {\n        return displayDateRelativeToToday(this.get('time'), this.get('intl.isoLocale'));\n    }),\n\n    messageDisplay: Ember.computed('correction', function () {\n        const correction = this.get('correction');\n        if (correction) {\n            return correction;\n        } else {\n            return this;\n        }\n    }),\n\n    isCorrection: Ember.computed.bool('correction')\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst ChatEvents = Ember.Mixin.create(Ember.Evented, LoggerMixin, {\n    initialDataLoaded: false,\n    connected: false,\n    enabled: false,\n    historyDirty: false,\n    handleHiddenRooms: true,\n    hiddenRooms: {},\n    useChatSyncFix: false\n});\n\nexport default ChatEvents;\n","import Ember from 'ember';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst MessageNotificationsMixin = Ember.Mixin.create(LoggerMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n\n    sendMentionNotification(room, person, message) {\n        // You shouldn't get a mention notification for yourself, which happens when sending a quote from another client\n        // like mobile\n        if (this.get('session.person.id') === person.get('id')) {\n            return;\n        }\n\n        if (this.shouldShowMentionNotification(room, message)) {\n            let roomName = room.getRawDisplaySubject();\n\n            const title = person.get('name');\n            const toastMessage = this.get('intl')\n                .lookup('notification.titles.chatMention', {\n                    roomName\n                })\n                .toString();\n            this.get('notification').info(title, toastMessage, {\n                icon: person.get('profilePicture.x128'),\n                tag: room.get('jid'),\n                hideAfter: 10,\n                soundId: 'chat',\n                shouldShowPopup: true,\n                shouldPlaySound: !this.get('preferences.chat.global.soundsMuted'),\n                target: this.get('applicationController'),\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendNotification(message) {\n        if (this.shouldShowNotification(message)) {\n            let showPopup =\n                this.get('preferences.notifications.global.showGroupNotifications') ||\n                message.get('room').isOneToOneRoom();\n            let playSound = showPopup && !this.get('preferences.chat.global.soundsMuted');\n            let title = this.getNotificationTitle(message.get('room'), message.get('chatUser'), message);\n            let messageBody, raw;\n\n            if (message.widgetType === 'video-notification') {\n                const messageKey = `chat.video.chatNotifications.${message.get('widget.data.type')}`;\n                const intl = this.get('intl');\n                if (intl.exists(messageKey)) {\n                    messageBody = this.get('intl').lookup(messageKey);\n                    raw = this.get('intl').t(messageKey);\n                } else {\n                    messageBody = message.get('messageBody');\n                    raw = message.get('raw');\n                }\n            } else {\n                messageBody = message.get('messageBody');\n                raw = message.get('raw');\n            }\n\n            this.get('notification').info(title, messageBody, {\n                icon: message.get('chatUser.profilePicture.x128'),\n                rawMessage: raw,\n                tag: message.get('room.jid'),\n                hideAfter: 8,\n                soundId: 'chat',\n                shouldShowPopup: showPopup,\n                shouldPlaySound: playSound,\n                target: this.get('applicationController'),\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendEngageNotification(message) {\n        let title = message.title;\n        let body = message.body;\n        let options = {\n            rawMessage: body,\n            hideAfter: message.hideAfter,\n            markdownToHtml: false,\n            shouldShowPopup: true,\n            shouldPlaySound: false,\n            clickHandler: message.clickHandler,\n            target: this.get('applicationController'),\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n        };\n\n        if (message.severity === 'error') {\n            this.get('notification').error(title, body, options);\n        } else {\n            this.get('notification').info(title, body, options);\n        }\n    },\n\n    shouldShowNotification(message) {\n        let isBusyUser = this.get('session.person.presence') === 'busy' && !message.get('room').isOneToOneRoom();\n        let isDuplicate = false;\n        if (message.duplicate) {\n            isDuplicate = message.get('duplicate');\n        }\n\n        let messageAlreadySeen = !message.get('unread');\n        let fromLoggedInUser = compareJids(message.get('chatUser.jid'), this.get('session.person.jid'));\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let windowFocused = this.windowInFocus();\n        let isSupervisorRoom = false;\n        targetRoomIsMuted = this.roomMuted(message.get('room.jid'));\n        isSupervisorRoom = message.get('room.isSupervisorRoom');\n\n        // Negative cases that block notifications are checked first.\n        if (\n            isBusyUser ||\n            isDuplicate ||\n            messageAlreadySeen ||\n            fromLoggedInUser ||\n            roomIsVisible ||\n            targetRoomIsMuted ||\n            isSupervisorRoom\n        ) {\n            return false;\n        } else if (!roomIsVisible || !windowFocused) {\n            //Then positive cases that indicate a notification should be shown are checked.\n            return true;\n        }\n\n        // The final default is to not show a notification\n        return false;\n    },\n\n    shouldShowMentionNotification(room) {\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let groupNotificationsEnabled = false;\n        let coveredByMessageNotification = false;\n\n        targetRoomIsMuted = this.roomMuted(room.get('jid'));\n        groupNotificationsEnabled = this.get('preferences.notifications.global.showGroupNotifications');\n        coveredByMessageNotification = groupNotificationsEnabled && !targetRoomIsMuted;\n\n        // Don't show a notification if the message is on screen already or if the notification will be covered\n        // by the message notification\n        if (roomIsVisible || coveredByMessageNotification) {\n            return false;\n        }\n\n        // Unlike messages the default for a mention notification is true\n        return true;\n    },\n\n    getNotificationTitle(room, chatUser) {\n        if (room.isOneToOneRoom()) {\n            return chatUser.get('name');\n        } else {\n            let personName = chatUser.get('name');\n            let roomName = room.getRawDisplaySubject();\n            return this.get('intl')\n                .lookup('notification.titles.chatRoomMessage', {\n                    personName: personName,\n                    roomName: roomName\n                })\n                .toString();\n        }\n    },\n\n    sendTestNotification() {\n        let title = this.get('intl').lookup('notification.titles.testNotification').toString();\n        let message = this.get('intl').lookup('notification.titles.testText').toString();\n        this.get('notification').info(title, message, {\n            icon: this.get('session.person.profilePicture.x128'),\n            tag: 'test-message',\n            hideAfter: 8,\n            soundId: 'chat',\n            shouldShowPopup: true,\n            shouldPlaySound: true,\n            target: this.get('applicationController'),\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId(),\n            clickHandler: () => {}\n        });\n    },\n\n    getNotificationVolume() {\n        let volume = this.get('chat.chatNotificationVolume');\n        if (volume > 1) {\n            volume = volume / 100;\n        }\n        return volume;\n    },\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    }\n});\n\nexport default MessageNotificationsMixin;\n","import Ember from 'ember';\nimport moment from 'moment';\nimport { markdownToHtml } from '../../utils/markdown';\nimport ChatMessage from '../../models/chat-message';\nimport { v4 as uuid } from 'uuid';\n\nexport default Ember.Mixin.create({\n    batchDataRequests: Ember.inject.service(),\n\n    messageDelayDefault: 200,\n    messageDelay: 200,\n    maxDelay: 25000,\n\n    _splitOverSizedMessage(message) {\n        //this regex pattern will try to split the message as close to 4000 characters as possible,\n        //if 4000 character falls on the middle of a word it will split before the word begins. If splitting\n        //isn't possible due to a long string of characters without a space it will just split at the 4,000\n        //character mark.\n        const pattern = /^(?:([\\s\\S]{1,4000}(?=[\\s]|$))|(?!([\\s\\S]{1,4000}(?=[\\s]|$)))[\\s\\S]{1,4000})/i;\n        var messageQueue = [];\n\n        while (message.length > 0) {\n            const result = pattern.exec(message);\n            messageQueue.push(result[0]);\n            message = message.slice(result[0].length);\n        }\n        return messageQueue;\n    },\n\n    _convertSplitMessagesToWidgets(room, messageQueue) {\n        const jid = room.get('jid');\n        const id = uuid();\n        let index = 0;\n\n        return messageQueue.map(message => {\n            const stanza = {\n                name: 'multipart-message',\n                contents: JSON.stringify({\n                    id: id,\n                    index: index++,\n                    messageCount: messageQueue.length\n                })\n            };\n            return {\n                to: jid,\n                body: message,\n                children: [stanza]\n            };\n        });\n    },\n\n    sendSplitMessageQueue(room, messageQueue) {\n        let deferred = Ember.RSVP.defer();\n        this._delayedMessageSender(room, deferred, messageQueue, null);\n        deferred.promise.catch(unsentMessageQueue => {\n            this._addFailedMessagesToRoom(room, unsentMessageQueue);\n            deferred.resolve(null);\n        });\n        return deferred.promise;\n    },\n\n    _addFailedMessagesToRoom(room, unsentMessageQueue) {\n        unsentMessageQueue.forEach(splitWidget => {\n            const jid = room.get('jid');\n            const owner = Ember.getOwner(this);\n            const stanza = this._manuallyCreateStanzaForFailedMessage(splitWidget);\n\n            let message = ChatMessage.create(\n                {\n                    from: this.get('session.person.jid'),\n                    oid: uuid(),\n                    time: moment(),\n                    stanza: stanza,\n                    links: [],\n                    raw: splitWidget.body,\n                    to: jid,\n                    widget: splitWidget,\n                    sendError: true\n                },\n                owner.ownerInjection()\n            );\n            message.set('messageBody', markdownToHtml(splitWidget.body));\n            this.checkForMentions(message);\n            this.get('batchDataRequests')\n                .getChatUser(message.get('from'))\n                .then(person => {\n                    message.set('chatUser', person);\n                    this.setMessageReadState(message);\n                    room.addMessage(message);\n                });\n        });\n    },\n\n    _manuallyCreateStanzaForFailedMessage(splitWidget) {\n        const childName = Ember.get(splitWidget, 'children.lastObject.name');\n        const childPayload = Ember.get(splitWidget, 'children.lastObject.contents');\n        return {\n            children: [\n                {\n                    name: childName,\n                    children: [childPayload]\n                }\n            ]\n        };\n    },\n\n    findMessageById(room, messageId) {\n        const messageCache = room.get('messageCache');\n        if (Object.prototype.hasOwnProperty.call(messageCache, messageId)) {\n            return messageCache.get(messageId);\n        }\n        return null;\n    },\n\n    _delayedMessageSender(room, deferred, messageQueue, pendingMessage) {\n        if (messageQueue.length === 0) {\n            deferred.resolve(null);\n            return;\n        }\n\n        if (this.get('messageDelay') >= this.get('maxDelay')) {\n            this.set('messageDelay', this.get('messageDelayDefault'));\n            let message = this.findMessageById(room, pendingMessage);\n            const splitWidget = messageQueue.shift();\n            message.setProperties({\n                sendError: true,\n                pending: false,\n                widget: splitWidget\n            });\n            deferred.reject(messageQueue);\n            return;\n        }\n\n        if (pendingMessage !== null) {\n            const failedMessage = messageQueue.get('firstObject');\n            const splitMessageData = JSON.parse(Ember.get(failedMessage, 'children.lastObject.contents'));\n            const splitMessageParent = room.get('splitMessageCache').get(splitMessageData.id);\n\n            if (splitMessageParent.get('messageArray.length') > 1) {\n                const message = this.findMessageById(room, pendingMessage);\n                splitMessageParent.get('messageArray').removeObject(message);\n            } else {\n                room.get('messages').removeObject(splitMessageParent);\n                const splitMessageCache = room.get('splitMessageCache');\n                delete splitMessageCache[splitMessageData.id];\n            }\n        }\n\n        this.sendMessageToRoom(room.get('jid'), null, messageQueue[0])\n            .then(() => {\n                messageQueue.shift();\n                this.set('messageDelay', this.get('messageDelayDefault'));\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    null,\n                    this.get('messageDelay')\n                );\n            })\n            .catch(messageId => {\n                this.set('messageDelay', this.get('messageDelay') * 2);\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    messageId,\n                    this.get('messageDelay')\n                );\n                return Ember.RSVP.reject();\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    chatService: inject.service('chat'),\n    oneToOneRoom: null,\n\n    presenceSubscriptionCounter: 0,\n\n    jid: computed('contactInfo.chat', function () {\n        const chatField = this.getFieldValue('contactInfo.chat');\n        if (chatField) {\n            return Ember.get(chatField, 'value.jid');\n        }\n        return null;\n    }),\n\n    // Deprecated: Please use entity-presence mixin properties where possible.\n    presence: computed.reads('activityPresence'),\n    chatStatus: computed.reads('primaryStatusMessage'),\n    hasChatStatus: computed.notEmpty('chatStatus'),\n\n    // TODO: these hasMedia computeds should move \"up\" a layer to \"participant\" - a new model layer for persons in rooms\n    hasMedia: computed('mediaPresence', function () {\n        const mediaInfo = this.get('mediaPresence.media');\n        return !!_.find(mediaInfo, media => media.audio || media.video || media.listener);\n    }),\n\n    hasMediaInActiveChatRoom: computed('hasMedia', 'chatService.activeRoom', function () {\n        return this.get('mediaPresence.roomJid') === this.get('chatService.activeRoom.jid');\n    })\n});\n","import ClickOutsideMixin from 'ember-click-outside/mixins/click-outside';\nexport default ClickOutsideMixin;\n","define(\"connections-ui/mixins/conversation-analysis\", [\"exports\", \"ember-webrtc-components/mixins/webrtc-conversation-analysis\"], function (_exports, _webrtcConversationAnalysis) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversationAnalysis.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst BASE_URI_V2 = 'api/v2/conversations';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    application: inject.service(),\n    acdNormalizedMessages: Ember.computed.bool('session.features.acdNormalizedMessages'),\n\n    pcUri: function () {\n        let application = this.get('application');\n        return application.pcV2Uri.apply(application, arguments);\n    },\n    baseUri: function () {\n        let application = this.get('application');\n        return application.pcV2Uri(BASE_URI_V2);\n    },\n    callsUri: function (id) {\n        return `${this.communicationUri(id, 'calls')}`;\n    },\n    createCommunicationUri: function (mediaType) {\n        return `${this.baseUri()}/${mediaType}`;\n    },\n    communicationUri: function (id, mediaType) {\n        return !_.isEmpty(mediaType) ? `${this.baseUri()}/${mediaType}/${id}` : `${this.baseUri()}/${id}`;\n    },\n    communicationsUri(id, participantId, mediaType, mediaId) {\n        return `${this.participantUri(id, participantId, mediaType)}/communications/${mediaId}`;\n    },\n    communicationsByTypeUri: function (mediaType) {\n        return this.baseUri() + '?communicationType=' + mediaType;\n    },\n    consultUri: function (id, participantId, mediaType, entity) {\n        if (this.get('session.features.acdTransferPermissions') && entity) {\n            entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n            return this.participantUri(id, participantId, mediaType) + '/consult' + `/${entity}`;\n        }\n        return this.participantUri(id, participantId, mediaType) + '/consult';\n    },\n    disconnectMediaTypeUri: function (id, mediaId, participantId, mediaType) {\n        const uri = `${BASE_URI_V2}/${mediaType}/${id}/participants/${participantId}/communications/${mediaId}`;\n        return this.get('application').pcV2Uri(uri);\n    },\n    getConversationUri: function (id) {\n        return this.communicationUri(id);\n    },\n    mediaRequestUri: function (id) {\n        return `${this.communicationUri(id, 'chats')}/mediarequests`;\n    },\n    monitorUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/monitor';\n    },\n    participantUri: function (id, participantId, mediaType) {\n        return this.participantsUri(id, mediaType) + participantId;\n    },\n    participantsUri: function (id, mediaType) {\n        return this.communicationUri(id, mediaType) + '/participants/';\n    },\n    participantDetailsUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/details';\n    },\n    participantWrapupUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapup';\n    },\n    sessionShareCodeUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/codes';\n    },\n    expireSessionShareCodeUri: function (id, participantId, securityKey) {\n        return this.participantUri(id, participantId) + '/codes/' + securityKey;\n    },\n    participantWrapupCodesUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapupcodes';\n    },\n    participantCommunicationWrapupUri: function (id, participantId, mediaType, communicationId) {\n        return this.participantUri(id, participantId, mediaType) + '/communications/' + communicationId + '/wrapup';\n    },\n    replaceUri: function (id, participantId, query, mediaType, entity) {\n        if (query) {\n            return this.participantUri(id, participantId, mediaType) + '/replace' + this.getQueryStr(query);\n        } else {\n            if (this.get('session.features.acdTransferPermissions') && entity) {\n                entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n                return this.participantUri(id, participantId, mediaType) + '/replace' + `/${entity}`;\n            }\n            return this.participantUri(id, participantId, mediaType) + '/replace';\n        }\n    },\n    scheduleCallbackUri: function (id, participantId) {\n        return `${this.participantUri(id, participantId)}/callbacks`;\n    },\n    tagsUri: function (id) {\n        //Are we using this?\n        return this.communicationUri(id) + '/tags';\n    },\n    wrapUpUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/wrapup';\n    },\n    wrapUpCodesUri: function (id) {\n        return this.communicationUri(id) + '/wrapupCodes';\n    },\n    messagesUri: function (id, mediaType) {\n        return `${this.communicationUri(id, mediaType)}/messages`;\n    },\n    sendChatMessageUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/messages`;\n    },\n    sendTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/typing`;\n    },\n    sendMessagingTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'messages')}/communications/${communicationId}/typing`;\n    },\n    draftUri: function (id, mediaType, query) {\n        if (query) {\n            return `${this.messagesUri(id, mediaType)}/draft${this.getQueryStr(query)}`;\n        } else {\n            return `${this.messagesUri(id, mediaType)}/draft`;\n        }\n    },\n    draftAttachmentUri: function (id, attachmentId, mediaType) {\n        return `${this.draftUri(id, mediaType)}/attachments/${attachmentId}`;\n    },\n    smsUri: function (id) {\n        return `${this.communicationUri(id, 'messages')}/messages`;\n    },\n    smsHistoryUri: function (id) {\n        return this.getConversationUri(id);\n    },\n    smsMessageDetailUri: function (id, messageId) {\n        // api/v2/conversations/messages/{conversationId}/messages/{messageId}/details\n        return `${this.smsUri(id)}/${messageId}/details/?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    smsMessageBatchUri: function (id) {\n        return `${this.smsUri(id)}/bulk?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    sendSMSMessageUri: function (id, communicationId) {\n        return `${this.communicationUri(\n            id,\n            'messages'\n        )}/communications/${communicationId}/messages?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    createMediaAttachmentUri: function (id, communicationId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media`;\n    },\n    getMediaAttachmentUri: function (id, communicationId, mediaId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media/${mediaId}`;\n    },\n    copyMediaAttachmentUri: function (conversationId) {\n        // api/v2/conversations/emails/{conversationId}/messages/draft/attachments/copy\n        return `${this.communicationUri(conversationId, 'emails')}/messages/draft/attachments/copy`;\n    },\n    requestACWUri: function (interactionId, participantId, agentCommunicationId) {\n        // api/v2/conversations/aftercallwork/{conversationId}/participants/{participantId}/communications/{communicationId}\n        return `${this.communicationUri(\n            ''\n        )}aftercallwork/${interactionId}/participants/${participantId}/communications/${agentCommunicationId}`;\n    },\n    getSupportedContentUri: function (subType, id) {\n        return `${this.baseUri()}/messaging/integrations/${subType}/${id}?expand=supportedContent`;\n    },\n\n    getDeploymentConfigUri: function (deploymentId, getSupportedContent = false) {\n        if (getSupportedContent) {\n            return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?expand=supportedContent`;\n        }\n        return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?type=active`;\n    },\n\n    getIntegrationConfigUri: function (subMessageType, integrationId) {\n        return `${this.baseUri()}/messaging/integrations/${subMessageType}/${integrationId}?expand=messagingSetting`;\n    },\n\n    getConversationSummaryFeedbackUri: function (conversationId, summaryId) {\n        return `${this.baseUri()}/${conversationId}/summaries/${summaryId}/feedback`;\n    },\n\n    getQueryStr: function (parameters) {\n        var query = '';\n        var arrayParameterCollection = {};\n        var params;\n\n        if (parameters && !_.isEmpty(parameters)) {\n            // Get all parameters that are simple key-value pairs and where the value is\n            // NOT an array\n            params = _.reduce(\n                parameters,\n                function (result, value, key) {\n                    if (Array.isArray(parameters[key])) {\n                        arrayParameterCollection[key] = value;\n                    } else {\n                        result[key] = value;\n                    }\n\n                    return result;\n                },\n                {}\n            );\n\n            // serialize the parameters\n            query = '?' + $.param(params);\n\n            _.forIn(arrayParameterCollection, function (arr, key) {\n                // convert the array values into query parameters that will result in:\n                //   ?key=value1&key=value2&...\n                _.each(arr, function (item) {\n                    if (query === '?') {\n                        query += key + '=' + item;\n                    } else {\n                        query += '&' + key + '=' + item;\n                    }\n                });\n            });\n        }\n        return query;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    // TODO: Fill in this stub for answer a chat\n    // with code that will actually answer a chat.\n    answerChat: function (conversation) {\n        return Ember.RSVP.resolve(conversation);\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject } = Ember;\nconst { Promise } = Ember.RSVP;\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    session: inject.service(),\n    ajax: inject.service(),\n\n    defaultLogLevel: 'debug',\n\n    /*\n     * Proxies AJAX requests as raw requests capturing\n     * response codes, correlations, etc. and loggin them\n     * out to SumoLogic automatically. Failed requests\n     * Promises will always resolved with the response,\n     * payload, and jqXHR object.\n     *\n     * @param {string} url - The request url path.\n     * @param {object} options - The request options.\n     * @param {string} type - The type of request to be made.\n     *\n     * @returns {Promise} Result of Ajax request\n     */\n    makeRequest(url, options = {}, type = 'get') {\n        const userId = this.get('session.person.guid');\n        const logger = this.logger;\n\n        if (type !== 'raw') {\n            options.method = (options.method || type).toUpperCase();\n            options.cache = false;\n        } else if (type === 'raw') {\n            options.method = (options.method || 'get').toUpperCase();\n        }\n\n        if (options.method && options.method.toLowerCase() !== 'get') {\n            options.dataType = options.dataType || 'json';\n        }\n\n        if (\n            options.data &&\n            options.dataType &&\n            options.dataType.toLowerCase() === 'json' &&\n            typeof options.data !== 'string' &&\n            options.method.toLowerCase() !== 'get'\n        ) {\n            options.contentType = 'application/json; charset=UTF-8';\n            options.data = JSON.stringify(options.data);\n        }\n\n        /*\n         * Logs the request at a specific log level\n         *\n         * @param {string} path - The request url path.\n         * @param {object} options - The request options.\n         * @param {object} payload - The response payload.\n         * @param {int} status - The response status code.\n         * @param {string} correlation - The correlation guid of the response.\n         * @param {strign} logLevel - The level to emit the log with.\n         */\n        const logRequest = (path, options, payload, status, correlation, logLevel) => {\n            const log = {\n                namespace: 'conversations',\n                message: 'User request',\n                path: path,\n                options: options,\n                response: { status, correlation },\n                user: userId\n            };\n\n            if (payload) {\n                log.response.payload = payload;\n            }\n\n            logger[logLevel]('Conversation Request:', { log });\n        };\n\n        /*\n         * Parses the response from the request to send to logRequest.\n         *\n         * @param {object} jqXHR - The jqXHR object.\n         * @param {object} payload - The response payload.\n         * @param {boolean} isError - Flag used to set appropriate log level.\n         */\n        const captureRequest = (request, isError) => {\n            const jqXHR = request.jqXHR;\n            const payload = request.payload;\n            if (jqXHR) {\n                const statusCode = jqXHR.status;\n                const correlationId = jqXHR.getResponseHeader('ININ-Correlation-id');\n                const logLevel = isError ? 'error' : this.get('defaultLogLevel');\n                logRequest(url, options, payload, statusCode, correlationId, logLevel);\n            }\n        };\n\n        /*\n         * Resolves a provies based on the response of a request.\n         *\n         * @param {object} response - Response from jqXHR request.\n         * @param {boolean} error - Flag use to resolve/reject promise.\n         *\n         * @returns {Promise} Promise resolve/rejecting jqXHR response.\n         */\n        const resolveRequest = (response, error) => {\n            const resolution = !!error ? 'reject' : 'resolve';\n            if (type === 'raw' || !!error) {\n                return Promise[resolution](response);\n            }\n            return Promise[resolution](response.response);\n        };\n\n        /*\n         * Determines if jqXHR response error is merely a parse error\n         * of an empty string returned by publicAPI.\n         *\n         * @param {response} - Response object from request.\n         */\n        const isSuccessResponse = response => {\n            if (response) {\n                const status = response.status || response.jqXHR.status;\n                if (status === 200 || status === 202) {\n                    return true;\n                }\n            }\n            return false;\n        };\n\n        return this.get('ajax')\n            .raw(url, options)\n            .then(response => {\n                captureRequest(response);\n                return resolveRequest(response);\n            })\n            .catch(response => {\n                // Swallow errors if jQuery is just failing to\n                // parse an empty respone as a valid JSON object.\n                if (isSuccessResponse(response)) {\n                    captureRequest(response);\n                    return resolveRequest(response);\n                }\n                captureRequest(response, true);\n                return resolveRequest(response, true);\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldConfig from '../field-config/field-config';\n\nconst { inject, Mixin } = Ember;\n\nfunction newPublicApiGroupData(name, type, vis) {\n    return {\n        name: name,\n        type: type.includes('groups.') ? type.split('.')[1] : type,\n        visibility: vis.toLowerCase(),\n        rulesVisible: true\n    };\n}\n\nexport default Mixin.create({\n    intl: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    application: inject.service(),\n\n    groupName: null,\n    groupType: null,\n    groupVisibility: null,\n\n    groupTypeDefault: Ember.computed.reads('newGroupTypeChoices.0'),\n    groupVisibilityDefault: Ember.computed.reads('newGroupVisibilityChoices.0'),\n    groupMembershipDefault: Ember.computed.reads('newGroupMembershipChoices.0'),\n    groupModal: null,\n\n    nameLengthExceeded: false,\n\n    creatingGroup: false,\n\n    createGroup() {\n        const intl = this.get('intl');\n        var name = this.get('groupName');\n        var type = this.get('groupType');\n        var visibility = this.get('groupVisibility');\n\n        if (!type) {\n            type = this.get('groupTypeDefault.value');\n        }\n\n        if (!visibility) {\n            visibility = this.get('groupVisibilityDefault.value');\n        }\n\n        if (visibility.toLowerCase() === 'public') {\n            visibility = 'public';\n        } else if (visibility.toLowerCase() === 'members-only') {\n            visibility = 'members';\n        } else {\n            visibility = 'owners';\n        }\n\n        const data = newPublicApiGroupData(name, type, visibility);\n        const url = this.get('application').pcV2Uri('api/v2/groups');\n        const request = this.get('ajax').post(url, { data });\n\n        return request\n            .then(data => {\n                try {\n                    this.setProperties({\n                        groupName: null,\n                        groupType: null,\n                        groupVisibility: null\n                    });\n                } catch (err) {\n                    Ember.Logger.error('Failed to set properties to null', { error: err });\n                }\n\n                this.sendAction('cancel');\n\n                this.bubbleAction({\n                    action: 'transitionToRoute',\n                    actionContext: ['group.detail', data.id]\n                });\n            })\n            .catch(err => {\n                this.setProperties({\n                    groupName: null,\n                    groupType: null,\n                    groupVisibility: null\n                });\n\n                this.sendAction('cancel');\n\n                const error = Ember.get(err, 'errors.0.detail');\n                const title = intl.lookup('notification.group.errorTitle');\n                let message = intl.lookup('notification.group.createError');\n\n                if (Ember.get(error, 'payload.code') === 'DUPLICATE_VALUE') {\n                    message = intl.lookup('notification.group.duplicate');\n                }\n\n                this.get('notification').error(title, message, {\n                    hideAfter: 5,\n                    forceBrowserNotification: true\n                });\n\n                Ember.Logger.error('Error creating group:', { error: err });\n            });\n    },\n\n    canCreateGroup: Ember.computed('session.person.namedPermissions', 'session.person.isAdmin', function () {\n        var permissions = this.get('session.person.namedPermissions');\n        var isAdmin = this.get('session.person.isAdmin');\n\n        if (_.includes(permissions, 'admin') || isAdmin) {\n            return true;\n        }\n\n        var createGroup = _.includes(permissions, 'group_creation');\n        var adminGroup = _.includes(permissions, 'group_administration');\n\n        return createGroup || adminGroup;\n    }),\n\n    groupTypeI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('general.groupType.i18nLabel');\n    }),\n\n    newGroupTypeChoices: Ember.computed('intl.isoLocale', function () {\n        var types = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('groupTypes');\n\n        return types.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_general_groupType_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    }),\n\n    groupVisibilityI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('privacy.groupVisibility.i18nLabel');\n    }),\n\n    newGroupVisibilityChoices: Ember.computed('intl.isoLocale', function () {\n        var choices = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).getAllowedValues(\n            'privacy.groupVisibility'\n        );\n\n        return choices.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_privacy_groupVisibility_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    })\n});\n","define(\"connections-ui/mixins/device-enumeration\", [\"exports\", \"ember-webrtc-components/mixins/device-enumeration\"], function (_exports, _deviceEnumeration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deviceEnumeration.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst {\n    $,\n    Mixin,\n    run: { bind }\n} = Ember;\n\nexport default Mixin.create({\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            const iframe = Ember.get(this, 'element');\n            if (iframe) {\n                const messageEvent = event.originalEvent;\n                const messageData = messageEvent.data;\n                const messageOptions = Object.assign({}, messageData.options);\n                if (messageEvent.source === iframe.contentWindow && messageData.type) {\n                    this.triggerMessageAction(messageData.type.toLowerCase(), messageData.data, messageOptions);\n                }\n            }\n        });\n    },\n\n    triggerMessageAction(type, data, options = {}) {\n        if (this.messageHandlers[type]) {\n            this.logger.debug('Handling message type', type, data);\n            this.messageHandlers[type].call(this, data, options);\n        } else {\n            // An in-house utility generates messages in this\n            // format that we do not want to log. See: PCDWEBK-4163\n            if (type !== 'rpc:request') {\n                this.logger.info('Unknown message type', { type, data });\n            }\n        }\n    },\n\n    startMessageListener: Ember.on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, bind(this, this.handleMessageEvent));\n    }),\n\n    stopMessageListener: Ember.on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nvar EntityControllerMixin = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    entity: null,\n\n    excludedFieldSections: null,\n\n    lastUploadedImage: null,\n\n    editingPictures: false,\n\n    viewingGallery: false,\n\n    actions: {\n        cancelEditProfilePicture() {\n            this.set('editingPictures', false);\n        },\n\n        editProfilePicture() {\n            this.set('editingPictures', true);\n        },\n\n        cancelUpload() {\n            this.send('editProfilePicture');\n        },\n\n        cancelEditPictures() {\n            this.set('uploadType', null);\n        },\n\n        viewLightGallery() {\n            this.set('viewingGallery', true);\n        },\n\n        cancelViewLightGallery() {\n            this.set('viewingGallery', false);\n        },\n\n        noop() {}\n    },\n\n    setInitialFieldSections: Ember.on('init', function () {\n        this.set('excludedFieldsSections', []);\n    }),\n\n    fieldSections: Ember.computed('entity', function () {\n        var entity = this.get('entity');\n\n        if (entity) {\n            var sections = this.get('entity').fieldConfig.sections;\n\n            if (this.get('application.session.user.isAdmin') && !this.get('application.session.user.personId')) {\n                return _.filter(\n                    sections,\n                    function (section) {\n                        var excludedSections = this.get('excludedFieldSections');\n                        return excludedSections.indexOf(section.key) === -1;\n                    },\n                    this\n                );\n            }\n\n            return _.filter(\n                sections,\n                function (section) {\n                    var readableSections = this.get('entity').getReadableSections(),\n                        excludedSections = this.get('excludedFieldSections');\n                    return excludedSections.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n                },\n                this\n            );\n        }\n\n        return [];\n    })\n});\n\nexport default EntityControllerMixin;\n","import Ember from 'ember';\n\n// Brings in isOneToOneOfflineOrBusy\nimport WebrtcActionUtils from 'connections-ui/mixins/webrtc-action-utils';\n\nexport default Ember.Mixin.create(WebrtcActionUtils, {\n    chat: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    application: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    mediaProviders: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    isChatEnabled: Ember.computed.reads('chat.enabled'),\n    isWebrtcEnabled: Ember.computed.reads('webrtc.enabled'),\n    isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled'),\n    phoneServiceEnabled: Ember.computed.reads('phoneService.enabled'),\n    phoneAvailable: Ember.computed.reads('phoneService.phoneAvailable'),\n    self: Ember.computed.reads('session.person'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('applicationUrlPrefix', this.get('application.urlprefix') || '');\n\n        // Need user details to compute the 'useMediaProviders' property, which is only used by the {{entity-contact-group}} component.\n        if (this.get('entity.type') === 'person' && this.classNames.includes('entity-contact-group-v2')) {\n            this.get('store')\n                .findRecord('public-api-user', this.get('entity.id'), {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => this.set('user', user));\n        }\n    },\n    callEntity(entity) {\n        this.get('phoneService').makeCall(entity);\n    },\n    toggleFavorite(entity) {\n        this.get('favorites').toggleFavorite(entity);\n    },\n\n    mediaProviderComponent: 'media-providers/video-dropdown',\n\n    videoProviders: Ember.computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getProvidersForUser('video', this.get('user'));\n    }),\n\n    useMediaProviders: Ember.computed('videoProviders.@each.haveAccess', function () {\n        const providers = this.get('videoProviders').filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }),\n\n    integrationBadgesComponent: 'integration-badges',\n    useIntegrationBadges: true\n});\n","import Ember from 'ember';\nimport moment from 'moment';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\nimport Presence from 'ember-purecloud-components/models/presence';\n\nconst { get, set, inject, computed, Mixin } = Ember;\n\nexport function isPresence(presenceMap, definition, check) {\n    if (!definition) {\n        return false;\n    }\n\n    let apiValue = get(definition, 'systemPresence');\n    let id = get(definition, 'id');\n\n    if (apiValue) {\n        return apiValue.toLowerCase() === check;\n    } else if (id && presenceMap) {\n        let presenceMapping = presenceMap.findBy('id', id);\n        if (presenceMapping && presenceMapping.systemPresence) {\n            return presenceMapping.systemPresence.toLowerCase() === check;\n        }\n    }\n\n    return false;\n}\n\nexport default Mixin.create({\n    intl: inject.service(),\n    session: inject.service(),\n    presenceService: inject.service('presence'),\n    phoneIntegrations: inject.service(),\n\n    outOfOffice: computed.reads('activities.outOfOffice'),\n    routingStatus: computed.reads('activities.routingStatus'),\n    acdDivisionPresenceProfileToggle: computed.readOnly('session.features.acdDivisionPresenceProfileToggle'),\n    primaryPresence: computed(\n        'activities.presence',\n        'activities.integrationPresence',\n        'session.presenceMap',\n        'presenceList.[]',\n        'currentPresenceSource',\n        function () {\n            const presence = this.get('activities.presence');\n            const presenceList = this.get('presenceList');\n            let currentPresenceSource = this.get('currentPresenceSource');\n            const integrationPresence = this.get('integrationPresence');\n            let currentPresence = presence;\n\n            // check the presence list for primary presence\n            // falls back to `activities.presence`\n            if (presenceList && presenceList.length > 0) {\n                const existingPresence = presenceList.find(pres => {\n                    let presSource = pres.source;\n                    if (isPurecloudSource(presSource)) {\n                        presSource = 'default';\n                    }\n                    return presSource.toLowerCase() === currentPresenceSource.toLowerCase();\n                });\n                if (existingPresence) {\n                    if (!presence) {\n                        // there are times where activities.presence is undefined\n                        currentPresence = existingPresence;\n                    } else {\n                        // need to verify if expands presence (from api) is the latest presence\n                        const existingPresenceDate = moment(existingPresence.modifiedDate);\n                        const activitiesPresenceDate = moment(presence.modifiedDate);\n                        const isExistingPresenceLatest = existingPresenceDate.isAfter(activitiesPresenceDate);\n                        if (isExistingPresenceLatest) {\n                            // if presence value in presence list, is the latest, then use that instead\n                            currentPresence = existingPresence;\n                        }\n                    }\n                }\n            }\n\n            // if user has an integration presence\n            if (integrationPresence && Ember.get(integrationPresence, 'presenceDefinition')) {\n                // check if user is offline for their primary presence source\n                const isGCOffline = isPresence(\n                    this.get('session.presenceMap'),\n                    !!currentPresence ? Ember.get(currentPresence, 'presenceDefinition') : undefined,\n                    'offline'\n                );\n\n                // if offline in primary presence source\n                // return integration presence\n                if (isGCOffline) {\n                    return integrationPresence;\n                }\n            }\n            return currentPresence;\n        }\n    ),\n\n    conversationSummary: computed.reads('activities.conversationSummary'),\n    geolocation: computed.reads('activities.geolocation'),\n    presenceDefinition: computed.reads('primaryPresence.presenceDefinition'),\n\n    // PCUCC-1546 - new integrationPresence expands for 3rd Party Presence\n    integrationPresence: computed.reads('activities.integrationPresence'),\n\n    presenceModel: computed(\n        'primaryPresence.presenceDefinition.systemPresence',\n        'presenceDefinition',\n        'presenceService.allPresences.[]',\n        'presenceService.outOfBandPresenceDefinitions.[]',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const presenceService = this.get('presenceService');\n            const presences = this.get('presenceService.allPresences');\n            const presenceDefinition = this.get('presenceDefinition');\n            if (presenceDefinition && presences && presences.length > 0) {\n                const presence = presences.find(presence => {\n                    return get(presenceDefinition, 'id') === get(presence, 'id');\n                });\n                const canViewPresenceDefinition = this.get('permissions.canViewPresenceDefinition');\n\n                if (this.get('acdDivisionPresenceProfileToggle')) {\n                    const outOfBandPresences = this.get('presenceService.outOfBandPresenceDefinitions');\n                    let outOfBandPresence;\n                    if (outOfBandPresences) {\n                        outOfBandPresence = outOfBandPresences.find(presence => {\n                            return get(presenceDefinition, 'id') === get(presence, 'id');\n                        });\n                    }\n                    if (!presence && !outOfBandPresence) {\n                        if (canViewPresenceDefinition) {\n                            // This recalculates the data necessary to handle the use cases where an unknown\n                            // presence is selected or when a deactivated presence has worked its way into the\n                            // cache (outside user intervention)\n                            // integration presence will be undefined at times and trigger many loops based on results\n                            Ember.run.join(() => {\n                                return presenceService.findPresence(get(presenceDefinition, 'id'), presenceDefinition);\n                            });\n                        } else {\n                            if (\n                                get(presenceDefinition, 'id') &&\n                                presenceDefinition &&\n                                presenceDefinition.systemPresence\n                            ) {\n                                //same code as in presenceService.findPresence catch() to retrieve the matching system status\n                                // We need to map the out of band presence to a primary presence for translation sake.\n                                return presenceService.get('primaryPresences').find(presence => {\n                                    const matchingPrimaryPresence =\n                                        presence.get('presence.systemPresence').toLowerCase() ===\n                                        presenceDefinition.systemPresence.toLowerCase();\n                                    if (matchingPrimaryPresence) {\n                                        const newPresence = presence.get('presence');\n                                        // Replace the id of the actual def instead of the primary presences id\n                                        set(newPresence, 'id', presenceDefinition.id);\n                                        const instance = Presence.create(\n                                            {\n                                                presence: newPresence\n                                            },\n                                            presenceService.getOwner(presenceService).ownerInjection()\n                                        );\n                                        presenceService.get('outOfBandPresenceDefinitions').addObject(instance);\n                                        return instance;\n                                    }\n                                    return false;\n                                });\n                            }\n                        }\n                    }\n                    return presence || outOfBandPresence;\n                } else {\n                    if (!presence && canViewPresenceDefinition) {\n                        // Try to find a system presence that matches\n                        const systemPresence = presences.find(\n                            p =>\n                                get(p, 'presence.type') === 'System' &&\n                                get(p, 'presence.systemPresence') === get(presenceDefinition, 'systemPresence')\n                        );\n                        if (systemPresence) {\n                            return systemPresence;\n                        }\n                        // This recalculates the data necessary to handle the use cases where an unknown\n                        // presence is selected or when a deactivated presence has worked its way into the\n                        // cache (outside user intervention)\n                        // integration presence will be undefined at times and trigger many loops based on results\n                        Ember.run.join(() => presenceService.findPresence(get(presenceDefinition, 'id')));\n                    }\n                    return presence;\n                }\n            }\n\n            return presences.findBy('key', 'offline');\n        }\n    ),\n\n    presenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'isOutOfOffice',\n        'outOfOffice.endDate',\n        'integrationPresence',\n        'primaryPresence',\n        'presenceModel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const endOfTime = moment('9999-12-31T00:00:00.000Z');\n\n            if (this.get('isOutOfOffice')) {\n                let end = moment(this.get('outOfOffice.endDate'));\n                if (end.isSame(endOfTime) || end.year() === 9999 || this.get('outOfOffice.indefinite')) {\n                    return this.get('intl').t('chat.presence.outOfOffice.title');\n                } else {\n                    return this.get('intl').t('chat.presence.outOfOffice.presence', {\n                        date: end.locale(this.get('intl.isoLocale')).format('l')\n                    });\n                }\n            }\n\n            const integrationPresenceSource = this.get('integrationPresence.source');\n            let primaryPresenceSource = this.get('primaryPresence.source');\n\n            if (isPurecloudSource(primaryPresenceSource)) {\n                primaryPresenceSource = 'default';\n            }\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                // if using 3rd Party Presence, append 3rd Party labels to presence label\n                if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                    const integrationLabel = this.get('intl').t(\n                        `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                    );\n                    return `${this.get('presenceModel.label')} on ${integrationLabel}`;\n                }\n                return this.get('presenceModel.label');\n            }\n            // if using 3rd Party Presence, append 3rd Party labels to presence label\n            if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                const integrationLabel = this.get('intl').t(\n                    `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                );\n                return `${this.get('presenceModel.primaryLabel')} on ${integrationLabel}`;\n            }\n\n            return this.get('presenceModel.primaryLabel');\n        }\n    ),\n\n    /**\n     * Generates a label based on the users presence. Includes the secondary presence and the primary presence\n     * separated by a bullet symbol. i.e. `Busy 1 • Busy`.\n     * This gives the users a further look into the users exact presence\n     */\n    secondaryPresenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'presenceLabel',\n        'presenceModel.primaryLabel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                if (!this.get('presenceLabel')) {\n                    return;\n                }\n                if (\n                    this.get('presenceModel.primaryLabel') &&\n                    this.get('presenceModel.primaryLabel') !== this.get('presenceLabel')\n                ) {\n                    return this.get('presenceModel.primaryLabel');\n                }\n                return null;\n            }\n\n            let secondaryPresence = null;\n\n            const definition = this.get('presenceDefinition');\n            const presenceMap = this.get('session.presenceMap');\n            const presence = presenceMap.find(p => p.id === definition.id);\n\n            if (presence) {\n                const locale = this.get('intl.isoLocale').toLowerCase();\n                const fallbackLocale = this.get('intl.baseLocale');\n\n                if (presence.languageLabels && Object.keys(presence.languageLabels).length > 0) {\n                    /**\n                     * The language label keys are inconsistent so we will just iterate over them\n                     * and try to match it up with the info we have\n                     */\n                    for (const [key, value] of Object.entries(presence.languageLabels)) {\n                        const formattedLocale = key.toLowerCase().replace(/_/g, '-');\n                        // if we found the exact locale that matches the users we can end it\n                        if (locale === formattedLocale) {\n                            secondaryPresence = value;\n                            break;\n                        }\n\n                        // sets the secondarypresence to the fallback locale if found and needed\n                        if (fallbackLocale === formattedLocale) {\n                            secondaryPresence = value;\n                        }\n                    }\n                }\n\n                let primaryPresence =\n                    typeof presence.systemPresence === 'string'\n                        ? presence.systemPresence.toLowerCase().trim().replace('_', ' ')\n                        : '';\n                // if the secondaryPresence and the primaryPresence are the same then we don't want to return anything\n                if (!secondaryPresence || secondaryPresence.toLowerCase().trim() === primaryPresence) {\n                    return null;\n                }\n            }\n\n            return secondaryPresence;\n        }\n    ),\n\n    primaryStatusMessage: computed.reads('primaryPresence.message'),\n\n    cityExists: computed.notEmpty('geolocation.city'),\n    regionExists: computed.notEmpty('geolocation.region'),\n    countryExists: computed.notEmpty('geolocation.country'),\n    hasGeolocation: computed.or('cityExists', 'regionExists', 'countryExists'),\n\n    isAvailable: computed.reads('isOnline'),\n    isOnline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('available') && !this.get('isOutOfOffice');\n    }),\n\n    isOffline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('offline');\n    }),\n\n    isAway: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isAway =\n            this.isPresence('away') ||\n            this.isPresence('training') ||\n            this.isPresence('break') ||\n            this.isPresence('meal') ||\n            this.isPresence('idle');\n        return isAway && !this.get('isOutOfOffice');\n    }),\n\n    isBusy: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isBusy = this.isPresence('busy') || this.isPresence('meeting');\n        return isBusy && !this.get('isOutOfOffice');\n    }),\n\n    isOutOfOffice: computed('session.presenceMap.[]', 'presenceDefinition', 'outOfOffice.active', function () {\n        return this.get('outOfOffice.active');\n    }),\n\n    isOnQueue: computed(\n        'session.presenceMap.[]',\n        'presenceDefinition',\n        'presenceDefinition.systemPresence',\n        'routingStatus.status',\n        'isOutOfOffice',\n        function () {\n            let systemPresence = this.get('presenceDefinition.systemPresence') || '';\n            return (\n                (systemPresence.toLowerCase() === 'on_queue' ||\n                    systemPresence.toLowerCase() === 'on queue' ||\n                    this.isPresence('on_queue')) &&\n                !this.get('isOutOfOffice')\n            );\n        }\n    ),\n\n    isOfflineOrBusy: computed.or('isOffline', 'isBusy'),\n\n    activityPresence: computed('isOnQueue', 'isOutOfOffice', 'isOnline', 'isOffline', 'isAway', 'isBusy', function () {\n        if (this.get('isOnQueue')) {\n            return 'on_queue';\n        } else if (this.get('isOutOfOffice')) {\n            return 'out_of_office';\n        } else if (this.get('isOnline')) {\n            return 'available';\n        } else if (this.get('isAway')) {\n            return 'away';\n        } else if (this.get('isBusy')) {\n            return 'busy';\n        }\n\n        return 'offline';\n    }),\n    activityPresenceClass: computed('activityPresence', 'isOffline', 'isOutOfOffice', function () {\n        if (this.get('isOutOfOffice') && this.get('isOffline')) {\n            // Display offline CSS colors via class if out of office and signed out\n            return 'offline';\n        }\n        return this.get('activityPresence');\n    }),\n\n    isPresence(check) {\n        return isPresence(this.get('session.presenceMap'), this.get('presenceDefinition'), check);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport keys from 'lodash/keys';\nimport parseInt from 'lodash/parseInt';\nimport sortBy from 'lodash/sortBy';\n\nconst profilePictureFieldKey = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nconst imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        informal: 'images.informal',\n        agent: 'agent.profileImage'\n    },\n    group: {\n        profile: 'images.profilePictures',\n        informal: 'images.gallery'\n    }\n};\n\nconst missingFieldsCache = {};\n\nconst EntityMixin = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    _currentSection: null,\n    _missingFieldsCache: missingFieldsCache,\n\n    _id: DS.attr(),\n    _entity: DS.attr(),\n    guid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr().volatile(),\n    mt: DS.attr(),\n\n    apps: DS.attr(),\n    orgId: DS.attr(),\n\n    init: function () {\n        Ember.set(this, '_initialData', {});\n        Ember.set(this, '_previousData', {});\n        Ember.set(this, '_changedSinceSave', []);\n\n        this._super();\n    },\n\n    name: Ember.computed('general.name.@each.value', function () {\n        return this.getFieldValue('general.name').value;\n    }),\n\n    type: Ember.computed(function () {\n        if (typeof this.fieldConfig === 'undefined') {\n            return '';\n        }\n        return this.fieldConfig.entityType;\n    }),\n\n    profilePicture: Ember.computed(\n        'images.profile',\n        'images.profile.[]',\n        'images.activeProfilePicture.[]',\n        'images.profile.@each.ref',\n        function () {\n            const pictureKey = profilePictureFieldKey[this.get('type')];\n            let fieldValue = this.getFieldValue(pictureKey);\n\n            if (!isEmpty(fieldValue)) {\n                return fieldValue.value;\n            } else {\n                fieldValue = this.getFieldValue(pictureKey, true);\n                if (!isEmpty(fieldValue.ref)) {\n                    return fieldValue.ref;\n                }\n            }\n\n            return null;\n        }\n    ),\n\n    profilePictureSizes: Ember.computed('profilePicture', function () {\n        const profilePicture = this.get('profilePicture');\n        if (profilePicture) {\n            // Strip off the 'x' in the keys and sort the available sizes.\n            return sortBy(keys(profilePicture).map(item => parseInt(item.substr(1))));\n        }\n        return [];\n    }),\n\n    uploadedImages: Ember.computed('uploads.images.[]', function () {\n        const type = this.get('type');\n        const path = imageMappings[type].profile;\n        return this.get(path);\n    }),\n\n    stateString: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('data.state')}`)\n            .toString();\n    }),\n\n    _self: Ember.computed(function () {\n        return this;\n    }),\n\n    _missingFields: Ember.computed('_missingFieldsCache', function () {\n        return missingFieldsCache[this.get('id')] || [];\n    }),\n\n    recordPropertyChange(fieldPath) {\n        const changedSinceSave = this.get('_changedSinceSave');\n\n        const missingFields = this.get('_missingFields');\n        if (missingFields.indexOf(fieldPath) !== -1) {\n            missingFields.removeObject(fieldPath);\n        }\n\n        changedSinceSave.addObject(fieldPath);\n\n        this.notifyPropertyChange(fieldPath);\n    },\n\n    changedProperties() {\n        const changedSinceSave = this.get('_changedSinceSave');\n        const missingFields = this.get('_missingFields');\n        return (changedSinceSave || []).filter(field => missingFields.indexOf(field) < 0);\n    },\n\n    getReferencedField(fieldPath) {\n        const field = this.getFieldValue(fieldPath, true);\n\n        if (field.value && field.value.fieldId !== 'NONE') {\n            const referencedField = this.getFieldValue(field.value.fieldPath, true);\n\n            if (Ember.isArray(referencedField) && referencedField.length > 0) {\n                return find(referencedField, { _id: field.value.fieldId });\n            } else if (!isEmpty(referencedField)) {\n                return referencedField;\n            } else if (field.ref) {\n                // If the reference field path is not loaded, try the field.ref value.\n                return {\n                    value: field.ref\n                };\n            }\n\n            return referencedField;\n        }\n\n        return {};\n    },\n\n    getFieldValue(fieldPath, referencedLookup) {\n        if (fieldPath && typeof this.fieldConfig !== 'undefined') {\n            const fieldArray = Ember.get(this, fieldPath);\n            const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n            const reference = this.fieldConfig.isFieldReference(fieldPath);\n\n            if (!isEmpty(fieldArray)) {\n                if (reference && !referencedLookup) {\n                    return this.getReferencedField(fieldPath);\n                } else if (repeatable) {\n                    return fieldArray;\n                } else {\n                    return fieldArray[0];\n                }\n            }\n\n            return repeatable ? [] : {};\n        }\n\n        return [];\n    },\n\n    isFieldValueEmpty(fieldPath) {\n        if (fieldPath) {\n            const fieldArray = Ember.get(this, fieldPath);\n            if (fieldArray && fieldArray.length > 0) {\n                return !fieldArray.some(entry => entry && entry.value);\n            }\n        }\n        return true;\n    },\n\n    removeFieldValue(fieldPath, value) {\n        const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n        const currentFieldValue = this.getFieldValue(fieldPath);\n\n        if (repeatable) {\n            const object = find(currentFieldValue, value);\n            if (object && object !== -1) {\n                currentFieldValue.removeObject(object);\n            }\n        }\n    },\n\n    reset() {\n        const promise = this.reload();\n\n        // For some reason, we need to keep the state updated manually\n        promise.then(record => {\n            if (this.currentState.stateName.indexOf('uncommitted') < 0) {\n                this.adapterDidCommit();\n            }\n\n            return record;\n        });\n\n        return promise;\n    },\n\n    save() {\n        const state = this.get('currentState');\n\n        if (state.stateName.includes('deleted')) {\n            this.set('isDeleted', true);\n        }\n\n        const promise = this._super();\n        promise.then(this.onSaveSuccess.bind(this)).catch(this.onSaveError.bind(this));\n\n        return promise;\n    },\n\n    onSaveSuccess(entity) {\n        const copy = cloneDeep(this.get('data'));\n        this.set('_initialData', copy);\n\n        // Clear historical data\n        this.set('_previousData', {});\n\n        this.set('versionError', false);\n\n        if (entity._internalModal) {\n            const internal = entity._internalModel;\n            if (internal.adapterDidCommit) {\n                internal.adapterDidCommit();\n            }\n        }\n\n        return entity;\n    },\n\n    onSaveError(error) {\n        const data = error.responseJSON || {};\n        const publicApiError = error.errors && error.errors[0];\n\n        if (publicApiError && publicApiError.title && publicApiError.title.indexOf('version') > -1) {\n            // Try to extract error from text inside the public api response\n            const regex = /^.*\\[(\\d+)\\].*\\[(\\d+)\\].*$/i;\n            const matches = publicApiError.title.match(regex);\n            if (matches.length === 3) {\n                const currentVersion = this.get('version');\n                const newVersion = matches[2];\n\n                // Prevent infinite loop: only retry if version actually changed\n                if (currentVersion !== newVersion) {\n                    Ember.Logger.info('Version mismatch, retrying with correct version:', publicApiError);\n\n                    this.set('versionError', true);\n                    this.set('version', newVersion);\n\n                    return Ember.RSVP.resolve(this.save())\n                        .then(this.onSaveSuccess.bind(this))\n                        .catch(this.onSaveError.bind(this));\n                } else {\n                    Ember.Logger.warn('Version mismatch but version unchanged, not retrying to avoid loop');\n                    return Ember.RSVP.reject(error);\n                }\n            }\n        } else if ((data && data.payload) || Ember.get(error, 'errors.length')) {\n            // Check error payload from directory-style error response\n            const payload = data.payload || Ember.get(error, 'errors.0.payload') || {};\n            if (payload.code === 'VERSION_MISMATCH') {\n                const currentVersion = this.get('version');\n                const newVersion = payload.currentVersion;\n\n                // Prevent infinite loop: only retry if version actually changed\n                if (currentVersion !== newVersion && newVersion) {\n                    Ember.Logger.info('Version mismatch, retrying with correct version:', payload);\n\n                    this.set('versionError', true);\n                    this.set('version', newVersion);\n\n                    return Ember.RSVP.resolve(this.save())\n                        .then(this.onSaveSuccess.bind(this))\n                        .catch(this.onSaveError.bind(this));\n                } else {\n                    Ember.Logger.warn('Version mismatch but version unchanged or missing, not retrying to avoid loop');\n                    return Ember.RSVP.reject(error);\n                }\n            } else {\n                return Ember.RSVP.reject(error);\n            }\n        } else {\n            Ember.Logger.error(\"Couldn't save field config\", error);\n            return new Ember.RSVP.Promise((_, reject) => {\n                this.reload().then(() => reject(error));\n            });\n        }\n    },\n\n    saveSection(section) {\n        this.set('_currentSection', section);\n        return this.save()\n            .catch(response => {\n                if (response && response.errors) {\n                    const error = response.errors[0];\n                    if (error && Ember.get(error, 'payload.code') === 'VERSION_MISMATCH') {\n                        return Ember.RSVP.resolve(response);\n                    }\n                }\n                return Ember.RSVP.reject(response);\n            })\n            .finally(() => this.set('_currentSection', null));\n    },\n\n    set(field, value, options) {\n        options = options || {};\n        const overwrite = options.overwrite !== undefined ? options.overwrite : undefined;\n        const recordChange = options.recordChange !== undefined ? options.recordChange : true;\n\n        if (field.indexOf('.') === -1 || overwrite === true) {\n            return this._super(field, value);\n        }\n\n        const sectionKey = field.split('.')[0];\n\n        if (this.get(field) === undefined) {\n            if (!this.fieldConfig.getFieldByKey(field)) {\n                // This is getting loud...\n                // Ember.Logger.error(`The field \"${field}\" does not exist on entity`, this);\n                return undefined;\n            }\n\n            if (!this.get(sectionKey)) {\n                this._super(sectionKey, {});\n            }\n        }\n\n        // Delegate to Ember when not dealing with our own field config\n        if (!this.fieldConfig.getSectionByKey(sectionKey)) {\n            return this._super(field, value);\n        }\n\n        let currentField = this.getFieldValue(field);\n        const fieldDef = this.fieldConfig.getFieldByKey(field);\n\n        if (this.fieldConfig.isFieldRepeatable(field)) {\n            const data = {\n                tempId: Ember.generateGuid(),\n                value: value,\n                labelKey: fieldDef.labelKeys[0]\n            };\n\n            if (currentField && currentField.length > 0) {\n                currentField.addObject(data);\n            } else {\n                currentField = [data];\n            }\n        } else {\n            if (currentField && currentField._id) {\n                Ember.set(currentField, 'value', value);\n            } else {\n                currentField = {\n                    tempId: Ember.generateGuid(),\n                    value: value,\n                    labelKey: fieldDef.labelKeys[0]\n                };\n            }\n\n            currentField = [currentField];\n        }\n\n        if (recordChange) {\n            this.recordPropertyChange(field);\n        }\n\n        return this._super(field, currentField);\n    },\n\n    getPermissableSections() {},\n    getReadableSections() {},\n    getWriteableSections() {},\n    getReadableFieldsForSection() {},\n    getWriteableFieldsForSection() {},\n\n    deleteField(fieldPath, fieldId) {\n        const id = this.get('id');\n        const field = this.getFieldValue(fieldPath);\n\n        if (!fieldId) {\n            fieldId = field._id;\n        }\n\n        const version = this.get('version');\n\n        const type = pluralize(this.get('type'));\n        const path = `/directory/api/v2/${type}/${id}/${version}/field/${fieldPath}/${fieldId}`;\n\n        return this.get('ajax')\n            .del(path)\n            .then(data => {\n                this.set('version', data.rel.version);\n            });\n    }\n});\n\nexport default EntityMixin;\n","import Ember from 'ember';\nimport EvaluationModel from '../models/evaluation';\nimport moment from '../utils/dates';\n\nconst EvaluationsMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    evaluationsAjax: Ember.$.ajax,\n\n    getEvaluations() {\n        return new Ember.RSVP.Promise(resolve => {\n            let promises = [];\n            let agentEvaluations = [];\n            let evaluatorEvaluations = [];\n            let assigneeEvaluations = [];\n            let payload = {\n                agentId: this.get('session.person.guid'),\n                evaluationState: ['Pending', 'InProgress'],\n                userType: 'evaluator'\n            };\n            let isAssigneeFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.assignee'];\n            let isDisputesFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.disputes'];\n\n            let evaluatorUri = `api/v2/quality/evaluations/query?`;\n            if (isAssigneeFeatureEnabled) {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&expand=assignee` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            } else {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            }\n\n            let agentFinishedUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${payload.agentId}` +\n                `&isReleased=true` +\n                `&agentHasRead=false` +\n                `&evaluationState=Finished` +\n                `&pageSize=25`;\n\n            let agentInReviewUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${payload.agentId}` +\n                `&isReleased=true` +\n                `&evaluationState=InReview` +\n                `&pageSize=25`;\n\n            let assigneeUri =\n                `api/v2/quality/evaluations/query?` +\n                `expand=agent` +\n                `&expand=assignee` +\n                `&assigneeUserId=${payload.agentId}` +\n                `&pageSize=25`;\n\n            const startTime = moment().add(-1, 'month').toISOString();\n\n            agentFinishedUri = agentFinishedUri + `&startTime=${startTime}`;\n            agentInReviewUri = agentInReviewUri + `&startTime=${startTime}`;\n            evaluatorUri = evaluatorUri + `&startTime=${startTime}`;\n            assigneeUri = assigneeUri + `&startTime=${startTime}`;\n\n            let evaluatorRequest = {\n                url: this.get('application').pcUri(evaluatorUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentFinished = {\n                url: this.get('application').pcUri(agentFinishedUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentInReview = {\n                url: this.get('application').pcUri(agentInReviewUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAssignee = {\n                url: this.get('application').pcUri(assigneeUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n\n            let locale = this.get('intl.isoLocale');\n            promises.push(\n                this.get('evaluationsAjax')(evaluatorRequest).then(({ entities = [] }) => {\n                    evaluatorEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate =\n                                    isAssigneeFeatureEnabled && !evaluation.calibration\n                                        ? evaluation.dateAssigneeChanged || evaluation.assignedDate\n                                        : evaluation.assignedDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'admin';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            promises.push(\n                this.get('evaluationsAjax')(requestAgentFinished).then(({ entities = [] }) => {\n                    agentEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate = evaluation.releaseDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'agent';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            if (isAssigneeFeatureEnabled) {\n                promises.push(\n                    this.get('evaluationsAjax')(requestAssignee).then(({ entities = [] }) => {\n                        assigneeEvaluations.push(\n                            entities.map(evaluation => {\n                                if (evaluation) {\n                                    evaluation.changedDate = evaluation.dateAssigneeChanged;\n                                    evaluation.assignedDate =\n                                        evaluation.assignedDate &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'admin';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            if (isDisputesFeatureEnabled) {\n                promises.push(\n                    this.get('evaluationsAjax')(requestAgentInReview).then(({ entities = [] }) => {\n                        agentEvaluations.push(\n                            entities.map(evaluation => {\n                                if (evaluation) {\n                                    evaluation.changedDate = evaluation.releaseDate;\n                                    evaluation.assignedDate =\n                                        evaluation.assignedDate &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'agent';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            let evaluationIdSet = {};\n            Ember.RSVP.all(promises).then(function () {\n                // It is important that the results are processed this way: evaluator results first, then assignee, and then agent\n                // That allows the de-duplication to use the most relevant of the results first and reject the same evaluation\n                // from less relevant queries\n                const resultData = evaluatorEvaluations\n                    .concat(assigneeEvaluations, agentEvaluations)\n                    .reduce((totalResult, queryResult) => {\n                        return totalResult.concat(\n                            queryResult.reduce((result, evaluation) => {\n                                if (!evaluationIdSet[evaluation.id]) {\n                                    evaluationIdSet[evaluation.id] = true;\n                                    result.push(evaluation);\n                                }\n                                return result;\n                            }, [])\n                        );\n                    }, []);\n                resolve(resultData); //resolve the promise when all inner promises are resolved\n            });\n        });\n    },\n\n    readEvaluation(evaluation) {\n        const evaluationIsAdminContext =\n            evaluation && evaluation.linkContext && evaluation.linkContext.toUpperCase() === 'ADMIN';\n        return (window.location.hash = `#/engage/${evaluationIsAdminContext ? 'admin' : 'agent'}/interactions/${\n            evaluation.conversation.id\n        }/?evaluationId=${evaluation.id}`);\n    }\n});\n\nexport default EvaluationsMixin;\n","import Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst { inject } = Ember;\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create(RelateFeaturesMixin, {\n    relate: inject.service(),\n    names: inject.service(),\n    externalContacts: inject.service(),\n\n    externalContactProfiles: null,\n\n    conversationId: null,\n    mediaType: null,\n\n    participants: [],\n    consultAgentParticipant: null,\n    consultParticipant: null,\n    communicationId: null,\n    hasMultipleExternalContactMatches: computed.gt('externalContactProfiles.length', 1),\n\n    isIncomingFromExternalContacts: computed.and('hasRelateAccess', 'isIncoming', 'hasExternalContactProfiles'),\n    isConnectedWithExternalContact: computed.and('hasRelateAccess', 'isConnected', 'hasOneExternalContactProfile'),\n    hasExternalContactProfiles: computed.notEmpty('externalContactProfiles'),\n    hasOneExternalContactProfile: computed.equal('externalContactProfiles.length', 1),\n\n    /**\n     * Returns the \"class\" of the thing that mixes in this mixin (the \"inheritor\")\n     * @private\n     */\n    _nameForInheritor() {\n        return componentClassName.call(this);\n    },\n\n    // This CP is used by the navbar.hbs template for for direct incoming (not to an agent's queue) calls\n    externalContactFullName: computed('externalContactProfiles.[]', function () {\n        const externalProfile = this.get('externalContactProfiles.firstObject');\n        if (externalProfile) {\n            return this.get('names').fullName(externalProfile);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator.calls.firstObject.other.name');\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ajax from 'ember-ajax';\nimport FaxModel from '../models/fax';\n\nconst FaxesMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n\n    getFaxes() {\n        return new Ember.RSVP.Promise(resolve => {\n            let request = {\n                contentType: 'application/json; charset=UTF-8',\n                cache: false\n            };\n            let url = this.get('application').pcV2Uri('api/v2/fax/documents');\n\n            return ajax(url, request).then(({ entities = [] }) => {\n                let owner = Ember.getOwner(this);\n                return resolve(\n                    _.map(entities, function (fax) {\n                        return FaxModel.create(fax, owner.ownerInjection());\n                    })\n                );\n            });\n        });\n    },\n\n    readFax(fax) {\n        this.changeFaxReadState(fax, true);\n        let contentUri = fax.get('contentUri');\n        let sharingUri = fax.get('sharingUri');\n\n        if (sharingUri) {\n            window.open(sharingUri);\n        } else {\n            ajax(contentUri, {\n                cache: false\n            }).then(contentLocationUri => {\n                window.open(contentLocationUri);\n            });\n        }\n    },\n\n    markFaxesRead(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, true);\n        });\n    },\n\n    markFaxesUnread(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, false);\n        });\n    },\n\n    changeFaxReadState(fax, read) {\n        fax.set('read', read);\n        let id = fax.get('id');\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify({\n                id: id,\n                read: read\n            })\n        });\n    },\n\n    renameFax(fax, name) {\n        fax.set('name', name);\n        let id = fax.get('id');\n        return ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: {\n                name\n            }\n        });\n    },\n\n    deleteFaxes(faxes) {\n        Ember.RSVP.all(\n            _.map(faxes, fax => {\n                this.deleteFax(fax);\n            })\n        );\n    },\n\n    downloadFax(id) {\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}/content`), {\n            cache: false,\n            method: 'GET',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json'\n        }).then(function ({ contentLocationUri }) {\n            window.open(contentLocationUri);\n        });\n    },\n\n    deleteFax(fax) {\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${fax.get('id')}`), {\n            cache: false,\n            method: 'DELETE',\n            contentType: 'application/json; charset=UTF-8'\n        });\n    }\n});\n\nexport default FaxesMixin;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nconst { run, inject, computed, RSVP, Mixin } = Ember;\n\nexport default Mixin.create({\n    classNames: ['field-component'],\n    classNameBindings: ['field.key', 'fieldTypeClass', 'isEmpty:empty-field', 'isNewField:new-field-entry-component'],\n\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    entity: null,\n\n    allFieldData: [],\n\n    fieldData: null,\n    field: computed.reads('fieldData.field'),\n    writeable: computed.reads('fieldData.writeable'),\n    isValid: computed.reads('fieldData.isValid'),\n    isEmpty: computed.alias('fieldData.isEmpty'),\n\n    editing: false,\n    showLabel: false,\n\n    isNewField: false,\n    savingField: false,\n\n    complexField: false,\n    complexValueFields: [], // Override complex fields for simple 'entry.value' bindings to fire\n\n    timers: null,\n\n    attrs: {\n        cancelAddNew: () => {}\n    },\n\n    init() {\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachObserversForComplexFields();\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    entry: computed('fieldData.value', 'fieldData.valueReference', function () {\n        return this.get('fieldData.value') || this.get('fieldData.valueReference');\n    }),\n\n    fieldTypeClass: computed('field.type', function () {\n        return `${this.get('field.type')}-field`;\n    }),\n\n    canEdit: computed('editing', 'fieldData.writeable', function () {\n        var editing = this.get('editing');\n\n        if (!editing) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(false)\n            });\n        }\n\n        return this.get('fieldData.writeable');\n    }),\n\n    attachObserversForComplexFields() {\n        var fields = this.get('complexValueFields');\n        if (_.isEmpty(fields)) {\n            return;\n        }\n\n        _.each(fields, field => {\n            this.addObserver(field, this, this.notifyComplexPropertyChange);\n        });\n    },\n\n    isFieldEmpty() {},\n\n    notifyComplexPropertyChange() {\n        run.once(this, this.performNotification);\n    },\n\n    performNotification() {\n        let fieldData = this.get('fieldData');\n        if (fieldData) {\n            fieldData.notifyPropertyChange('isEmpty');\n            fieldData.notifyPropertyChange('isValid');\n        }\n    },\n\n    // Called before save\n    cleanFieldForSave: () => {},\n\n    // Override for empty logic check for complex fields\n    isComplexFieldEmpty() {\n        return false;\n    },\n\n    saveField(value) {\n        if (this.get('savingField')) {\n            return new RSVP.Promise(function (resolve) {\n                resolve({});\n            });\n        }\n\n        const entity = this.get('entity');\n        const fieldPath = this.get('field').getFieldPath();\n\n        if (value || value === '') {\n            this.set('entry.value', value);\n            entity.set(fieldPath, value);\n        }\n\n        this.set('savingField', true);\n\n        const section = this.get('field.section');\n        if (section) {\n            return entity.saveSection(section).finally(() => this.set('savingField', false));\n        }\n        return entity.save();\n    }\n});\n","import Ember from 'ember';\nimport moment from 'connections-ui/utils/dates';\n\nexport default Ember.Mixin.create({\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    didFlag: Ember.computed.bool('flaggedSelves.length'),\n    flagOperationInProcess: false,\n\n    flaggedSelves: Ember.computed('call.participants.@each.flaggedReason', 'call.myGuid', function () {\n        let myParticipants = this.get('call.participants');\n        if (!myParticipants) {\n            return [];\n        }\n        let myGuid = this.get('call.myGuid');\n        let myFlaggedParticipants = myParticipants.filter(\n            participant => participant.user && participant.user.id === myGuid && participant.flaggedReason\n        );\n        return myFlaggedParticipants;\n    }),\n\n    // allow flagging/unflagging calls for 45 minutes from end time (analytics service's window for accepting new events for a call is 60 minutes)\n    allowFlagChange: Ember.computed('call.callEnd', 'clock.minute', function () {\n        let minutesPassed = moment().diff(this.get('call.callEnd'), 'minutes');\n        return minutesPassed < 45;\n    }),\n\n    flagInteractionAction(action) {\n        if (this.get('allowFlagChange')) {\n            this.set('flagOperationInProcess', true);\n            const participants = action === 'flag' ? [this.get('call.myParticipant')] : this.get('flaggedSelves');\n            this.get('phone')\n                .flagCallHistoryInteraction(action, this.get('call'), participants)\n                .then(() => {\n                    this.set('flagOperationInProcess', false);\n                });\n        } else {\n            const message = this.get('intl').lookup('notification.purecloud.tooLateToFlag');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Mixin from 'smoke-and-mirrors/mixins/in-viewport';\n\nexport default Mixin;\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\n// ==========================================================\n// NOTICE: This mixin is intended to be consumed by the\n// Interaction component. It inherits servies injects and\n// dependencies from the parent component.\n// ==========================================================\n//\n// Rules for showing/hiding/disabling session share button\n//\n// 1. If the agent has session share permissions then the\n// session share button should be visible (it may be disabled\n// when end customer's browser cannot support screen share).\n//\n// 2. If the agent has session share permissions and the end\n// user is using Firefox - button is enabled.\n//\n// 3. If the agent has session share permissions and the end\n// user is using Chrome AND has the screen share extension\n// installed - button is enabled.\n//\n// 4. If the agent has session share permissions and the end\n// user is using any browser except Firefox or Chrome the\n// screen share button is disabled with tooltip.\n//\n// 5. If the agent has session share permissions and the end\n// user is using Chrome but does NOT have the screen share\n// extension, button is disabled with tooltip.\n//\n// ==========================================================\n\nexport default Ember.Mixin.create({\n    // Configuration\n\n    customerBrowserDetails: computed(\n        'interaction.customerDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,cobrowseType,standAloneApplication,canScreenshare,canCobrowse}',\n        function () {\n            const customerDetails = this.get('interaction.customerDetails');\n\n            if (!customerDetails) {\n                return {};\n            }\n\n            // because the object we get has stringified the boolean values, need to convert these to true and false\n            const isChrome = Ember.get(customerDetails, 'isChrome') === 'true' ? true : false;\n            const isFirefox = Ember.get(customerDetails, 'isFirefox') === 'true' ? true : false;\n            const isEdgeChromium = Ember.get(customerDetails, 'isEdgeChromium') === 'true' ? true : false;\n            const hasChromeExtension = Ember.get(customerDetails, 'hasChromeExtension') === 'true' ? true : false;\n            const isStandAloneApplication =\n                Ember.get(customerDetails, 'standAloneApplication') === 'true' ? true : false;\n            const canScreenshare = Ember.get(customerDetails, 'canScreenshare') === 'true' ? true : false;\n            const canCobrowse = Ember.get(customerDetails, 'canCobrowse') === 'true' ? true : false;\n            const cobrowseType = Ember.get(customerDetails, 'cobrowseType') || canCobrowse ? true : false;\n            return {\n                isChrome,\n                isFirefox,\n                isEdgeChromium,\n                hasChromeExtension,\n                cobrowseType,\n                isStandAloneApplication,\n                canScreenshare,\n                canCobrowse\n            };\n        }\n    ),\n\n    isCustomerConfiguredForCobrowse: computed.or(\n        'customerBrowserDetails.cobrowseType',\n        'customerBrowserDetails.canCobrowse'\n    ),\n\n    isCustomerConfiguredForScreenShare: computed(\n        'interaction.isV2Provider',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            // screenshare is not supported for v2 providers\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            if (\n                Ember.get(customerBrowserDetails, 'canScreenshare') ||\n                Ember.get(customerBrowserDetails, 'isFirefox') ||\n                (Ember.get(customerBrowserDetails, 'isChrome') &&\n                    Ember.get(customerBrowserDetails, 'hasChromeExtension')) ||\n                Ember.get(customerBrowserDetails, 'isEdgeChromium') ||\n                Ember.get(customerBrowserDetails, 'isStandAloneApplication')\n            ) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    screenShareMisconfiguration: computed(\n        'isCustomerConfiguredForScreenShare',\n        'isAgentAllowedToScreenShare',\n        function () {\n            return this.get('isCustomerConfiguredForScreenShare') === !this.get('isAgentAllowedToScreenShare');\n        }\n    ),\n\n    cobrowseMisconfiguration: computed('isCustomerConfiguredForCobrowse', 'isAgentAllowedToCobrowse', function () {\n        return this.get('isCustomerConfiguredForCobrowse') === !this.get('isAgentAllowedToCobrowse');\n    }),\n\n    // Permissions & Feature Toggles\n\n    canCobrowseChat: computed.reads('permissions.canViewAcdCoBrowseForChat'),\n    canCobrowseCall: computed.reads('permissions.canViewAcdCoBrowseForCall'),\n\n    isAgentAllowedToCobrowseCall: computed.and('isCall', 'canCobrowseCall'),\n    isAgentAllowedToCobrowseChat: computed.and('isChat', 'canCobrowseChat'),\n    isAgentAllowedToCobrowse: computed.or('isAgentAllowedToCobrowseCall', 'isAgentAllowedToCobrowseChat'),\n\n    canScreenShare: computed.reads('permissions.canViewAcdScreenShare'),\n\n    isAgentAllowedToScreenShareCall: computed.and('isCall', 'canScreenShare'),\n    isAgentAllowedToScreenShareChat: computed.and('isChat', 'canScreenShare'),\n    isAgentAllowedToScreenShare: computed.or('isAgentAllowedToScreenShareCall', 'isAgentAllowedToScreenShareChat'),\n\n    // Tooltips\n\n    sessionShareStartVideoTooltip: computed('webrtc.activeBridge', function () {\n        if (!this.get('webrtc.activeBridge')) {\n            return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n        }\n        return 'purecloud.acdInteraction.sessionShare.startVideo';\n    }),\n\n    sessionShareStartTooltip: computed(\n        'webrtc.{activeBridge,screenShareViaHawk}',\n        'disableShareButtonReason',\n        'customerBrowserDetails.isStandAloneApplication',\n        'interaction.canScreenShare',\n        function () {\n            const canScreenShareViaHawk =\n                this.get('interaction.canScreenShare') && this.get('webrtc.screenShareViaHawk');\n            /* if we cannot screen share via hawk, we need to check the activeBridge */\n            if (!canScreenShareViaHawk && !this.get('webrtc.activeBridge')) {\n                return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n            } else if (this.get('disableShareButtonReason') && this.get('isChat')) {\n                return this.get('disableShareButtonReason');\n            } else if (this.get('customerBrowserDetails.isStandAloneApplication') && this.get('isChat')) {\n                return 'purecloud.acdInteraction.sessionShare.customerUsingStandAloneApplication';\n            }\n            return 'purecloud.acdInteraction.sessionShare.start';\n        }\n    ),\n\n    webMessagingCobrowseStartTooltip: computed(\n        'interaction.cobrowseSessionShareActive',\n\n        function () {\n            if (!this.get('interaction.cobrowseSessionShareActive')) {\n                return 'purecloud.acdInteraction.cobrowseNext.startCobrowse';\n            }\n            return 'purecloud.acdInteraction.sessionShare.screenShareActive';\n        }\n    ),\n\n    // Session Share State\n\n    isCoBrowse: computed.bool('interaction.isCoBrowse'),\n\n    isRequestingScreenShareOrCoBrowse: computed.alias('interaction.isRequestingScreenShareOrCoBrowse'),\n    isRequestingVideo: computed.alias('interaction.isRequestingVideo'),\n\n    isAgentDisconnectedFromSharedSession: computed.reads('interaction.isAgentDisconnectedFromSharedSession'),\n    isCustomerDisconnectedFromSharedSession: computed.reads('interaction.isCustomerDisconnectedFromSharedSession'),\n\n    isSessionCodeRequired: computed.alias('interaction.isSessionCodeRequired'),\n\n    // Button Enablement\n\n    disableShareButtonReason: computed(\n        'screenShareMisconfiguration',\n        'cobrowseMisconfiguration',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            const isConfigured =\n                this.get('isCustomerConfiguredForCobrowse') ||\n                this.get('isCustomerConfiguredForScreenShare') ||\n                this.get('customerBrowserDetails.isStandAloneApplication');\n\n            if (!customerBrowserDetails || isConfigured) {\n                return false;\n            }\n\n            if (this.get('screenShareMisconfiguration')) {\n                if (\n                    Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.get(customerBrowserDetails, 'hasChromeExtension')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.noChromeExtension';\n                }\n                if (\n                    !Ember.get(customerBrowserDetails, 'isFirefox') &&\n                    !Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.get(customerBrowserDetails, 'isEdgeChromium')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.notUsingSupportedBrowser';\n                }\n            } else if (this.get('cobrowseMisconfiguration')) {\n                return 'purecloud.acdInteraction.sessionShare.error.notConfiguredForCobrowse';\n            }\n        }\n    ),\n\n    disableVideoButton: computed.bool('interactionService.hasActiveSessionShare'),\n\n    disableShareButton: computed(\n        'disableVideoButton',\n        'isCustomerConfiguredForCobrowse',\n        'isCustomerConfiguredForScreenShare',\n        'interaction.isV2Provider',\n        function () {\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n            return (\n                this.get('disableVideoButton') ||\n                !(this.get('isCustomerConfiguredForCobrowse') || this.get('isCustomerConfiguredForScreenShare'))\n            );\n        }\n    ),\n\n    shouldShowSessionShareButton: computed(\n        'interaction.isV2Provider',\n        'isAgentAllowedToScreenShare',\n        'isAgentAllowedToCobrowse',\n        'interaction.myselfIsMonitor',\n        'interaction.myselfIsCoach',\n        function () {\n            // session-share is not supported for v2 widgets or for MCB participants\n            if (\n                this.get('interaction.isV2Provider') ||\n                this.get('interaction.myselfIsMonitor') ||\n                this.get('interaction.myselfIsCoach')\n            ) {\n                return false;\n            }\n            // Show the button if agent has either permission\n            return this.get('isAgentAllowedToScreenShare') || this.get('isAgentAllowedToCobrowse');\n        }\n    ),\n\n    enableAcdSessionShare: computed(\n        'isConnected',\n        'isCall',\n        'isChat',\n        'interaction.onConsult',\n        'isInternalProvider',\n        function () {\n            const isInternalProvider = this.get('isInternalProvider');\n            return (\n                isInternalProvider &&\n                (this.get('isCall') || this.get('isChat')) &&\n                this.get('isConnected') &&\n                !this.get('interaction.onConsult')\n            );\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    acdVoicemailTooltip: computed('acdVoicemailPlayerVisible', function () {\n        if (!this.get('acdVoicemailPlayerVisible')) {\n            return 'purecloud.acdInteraction.voicemail.showAudioPlayer';\n        }\n        return 'purecloud.acdInteraction.voicemail.hideAudioPlayer';\n    }),\n\n    holdTooltipTitle: computed('interaction.isHeld', function () {\n        if (this.get('interaction.isHeld')) {\n            return 'purecloud.acdInteraction.unhold';\n        }\n        return 'purecloud.acdInteraction.hold';\n    }),\n\n    muteTooltipTitle: computed('interaction.conversation.isMuted', function () {\n        if (this.get('interaction.conversation.isMuted')) {\n            return 'purecloud.acdInteraction.unmute';\n        }\n        return 'purecloud.acdInteraction.mute';\n    }),\n\n    scriptToolTip: computed('disabledScriptButton', function () {\n        if (this.get('disabledScriptButton')) {\n            return 'purecloud.acdInteraction.scriptsNotAvailable';\n        }\n        return 'purecloud.acdInteraction.scripts';\n    }),\n\n    skipACWTooltipTitle: computed('interaction.isCommunicationAfterCallWorkRequested', function () {\n        if (this.get('interaction.isCommunicationAfterCallWorkRequested')) {\n            return 'purecloud.acdInteraction.skipACW';\n        }\n        return 'purecloud.acdInteraction.requestACW';\n    })\n});\n","import Ember from 'ember';\n\nvar currentJobs = [];\nvar finishedJobs = [];\n\nfunction jobEndpoint(id) {\n    return `/api/v2/jobs/${id}`;\n}\n\nexport default Ember.Mixin.create({\n    ajax: Ember.inject.service(),\n\n    _currentJobs: currentJobs,\n    _finishedJobs: finishedJobs,\n\n    addJob: function (job, callback, scope) {\n        if (job) {\n            job.callback = callback;\n            job.scope = scope || this;\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 5000);\n\n            currentJobs.addObject(job);\n        }\n    },\n\n    getJobData: function (job) {\n        return this.get('ajax')\n            .ajaxGet(jobEndpoint(job.jobId))\n            .then(\n                data => {\n                    data = data.res;\n\n                    var retryJobId = data.retryJobId;\n\n                    if (data.status !== 'in-progress' && data.status !== 'pending') {\n                        window.clearInterval(job.interval);\n\n                        if (data.status === 'retry') {\n                            job.jobId = retryJobId;\n                            this.handleJob(job);\n                        } else if (job.status === 'failed') {\n                            currentJobs.removeObject(job);\n                            finishedJobs.addObject(job);\n\n                            job.callback.apply(job.scope, [job]);\n                        } else {\n                            currentJobs.removeObject(job);\n                            finishedJobs.addObject(job);\n\n                            job.callback.apply(job.scope, [job]);\n                        }\n                    }\n                },\n                function () {\n                    window.clearInterval(job.interval);\n\n                    currentJobs.removeObject(job);\n                    finishedJobs.addObject(job);\n\n                    job.callback.apply(job.scope, [job]);\n                }\n            );\n    }\n});\n","define(\"connections-ui/mixins/logger\", [\"exports\", \"ember-purecloud-components/mixins/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    actions: {\n        error(error) {\n            const errorState = { type: 'profileFetchServerFailure' };\n\n            Ember.Logger.error(error);\n\n            if (error && error.errors) {\n                error = _.head(error.errors);\n            }\n\n            if (error) {\n                let code = error.code;\n                if (typeof error.status === 'number') {\n                    code = error.status;\n                }\n                if (code >= 400 && code < 500) {\n                    this.transitionTo('index');\n                } else if (error.status >= 500) {\n                    this.set('application.errorState', errorState);\n                    this.transitionTo('maintenance');\n                }\n            } else if (!error) {\n                this.set('application.errorState', errorState);\n                this.transitionTo('maintenance');\n            }\n        }\n    }\n});\n","import Ember from 'ember';\n\nvar PagingMixin = Ember.Mixin.create({\n    entityType: null,\n\n    currentPage: null,\n    cachedTotal: null,\n\n    limit: 10,\n    extraParams: Ember.computed(function () {\n        return {};\n    }),\n\n    fieldList: null,\n\n    actions: {\n        nextPage() {\n            if (this.get('hasNextPage')) {\n                this.incrementProperty('currentPage');\n                this.loadPage();\n            }\n        },\n\n        prevPage() {\n            if (this.get('hasPrevPage')) {\n                this.decrementProperty('currentPage');\n                this.loadPage();\n            }\n        }\n    },\n\n    ensureCorrectProperties: Ember.on('init', function () {\n        if (!this.get('entityType')) {\n            this.set('entityType', 'person');\n        }\n\n        this.set('currentPage', 0);\n        this.set('cachedTotal', 0);\n    }),\n\n    offset: Ember.computed('limit', 'currentPage', function () {\n        return this.get('limit') * this.get('currentPage');\n    }),\n\n    currentPageDisplay: Ember.computed('currentPage', function () {\n        return this.get('currentPage') + 1;\n    }),\n\n    totalPages: Ember.computed('currentPage', 'content.[]', 'page', 'cachedTotal', function () {\n        var cachedTotal = this.get('cachedTotal') || 0;\n\n        return Math.ceil(cachedTotal / this.get('limit'));\n    }),\n\n    hasNextPage: Ember.computed('currentPageDisplay', 'totalPages', function () {\n        return this.get('currentPageDisplay') < this.get('totalPages');\n    }),\n\n    hasPrevPage: Ember.computed('currentPage', function () {\n        return this.get('currentPage') !== 0;\n    }),\n\n    haveContent: Ember.computed('content.[]', 'currentPage', function () {\n        var content = this.get('content');\n        if (content) {\n            return content.get('length') > 0;\n        }\n\n        return false;\n    }),\n\n    loadPage() {\n        let directory = true;\n        let entityType = this.get('entityType');\n        let extraParams = this.get('extraParams');\n\n        let letterUpdate = {};\n        if (entityType === 'group') {\n            letterUpdate = {\n                letter: null\n            };\n        }\n\n        let params = Object.assign(\n            {},\n            {\n                limit: this.get('limit'),\n                offset: this.get('offset'),\n                directory: directory\n            },\n            extraParams,\n            letterUpdate\n        );\n\n        if (this.get('fieldList')) {\n            params = Object.assign({}, params, {\n                fl: this.get('fieldList')\n            });\n        }\n\n        let page = this.store.query(entityType, params);\n\n        page.then(data => {\n            let content = data;\n            if (data.content) {\n                content = data.content;\n            }\n\n            content = content.map(x => x.getRecord());\n\n            this.set('content', content);\n\n            let cachedTotal = Ember.get(data, 'meta.count');\n            if (cachedTotal > 0) {\n                this.set('cachedTotal', cachedTotal);\n            }\n\n            return content;\n        });\n\n        this.set('page', page);\n\n        return page;\n    }\n});\n\nexport default PagingMixin;\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    activeCall: null,\n    isHeld: computed.reads('activeCall.isHeld'),\n    isMuted: computed.reads('activeCall.isMuted'),\n    isRecording: computed.reads('activeCall.isRecording'),\n    isActiveCallACD: computed('activeCall.{isAgentCall,myselfIsMonitor,myselfIsCoach,myselfIsBarged}', function () {\n        if (!this.get('activeCall')) {\n            return false;\n        }\n        return (\n            this.get('activeCall.isAgentCall') &&\n            !this.get('activeCall.myselfIsMonitor') &&\n            !this.get('activeCall.myselfIsCoach') &&\n            !this.get('activeCall.myselfIsBarged')\n        );\n    }),\n    isOutsideCall: computed('activeCall.otherParty.purpose', function () {\n        const purpose = this.get('activeCall.otherParty.purpose');\n        return purpose === 'external';\n    }),\n    myself: computed('activeCall.myself', function () {\n        // TODO: can this be removed?\n        return this.get('activeCall.myself');\n    }),\n    onCall: computed.reads('activeCall.onCall'),\n    setActiveCall(conversation) {\n        this.set('activeCall', conversation);\n        this.notifyPropertyChange('activeCall');\n    },\n    cleanupActiveCall() {\n        return this.setActiveCall(null);\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport { task, timeout } from 'ember-concurrency';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\n\nconst CALL_CONVERSATION_CREATED_EVENT = 'callConversationCreated';\n\nconst Promise = Ember.RSVP.Promise;\nconst { run, inject, observer } = Ember;\n\nexport default Ember.Mixin.create(AutoSaveDevicesMixin, {\n    headset: inject.service(),\n    session: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    store: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    // temp variables for user actions (merging, dialing)\n    attemptingToCall: null,\n    shouldPromptForMerge: false,\n    callToMergeInto: null,\n    mergeData: null,\n\n    deviceMuteEvent(isMuted) {\n        const call = this.get('activeCall');\n        if (call && this.get('isMuted') !== isMuted) {\n            this.mute(call);\n        }\n    },\n\n    deviceHoldEvent(holdRequested, toggle) {\n        const call = this.get('activeCall');\n        if (!call) {\n            return;\n        }\n\n        // this is because jabra sends an unmute request after the call ends. Presumably to get the headset in a vanilla state\n        if (toggle && !call.get('isConnected')) {\n            return;\n        }\n\n        if (toggle || call.get('isHeld') !== holdRequested) {\n            this.hold(call);\n        }\n    },\n\n    deviceCallRejectedEvent(conversationId) {\n        let conversation;\n        if (conversationId) {\n            conversation = this.get('conversations').findBy('id', conversationId);\n        } else {\n            conversation = this.get('conversations').find(conversation => {\n                return conversation.get('isDialing') && conversation.get('isIncoming');\n            });\n        }\n\n        this.sendToVoicemail(conversation);\n    },\n\n    init() {\n        this._super(...arguments);\n        run.next(() => {\n            if (this.get('webrtcSdkService.useSdk')) {\n                this.enableHeadsets(this.get('webrtcSdkService'));\n            } else {\n                this.enableHeadsets(this.get('headset'));\n            }\n        });\n    },\n\n    changeHeadsetSource: observer('webrtcSdkService.useSdk', function () {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.enableHeadsets(this.get('webrtcSdkService'));\n        }\n    }),\n\n    enableHeadsets(headsetSource) {\n        const headset = headsetSource;\n        headset.on('deviceMuteStatusChanged', isMuted => {\n            this.deviceMuteEvent(isMuted);\n        });\n        headset.on('deviceHoldStatusChanged', (holdRequested, toggle) => {\n            this.deviceHoldEvent(holdRequested, toggle, true);\n        });\n        headset.on('deviceRejectedCall', conversationId => {\n            this.deviceCallRejectedEvent(conversationId, true);\n        });\n    },\n\n    callVoicemail() {\n        return this.makeCall('*86');\n    },\n\n    _handleValidationError(error) {\n        const validationError = {\n            valid: false,\n            validationError: error\n        };\n        this.logger.warn('Call validation failed', validationError);\n        return Promise.reject('Call validation failed', validationError);\n    },\n\n    webrtcPhoneWithIssues: Ember.computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    _validateCall(phoneNumber, callingPerson, onbehalfOfQueue) {\n        if (this.get('station.isWebrtc')) {\n            if (!this.get('carrierPigeonConnected')) {\n                this.get('notification').error(\n                    null,\n                    this.get('intl').lookup('notification.purecloud.webrtcPhoneUnavailable'),\n                    {\n                        hideAfter: 5,\n                        tag: 'webrtc-phone-unavailable'\n                    }\n                );\n\n                return this._handleValidationError('Station is webrtc and carrier pigeon is not connected');\n            } else if (this.get('webrtcPhoneWithIssues')) {\n                const intl = this.get('intl');\n                const title = intl.t('notification.titles.callError').toString();\n                const message = intl.t(this.get('webrtc.webrtcAudioCallIssueKey'));\n                this.get('notification').info(title, message);\n                return this._handleValidationError('Station is webrtc and has audio issues');\n            }\n        }\n\n        let message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n        if (this.get('onQueue') && (!onbehalfOfQueue || !onbehalfOfQueue.id)) {\n            message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n        let station = this.get('station');\n        let noStation = station === undefined || station === null;\n        if (noStation) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.noStationSelected');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('No station selected');\n        }\n        if (this.get('phoneDisabled')) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.unsupportedStation');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('Phone service disabled');\n        }\n        return Promise.resolve();\n    },\n\n    _throttledHoldOtherConversations: task(function* (data) {\n        this._holdOtherActiveConversations(data);\n        yield timeout(1000);\n    }).drop(),\n\n    // Handles errors by logging and notifying the user, but re-throws the error for consumers\n    // to handle if they want to\n    _makeCall(phoneNumber, callingPerson, onbehalfOfQueue, externalContactId) {\n        if (callingPerson && !_.isEmpty(callingPerson)) {\n            this.set('attemptingToCall', callingPerson);\n        } else {\n            this.set('attemptingToCall', phoneNumber);\n        }\n\n        let url;\n        let data = {};\n        let key = 'phoneNumber';\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'person') {\n            key = 'callUserId';\n        }\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'queue') {\n            key = 'callQueueId';\n        }\n        // if phoneNumber is a string, we can safely skip the formatting\n        // otherwise, the format method is required here to return an id\n        // or number from the model (phoneNumber).\n        if (typeof phoneNumber !== 'string') {\n            phoneNumber = this.get('addressformat').format(phoneNumber);\n        } else if (_.startsWith(phoneNumber, 'sip:')) {\n            phoneNumber = this.get('addressformat').formatSipAddress(phoneNumber);\n        }\n        data[key] = phoneNumber;\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        url = this.pcUri(`api/v2/conversations/calls`);\n        if (onbehalfOfQueue && onbehalfOfQueue.id) {\n            data.callFromQueueId = onbehalfOfQueue.id;\n        }\n        if (phoneNumber === undefined || phoneNumber === null) {\n            let message = this.get('intl').lookup('notification.purecloud.unableToMakeCall');\n            const error = Error('Failed to make call: PhoneNumber is not defined');\n\n            this.logger.error(error.message, error);\n            this.showErrorNotification({ message }, error);\n            return Ember.RSVP.Promise.reject(error);\n        }\n\n        let promise;\n\n        // if this is a webrtc call, place it through the sdk\n        if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n            promise = this.get('webrtcSdkService').startSoftphoneSession(data);\n        } else {\n            const options = { data: data, contentType: 'application/json' };\n            promise = this.makeRequest(url, options, 'post');\n        }\n\n        return promise\n            .then(data => {\n                this.get('conversationsMadeByClient').pushObject(data);\n                data.attemptingToCall = this.get('attemptingToCall');\n                const conversation = this.updateActiveConversationEntry(data);\n\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').outgoingCall({ conversationId: data.id });\n                }\n\n                if (onbehalfOfQueue && data && data.id) {\n                    this.trigger(CALL_CONVERSATION_CREATED_EVENT, { conversationId: data.id });\n                }\n\n                if (this.get('station.isWebrtc')) {\n                    // TODO: shouldnt this be automatic with we place a call?\n                    this.get('_throttledHoldOtherConversations').perform(data);\n                }\n\n                return conversation || { id: data.id };\n            })\n            .catch(err => {\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n\n                this.logger.error('Error making request to place call', { data, url, err });\n                this.showErrorNotification(responseJSON, err);\n                return Ember.RSVP.Promise.reject(err);\n            });\n    },\n\n    // helper service method to validate and make a call, handling errors by notifying the user.\n    // Returns a promise that does not reject. All errors are handled and notified to user\n    // To consume the error from validation or placing call, call _validateCall and _makeCall directly\n    makeCall(/*phoneNumber, callingPerson, onbehalfOfQueue*/) {\n        const callArgs = arguments;\n        return this._validateCall(...callArgs).then(() => {\n            return this._makeCall(...callArgs);\n        });\n    },\n\n    /**\n       @desc Starts a call with the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async callPersonById(id) {\n        if (!this.get('phoneAvailable')) {\n            return;\n        }\n\n        const person = await this.get('store').findRecord('person', id);\n        return this.makeCall(person);\n    },\n\n    mergeCalls(conversations) {\n        const conferences = _.filter(conversations, function (conversation) {\n            return conversation.get('onConference');\n        });\n        const data = {\n            conversationIds: []\n        };\n        const recordings = _.filter(conversations, function (conversation) {\n            return conversation.get('isRecording');\n        });\n        let callsToMerge, callToMergeInto;\n        if (conferences.length > 1) {\n            Ember.Logger.warn('phone service: You cannot merge two conferences');\n            return;\n        } else if (conferences.length === 1) {\n            callToMergeInto = _.head(conferences);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation.get('onConference');\n            });\n            if (recordings.length && callToMergeInto.get('isRecording') !== true) {\n                this.set('shouldPromptForMerge', true);\n                Ember.Logger.warn('Your recording will end when merging a recording call into a conference call');\n            }\n        } else if (recordings.length > 0) {\n            callToMergeInto = _.head(recordings);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        } else {\n            callToMergeInto =\n                conversations.findBy('id', this.get('activeCall.id')) || conversations.findBy('isIncoming', false);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        }\n        _.each(callsToMerge, function (conversation) {\n            return data.conversationIds.push(conversation.id);\n        });\n        this.set('mergeData', data);\n        this.set('callToMergeInto', callToMergeInto);\n        if (this.get('shouldPromptForMerge') === false) {\n            return this.makeMergeRequest();\n        }\n    },\n\n    toVoicemail(conversation) {\n        Ember.deprecate('Please use \"service:phone/sendToVoicemail\" for sending a call to voicemail', false, {\n            id: 'directory-core.deprecate-old-phone-service-methods',\n            until: '8.0.0',\n            url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md#markdown-header-old-phone-service-methods'\n        });\n        this.sendToVoicemail(conversation);\n    },\n\n    _throttledHandlePhoneStatusChange: task(function* () {\n        this.handlePhoneStatusChange(...arguments);\n        yield timeout(1000);\n    }).drop(),\n\n    sendToVoicemail(conversation) {\n        if (conversation) {\n            this.get('_throttledHandlePhoneStatusChange').perform('sendToVoicemail', conversation);\n            !this.get('webrtcSdkService.useSdk') &&\n                this.get('headset').endCall(conversation.get('id'), this.get('connectedConversations.length') > 1);\n        }\n    },\n\n    makeMergeRequest() {\n        const callId = this.get('callToMergeInto.id');\n        const uri = this.communicationUri(callId, 'calls');\n        const data = this.get('mergeData');\n        return this.makeRequest(uri, { data }, 'patch').finally(() => {\n            return this.clearMergeData();\n        });\n    },\n\n    clearMergeData() {\n        this.set('mergeData', null);\n        this.set('callToMergeInto', null);\n        return this.set('shouldPromptForMerge', false);\n    },\n\n    makeConferenceCall(parties, queue) {\n        const uri = this.pcUri(`api/${this.get('convAPIVersion')}/conversations/calls`);\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { queueId: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        if (queue && queue.id) {\n            options.data.callFromQueueId = queue.id;\n        }\n\n        return this.makeRequest(uri, options, 'post')\n            .then(json => {\n                this.get('conversationsMadeByClient').pushObject(json);\n            })\n            .catch(err => {\n                Ember.Logger.error('Error making conference call number', { uri, error: err });\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n                return this.showErrorNotification(responseJSON, err);\n            });\n    },\n\n    bulkAddParticipants(parties) {\n        const callId = this.get('activeCall').id;\n        const uri = `${this.communicationUri(callId, 'calls')}/participants`;\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { address: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        return this.makeRequest(uri, options, 'post');\n    },\n\n    blindTransfer(participant) {\n        const isNumber = typeof participant.value === 'string';\n        const myselfId = this.get('myself.id');\n        const callId = this.get('activeCall.id');\n        const participantEntity = Ember.get(participant, 'entity');\n        const url = this.replaceUri(callId, myselfId, null, 'calls');\n        const isQueue = participant ? Ember.get(participant, 'entity.type') === 'queue' : false;\n        let data = {};\n\n        if (isNumber) {\n            data.address = participant.value;\n        } else if (isQueue) {\n            data.queueId = participant.id;\n        } else {\n            const personGuid = Ember.get(participantEntity, 'guid');\n            data.userId = personGuid;\n        }\n\n        const options = { data };\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this._handleCallTransferred();\n        });\n    },\n\n    _handleCallTransferred(interaction) {\n        // if the call gets routed back to the client later, we don't want it to appear already answered or placed by the client\n        const conversationId = interaction ? Ember.get(interaction, 'id') : this.get('activeCall.id');\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            Ember.set(conversation, 'acceptedByClient', false);\n            Ember.set(conversation, 'shouldAutoProceedWebrtc', false);\n        }\n        if (interaction) {\n            Ember.set(interaction, 'acceptedByClient', false);\n            Ember.set(interaction, 'shouldAutoProceedWebrtc', false);\n        }\n        const conversationsMadeByClient = this.get('conversationsMadeByClient');\n        const placedConversation = conversationsMadeByClient.findBy('id', conversationId);\n        if (placedConversation) {\n            conversationsMadeByClient.removeObject(placedConversation);\n        }\n    },\n\n    consultTransfer(destination) {\n        const activeCall = this.get('activeCall');\n        const isNumber = typeof destination.value === 'string';\n        const person = destination.entity;\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        const currentCallId = Ember.get(activeCall, 'id');\n        const otherPartyId = Ember.get(activeCall, 'otherParty.id');\n        let url = this.consultUri(currentCallId, otherPartyId, 'calls');\n        if (!isNumber && !isQueue) {\n            return this.get('store')\n                .find('person', Ember.get(person, 'guid'))\n                .then(party => {\n                    return this.initiateTransfer(party, url);\n                });\n        } else if (isQueue) {\n            return this.initiateTransfer(destination, url);\n        }\n        return this.initiateTransfer(destination.value, url);\n    },\n\n    initiateTransfer(destination, url) {\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        let addressee = {};\n        if (isQueue) {\n            addressee = { queueId: destination.id };\n        } else if (typeof destination !== 'string' && _.isEmpty(destination.phoneNumber)) {\n            addressee = { userId: destination.get('guid') };\n        } else if (typeof destination === 'string') {\n            addressee = { address: destination };\n        }\n        const options = { data: { destination: addressee } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    changeSpeakerForConsult(speakTo) {\n        const callId = this.get('activeCall.id');\n        const otherParty = this.get('activeCall.otherParties').find(function (party) {\n            return party.consultParticipantId != null;\n        });\n        const otherPartyId = Ember.get(otherParty, 'consultParticipantId');\n        const url = this.consultUri(callId, otherPartyId, 'calls');\n        const options = { data: { speakTo } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    endConsult() {\n        const currentCallId = this.get('activeCall.id');\n        const otherPartyId = this.get('activeCall.myself.consultParticipantId');\n        const url = this.generateConversationsUrl(currentCallId, otherPartyId, 'consult');\n        const options = { dataType: 'text' };\n        return this.makeRequest(url, options, 'DELETE');\n    },\n\n    dialDtmfNumber(currentCallId, participantId, number) {\n        Ember.assert(\n            'phone:dialDtmfNumber must take a conversation id as the first argument',\n            currentCallId !== undefined\n        );\n        Ember.assert(\n            'phone:dialDtmfNumber must take a participant id as the second argument',\n            participantId !== undefined\n        );\n\n        let uri = this.pcUri(\n            `api/${this.get('convAPIVersion')}/conversations/${currentCallId}/participants/${participantId}/digits`\n        );\n        this.logger.info('sendingDtmfTones', {\n            conversationId: currentCallId,\n            participantId,\n            number\n        });\n\n        this.get('ajax').post(uri, { data: { digits: number } });\n    },\n\n    _throttledAnswerWebrtc: task(function* (conversation) {\n        this._answerWebrtc(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswer: task(function* (conversation) {\n        this._answer(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswerSoftphoneConversation: task(function* (conversationId) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.get('webrtcSdkService').acceptPendingSession({ conversationId });\n        } else {\n            this.get('webrtc').answerSoftphoneConversation(conversationId);\n        }\n        yield timeout(1000);\n    }).drop(),\n\n    answer() {},\n\n    _answerWebrtc(conversation) {\n        const conversationId = conversation.get('id');\n        const session = this._findPendingSessionsByConversationId(conversationId);\n        if (session === undefined) {\n            if (this.get('stationHasPersistentConnection')) {\n                // This is a flag we can look at in case we end up getting proposes for this conversation *later*\n                Ember.set(conversation, 'shouldAutoProceedWebrtc', true);\n\n                this.logger.info('_answerWebrtc stationHasPersistentConnection', { conversationId });\n                const task = this.get('_throttledAnswer').perform(conversation);\n                return task;\n            }\n\n            this.logger.info('Conversation is waiting for session', { conversationId });\n            conversation.set('waitingForSession', true); // when the session comes in, this should auto accept.\n            return;\n        }\n\n        return this.get('_throttledAnswerSoftphoneConversation').perform(conversationId);\n    },\n\n    _answer(conversation) {\n        const conversationId = conversation.get('id');\n        this.logger.log('handling _answer status change for conversation', { conversationId });\n        this.handlePhoneStatusChange('answer', conversation)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'callState.state', 'CONNECTED');\n            })\n            .then(() => {\n                if (this.get('onQueue')) {\n                    return this.checkForNonACD(conversation);\n                }\n            })\n            .catch(() => {\n                const message = 'Failed to answer call: ' + conversationId;\n                const title = this.get('intl').t('notification.titles.callError');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    _throttledMute: task(function* (conversation) {\n        this._mute(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    mute(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            return this.get('_throttledMute').perform(conversation);\n        }\n    },\n\n    _mute(conversation) {\n        const isMuted = conversation.get('isMuted');\n        this.handlePhoneStatusChange('muted', conversation)\n            .then(() => {\n                // this.get('headset').setMute(!isMuted);\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').setMute(!isMuted);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isMuted', !isMuted);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.mute');\n                return this.get('notification').error(title, message);\n            });\n    },\n\n    /**\n     * @param {object | undefined | null} conversation the conversation to hold, if not provided `activeCall` will be used\n     * @param {boolean} skipHoldAll `true` if we should skip holding all of the other calls`\n     */\n    hold(conversation, skipHoldAll = false) {\n        // bypasses throttling and other seemingly uneeded checks\n        if (this.get('session.useMultipanel')) {\n            conversation = conversation || this.get('activeCall');\n            if (!conversation) {\n                return Ember.RSVP.Promise.resolve();\n            } else if (skipHoldAll) {\n                return this._held(conversation);\n            }\n\n            // if the conversation is held now, it's being unheld\n            // so if we're using webrtc, and there are more than one active\n            // call, we should hold all other calls that aren't already held\n            const isHeld = conversation.get('isHeld');\n            if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n                this._holdOtherActiveConversations(conversation);\n            }\n            return this._held(conversation);\n        }\n\n        // if the conversation is held now, it's being unheld\n        // so if we're using webrtc, and there are more than one active\n        // call, we should hold all other calls that aren't already held\n        const isHeld = conversation.get('isHeld');\n        if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n            this._holdOtherActiveConversations(conversation);\n        }\n        this.held(conversation);\n        return Ember.RSVP.Promise.resolve();\n    },\n\n    _holdOtherActiveConversations(conversation) {\n        const conversationId = Ember.get(conversation, 'id');\n        const otherConversations = this.get('connectedConversations').filter(c => c.get('id') !== conversationId);\n        otherConversations.forEach(otherConversation => {\n            if (!otherConversation.get('isHeld')) {\n                this._held(otherConversation);\n            }\n        });\n    },\n\n    held(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_throttledHeld').perform(conversation);\n        }\n    },\n\n    _throttledHeld: task(function* (conversation) {\n        this._held(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _held(conversation) {\n        const isHeld = conversation.get('isHeld');\n        return this.handlePhoneStatusChange('held', conversation)\n            .then(() => {\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').setHold(conversation.get('id'), !isHeld);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isHeld', !isHeld);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hold');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    record(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_throttledRecord').perform(conversation);\n        }\n    },\n\n    _throttledRecord: task(function* (conversation) {\n        this._record(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _record(conversation) {\n        const isRecording = conversation.get('isRecording');\n        this.handlePhoneStatusChange('recording', conversation)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'isRecording', !isRecording);\n            })\n            .catch(() => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.record');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    flagActiveInteraction(action, conversation) {\n        const call = conversation || this.get('activeCall');\n        const participant = call.get('myself');\n        if (!participant) {\n            this.logger.info('No \"myself\" participant on the call when handling flag change', {\n                conversationId: Ember.get(call, 'id')\n            });\n            return Promise.reject(new Error('Self participant missing'));\n        }\n\n        const isFlagged = !!conversation.get('myself.flaggedReason');\n        this.logger.debug('isFlagged:', isFlagged);\n\n        return this._makeFlagChange(conversation, participant, action)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'myself.flaggedReason', [\n                    isFlagged ? undefined : 'general'\n                ]);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n                this.get('notification').error(title, message);\n                this.logger.warn('Failed to validate interaction flagging', {\n                    conversationId: Ember.get(conversation, 'id'),\n                    err\n                });\n            });\n    },\n\n    flagCallHistoryInteraction(action, conversation, participants) {\n        return Ember.RSVP.all(\n            participants.map(participant => {\n                return this._makeFlagChange(conversation, participant, action);\n            })\n        ).catch(err => {\n            const title = this.get('intl').t('notification.titles.callError');\n            const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n            this.get('notification').error(title, message);\n            this.logger.warn('Failed to validate history interaction flagging', {\n                conversationId: Ember.get(conversation, 'id'),\n                err\n            });\n        });\n    },\n\n    _makeFlagChange(call, participant, action) {\n        let url = this.pcUri(`api/v2/conversations/${call.id}/participants/${participant.id}/flaggedreason`);\n\n        let type;\n        if (action === 'flag') {\n            type = 'PUT';\n        } else if (action === 'unflag') {\n            type = 'DELETE';\n        } else {\n            return Promise.reject(new Error('Unwanted action for changing flag'));\n        }\n\n        return this.makeRequest(url, {}, type).then(() => {\n            if (action === 'flag') {\n                Ember.set(participant, 'flaggedReason', 'general');\n            } else {\n                Ember.set(participant, 'flaggedReason', undefined);\n            }\n        });\n    },\n\n    endCall(conversation = this.get('activeCall')) {\n        if (conversation) {\n            return this.get('_throttledEndCall').perform(conversation);\n        }\n    },\n\n    /**\n     * Ends the conversation call for ALL participants included.\n     * @param {object} conversation The conversation to end\n     */\n    endCallForAll(conversation = this.get('activeCall')) {\n        if (conversation) {\n            return this.get('_throttledEndCallForAll').perform(conversation);\n        }\n    },\n\n    endCallById(conversationId) {\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            return this.get('_throttledEndCall').perform(conversation);\n        }\n    },\n\n    _throttledEndCall: task(function* (conversation) {\n        this._endCall(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledEndCallForAll: task(function* (conversation) {\n        this._endCallForAll(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    async _endCall(conversation) {\n        return this.handlePhoneStatusChange('hangup', conversation)\n            .then(() => {\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('notification').error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    async _endCallForAll(conversation) {\n        return this.handlePhoneStatusChange('end', conversation)\n            .then(() => {\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('notification').error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    /**\n     * All webrtc softphone calls are ended through here.\n     */\n    _endWebrtcCall(conversationId) {\n        if (this.get('stationHasPersistentConnection')) {\n            return;\n        }\n        if (this.get('station.isWebrtc') && conversationId) {\n            const data = {\n                conversationId,\n                conversationType: webrtcConversationTypes.SOFTPHONE,\n                // PCM-517 - this fallback disconnect was disconnecting conversations that\n                // got routed back to an agent after transfering to a queue, and were new, not old\n                pending: false, // don't end any new pending conversations\n                notAfter: new Date() // don't end any conversations created after now\n            };\n            // PCM-340 - pass false to throttle to run on tail end of the interval. This gives the API request to hangup\n            // one second to finish, before we explicitly tear down the connection. If the edge takes longer than\n            // one second to hangup, then we'll tear it down and the edge will detect an error, but that's expected\n            this.get('_throttledEndWebrtcCall').perform(data);\n        }\n    },\n\n    _throttledEndWebrtcCall: task(function* (data) {\n        yield timeout(1000);\n        this.get('webrtc').endConversation(data);\n    }).drop(),\n\n    handlePhoneStatusChange(action, conversation) {\n        return new Promise((resolve, reject) => {\n            const call = conversation || this.get('activeCall');\n            const participant = call.get('myself');\n            if (!participant) {\n                this.logger.info('No \"myself\" participant on the call when handling status change', {\n                    conversationId: Ember.get(call, 'id')\n                });\n                return reject(new Error('Self participant missing'));\n            }\n            let type = 'patch';\n            let url = this.pcUri(`api/v2/conversations/calls/${call.id}/participants/${participant.id}`);\n            let data, toggle;\n\n            // Used to end the entirety of the conversation. Implemented for `endForAll` in conferencing.\n            if (action === 'end') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n                url = this.generateConversationUrl(call.get('id'));\n            } else if (action === 'hangup') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n                const callbackConnected = _.get(participant, 'callbacks[0].state', '').toLowerCase() === 'connected';\n                const callConnected = _.get(participant, 'calls[0].state', '').toLowerCase() === 'connected';\n\n                if (\n                    (callConnected && callbackConnected) ||\n                    (!callConnected && callbackConnected && conversationWithError)\n                ) {\n                    type = 'patch';\n                    const communicationId = _.get(participant, 'calls[0].id');\n                    url = this.generateCommunicationUrl(call.get('id'), participant.id, communicationId);\n                }\n            } else if (action === 'answer') {\n                data = {\n                    state: 'CONNECTED'\n                };\n            } else if (action === 'sendToVoicemail') {\n                type = 'post';\n                const query = {\n                    voicemail: true\n                };\n                url = this.replaceUri(call.get('id'), participant.id, null, 'calls');\n                data = query;\n            } else if (action === 'held') {\n                if (!Ember.get(conversation, 'isConnected')) {\n                    this.logger.debug(\n                        `Attempted to set hold state for non-connected conversation: ${conversation.get('id')}`\n                    );\n                    return Promise.resolve();\n                }\n\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            } else {\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            }\n\n            this.set('loading.' + action, true);\n            this.set('currentStatusChange', action);\n\n            if (!_.includes(['put', 'post', 'patch'], type)) {\n                reject();\n            }\n\n            this.makeRequest(url, { data }, type)\n                .then(response => {\n                    resolve(response);\n                })\n                .catch(({ jqXHR }) => {\n                    reject(jqXHR);\n\n                    if (jqXHR.status !== 202) {\n                        this.set(`loading.${action}`, false);\n                    }\n\n                    if (jqXHR.status === 403) {\n                        const response = JSON.parse(jqXHR.responseText);\n                        if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                            const title = this.get('intl').t('notification.titles.callError');\n                            const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                            return this.get('notification').error(title, message);\n                        }\n                    }\n                })\n                .finally(() => {\n                    return this.set('loading.' + action, false);\n                });\n        });\n    },\n\n    handleOtherParticipantStatusChange(action, participant) {\n        const call = this.get('activeCall');\n        const url = this.generateConversationsUrl(call.get('id'), participant.id);\n        let method = 'patch';\n        let data = {};\n\n        if (action === 'hangup') {\n            data.state = 'disconnected';\n        } else {\n            const toggle = _.head(participant.calls)[action];\n            data[action] = !toggle;\n        }\n\n        const options = { method, data: JSON.stringify(data) };\n        return this.makeRequest(url, options, 'raw')\n            .then(data => {\n                return Ember.Logger.debug('Other Status Change: ' + action, data);\n            })\n            .catch(({ jqXHR }) => {\n                if (jqXHR.status !== 202) {\n                    this.set('loading.' + action, false);\n                }\n\n                if (jqXHR.status === 403) {\n                    const response = JSON.parse(jqXHR.responseText);\n                    if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                        const title = this.get('intl').t('notification.titles.callError');\n                        const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                        return this.get('notification').error(title, message);\n                    }\n                }\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    callForwardingActive: false,\n    callForwardingNumber: null,\n    callForwardingExtension: null,\n\n    fetchCallForwarding() {\n        if (this.get('canCallForward')) {\n            this.getCallForwarding()\n                .then(response => {\n                    return this._updateCallForwarding(response);\n                })\n                .catch(() => {\n                    this.set('callForwardingActive', false);\n                });\n        }\n    },\n\n    getCallForwarding() {\n        const url = this.get('application').pcV2Uri('api/v2/users/' + this.get('personGuid') + '/callForwarding');\n        return this.get('ajax').ajaxGet(url);\n    },\n\n    _updateCallForwarding(response) {\n        const enabled = _.isEmpty(response) ? false : response.enabled;\n        this.set('callForwardingActive', enabled);\n        const phoneNumber = response.phoneNumber;\n        const hasPhoneNumber = !_.isEmpty(phoneNumber);\n        if (hasPhoneNumber) {\n            if (_.startsWith(phoneNumber, ';ext=')) {\n                const re = /^;ext=(\\d{1,})$/;\n                const number = _.last(re.exec(phoneNumber));\n                this.set('callForwardingExtension', number);\n                return this.set('callForwardingNumber', null);\n            } else {\n                this.set('callForwardingNumber', phoneNumber);\n                return this.set('callForwardingExtension', null);\n            }\n        }\n    }\n});\n","import Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\nimport ERROR_WHITE_LIST from 'connections-ui/utils/error-white-list';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject, observer, run } = Ember;\n\nexport default Ember.Mixin.create({\n    externalContacts: inject.service(),\n\n    _contactObservers: null,\n\n    // holds all of the conversations\n    conversations: [],\n    conversationsMadeByClient: [],\n    activeConversations: computed.reads('conversations'),\n    onMultipleCalls: computed.gt('activeConversations.length', 1),\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n    },\n\n    // TODO: unbind conversations and webrtc sessions\n    // This is only used in two places anyways. Might be able to remove.\n    activeAcdCalls: computed(\n        'activeConversations.[]',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        'station.isWebrtc',\n        function () {\n            return this.get('activeConversations').filter(conv => {\n                if (!this.get('station.isWebrtc')) {\n                    return conv.get('isAgentCall');\n                }\n                const callState = Ember.get(conv, 'callState.state');\n                const webrtcConversation = this.get('webrtc').getConversation({\n                    conversationId: conv.id,\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                const session = this._findPendingSessionsByConversationId(conv.id);\n                if (!callState || !webrtcConversation || !session) {\n                    return false;\n                }\n                const callIsAlreadyConnnected = ['connected', 'disconnected'].indexOf(callState.toLowerCase()) > -1;\n                const hasPendingSession = session ? Ember.get(session, 'id') || Ember.get(session, 'sid') : false; // seems redundant when checking for session above\n                const webrtcSessions = Ember.get(webrtcConversation, 'sessions');\n                const atLeastOneWebrtcConversation = this.isDefinedAndLengthGreaterThan(webrtcSessions, 0); // atLeastOneWebrtcConversation would be better here.\n                return (\n                    (callIsAlreadyConnnected || hasPendingSession || atLeastOneWebrtcConversation) &&\n                    conv.get('isAgentCall')\n                );\n            });\n        }\n    ),\n\n    // activeNonAcdCalls feeds all the components based on whether or not station is webrtc or not.\n    activeNonAcdCalls: computed('activeConversations.@each.connectedToStationAndNotConference', function () {\n        return this.get('activeConversations').filter(conv => {\n            // connecting to an auto conference, do not display.\n            if (conv.get('connectedToStationAndNotConference') && !conv.get('isGroupRing')) {\n                return false;\n            }\n            return !conv.get('isAgentCall');\n        });\n    }),\n\n    // conversations that are not 'disconnected' and not 'terminated'\n    connectedConversations: computed('conversations.@each.onCall', function () {\n        const conversations = this.get('conversations');\n        return conversations.filter(function (conversation) {\n            return conversation.get('onCall');\n        });\n    }),\n\n    /**\n     * Consumed by webrtc-conversation-manager behind toggle.\n     *\n     * Conversations for which the client should send the <proceed /> (i.e., webrtc.answerSoftphoneConversation())\n     * This would be conversations that the client initiated or conversations that were answered before the client received the <propose />\n     * or conversations that this browser was set to handle calls from with the thisBrowserIsTheOneToAnswerFrom toggle.\n     */\n    dialingOrContactingOrAlertingConversationsToProceed: computed(\n        'conversations.@each.waitingForSession',\n        'conversationsMadeByClient.@each.id',\n        'conversations.@each.isDialing',\n        'thisBrowserIsTheOneToAnswerFrom',\n        function () {\n            const conversations = this.get('conversations');\n            return conversations.filter(conversation => {\n                const thisClientMadeTheCall = this.get('conversationsMadeByClient').findBy('id', conversation.id);\n                const waitingForSession = conversation.get('waitingForSession');\n                // If we transfer a call we've placed and we're the target of the transfer, we do not want to auto answer/proceed.\n                if (!!conversation.recentTransfers) {\n                    this.get('conversationsMadeByClient').removeObject(conversation);\n                    return false;\n                }\n                if (thisClientMadeTheCall || waitingForSession) {\n                    return true;\n                }\n\n                const thisBrowserIsTheOneToAnswerFrom = this.get('thisBrowserIsTheOneToAnswerFrom');\n                const isDialing = conversation.get('isDialing');\n                const isOutbound = conversation.get('isOutbound');\n                return isOutbound && isDialing && thisBrowserIsTheOneToAnswerFrom;\n            });\n        }\n    ),\n\n    disconnectedConversations: computed('conversations.@each.onCall', function () {\n        return this.get('conversations').filter(conversation => {\n            const isDisconnected = this.isDisconnected(conversation);\n            if (conversation.get('isAgentCall')) {\n                return isDisconnected && conversation.get('isAfterCallWorkCompleted');\n            }\n            return isDisconnected;\n        });\n    }),\n\n    eligibleCallsToMerge: computed('activeConversations.@each.{isConnected,onConference}', 'activeCall', function () {\n        const onConference = this.get('activeCall.onConference');\n        return this.get('activeConversations').reject(conv => {\n            let thisCallIsConference = false;\n            if (!conv.get('isConnected')) {\n                return true;\n            }\n            if (conv.get('onConference')) {\n                thisCallIsConference = true;\n            }\n            return conv.id === this.get('activeCall.id') || (onConference && thisCallIsConference);\n        });\n    }),\n\n    _handleActiveConversationsUpdates: observer(\n        'activeConversations.[]',\n        'activeNonAcdCalls.[]',\n        'station.isWebrtc',\n        function () {\n            this.get('_throttledHandleActiveConversations').perform();\n        }\n    ),\n\n    _throttledHandleActiveConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this.handleActiveConversationsUpdates();\n    }).drop(),\n\n    handleActiveConversationsUpdates() {\n        const hasActiveCall = this.get('activeCall');\n        const activeNonAcdCalls = this.get('activeNonAcdCalls');\n\n        // activeNonAcdCalls could contain calls that have ended\n        const connectedNonAcdCalls = activeNonAcdCalls.filterBy('onCall');\n\n        const connectedConversations = this.get('connectedConversations') || [];\n        const dialingOrIncomingConversation = connectedConversations.filter(function (conversation) {\n            return conversation.get('isDialing') || conversation.get('isIncoming');\n        });\n\n        let newActiveCall = undefined;\n\n        if (!hasActiveCall) {\n            // no active call\n            newActiveCall = (connectedNonAcdCalls && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n        } else {\n            // active call might have finished\n            const activeCallOngoing = this.get('onCall');\n\n            if (!activeCallOngoing) {\n                const activeCallErrors = this.get('activeCall.errorInfoMessage');\n\n                if (activeCallErrors) {\n                    // something went wrong with the call\n                    this.set('lastConversationError', {\n                        id: this.get('activeCall.id'),\n                        errorInfo: this.get('activeCall.errorInfo')\n                    });\n                    Ember.Logger.warn('lastConversationError: ', this.get('lastConversationError'));\n                } else {\n                    // call finished successfully - move to the next one\n                    newActiveCall = (connectedNonAcdCalls && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n                }\n\n                // prioritize new dialed or incoming calls\n                if (dialingOrIncomingConversation && dialingOrIncomingConversation.length) {\n                    newActiveCall = Ember.get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            } else {\n                const dialingOutboundConversations = connectedConversations.filter(function (conversation) {\n                    return conversation.get('isDialing') && !conversation.get('isIncoming');\n                });\n                const hasOutboundConversation = dialingOutboundConversations && dialingOutboundConversations.length;\n\n                if (hasOutboundConversation) {\n                    newActiveCall = Ember.get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            }\n        }\n\n        // set the next active call appropriately\n        if (newActiveCall) {\n            this.set('activeCall', newActiveCall);\n        }\n    },\n\n    hasIncomingConversations: false,\n    _setHasIncomingConversations: observer('incomingConversations.[]', function () {\n        return run.once(this, this.set, 'hasIncomingConversations', this.get('incomingConversations.length') > 0);\n    }),\n\n    hasActiveNonAcdCalls: computed('incomingNonAcdConversations.[]', 'activeNonAcdCalls.[]', function () {\n        return this.get('incomingNonAcdConversations.length') > 0 || this.get('activeNonAcdCalls.length') > 0;\n    }),\n\n    incomingConversations: computed(\n        'conversations.[]',\n        'station.isWebrtc',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        function () {\n            const conversations = this.get('conversations');\n            return conversations.filterBy('isIncoming');\n        }\n    ),\n\n    incomingNonAcdConversations: computed('incomingConversations.[]', function () {\n        const conversations = this.get('incomingConversations');\n        return conversations.rejectBy('isAgentCall');\n    }),\n\n    isOnConnectedCall: computed('activeConversations.@each.isConnected', function () {\n        return !!this.get('activeConversations').findBy('isConnected');\n    }),\n\n    mostRecentlyConnectedConferenceCalls() {\n        return this.get('activeConversations').filter(conversation => {\n            const isConferenceCall = Ember.get(conversation, 'onConference');\n            const isConnectedCall = Ember.get(conversation, 'onCall');\n            const myTime = moment(Ember.get(conversation, 'myself.connectedTime'));\n            const diff = moment().diff(myTime);\n            return isConferenceCall && isConnectedCall && diff < 3000;\n        });\n    },\n\n    // conversations that have the 'connected' state and are not agent calls.\n    onlyConnectedConversations: computed('conversations.@each.connected', function () {\n        return this.get('conversations').filter(conversation => {\n            return conversation.get('isConnected') && !conversation.get('isAgentCall');\n        });\n    }),\n\n    recentDisconnectedAgentCalls: computed('conversations.@each.connected', function () {\n        return this.get('conversations').reject(conversation => {\n            const isDisconnected = this.isDisconnected(conversation) && conversation.get('isAfterCallWorkCompleted');\n            const isAgentCall = conversation.get('isAgentCall');\n            return !isAgentCall || !isDisconnected;\n        });\n    }),\n\n    recentDisconnectedNonAcdCalls: computed('conversations.@each.onCall', function () {\n        return this.get('conversations').filter(conversation => {\n            const callState = Ember.get(conversation, 'callState');\n            const isDisconnected =\n                callState && callState.state\n                    ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1\n                    : false;\n            return isDisconnected && !conversation.get('isAgentCall');\n        });\n    }),\n\n    removeConversationFromConversations(calls) {\n        const conversations = this.get('conversations');\n        const conversationsMadeByClient = this.get('conversationsMadeByClient');\n        const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n        if (this.isDefinedAndLengthGreaterThan(conversations, 0)) {\n            calls.forEach(conversation => {\n                const conversationId = Ember.get(conversation, 'id');\n                if (!conversationId || !Ember.get(conversation, 'isDisconnected')) {\n                    return;\n                }\n\n                // weird case where a non acd call ends and gets transferred back immediately. conversation is no longer disconnected and shouldn't be removed\n                if (!conversation.get('isAgentCall') && !this._shouldRemoveNonAcdConversation(conversation)) {\n                    return;\n                }\n\n                const conversationMarker = conversationsMadeByClient.findBy('id', conversationId);\n                if (conversationMarker) {\n                    conversationsMadeByClient.removeObject(conversationMarker);\n                }\n                const conversationsToRemove = conversations.filterBy('id', conversationId);\n\n                if (conversation) {\n                    const callErrorToRemove = userCallSessionsWithErrors.filterBy('id', conversationId);\n                    userCallSessionsWithErrors.removeObjects(callErrorToRemove);\n\n                    if (conversation.id === this.get('activeCall.id')) {\n                        this.cleanupActiveCall();\n                    }\n\n                    const conversationModelTemp = ConversationModel.create(\n                        conversation.get('__interaction_metadata__'),\n                        Ember.getOwner(this).ownerInjection()\n                    );\n                    Ember.set(conversationModelTemp, 'type', 'call');\n\n                    const { id } = conversation;\n                    this.set(`_contactObservers.${id}`, undefined);\n\n                    conversation.destroy();\n                    conversationModelTemp.destroy();\n                }\n\n                conversations.removeObjects(conversationsToRemove);\n            });\n        }\n    },\n\n    _throttledRemoveDisconnectedConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this._removeDisconnectedConversations();\n    }).drop(),\n\n    _shouldRemoveNonAcdConversation(conversation) {\n        const conversationHasErrors = this.get('userCallSessionsWithErrors').findBy('id', conversation.id);\n        const conversationMadeByClient = this.get('conversationsMadeByClient').findBy('id', conversation.id);\n        const conversationAcceptedOnClient = Ember.get(conversation, 'acceptedByClient');\n        const conversationWasMadeOrAcceptedOnClient = conversationAcceptedOnClient || conversationMadeByClient;\n\n        const participantsForUser = conversation.get('participants').filterBy('userId', this.get('personGuid'));\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n\n        let conversationWasTerminatedNotDisconnected = false;\n        if (updatedParticipantCall) {\n            conversationWasTerminatedNotDisconnected = updatedParticipantCall.state === 'terminated';\n\n            if (updatedParticipantCall.state === 'alerting') {\n                return false;\n            }\n        }\n\n        if (\n            !conversationWasMadeOrAcceptedOnClient ||\n            conversationWasTerminatedNotDisconnected ||\n            (conversationWasMadeOrAcceptedOnClient && !conversationHasErrors)\n        ) {\n            return true;\n        }\n        if (conversationHasErrors) {\n            return false;\n        }\n    },\n\n    _removeDisconnectedConversations() {\n        if (this.get('recentDisconnectedAgentCalls.length')) {\n            const disconnectedCalls = this.get('recentDisconnectedAgentCalls');\n            return run.next(this, this.removeConversationFromConversations, disconnectedCalls);\n        }\n        if (this.get('recentDisconnectedNonAcdCalls.length')) {\n            // remove conversations normally that were not made or accepted on this client\n            // remove conversations normally that do not have errors\n            const conversationsToRemove = this.get('recentDisconnectedNonAcdCalls').filter(conversation => {\n                return this._shouldRemoveNonAcdConversation(conversation);\n            });\n            let timeOutToRemove = this.get('timeOutToRemove');\n            if (!isTesting) {\n                const stationIsWebrtc = this.get('station.isWebrtc');\n                const thereArePendingSessions = this.get('webrtc.pendingSessions.length') > 0;\n                if (\n                    stationIsWebrtc &&\n                    thereArePendingSessions &&\n                    this.get('activeCall.connectedToStationAndNotConference')\n                ) {\n                    timeOutToRemove = 1;\n                }\n            }\n            if (conversationsToRemove.length) {\n                this.get('_debouncedRemoveConversationFromConversations').perform(\n                    conversationsToRemove,\n                    timeOutToRemove\n                );\n            }\n        }\n    },\n\n    _debouncedRemoveConversationFromConversations: task(function* (conversationsToRemove, debounceTime) {\n        yield timeout(debounceTime);\n        this.removeConversationFromConversations(conversationsToRemove);\n    }),\n\n    thereIsAConnectedConversation: computed.gte('onlyConnectedConversations.length', 1),\n\n    updateConversationArray(conversation, conversationDetails, isAgentCall) {\n        const conversationExists = conversationDetails != null ? true : false;\n        if (conversationExists) {\n            conversationDetails.setProperties(conversation);\n        } else {\n            conversationDetails = ConversationModel.create(conversation, Ember.getOwner(this).ownerInjection());\n\n            //Verify if we should process this update if agentCall\n            let isUpdateValid = true;\n            if (isAgentCall) {\n                Ember.set(conversationDetails, 'type', 'call');\n            }\n            if (isUpdateValid) {\n                this.get('conversations').pushObject(conversationDetails);\n            } else {\n                conversationDetails.destroy();\n            }\n        }\n        if (conversationDetails) {\n            this.trigger(`conversations.${conversationDetails.get('id')}`);\n            return conversationDetails;\n        } else {\n            return null;\n        }\n    },\n\n    monitoredConversationsForErrors: computed('conversations.@each.participants', function () {\n        const nonAcdCalls = this.get('conversations').reject(conversation => {\n            return Ember.get(conversation, 'participants').any(party =>\n                party && party.purpose ? party.purpose === 'agent' || party.purpose === 'acd' : false\n            );\n        });\n        return Ember.A([].concat(nonAcdCalls || []));\n    }),\n\n    // returns an array of conversation objects for the current user:\n    // { id: conversationId,\n    //   calls: [] // All calls for this user's participant\n    // }\n    usersCallSessions: computed('monitoredConversationsForErrors.@each.participants', 'personGuid', function () {\n        let callSessions = [];\n        this.get('monitoredConversationsForErrors').forEach(conversation => {\n            Ember.get(conversation, 'participants').forEach(participant => {\n                const purpose = (Ember.get(participant, 'purpose') || '').toLowerCase();\n                const participantIsUserAgent = ['user', 'agent'].indexOf(purpose) > -1;\n                const participantIsCurrentUser = Ember.get(participant, 'userId') === this.get('personGuid');\n                const userParticipant = participantIsCurrentUser && participantIsUserAgent ? participant : null;\n                if (userParticipant && Ember.get(userParticipant, 'calls')) {\n                    callSessions.push({ id: conversation.id, calls: Ember.get(userParticipant, 'calls') });\n                }\n            });\n        });\n        return callSessions;\n    }),\n\n    // returns array of user's call sessions that have errors (errorInfo or disconnectType == 'error' or disconnectReasons with 3XX, 4XX, 5XX codes)\n    userCallSessionsWithErrors: computed(\n        'usersCallSessions.calls.@each.errorInfo',\n        'usersCallSessions.calls.@each.disconnectReasons',\n        'userCallSessionsWithErrors.calls.@each.disconnectType',\n        function () {\n            return this.get('usersCallSessions').filter(session => {\n                const calls = Ember.get(session, 'calls');\n                const callsWithErrors = calls.filter(call => {\n                    const disconnectReasons = Ember.get(call, 'disconnectReasons');\n                    const thereAreDisconnectReasons = this.isDefinedAndLengthGreaterThan(disconnectReasons, 0);\n                    if (thereAreDisconnectReasons) {\n                        const re = /[3|4|5|6]\\d{2}/;\n                        const disconnectErrors = disconnectReasons.filter(reason => {\n                            return re.exec(reason.code);\n                        });\n                        return this.isDefinedAndLengthGreaterThan(disconnectErrors, 0);\n                    }\n                    const errorInfo = Ember.get(call, 'errorInfo');\n                    const disconnectTypeIsError =\n                        typeof Ember.get(call, 'disconnectType') === 'string'\n                            ? call.disconnectType.toLowerCase() === 'error'\n                            : false;\n\n                    // UI-2567: Ignore white listed errors if they do not cause disconnect\n                    if (!disconnectTypeIsError && errorInfo && ERROR_WHITE_LIST.indexOf(errorInfo.code) !== -1) {\n                        return false;\n                    }\n\n                    return errorInfo || disconnectTypeIsError ? true : false;\n                });\n                return callsWithErrors.length > 0 ? true : false;\n            });\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { observer, Logger } = Ember;\n\nexport default Ember.Mixin.create({\n    registerCPTopics: observer('user.id', function () {\n        const id = this.get('user.id');\n        const pigeon = this.get('pigeon');\n        let topics = [];\n        if (id && !this.get('registeredTopics')) {\n            this.set('registeredTopics', true);\n            topics = [\n                'station',\n                'conversations',\n                'voicemail.messages',\n                'userrecordings',\n                'fax.documents',\n                'evaluations'\n            ];\n\n            this.get('pigeon').on(`v2.users.${id}.station`, this, this._updateStationEvent); // in mixins/phone-service/station\n            return topics.map(t => `v2.users.${id}.${t}`).forEach(t => pigeon.registerPriorityTopic(t));\n        }\n    }),\n\n    updateActiveConversationEntry(conversation) {\n        let type = this.getInteractionTypeFromCP(conversation);\n\n        if (!type.isCall || (type.isCall && type.isCallback) || type.isFax) {\n            return;\n        }\n\n        let conversationData;\n        let currentCallState;\n        const conversationDetails = this.get('conversations').findBy('id', conversation.id);\n        if (conversationDetails) {\n            const participantOnExistingConversation = conversationDetails\n                .get('participants')\n                .findBy('userId', this.get('personGuid'));\n            if (!participantOnExistingConversation) {\n                Logger.error(\n                    `updateActiveConversationEntry: Expected to find person ${this.get('personGuid')} on conversation ${\n                        conversation.id\n                    } but person was not found`\n                );\n            } else {\n                const participantCall = this.getParticipantCall(participantOnExistingConversation);\n                currentCallState = participantCall.state ? participantCall.state.toLowerCase() : null;\n            }\n        }\n\n        const participants = Ember.get(conversation, 'participants');\n        const isAgentCall = participants.any(party => (party.purpose ? party.purpose === 'agent' : false));\n\n        const participantsForUser = participants.filterBy('userId', this.get('personGuid'));\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n        const participantOnCall = updatedParticipantCall\n            ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(updatedParticipantCall.state.toLowerCase()) >\n              -1\n            : false;\n        const participantIsNotVoicemail = participantOnUpdatedConversation.purpose\n            ? participantOnUpdatedConversation.purpose.toLowerCase() !== 'voicemail'\n            : false;\n        const isActiveOnCall = updatedParticipantCall && participantOnCall && participantIsNotVoicemail;\n        const newCallState = updatedParticipantCall.state.toLowerCase();\n\n        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n            Ember.set(conversation, 'acceptedByClient', false);\n        }\n\n        if (\n            currentCallState &&\n            participantIsNotVoicemail &&\n            currentCallState !== 'connected' &&\n            newCallState === 'connected'\n        ) {\n            this.get('headset').answerCall(conversation.id, this.get('connectedConversations.length') >= 1);\n        }\n\n        if (currentCallState && currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n            this.get('headset').endCall(conversation.id, this.get('connectedConversations.length') > 1);\n        }\n\n        const onCall = conversationDetails ? conversationDetails.get('onCall') : false;\n        if (isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated') {\n            conversationData = this.updateConversationArray(conversation, conversationDetails, isAgentCall);\n        }\n        if (conversationData || newCallState === 'terminated') {\n            this.notifyPropertyChange('conversations');\n            this.notifyPropertyChange('recentDisconnectedAgentCalls');\n            this._logConversationDetails(conversationData);\n        }\n\n        conversationData = this._updateModelForConsult(conversationData, conversation);\n\n        return conversationData;\n    },\n\n    //TODO | SERVOPS-11175 | change this if/when service updates to include consultParticipant status for participants after customer departs\n    _updateModelForConsult(conversationData, conversation) {\n        if (conversation && conversation.participants) {\n            const consultParticipantId = conversation.participants\n                .filterBy('purpose', 'customer')\n                .mapBy('consultParticipantId')\n                .pop();\n\n            // the consultParticipantId needs to be retained even when the call is no longer\n            // on consult because of use cases identified in SERVOPS-11175\n            if (consultParticipantId) {\n                conversationData.consultParticipantId = consultParticipantId;\n            }\n        }\n        return conversationData;\n    }\n});\n","import Ember from 'ember';\nimport { EVENTS } from 'connections-ui/utils/hosted-context';\nimport moment from 'connections-ui/utils/dates';\nimport _ from 'lodash';\n\nconst { observer, run, inject } = Ember;\nconst IGNORED_ERRORS = ['error.ininedgecontrol.session.inactive'];\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    useNotificationProfileOutput: Ember.computed.reads('session.features.notificationOutputPicker'),\n\n    displayIncomingNotification(conversation) {\n        let isHosted, applicationHasFocus;\n        const hosted = this.get('application.hostedContext');\n        if (hosted) {\n            isHosted = hosted.isHosted();\n            applicationHasFocus = hosted.applicationHasFocus();\n        }\n        if (this.get('application.browserHidden') || (isHosted && !applicationHasFocus)) {\n            const title = this.get('intl').lookup('notification.titles.incomingCall').toString();\n            const message = this.get('intl').lookup('notification.purecloud.incomingCall').toString();\n            const notificationOptions = {\n                fallbackToInBrowser: false,\n                hideAfter: 8,\n                tag: EVENTS.INCOMING_CALL,\n                meta: {\n                    conversation: conversation\n                },\n                clickHandler: (conversation, action) => {\n                    if (conversation && action) {\n                        if (_.includes(action, 'ignore')) {\n                            return this.toVoicemail(conversation);\n                        } else if (_.includes(action, 'answer')) {\n                            return this.answer(conversation);\n                        }\n                    }\n                }\n            };\n\n            if (this.get('useNotificationProfileOutput')) {\n                notificationOptions.notificationOutputDeviceId = this.getNotificationOutputDeviceId();\n            }\n\n            this.get('notification').info(title, message, notificationOptions);\n        }\n    },\n\n    // handle errors on users session\n    handleParticipantCallError: observer(\n        'userCallSessionsWithErrors.@each.calls',\n        'userCallSessionsWithErrors.calls.@each.disconnectedTime',\n        'personGuid',\n        'webrtcSdkService.useSdk',\n        function () {\n            // we will use the sdk the determine and parse call errors\n            if (this.get('webrtcSdkService.useSdk')) {\n                return;\n            }\n\n            const callsWithErrors = this.get('callsWithErrors');\n            const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n            // are there any errors on any of the user's sessions?\n            _.each(userCallSessionsWithErrors, session => {\n                const calls = Ember.get(session, 'calls');\n                _.each(calls, call => {\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    const hasThrownError = Ember.get(call, '_hasThrownError');\n                    if (isRecent && !hasThrownError) {\n                        callsWithErrors.pushObject({ conversationId: session.id, call: call });\n\n                        // TODO: We should not be getting calls without error info here PCDWEBK-3674\n                        if (call.errorInfo && !_.includes(IGNORED_ERRORS, call.errorInfo.code)) {\n                            Ember.set(call, '_hasThrownError', true);\n                            this.showErrorNotification(call.errorInfo);\n                        }\n                    }\n                });\n            });\n\n            if ((this.get('_testIsStationWebrtc') || this.get('station.isWebrtc')) && callsWithErrors.length > 0) {\n                _.each(callsWithErrors, call => {\n                    const reason = Ember.get(call, 'call.disconnectReasons.firstObject');\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    if (\n                        reason &&\n                        isRecent &&\n                        Ember.get(reason, 'type') === 'SIP' &&\n                        !Ember.get(call, 'call._hasThrownError')\n                    ) {\n                        Ember.set(call, 'call._hasThrownError', true);\n                        run.throttle(this, this.showSipError, reason, 1000);\n                    }\n                });\n            }\n        }\n    ),\n\n    showSipError(response) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.sipError');\n        messageText = `${messageText} ${response.code} ${response.phrase}`;\n        this.get('notification').error(title, messageText, {\n            tag: 'call-error',\n            icon: `${prefix} assets/images/icons/png/checkmark-circled.png`,\n            hideAfter: 5\n        });\n    },\n\n    translateServerErrors(response) {\n        const { message, messageParams, messageWithParams, code } = response;\n        const intl = this.get('intl');\n        switch (code) {\n            case 'providerapi.error.no.station.for.edge':\n            case 'providerapi.error.station.no.active.edge': {\n                return this.fetchStation(messageParams.stationId).then(response => {\n                    return messageWithParams.replace('{stationId}', `'${response.get('name')}'`);\n                });\n            }\n            case 'error.ininedgecontrol.connection.station.notReached': {\n                let newCode = code + '.physical';\n\n                if (this.get('station.isWebrtc')) {\n                    newCode = code + '.webrtc';\n                }\n\n                return Ember.RSVP.resolve(intl.t(newCode));\n            }\n            default: {\n                if (code && intl.exists(code)) {\n                    return Ember.RSVP.resolve(intl.t(code));\n                }\n                if (message) {\n                    return Ember.RSVP.resolve(message);\n                }\n                return code;\n            }\n        }\n    },\n\n    showErrorNotification(response, err) {\n        if (!response) {\n            if (!err) {\n                Ember.Logger.error(new Error('Cannot show error notification with no error information'));\n                return;\n            }\n            response = { message: err.message };\n        }\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.dialpad.call');\n        messageText = this.translateServerErrors(response, err);\n        return messageText.then(text => {\n            return this.get('notification').error(title, text, {\n                tag: 'call-error',\n                icon: prefix + 'assets/images/icons/png/checkmark-circled.png',\n                hideAfter: 5\n            });\n        });\n    },\n    showFeedbackErrorNotification(message) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        message = '' + message;\n        return this.get('notification').error(title, message, {\n            target: this.get('applicationController'),\n            tag: 'activeCall',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').lookup('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    showNoStationSelected(conversation) {\n        Ember.Logger.error('Cannot answer conversation because there is no active station for the current user', {\n            conversationId: conversation.get('id')\n        });\n        const title = this.get('intl').t('notification.titles.callError');\n        const message = this.get('intl').t('purecloud.station.noStationSelected');\n        this.get('notification').error(title, message, {\n            tag: 'call-error'\n        });\n    },\n\n    checkForNonACD(conversation) {\n        let isAcdCall = this.get('isActiveCallACD');\n        if (conversation) {\n            isAcdCall = conversation.get('isAgentCall');\n        }\n        if (!isAcdCall) {\n            const message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\n\nconst { computed, RSVP, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    store: inject.service(),\n    station: null,\n    needStation: false,\n    updateStationEventTimeout: 500,\n\n    freeSeatPreference: computed('session.org.orgSettings.freeSeating', function () {\n        return this.get('session.org.orgSettings.freeSeating');\n    }),\n\n    noStationSelected: computed.not('station'),\n\n    defaultStation: computed('user.station.defaultStation', function () {\n        const user = this.get('user');\n        if (user && Ember.get(user, 'station.defaultStation')) {\n            return this.get('user.station.defaultStation');\n        }\n        return null;\n    }),\n\n    associatedStationNotDefault: computed('defaultStation', 'station', function () {\n        if (!(this.get('defaultStation') || this.get('station'))) {\n            return false;\n        }\n        return this.get('defaultStation.id') !== this.get('station.id');\n    }),\n\n    defaultStationNamePromise: computed('defaultStation', function () {\n        if (!this.get('defaultStation')) {\n            return RSVP.resolve(null);\n        }\n\n        return this.get('store')\n            .find('station', this.get('defaultStation.id'))\n            .then(station => station.get('name'));\n    }),\n\n    // TODO: Remove this when API-2018 is ready because the calls to pub api for getting the user\n    // and setting the station will include station name and type.\n    fetchStation(selectedStation) {\n        const stationId = this.guidFromUri(selectedStation || this.get('user.station.lastAssociatedStation.id'));\n        return this.store\n            .find('station', stationId)\n            .then(station => {\n                this.set('station', station);\n                return station;\n            })\n            .catch(function (err) {\n                Ember.Logger.error('Failed to fetch station:', {\n                    error: err,\n                    stationId\n                });\n            });\n    },\n\n    disassociateStation() {\n        let url = this.get('applicationService').pcV2Uri(`api/v2/users/stations/me/associatedstation`);\n        return this.get('ajax').delete(url);\n    },\n\n    disconnectPersistentConnection() {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService').endAllSoftphoneSessions();\n        }\n\n        const webrtc = this.get('webrtc');\n        const conversations = webrtc\n            .get('conversations')\n            .filterBy('conversationType', webrtcConversationTypes.SOFTPHONE)\n            .map(c => ({ conversationId: c.get('conversationId'), jid: c.get('jid') }));\n        if (conversations.length !== 1) {\n            Ember.Logger.warn('Disconnecting persistent connection with active conversations', {\n                conversations: conversations.map(c => Ember.get(c, 'id'))\n            });\n        } else {\n            Ember.Logger.info('disconnecting persistent connection', conversations[0]);\n        }\n        conversations.forEach(c => webrtc.endConversation(c));\n    },\n\n    chooseDefault() {\n        const user = this.get('user');\n        let defaultStation = Ember.get(user, 'station.defaultStation');\n        if (!defaultStation) {\n            defaultStation = Ember.get(user, 'station.associatedStation');\n        }\n        this.chooseStation(Ember.get(defaultStation, 'id'));\n        this.set('defaultStation', defaultStation);\n        Ember.set(user, 'station.defaultStation', defaultStation);\n    },\n\n    doLoginAssociationLogic() {\n        const isFreeSeatOrg = this.get('freeSeatPreference');\n        let promise;\n\n        if (isFreeSeatOrg) {\n            promise = this._loginAssociationFreeSeat();\n        } else {\n            promise = this._loginAssociation();\n        }\n\n        return promise;\n    },\n\n    doLogoutAssociationLogic() {\n        return Ember.RSVP.resolve();\n    },\n\n    _loginAssociationFreeSeat() {\n        const user = this.get('user');\n        const associatedStation = Ember.get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        this.set('station', null);\n        this.logger.debug('Could not associate station on login because user does not have an associated Station');\n        return RSVP.resolve();\n    },\n\n    _loginAssociation() {\n        const user = this.get('user');\n        const associatedStation = Ember.get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        const lastAssociatedStation = Ember.get(user, 'station.lastAssociatedStation');\n        if (lastAssociatedStation) {\n            // user has no associated station, so we will pick the last station they used as long as it is not associated to another user\n            const lastAssociatedUser = Ember.get(lastAssociatedStation, 'associatedUser');\n            if (!lastAssociatedUser) {\n                return this.chooseStation(Ember.get(lastAssociatedStation, 'id'));\n            }\n        }\n        const defaultStation = Ember.get(user, 'station.defaultStation');\n        if (defaultStation) {\n            // user has no associated station or last used station, so pick their default as long as it is not associated to another user\n            const defaultStationUser = Ember.get(defaultStation, 'associatedUser');\n            if (!defaultStationUser) {\n                return this.chooseStation(Ember.get(defaultStation, 'id'));\n            }\n        }\n        const userStationSettings = Ember.get(user, 'station');\n        this.set('station', null);\n        this.logger.info('User did not have any stations to pick on login', { userStationSettings });\n        return RSVP.resolve();\n    },\n\n    chooseStation(selectedStation) {\n        let station = selectedStation.split('/').pop();\n\n        if (!station) {\n            return Ember.RSVP.resolve();\n        }\n        let uri = this.get('application').pcUri(['api/v2/users/stations/me/associatedstation', station]);\n        const successHandler = data => {\n            this.fetchStation(station);\n            return data;\n        };\n        const errorHandler = jqXHR => {\n            Ember.onerror(jqXHR);\n            let message = Ember.get(jqXHR, 'responseJSON.message') || '';\n            message = this.get('intl').lookup('notification.purecloud.phoneFail') + message;\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        };\n        return this.get('ajax').put(uri).then(successHandler, errorHandler);\n    },\n\n    _updateStationEvent(eventBody, json) {\n        this.get('_debouncedUpdateStationEvent').cancelAll();\n        this.get('_debouncedUpdateStationEvent').perform(eventBody, json);\n    },\n\n    _debouncedUpdateStationEvent: task(function* (eventBody, json) {\n        yield timeout(this.get('updateStationEventTimeout'));\n        this._handleUpdateStation(eventBody, json);\n    }),\n\n    _handleUpdateStation(eventBody, json) {\n        const metadata = Ember.get(json, 'metadata');\n        if (!metadata) {\n            return;\n        }\n        const stationId = this.get('station') ? this.get('station.id') : null;\n        const newStation = Ember.get(eventBody, 'associatedStation');\n        const newStationId = newStation && newStation.id ? newStation.id : null;\n        const currentStationIsNewStation = !!(stationId && newStationId && stationId === newStationId);\n        const action = Ember.get(metadata, 'action') ? metadata.action.toLowerCase() : false;\n\n        if (action === 'associated' && currentStationIsNewStation) {\n            return;\n        } else if (action === 'disassociated') {\n            this.set('station', null);\n        } else if (action === 'associated') {\n            this.fetchStation(eventBody.stationUri || newStationId);\n        }\n    },\n\n    _testIsStationWebrtc: false // HACK: for testing\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    addIndicatorForPromise: function (promise, target) {\n        Ember.assert('You must specify a valid target selector', target && typeof target === 'string');\n\n        if (promise && promise.then) {\n            var view = Ember.$('<div class=\"loading-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>');\n            Ember.$(target).append(view);\n\n            promise.then(function () {\n                view.remove();\n            });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst PurecloudModelMixin = Ember.Mixin.create({});\n\nexport default PurecloudModelMixin;\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\nconst { alias } = computed;\n\nconst FEATURE_RELATE_ACCESS = 'permissions.hasExternalContactsViewContactAccess';\n\nconst FEATURE_CUSTOM_FIELDS = 'session.features.relateDynamicSchema';\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    hasRelateAccess: computed.alias(FEATURE_RELATE_ACCESS),\n\n    canShowCustomFields: alias(FEATURE_CUSTOM_FIELDS),\n\n    contactRoute: computed('isRelateEngineAvailable', function () {\n        return 'relate.contacts-ui-redirect'; // todo: clean up with redirects\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport ajax from 'ember-ajax';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst SEARCH_ALL = '*';\n\nconst TAGS_ENDPOINT = '/directory/api/v2/tags/skills.skills,skills.certs,general.department,general.title';\n\nconst CANCELLATION_ERROR = 'Request Cancelled';\n\nfunction performSearch() {\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n\n    var value;\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = SEARCH_ALL;\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    var deferred = this.get('pendingSearchRequest');\n    if (deferred) {\n        deferred.reject(CANCELLATION_ERROR);\n    }\n    deferred = Ember.RSVP.defer();\n\n    this.set('pendingSearchRequest', deferred);\n\n    var requestArray = [];\n\n    var queueSearchRequest;\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    if (this.get('searchQueueOnly') && queuePermission) {\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        const myQueuesOnly = this.get('myQueuesOnly');\n\n        if (divisionAgnostic) {\n            queueSearchData.name = `**${value}**`;\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        if (myQueuesOnly) {\n            queueSearchData.myQueuesOnly = myQueuesOnly;\n        }\n\n        queueSearchRequest = this.get('store').query('queue', queueSearchData);\n        requestArray.push(queueSearchRequest);\n    } else if (this.get('searchRelate') && this.get('searchRelateOnly') && relatePermission) {\n        queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            originator: this.get('componentClassName'),\n            expandField: 'externalOrganization'\n        });\n        requestArray.push(queueSearchRequest);\n    } else {\n        if (this.get('searchQueueOnly')) {\n            return;\n        }\n        const query = [\n            {\n                value: value,\n                type: 'QUERY_STRING'\n            }\n        ];\n        // should be the ucIntegrationKey, will be null unless set\n        const searchIntegrationKey = this.get('searchIntegrationKey');\n        if (searchIntegrationKey) {\n            query.push({\n                type: 'EXACT',\n                fields: ['integration'],\n                value: searchIntegrationKey\n            });\n        }\n\n        let request = null;\n\n        const userRequest = this.get('store').query('public-api-user', {\n            query,\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        request = userRequest.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        requestArray.push(request);\n\n        if (this.get('searchQueue') && queuePermission) {\n            let queueSearchQuery;\n            if (this.get('divisionAgnostic')) {\n                queueSearchQuery = {\n                    name: value,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit'),\n                    divisionAgnostic: true\n                };\n            } else {\n                queueSearchQuery = {\n                    name: `**${value}**`,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit')\n                };\n            }\n            queueSearchRequest = this.get('store').query('queue', queueSearchQuery);\n            requestArray.push(queueSearchRequest);\n        }\n\n        if (this.get('searchRelate') && relatePermission) {\n            queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n                searchTerm: `${value}`,\n                pageSize: this.get('searchLimit'),\n                originator: this.get('componentClassName'),\n                pageNumber: 1,\n                expandField: 'externalOrganization,division'\n            });\n            requestArray.push(queueSearchRequest);\n        }\n    }\n\n    Ember.RSVP.allSettled(requestArray).then(promises => {\n        const results = [];\n        promises.forEach(promise => {\n            if (promise.state === 'rejected') {\n                Ember.Logger.warn('Failed to load search request', { reason: promise.reason });\n            } else {\n                results.push(promise.value);\n            }\n        });\n        if (results.length === 0) {\n            deferred.reject(new Error('All search requests failed'));\n        } else {\n            deferred.resolve(results);\n        }\n    });\n\n    deferred.promise\n        .then(entities => {\n            var results = _.map(entities, function (entity) {\n                if (!Array.isArray(entity)) {\n                    return entity.get('content').map(x => x.getRecord());\n                } else {\n                    return entity;\n                }\n            });\n\n            if (entities.length) {\n                this.set('searchMeta', _.head(entities).meta);\n            }\n            entities = _.flatten(results);\n            const people = entities.filterBy('type', 'person');\n            if (people.length > 0) {\n                this.get('presenceSubscription').autoSubscribe(people, this, 'search');\n            }\n            this.set('searchResults', entities);\n\n            if (_.isEmpty(entities)) {\n                this.notifyPropertyChange('searchResults');\n            }\n\n            return entities;\n        })\n        .finally(() => {\n            this.set('pendingSearchRequest', null);\n        });\n\n    this.set('currentSearchRequest', DS.PromiseArray.create({ promise: deferred.promise }));\n}\n\nfunction performTagSearch() {\n    var request = tagSearchRequest(this.get('tagSearchQuery'));\n\n    request.then(results => {\n        this.set('tagSearchResults', results);\n        return results;\n    });\n\n    this.set('tagSearchRequest', DS.PromiseObject.create({ promise: request }));\n}\n\nfunction tagSearchRequest(query) {\n    return new Ember.RSVP.Promise(function (resolve, reject) {\n        ajax(TAGS_ENDPOINT, {\n            type: 'GET',\n            data: { q: query }\n        }).then(function (data) {\n            var results = data.res;\n\n            if (results.length !== 0) {\n                _.each(results, function (result) {\n                    var tag = result.field.substring(result.field.indexOf('.') + 1);\n                    result.tag = tag;\n                });\n            }\n\n            resolve(results);\n        }, reject);\n    }, 'SearchMixin#tagSearchRequest');\n}\n\nexport const SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    searchIntegrationKey: null,\n\n    searchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        Ember.run.debounce(this, performSearch, 200);\n    })\n});\n\nexport const ThenableSearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    store: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    performSearch(searchQuery, entityFilter) {\n        this.set('searchQuery', searchQuery);\n        this.set('entityFilter', entityFilter);\n        performSearch.apply(this);\n        return this.get('currentSearchRequest');\n    }\n});\n\nexport const TagSearchMixin = Ember.Mixin.create({\n    tagSearchQuery: null,\n    tagSearchRequest: null,\n\n    tagSearchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performTagSearch: Ember.observer('tagSearchQuery', function () {\n        Ember.run.debounce(this, performTagSearch, 150);\n    })\n});\n\n// TODO: Remove this after toggle is flipped\nexport const HelpMixin = Ember.Mixin.create({\n    searchQuery: null,\n    searchResults: null,\n    request: null,\n\n    _performHelpSearch() {\n        const searchQuery = this.get('searchQuery');\n\n        if (searchQuery) {\n            const request = new Ember.RSVP.Promise((resolve, reject) => {\n                Ember.$.ajax({\n                    type: 'GET',\n                    cache: false,\n                    url: 'https://help.genesys.cloud/purecloud-search-api.php',\n                    dataType: 'json',\n                    data: {\n                        q: searchQuery\n                    },\n                    success: data => {\n                        const results = data ? Ember.get(data, 'results') : null;\n                        _.forEach(results, function (result) {\n                            if (result.excerpt) {\n                                result.excerpt = result.excerpt\n                                    .replace(/(<([^>]+)>)/gi, '')\n                                    .replace(/&quot;/g, '\"')\n                                    .replace(/&#39;/g, \"'\")\n                                    .replace(/&lt;/g, '<')\n                                    .replace(/&gt;/g, '>')\n                                    .replace(/&amp;/g, '&')\n                                    .replace(/&#8217;/g, \"'\");\n                            }\n                        });\n                        this.set('searchResults', results);\n                        resolve(data);\n                    },\n                    error: function (error) {\n                        Ember.Logger.log('Error accessing resourceCenter');\n                        reject(error);\n                    }\n                });\n            });\n\n            this.set('request', DS.PromiseObject.create({ promise: request }));\n        } else {\n            this.set('searchResults', null);\n        }\n    },\n\n    performHelpSearch: Ember.observer('searchQuery', function () {\n        Ember.run.debounce(this, this._performHelpSearch, 150);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst TIMEOUT = isTesting ? 0 : 300;\n\nconst PrepareResults = (context, results) => {\n    let parsedResults;\n\n    if (!Array.isArray(results)) {\n        parsedResults = results.get('content');\n        parsedResults = parsedResults.map(x => x.getRecord());\n    } else {\n        parsedResults = results;\n    }\n\n    if (parsedResults.length < 0 && parsedResults === undefined && parsedResults === null) {\n        context.set('retrySearch', true);\n        return;\n    }\n\n    const entities = _.flatten(parsedResults);\n    const people = entities.filterBy('type', 'person');\n\n    if (people.length > 0) {\n        context.get('presenceSubscription').autoSubscribe(people, context, 'search');\n    }\n\n    return entities;\n};\n\nconst performSearch = function () {\n    let value;\n\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = '*';\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    const userPending = this.get('userPending');\n    const queuePending = this.get('queuePending');\n    const relatePending = this.get('relatePending');\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    const searchRelate = this.get('searchRelate');\n    const searchQueues = this.get('searchQueue');\n    const searchUsers = this.get('searchUser');\n    let userRequests = null;\n\n    if (searchUsers && !userPending) {\n        this.set('userPending', true);\n\n        const request = this.get('store').query('public-api-user', {\n            query: [\n                {\n                    value: value,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        userRequests = request.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        userRequests.catch(() => this.set('userSearchFailed', true));\n        userRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('userResults', entities);\n        });\n        userRequests.finally(() => {\n            this.set('userPending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchQueues && queuePermission && !queuePending) {\n        this.set('queuePending', true);\n\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        if (divisionAgnostic) {\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        const queueRequests = this.get('store').query('queue', queueSearchData);\n\n        queueRequests.catch(() => this.set('queueSearchFailed', true));\n        queueRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('queueResults', entities);\n        });\n        queueRequests.finally(() => {\n            this.set('queuePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchRelate && relatePermission && !relatePending) {\n        this.set('relatePending', true);\n        const relateRequests = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            expandField: 'externalOrganization,division',\n            originator: this.get('componentClassName')\n        });\n\n        relateRequests.catch(() => this.set('relateSearchFailed', true));\n        relateRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('relateResults', entities);\n        });\n        relateRequests.finally(() => {\n            this.set('relatePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n};\n\nconst SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    searchOnEmpty: false,\n\n    retrySearch: false,\n\n    searchUser: false,\n    searchRelate: false,\n    searchQueue: false,\n\n    userSearchFailed: false,\n    queueSearchFailed: false,\n    relateSearchFailed: false,\n\n    searchLimit: 25,\n    userPending: false,\n    queuePending: false,\n    relatePending: false,\n\n    userResults: null,\n    queueResults: null,\n    relateResults: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('userResults', []);\n        this.set('relateResults', []);\n        this.set('queueResults', []);\n    },\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        this.debouncedSearch();\n    }),\n\n    performReload: Ember.observer('retrySearch', function () {\n        if (this.get('retrySearch')) {\n            this.set('userResults', []);\n            this.set('relateResults', []);\n            this.set('queueResults', []);\n            this.debouncedSearch();\n        }\n    }),\n\n    debouncedSearch: _.debounce(performSearch, TIMEOUT, { leading: false, trailing: true })\n});\n\nexport default SearchMixin;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst presenceToRadixMapping = {\n    available: 1,\n    busy: 2,\n    away: 3,\n    idle: 3,\n    offline: 4,\n    on_queue: 5,\n    out_of_office: 6\n};\n\nconst radixMapping = function (user) {\n    if (user) {\n        return presenceToRadixMapping[user.get('presence')];\n    } else {\n        return null;\n    }\n};\n\nconst userName = function (user) {\n    return user.get('name') || '';\n};\n\nconst mapUserToSortable = function (user) {\n    return `${radixMapping(user)}${userName(user)}`;\n};\n\nconst mapRoomToSortable = function (room) {\n    let radix = radixMapping(room.get('oneToOneTarget'));\n    let name = room.get('subject');\n    return `${radix}${name}`;\n};\n\nconst SortChatUsersMixin = Ember.Mixin.create({\n    sortChatUsers(usersList) {\n        return _.sortBy(usersList, mapUserToSortable);\n    },\n\n    sortOneToOneRooms(rooms) {\n        return _.sortBy(rooms, mapRoomToSortable);\n    }\n});\n\nexport default SortChatUsersMixin;\n","define(\"connections-ui/mixins/style-namespacing-extras\", [\"exports\", \"ember-component-css/mixins/style-namespacing-extras\"], function (_exports, _styleNamespacingExtras) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _styleNamespacingExtras.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    beforeModel: function () {\n        // Skip call to super which is the authenticated-route-mixin\n        return null;\n    }\n});\n","import Ember from 'ember';\n\n// Viewport code adapted from:\n// https://emberway.io/ember-js-detecting-if-a-dom-element-is-in-the-viewport-eafcc77a6f86\n\nconst { computed } = Ember;\n\nconst REFRESH_RATE = 200;\n\nfunction getScrollParent(comp) {\n    if (!comp || !comp.$) {\n        return null;\n    }\n    try {\n        return [...comp.$().parents()].find(el => {\n            const $el = Ember.$(el);\n            return /(auto|scroll)/.test($el.css('overflow') + $el.css('overflow-y') + $el.css('overflow-x'));\n        });\n    } catch (err) {\n        return null;\n    }\n}\n\nexport default Ember.Mixin.create({\n    enableViewport: true,\n\n    enteredViewport: computed('boundingClientRect', 'windowHeight', function () {\n        const rect = this.get('boundingClientRect');\n        const windowHeight = this.get('windowHeight');\n        const windowWidth = this.get('windowWidth');\n        if (!rect) {\n            return false;\n        }\n\n        return rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth;\n    }),\n\n    exitedViewport: computed.not('enteredViewport'),\n\n    /**\n     * Implementers of these hooks are responsible for setting up their own run loop for\n     * scheduling, since this mixin is using request animation frame to handle events.\n     **/\n    didEnterViewport() {},\n    didExitViewport() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.get('enableViewport')) {\n            Ember.run.scheduleOnce('afterRender', this, '_setup');\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._teardown();\n    },\n\n    _setup() {\n        Ember.run(() => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n\n            this._bindEvents();\n            this._updateBoundingClientRect();\n            this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n            this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n        });\n    },\n\n    _teardown() {\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const scrollParentRef = Ember.$(scrollParent);\n        if (scrollParentRef) {\n            scrollParentRef.off(`.${this.elementId}`);\n        }\n\n        const windowRef = Ember.$(window);\n        if (windowRef) {\n            windowRef.off(`.${this.elementId}`);\n        }\n    },\n\n    _bindEvents() {\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const $scrollParent = Ember.$(scrollParent);\n        const resizeHandler = this.resizeHandler.bind(this);\n        $scrollParent.on(`scroll.${this.elementId}`, this.scrollHandler.bind(this));\n        Ember.$(window).on(`resize.${this.elementId}`, resizeHandler);\n    },\n\n    _updateBoundingClientRect() {\n        const el = this.element;\n        if (el && el.getBoundingClientRect) {\n            this.set('boundingClientRect', el.getBoundingClientRect());\n        }\n    },\n\n    _updateWindowSize() {\n        this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n        this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n    },\n\n    scrollHandler() {\n        Ember.run.debounce(this, '_scrollHandler', REFRESH_RATE, false);\n    },\n\n    _scrollHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateBoundingClientRect.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateBoundingClientRect', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    },\n\n    resizeHandler() {\n        Ember.run.debounce(this, '_resizeHandler', REFRESH_RATE, false);\n    },\n\n    _resizeHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateWindowSize.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateWindowSize', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    }\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    interaction: computed.reads('webrtc.interaction'),\n    webrtc: inject.service(),\n    streaming: inject.service(),\n    intl: computed.reads('webrtc.intl'),\n    phone: inject.service(),\n    mediaProviders: inject.service(),\n    sessionService: inject.service('session'),\n\n    videoTooltipTitle: Ember.computed('videoTooltipKey', 'haveNonPurecloudMediaProvider', function () {\n        let key = this.get('videoTooltipKey');\n        if (this.get('haveNonPurecloudMediaProvider')) {\n            key = 'ewc.open';\n        }\n\n        const params = {};\n\n        if (key === 'ewc.userOffline' || key === 'ewc.userBusy') {\n            params.name = this.get('webrtcTarget.oneToOneTarget.name');\n        }\n\n        if (this._fixTooltips) {\n            Ember.run.scheduleOnce('afterRender', this, this._fixTooltips);\n        }\n        return this.get('intl').t(key, params);\n    }),\n\n    videoTooltipTitleSr: Ember.computed('videoTooltipTitle', 'videoTooltipeKey', 'activeRoom.videoPeers', function () {\n        let key = this.get('videoTooltipKey');\n\n        const numberOfParticipants = this.get('activeRoom.videoPeers');\n        if (key == 'ewc.open' && numberOfParticipants > 0) {\n            key = 'ewc.openSr';\n            return this.get('intl').t(key, { number: numberOfParticipants });\n        }\n\n        return this.get('videoTooltipTitle');\n    }),\n\n    oneToOneChat: computed('webrtcTarget.oneToOneTarget', function () {\n        const webrtcTarget = this.get('webrtcTarget');\n        return webrtcTarget && webrtcTarget.isOneToOneRoom();\n    }),\n\n    isFirefox: BrowserUtils.isFirefox,\n\n    webrtcTarget: computed.or('activeRoom', 'entity.oneToOneRoom'),\n\n    webrtcPhoneWithIssues: Ember.computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    videoMediaProviders: Ember.computed('useMediaProviders', 'sessionService', 'mediaProviders.enabled', function () {\n        if (!this.get('useMediaProviders') || !this.get('mediaProviders.enabled')) {\n            return [];\n        }\n\n        return this.get('mediaProviders').getVideoProviders(this.get('sessionService.user'), this.get('webrtcTarget'));\n    }),\n\n    haveNonPurecloudMediaProvider: Ember.computed('videoMediaProviders.[]', function () {\n        return !!this.get('videoMediaProviders').find(provider => provider.get('id') !== 'purecloud');\n    }),\n\n    videoTooltipKey: computed(\n        'webrtc.{videoCallCapable,activeRoom.showingVideo,activeBridge,canConference,webrtcAudioCallIssueKey}',\n        'webrtcTarget.{showingVideo,videoRoomFull}',\n        'interaction.activeRealtimeInteractions.[]',\n        'isOneToOneOfflineOrBusy',\n        'isFirefox',\n        'mediaProviders.{enabled,usingVideoProvider}',\n        'useMediaProviders',\n        function () {\n            const openTooltip = 'ewc.open';\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return this.get('webrtc.webrtcAudioCallIssueKey');\n            }\n            if (!this.get('webrtc.videoCallCapable') && !this.get('useMediaProviders')) {\n                return 'ewc.notCapable';\n            }\n            if (this.get('interaction.activeRealtimeInteractions.length')) {\n                return 'ewc.activeInteractions';\n            }\n            if (\n                this.get('webrtcTarget.showingVideo') ||\n                this.get('webrtc.activeRoom.showingVideo') ||\n                this.get('mediaProviders.usingVideoProvider')\n            ) {\n                if (this.get('webrtcTarget.jid') === this.get('webrtc.activeRoom.jid')) {\n                    return 'ewc.openActiveCall';\n                }\n                return 'ewc.anotherActiveCall';\n            }\n            if (this.get('webrtcTarget.videoRoomFull')) {\n                return 'ewc.atCapacity';\n            }\n            if (this.get('webrtcTarget.oneToOneTarget')) {\n                if (this.get('mediaProviders.enabled') && this.get('useMediaProviders')) {\n                    return openTooltip;\n                }\n                if (!this.get('isOneToOneOfflineOrBusy')) {\n                    return openTooltip;\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isOffline')) {\n                    return 'ewc.userOffline';\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isBusy')) {\n                    return 'ewc.userBusy';\n                }\n            }\n            if (!this.get('webrtc.canConference') && !this.get('useMediaProviders')) {\n                return 'ewc.browserNotSupported';\n            }\n            return openTooltip;\n        }\n    ),\n\n    isOneToOneOfflineOrBusy: computed.and(\n        'oneToOneChat',\n        'webrtcTarget',\n        'webrtcTarget.oneToOneTarget.isOfflineOrBusy'\n    ),\n\n    isVideoButtonEnabled: computed(\n        'videoTooltipKey',\n        'webrtc.webrtcAudioCallIssueKey',\n        'haveNonPurecloudMediaProvider',\n        'useMediaProviders',\n        function () {\n            if (this.get('useMediaProviders') && this.get('haveNonPurecloudMediaProvider')) {\n                return true;\n            }\n\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return false;\n            }\n\n            return this.get('videoTooltipKey') === 'ewc.open' || this.get('videoTooltipKey') === 'ewc.openActiveCall';\n        }\n    ),\n\n    videoButtonEnabled: computed('isVideoButtonEnabled', function () {\n        return this.get('isVideoButtonEnabled') ? 'enabled' : 'disabled';\n    })\n});\n","define(\"connections-ui/models/annotation\", [\"exports\", \"ember-purecloud-components/models/annotation\"], function (_exports, _annotation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _annotation.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { typeOf, isPresent, copy, computed, assign } = Ember;\n\nexport const APPS_API_PROTOCOL = 'purecloud-client-apps';\nconst PROTOCOL_FIELD_NAME = 'protocol';\n\n// ----- Inbound Message Properties\nconst PROTOCOL_AGENT_FIELD_NAME = 'protocolAgentName';\nconst PROTOCOL_AGENT_VERSION_FIELD_NAME = 'protocolAgentVersion';\nconst API_ACTION_FIELD_NAME = 'action';\n\n// ----- Outbound Message Properties\nconst OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME = 'purecloudEventType';\n\n/**\n * Model representing an inbound API call from the Apps SDK or from an internal app/frame utilizing direct\n * postMessage calls.\n */\nconst AppApiCall = Ember.Object.extend({\n    internalPcCall: false,\n    srcApp: null,\n    srcAppInstance: null,\n    protocol: null,\n    protocolAgentName: null,\n    protocolAgentVersion: null,\n    action: null,\n    actionDetails: null,\n\n    appId: computed('srcApp', 'srcAppInstance', function () {\n        let result = this.get('srcAppInstance.appId');\n\n        if (!result) {\n            result = this.get('srcApp.id');\n        }\n\n        return result || null;\n    })\n});\n\n/**\n * Parses and validates the provided messagePayload into an AppApiCall instance.\n *\n * actionDetails will only contain properties which are applicable to the specific api call.  i.e.\n * metadata props like the action, protocol, protocol agent, etc. will only exist in their\n * specific instance variables.\n *\n * @param {object} messagePayload - The payload to parse; fails if not an object\n * @param {boolean} requireProtocol - If the validation should fail on protocol fields\n *\n * @returns an AppApiCall if the message is valid\n * @throws Error if the payload structure is invalid;\n *  the protocol is missing/incorrect (in strict mode);\n *  the action is missin/incorrect\n */\nexport function parseMessage(messagePayload, requireProtocol) {\n    let result = null;\n\n    if (typeOf(messagePayload) !== 'object') {\n        throw new Error('invalidPayload');\n    } else {\n        let protocol = messagePayload[PROTOCOL_FIELD_NAME];\n        if (requireProtocol) {\n            if (\n                !Object.prototype.hasOwnProperty.call(messagePayload, PROTOCOL_FIELD_NAME) ||\n                typeOf(protocol) !== 'string' ||\n                !isPresent(protocol)\n            ) {\n                throw new Error('missingProtocol');\n            }\n\n            if (protocol !== APPS_API_PROTOCOL) {\n                throw new Error('invalidAppsProtocol');\n            }\n        }\n\n        let action = messagePayload[API_ACTION_FIELD_NAME];\n        if (\n            !Object.prototype.hasOwnProperty.call(messagePayload, API_ACTION_FIELD_NAME) ||\n            typeOf(action) !== 'string' ||\n            !isPresent(action)\n        ) {\n            throw new Error('missingAction');\n        }\n\n        let actionDetails = copy(messagePayload, true);\n\n        // Prune metadata and control fields from the actionDetails\n        [\n            PROTOCOL_FIELD_NAME,\n            PROTOCOL_AGENT_FIELD_NAME,\n            PROTOCOL_AGENT_VERSION_FIELD_NAME,\n            API_ACTION_FIELD_NAME\n        ].forEach(fieldToPrune => {\n            delete actionDetails[fieldToPrune];\n        });\n\n        result = AppApiCall.create({\n            protocol,\n            protocolAgentName: messagePayload[PROTOCOL_AGENT_FIELD_NAME],\n            protocolAgentVersion: messagePayload[PROTOCOL_AGENT_VERSION_FIELD_NAME],\n            action,\n            actionDetails\n        });\n    }\n\n    return result;\n}\n\n/**\n * Constructs the full payload of a message to be sent to an Embedded Client App.\n * Metadata fields will be appended to any provided custom payload to create the normalized\n * event structure.\n *\n * @param {string} eventType - The eventType of this message.\n * @param {object|null|undefined} [customPayload={}] - Additional payload to send to the the app\n *\n * @throws Error if eventType is not a non-blank string\n * @throws Error if the customPayload is not null, undefined, or an object\n * @throws Error if any of the reserved, metadata keys are provided in the customPayload\n *\n * @returns A normalized payload with all necessary metadata suitable to dispatch to an Embedded Client App\n */\nexport function buildOutboundMsgPayload(eventType, customPayload = {}) {\n    if (typeOf(eventType) !== 'string' || eventType.trim().length === 0) {\n        throw new Error('Non-empty string must be provided as the eventType');\n    }\n\n    let payloadType = typeOf(customPayload);\n    if (payloadType !== 'null' && payloadType !== 'object') {\n        throw new Error('Payload must be null, undefined, or an object');\n    }\n\n    // Ensure no metadata fields are in the provided customPayload\n    [PROTOCOL_FIELD_NAME, OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME].forEach(currMetadataFieldName => {\n        if (customPayload && Object.prototype.hasOwnProperty.call(customPayload, currMetadataFieldName)) {\n            throw new Error(`Payload contains reserved metadata prop '${currMetadataFieldName}'`);\n        }\n    });\n\n    return assign(\n        {\n            [PROTOCOL_FIELD_NAME]: APPS_API_PROTOCOL,\n            [OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME]: eventType\n        },\n        customPayload || {}\n    );\n}\n\nexport default AppApiCall;\n","import config from '../config/environment';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport InternallyHostedApp from './internally-hosted-app';\n\nconst { Evented, computed, run, get } = Ember;\n\nlet AppState = Ember.Object.extend({\n    name: null,\n    ordinal: 0,\n    compareTo(anotherState) {\n        if (!anotherState) {\n            return 1;\n        } else if (Object.getPrototypeOf(anotherState) !== Object.getPrototypeOf(this)) {\n            let errorMsg = 'Cannot compare AppState another object type';\n            Ember.Logger.error(errorMsg);\n            throw new Error(errorMsg);\n        }\n\n        return this.get('ordinal') - anotherState.get('ordinal');\n    }\n});\n\n/**\n * List of lifecycle-oredered, AppState instances\n *\n * Callers can use the @see AppState#copareTo method to test for state order\n */\nexport const APP_STATES = {\n    LOADING: AppState.create({\n        ordinal: 100\n    }),\n    BOOTSTRAPPING: AppState.create({\n        ordinal: 200\n    }),\n    RUNNING: AppState.create({\n        ordinal: 300\n    }),\n    STOPPING: AppState.create({\n        ordinal: 400\n    }),\n    STOPPED: AppState.create({\n        ordinal: 500\n    })\n};\n\n/**\n * The event name (internal eventing) that will be fired when the\n * lifecycle is changing (opt-in).  The primary consumer of this event will\n * be the app-instance component for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOK_EVENT = 'appLifecycleHook';\n\n/**\n * The event payload values for @see {LIFECYCLE_HOOK_EVENT} that will\n * notify of a new lifecycle state (opt-in).  Again, this will typically be used\n * by the app-instance componet for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOKS = {\n    BOOTSTRAP: 'bootstrap',\n    FOCUS: 'focus',\n    BLUR: 'blur',\n    STOP: 'stop'\n};\n\n/**\n * The callback types utilized by the Apps SDK (or app devs directly) as the\n * postMessage payload confirming the succes of app-side work within a lifecycle\n * phase.\n */\nexport const APP_LIFECYCLE_CALLBACKS = {\n    BOOTSTRAPPED: 'bootstrapped',\n    STOPPED: 'stopped'\n};\n\n/**\n * The list of problems which can affect this app-instance\n */\nexport const APP_PROBLEMS = {\n    APP_UPDATED: 'updated',\n    APP_DELETED: 'deleted',\n    LICENSE_UNAVAILABLE: 'licenseUnavailable'\n};\n\n/*\n * Internal, configuration details of each app lifecycle state which will be ordered by ordinal.\n *\n * Heads up, this config is not validated internally.  So you break it, you bought it.\n */\nconst STATE_CONFIGS = {\n    [APP_STATES.LOADING]: {\n        lifecycleDetails: {\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.loading')\n        }\n    },\n    [APP_STATES.BOOTSTRAPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.bootstrap',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.bootstrapping'),\n            broadcastHookName: LIFECYCLE_HOOKS.BOOTSTRAP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.BOOTSTRAPPED\n        }\n    },\n    [APP_STATES.RUNNING]: {},\n    [APP_STATES.STOPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.stop',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.stopping'),\n            broadcastHookName: LIFECYCLE_HOOKS.STOP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.STOPPED\n        }\n    },\n    [APP_STATES.STOPPED]: {}\n};\n\n// Ordered list of lifecycle states\nconst LIFECYCLE_ORDERED_APP_STATES = Object.keys(APP_STATES)\n    .map(currStateName => APP_STATES[currStateName])\n    .sort((state1, state2) => state1.compareTo(state2));\n\n/**\n * An app-instance manages the runtime state of a particular instance of an app.\n * It contains the current lifecyle state, tracks transitional states, stores\n * any problems that might be affecting this instance, provides an api to\n * manipulate the lifecycle, and broadcasts events to integrate\n * with the rendering portion of the lifecycle.\n *\n * Important Notes:\n * app-instances are managed by an app-pool and must also be rendered with\n * an app-pool (transitively: app-instance and app-embed) component to ensure the\n * lifecycle correctly accounts for rendering and callbacks.\n *\n * Problems can occur at any state and may or may not exclusively affect state.  Therefore,\n * there is no app-state \"PROBLEM\".  Rather, users should consult the problem attribute\n * in addition to state.\n *\n * Instance Lifecycle States:\n *  <ol>\n *      <li>LOADING - The app's iframe is loading</li>\n *      <li>BOOTSTRAPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'bootstrap' hook (event fired)</li>\n *              <li>Awaits 'bootstrapped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>RUNNING\n *          <ul>\n *              <li>'blur' hook (event fired) on app blur (Opt-in)</li>\n *              <li>'focus' hook (event fired) on subsequent app focus (Opt-in)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'stop' hook (event fired) after stop requested</li>\n *              <li>Awaits 'stopped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPED - The app has shut down and the instance can safely be removed from PureCloud</li>\n *  </ol>\n *\n * Lifecycle Hooks (Opt In):\n * If an app is so configured, this class will broadcast lifecyle events out.  The\n * primary consumer of these events will be the app-instance component who will re-broadcast\n * the event onto the app's iframe.\n *\n * <ul>\n *   <li>bootstrap</li>\n *   <li>focus</li>\n *   <li>blur</li>\n *   <li>stop</li>\n * </ul>\n *\n * Lifecycle Callbacks:\n * App developers can acknowledge completion of certain app-side work via callbacks.\n * Callbacks are opt-in and will eventually time out to prevent an app from locking up\n * <ul>\n *   <li>bootstrapped</li>\n *   <li>stopped</li>\n * </ul>\n */\nconst AppInstance = Ember.Object.extend(Evented, {\n    instanceId: null,\n    app: null,\n\n    currState: null,\n    _currStateStartTimestamp: null,\n    problem: {\n        name: null,\n        details: null\n    },\n\n    lastUserAccessTimestamp: null,\n\n    _stateTimeoutTimer: null,\n\n    // sets a badging count for the app instance\n    attentionCount: 0,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('instanceId', Ember.guidFor(this));\n\n        this.set('problem', {\n            name: null,\n            details: null\n        });\n\n        // Attach to beforeunload event to get instrumentation on app shutdown\n        // Note: beforeunload listeners should not be attached via jquery\n        if (window && window.addEventListener) {\n            let reportStoppedInteraction = () => {\n                Ember.run(() => {\n                    // Inactive app integrations will have already been reported\n                    if (this._inAppInteraction()) {\n                        this._appendAppInteraction('windowUnload', true);\n                    }\n                });\n            };\n            this.set('reportStoppedInteraction', reportStoppedInteraction);\n            window.addEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let timeout = this.get('_stateTimeoutTimer');\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let reportStoppedInteraction = this.get('reportStoppedInteraction');\n        if (reportStoppedInteraction) {\n            window.removeEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    appId: computed('app.id', function () {\n        let appId = this.get('app.id');\n\n        return appId || null;\n    }),\n\n    start() {\n        this._startAppInteraction('start');\n        this._advanceState(APP_STATES.LOADING);\n        this.set('lastUserAccessTimestamp', Date.now());\n    },\n\n    loaded() {\n        this._advanceState(APP_STATES.BOOTSTRAPPING);\n    },\n\n    bootstrapped() {\n        this._advanceState(APP_STATES.RUNNING);\n    },\n\n    focus() {\n        this._startAppInteraction('focus');\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.focus')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.FOCUS);\n        }\n    },\n\n    blur() {\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.blur')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.BLUR);\n        }\n\n        this._appendAppInteraction('blur', true);\n    },\n\n    stop() {\n        this._advanceState(APP_STATES.STOPPING);\n    },\n\n    stopped() {\n        this._advanceState(APP_STATES.STOPPED);\n    },\n\n    setProblem(name, details = null) {\n        this.set('problem.name', name);\n        this.set('problem.details', details);\n        this.notifyPropertyChange('problem');\n    },\n\n    _advanceState(requestedState) {\n        let currState = this.get('currState');\n        if (!requestedState || requestedState.compareTo(currState) <= 0) {\n            // Invalid next state\n            return;\n        }\n\n        // if monitoring ... cancel\n        let timeout = this.get('_stateTimeoutTimer');\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let requestedStateConfig = STATE_CONFIGS[requestedState];\n        let nextState = this._getNextState(requestedState);\n\n        if (\n            requestedStateConfig.lifecycleDetails &&\n            requestedStateConfig.lifecycleDetails.stateOptInPropName &&\n            !this.get(`app.lifecycle.${requestedStateConfig.lifecycleDetails.stateOptInPropName}`) &&\n            nextState\n        ) {\n            // App doesn't need this transitional state ... move to the next\n\n            this._advanceState(nextState);\n            return;\n        }\n\n        this.set('currState', requestedState);\n        this.set('_currStateStartTimestamp', Date.now());\n\n        if (this._inAppInteraction()) {\n            this._appendAppInteraction(\n                this._convertStateToLifecycleEvent(requestedState),\n                requestedState === APP_STATES.STOPPED\n            );\n        } else if (requestedState === APP_STATES.STOPPED) {\n            // Because an app will likely be hidden when stopped, there is no\n            // active interaction; however, this event represents a user dismissing\n            // an app (updated/deleted) or a pool eviction; so it's important to log\n            this._logInactiveAppStopped();\n        }\n\n        if (requestedStateConfig.lifecycleDetails) {\n            if (requestedStateConfig.lifecycleDetails.broadcastHookName) {\n                this._triggerLifecycleHookEvent(requestedStateConfig.lifecycleDetails.broadcastHookName);\n            }\n\n            if (requestedStateConfig.lifecycleDetails.maxDurationMillis) {\n                // Start transitional state timeout\n                this.set(\n                    '_stateTimeoutTimer',\n                    run.later(\n                        this,\n                        '_monitorTransitionalState',\n                        requestedStateConfig.lifecycleDetails.maxDurationMillis + 1\n                    )\n                );\n            }\n        }\n    },\n\n    _triggerLifecycleHookEvent(hook) {\n        this.trigger(LIFECYCLE_HOOK_EVENT, {\n            hook\n        });\n    },\n\n    _monitorTransitionalState() {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        let currState = this.get('currState');\n        let currStateConfig = STATE_CONFIGS[currState];\n        let nextState = this._getNextState(currState);\n        let currStateEntryTimestamp = this.get('_currStateStartTimestamp');\n        let maxDuration = currStateConfig ? get(currStateConfig, 'lifecycleDetails.maxDurationMillis') : undefined;\n\n        if (currStateConfig && currStateEntryTimestamp !== null && maxDuration) {\n            let timeInState = Date.now() - currStateEntryTimestamp;\n\n            if (timeInState < maxDuration) {\n                // Should not occur, but will re-kick the timer to wait until the state has expired\n                this.set('_stateTimeoutTimer', run.later(this, '_monitorTransitionalState', 100));\n            } else if (nextState) {\n                // The transitional state has expired and can be moved to the next state\n                this._advanceState(nextState);\n            }\n        }\n    },\n\n    _getNextState(currState) {\n        let result = null;\n\n        let currStateIndex = _.findIndex(LIFECYCLE_ORDERED_APP_STATES, currState);\n        if (currStateIndex >= 0 && LIFECYCLE_ORDERED_APP_STATES.length > currStateIndex + 1) {\n            result = LIFECYCLE_ORDERED_APP_STATES[currStateIndex + 1];\n        }\n\n        return result;\n    },\n\n    // Instrumentation\n    _interactionStartTimestamp: null,\n    _latestInteractionTimestamp: null,\n    _inAppInteraction() {\n        return !!this.get('_interactionStartTimestamp');\n    },\n    _startAppInteraction(lifecycleEvent) {\n        let startTimestamp = Date.now();\n        this.set('_interactionStartTimestamp', startTimestamp);\n        this.set('_latestInteractionTimestamp', startTimestamp);\n\n        this._logAppInteraction(lifecycleEvent, {\n            interactionStart: startTimestamp\n        });\n    },\n    _appendAppInteraction(lifecycleEvent, complete) {\n        let startTimestamp = this.get('_interactionStartTimestamp');\n        if (!startTimestamp) {\n            Ember.Logger.error('Attempted to append to an unknown app interaction');\n            return;\n        }\n\n        let now = Date.now();\n        let interactionDetails = {\n            interactionStart: startTimestamp,\n            timeSinceInteractionStart: now - startTimestamp,\n            timeSincePrevInteraction: now - this.get('_latestInteractionTimestamp')\n        };\n\n        if (complete) {\n            interactionDetails.interactionEnd = now;\n            interactionDetails.interactionDuration = now - startTimestamp;\n            this.set('_interactionStartTimestamp', null);\n            this.set('_latestInteractionTimestamp', null);\n        } else {\n            this.set('_latestInteractionTimestamp', Date.now());\n        }\n\n        this._logAppInteraction(lifecycleEvent, interactionDetails);\n    },\n    /**\n     * logs an app shutdown as a single pageAction regardless of interaction\n     * state due to the importance of this event.  Usually, this will be\n     * the result of a user dismissal (update/deleted app) or pool\n     * eviction.\n     */\n    _logInactiveAppStopped() {\n        let now = Date.now();\n        this._logAppInteraction(this._convertStateToLifecycleEvent(APP_STATES.STOPPED), {\n            interactionStart: now,\n            timeSinceInteractionStart: 0,\n            timeSincePrevInteraction: 0,\n            interactionEnd: now,\n            interactionDuration: 0\n        });\n    },\n    _logAppInteraction(lifecycleEvent, interactionDetails) {\n        let commonAttrs = {\n            lifecycleEvent,\n            pcAppTypeId: this.get('app.typeId'),\n            pcAppId: this.get('appId'),\n            pcAppInstanceId: this.get('instanceId'),\n            pcAppDisplayType: this.get('app.displayType'),\n            pcAppInternallyHosted: this.get('app') instanceof InternallyHostedApp,\n            pcAppFeatureCategory: this.get('app.featureCategory'),\n            pcAppProblemName: this.get('problem.name'),\n            interactionId: this.get('app.interactionId')\n        };\n        for (const queryParam of this.get('app').getURLTemplateQueryParams()) {\n            commonAttrs[`${queryParam}UrlReplacement`] = true;\n        }\n        addPageAction('clientAppInteraction', _.merge({}, interactionDetails, commonAttrs));\n    },\n    _convertStateToLifecycleEvent(appState) {\n        switch (appState) {\n            case APP_STATES.LOADING:\n                return 'loading';\n            case APP_STATES.BOOTSTRAPPING:\n                return 'bootstrapping';\n            case APP_STATES.RUNNING:\n                return 'running';\n            case APP_STATES.STOPPING:\n                return 'stopping';\n            case APP_STATES.STOPPED:\n                return 'stopped';\n            default:\n                return 'unknownAppState';\n        }\n    }\n});\n\nexport default AppInstance;\n","import Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport find from 'lodash/find';\nimport findIndex from 'lodash/findIndex';\nimport isEqual from 'lodash/isEqual';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport orderBy from 'lodash/orderBy';\nimport reduce from 'lodash/reduce';\nimport { addPageAction } from '../utils/newrelic';\nimport AppInstance, { APP_PROBLEMS, APP_STATES } from './app-instance';\n\nconst { computed, RSVP } = Ember;\n\n/**\n * An AppPool manages a collection of apps, appInstances, and their lifecycles.  This object must\n * be used in conjuction with an app-pool component to handle the rendering lifecycle\n * of the appInstances.  Because it handles lifecycles and is render aware, it should also\n * be used for ephemeral apps that need lifecycle hooks called.\n *\n * If a getMaxActive size is set, then the pool will limit the number of concurrent\n * apps; however, apps transitioning into/out of active state will still be\n * included in renderedApps and must still be rendered to the dom to afford the\n * apps time to boot and shutdown appropriately.\n *\n * Top level pool state such as app loading state, if an app is being shown, or\n * if a requested app is unavailable will be represented in currState and the\n * details will contain applicable details.\n *\n * Individual app state such as loading, bootstrapping, app config changes,\n * runtime problems, etc. will be stored in the instance.\n *\n * Only one instance of an app can be \"active\" (loading, booting, or running)\n * at a given time; however, there may be other instances of the same app that are\n * transitioning out of the pool (e.g. stopping, stopped).\n *\n * Top-level Pool States\n *\n * LOADING - Apps are being loaded for the first time or a load failure is being\n *  retried.  Note that this state is NOT re-entered when apps are periodically\n *  refreshed; Instead, the pool will merge running apps behind the scenes.  See\n *  the AppInstance model for details.\n *  {\n *    loadRetryAttempt: true|false, // Indicates that this is an initial load retry attempt\n *    autoAttempt: true|false, // The loading request was made automatically by the pool\n *  }\n *\n * LOAD_FAILED - Initial load of the pool failed.  This state is recoverable\n *  automatically if loadRetryBaseMillis is configured or manually via the\n *  reloadApps call.  If an app was previously\n *  attempted to be shown, that state will attempt to be restored if the load\n *  eventually succeeds.\n *\n *  This state will not occur if a reloadApps fails after a successful init.  In\n *  this case, the pool will remain with the existing apps until a successful\n *  reload.\n *\n *  {\n *      loadRetryScheduled: true|false\n *  }\n *\n * IDLE - Apps are successfully loaded, but no app is being used\n *  null - No Details\n *\n * APP_NOT_FOUND - The requested app is not known to this pool\n *  {\n *      appId: <id> // The attempted app Id\n *  }\n *\n * ALLOCATING_SPACE - Space is being made for the requested instance\n *  {\n *    // the pending instance's details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * SHOWING_APP - An app is active.  Note: App may be loading or have a problem.\n *  @see {app-instance} for the enumerated states of an instance\n *  {\n *    // active instance details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * ALLOCATION_FAILED - Space could not be made for the requested instance\n *  {\n *    // the failed instance's details\n *    appId: app.id,\n *    app\n *  }\n *\n * Events:\n *  appPoolReloaded - Triggered when this pool's apps have been reloaded either\n *      manually or via a scheduled refresh\n *\n * @see {app-instance} For details on lifecylce, hooks, events, etc.\n */\n\nexport const APPS_RELOADED_EVENT = 'appPoolReloaded';\n\nexport const POOL_STATES = {\n    IDLE: 'idle',\n    LOADING: 'loading',\n    APP_NOT_FOUND: 'appNotFound',\n    ALLOCATING_SPACE: 'allocating',\n    SHOWING_APP: 'showingApp',\n    ALLOCATION_FAILED: 'allocationFailed',\n    LOAD_FAILED: 'loadFailed'\n};\n\nconst AppPool = Ember.Object.extend(Ember.Evented, LoggerMixin, {\n    // Public params\n    /**\n     * Optional, dev-friendly pool name used for logging purposes.\n     */\n    poolName: null,\n\n    /**\n     * A function that returns the maximum number of concurrent running\n     * apps (does not include apps shutting down). The app pool size is not dynamic and\n     * will not properly respond to changing the value this function returns.\n     */\n    getMaxActive: null,\n    /**\n     * Function to fetch apps for this pool.  Must return a Promise.  Will be used\n     * to load and refresh the pool.\n     */\n    fetchAppsFn: null,\n\n    /**\n     * Base millis for incremental backoff retries (with jitter) of initial apps load failures.\n     * Set <= 0 to disable auto retry and allow manual retry.\n     */\n    loadRetryBaseMillis: -1,\n\n    /**\n     * Max base millis to use in the initial apps load retry backoff.  If not specified,\n     * retry will grow without bound.  If specified and reached, retry will be\n     * loadRetryMaxBackoffMillis + random([0, .1loadRetryMaxBackoffMillis]).\n     */\n    loadRetryMaxBackoffMillis: -1,\n\n    /**\n     * Millis to wait until refreshing the list of apps in the pool.\n     * Apps will be smartly merged per logic in reloadApps.\n     */\n    reloadAppsIntervalMillis: -1,\n\n    /**\n     * Base millis for exponential backoff of reload retries if the initial interval attempt fails.\n     * Full jitter will be applied until reloadAppsIntervalMillis is hit.  Once reached,\n     * retry will be reloadAppsIntervalMillis + random([0, .1reloadAppsIntervalMillis]).\n     */\n    reloadAppsRetryBaseMillis: 1000,\n\n    /**\n     * The number of millis to wait between checks for stopped instances.\n     *\n     * Primarily configurable for testing purposes.\n     */\n    stoppedInstanceRemovalInterval: 500,\n\n    // Public Props\n    currState: {\n        name: null,\n        details: null\n    },\n    /**\n     * A list of app instances whose iframe elements MUST be rendered.\n     * This list will include transitional apps and, therefore, is not suitable to query\n     * for which apps are actively being used by the user.\n     */\n    renderedAppInstances: computed.alias('_renderedInstances'),\n\n    // Private Props\n    _loadAppsPromise: null, // Holds the initial apps load promise (and reload promise if the initial load fails)\n    _showFailureRestoreAppId: null, // Holds attempted show appId in case the load fails and needs reloaded\n    _loadRetryAttempts: 0, // Holds the number of load retry attempts (Used to calculate backoff)\n    _loadRetryScheduled: computed.bool('_loadRetryTask.isRunning'), // Computed indicating if a retry is scheduled\n\n    _reloadFailureCount: 0, // Failure attempts since last successful reload\n\n    skipLongRunningTasks: false,\n\n    appAttentionCounts: computed('_renderedInstances.[]', '_renderedInstances.@each.attentionCount', function () {\n        let counts = Ember.Object.create({});\n        let runningInstances = this._searchInstances(this.get('_renderedInstances'), {\n            appId: null,\n            maxState: APP_STATES.RUNNING\n        });\n\n        runningInstances.forEach(currInstance => {\n            counts.set(currInstance.get('app.id'), currInstance.get('attentionCount'));\n        });\n\n        return counts;\n    }),\n\n    totalAttentionCount: computed('appAttentionCounts', function () {\n        let keys = Object.keys(this.get('appAttentionCounts'));\n        let sum = 0;\n        keys.forEach(key => {\n            sum += this.get(`appAttentionCounts.${key}`);\n        });\n        return sum;\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.setProperties({\n            _apps: [],\n            _renderedInstances: [],\n            currState: {\n                name: null,\n                details: null\n            },\n            _fetchFailureLog: {\n                abortedCount: 0,\n                endpointFailureCount: 0\n            }\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let instances = this.get('_renderedInstances');\n        if (instances && instances.length > 0) {\n            instances.forEach(currInstance => {\n                if (currInstance && !currInstance.isDestroying && !currInstance.isDestroyed) {\n                    currInstance.destroy();\n                }\n            });\n        }\n    },\n\n    /**\n     * Returns a promise resolving with the list of loaded apps or rejected due to load failure\n     */\n    findAllApps() {\n        return this._loadApps().then(() => {\n            return this.get('_apps');\n        });\n    },\n\n    /**\n     * Returns a promise that will be resolved with the newly shown instance if successful\n     * or rejected if the show operation could not be performed (See pool failure states)\n     */\n    showApp(appId) {\n        return this._findApp(appId)\n            .then(app => {\n                let [existingInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                    appId,\n                    maxState: APP_STATES.RUNNING\n                });\n\n                return new RSVP.Promise(resolve => {\n                    if (existingInstance) {\n                        existingInstance.focus();\n\n                        this._setState(POOL_STATES.SHOWING_APP, {\n                            appId,\n                            instanceId: existingInstance.instanceId,\n                            instance: existingInstance\n                        });\n\n                        resolve(this.get('currState'));\n                    } else {\n                        resolve(this._allocateNewInstance(app));\n                    }\n                });\n            })\n            .catch(reason => {\n                if (reason && typeof reason === 'object' && Object.prototype.hasOwnProperty.call(reason, 'name')) {\n                    // A promise already rejected with state\n\n                    if (reason.name === POOL_STATES.LOAD_FAILED) {\n                        // store the attempted appId here incase the user wants to reload\n                        this.set('_showFailureRestoreAppId', appId);\n                    }\n\n                    // reject it on through\n                    return RSVP.reject(reason);\n                } else {\n                    this._setState(POOL_STATES.APP_NOT_FOUND, {\n                        appId\n                    });\n\n                    return RSVP.reject(this.get('currState'));\n                }\n            });\n    },\n\n    /**\n     * Hides the specified running instance, sets it's last used ts, and sets the pool to idle\n     *\n     * @returns a promise that will be resolved with the hidden instance\n     * details or rejected if the instance could not be found, was not running,\n     * or was not shown.\n     * (See pool failure states)\n     */\n    hideApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                instanceId,\n                maxState: APP_STATES.STOPPING\n            });\n\n            if (\n                runningInstance &&\n                this.get('currState.name') === POOL_STATES.SHOWING_APP &&\n                this.get('currState.details.instance.instanceId') === runningInstance.get('instanceId')\n            ) {\n                runningInstance.blur();\n                this._setState(POOL_STATES.IDLE);\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.get('currState'));\n            }\n        });\n    },\n\n    /**\n     * Stops the specified running instance, if available.  The instance will\n     * still complete its lifecycle as configured.  The pool state will not be\n     * modified.\n     *\n     * @returns a promise that will be resolved with the stopped instance\n     * details or rejected if the instance could not be found or was not running.\n     * (See pool failure states)\n     */\n    stopApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                instanceId,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (runningInstance) {\n                runningInstance.stop();\n\n                this._monitorAppLifecycles();\n\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.get('currState'));\n            }\n        });\n    },\n\n    /**\n     * Reattempt a failed app load or fetch and merge latest apps with current apps.\n     * Note: if the pool is configured for auto-reload attempts on failure, calling this\n     * manually while in a LOAD_FAILED state will have no effect and always reject\n     * with LOAD_FAILED status.\n     *\n     * If an instance is running and its backing app is updated/removed, the current\n     * app version will be used/retained.  Once the app instance is no longer running,\n     * (i.e. the user confirms removal) a subsequent reloadApps call will\n     * replace/remove the app.\n     *\n     * @returns a promise which resolves/rejects with the current pool state.  Note that\n     * the promise may reject but the pool state will be a success state.  This indicates\n     * that the reload failed, but the existing apps are still being used.\n     */\n    reloadApps() {\n        return this._reloadApps();\n    },\n\n    /**\n     * Helper method to differentiate internal and external requests\n     *\n     * @private\n     */\n    _reloadApps(internalLoadRetry = false) {\n        return this._loadApps()\n            .then(() => {\n                // Fetch current apps and overlay with any running, existing apps\n                return this.__fetchApps().then(latestApps => {\n                    let mergedApps = [];\n\n                    this._searchInstances(this.get('_renderedInstances'), {\n                        appId: null,\n                        maxState: APP_STATES.RUNNING\n                    }).forEach(runningInstance => {\n                        let newApp = find(latestApps, { id: runningInstance.get('appId') });\n\n                        let problem = null;\n                        if (!newApp) {\n                            problem = APP_PROBLEMS.APP_DELETED;\n                        } else if (!isEqual(newApp, runningInstance.app)) {\n                            problem = APP_PROBLEMS.APP_UPDATED;\n                        }\n\n                        if (problem) {\n                            // App has been removed or changed, keep the existing until\n                            // the user shuts down the running app\n                            runningInstance.setProblem(problem);\n                            mergedApps.push(runningInstance.app);\n                        }\n                    });\n\n                    // Add all latestApps that have not been overridden by current apps\n                    latestApps.forEach(currNewApp => {\n                        if (findIndex(mergedApps, { id: currNewApp.id }) < 0) {\n                            mergedApps.push(currNewApp);\n                        }\n                    });\n\n                    this.set('_apps', mergedApps);\n\n                    return this.get('currState');\n                });\n            })\n            .catch(reason => {\n                if (\n                    reason &&\n                    reason.name &&\n                    reason.name === POOL_STATES.LOAD_FAILED &&\n                    (!this.get('_loadRetryScheduled') || internalLoadRetry)\n                ) {\n                    // Initial load previously failed\n                    // OK to retry; this is an manual or internal, automatic reload request\n                    // Reload success will be broadcast in handler below or pass rejection/pool state on through\n                    return this._loadApps(true, internalLoadRetry);\n                }\n\n                // Failed on subsequent app reload\n                // Leave the current pool-state and/or apps alone and just reject this function's promise\n                return RSVP.reject(this.get('currState'));\n            })\n            .then(loadResult => {\n                this.trigger(APPS_RELOADED_EVENT);\n\n                let restoreAppId = this.get('_showFailureRestoreAppId');\n                if (restoreAppId) {\n                    // reload attempt succeeded; retry appId one more time\n                    this.set('_showFailureRestoreAppId', null);\n\n                    return this.showApp(restoreAppId);\n                } else {\n                    return loadResult;\n                }\n            });\n    },\n\n    _setState(name, details = null) {\n        this.set('currState.name', name);\n        this.set('currState.details', details);\n        this.notifyPropertyChange('currState');\n        this._logPoolEvent('stateUpdate');\n    },\n\n    _findApp(appId) {\n        return this._loadApps().then(() => {\n            let app = find(this.get('_apps'), { id: appId });\n            return app || RSVP.reject('appNotFound');\n        });\n    },\n\n    /**\n     * Singleton initial load of apps.  All calls wait on this initial load\n     * to ensure a base state of the pool (loaded or failure).\n     *\n     * LOAD SUCCESS:\n     * Sets the pool state to idle and will initiate automatic app refresh\n     * if the pool owner has configured it via reloadAppsIntervalMillis.  If the\n     * owner has not configured automatic refresh, it can be manually triggered\n     * via reloadApps.\n     *\n     * LOAD FAILURE:\n     * In the event of load failure, load can be retried by passing true for\n     * the forceReload argument. Note that forceReload will still only allow\n     * one concurrent reload call. The pool can be configured to automatically\n     * attempt reloads via loadRetryBaseMillis.\n     *\n     * @private\n     */\n    _loadApps(forceReload = false, autoLoadRetry = false) {\n        this.logger.debug('app-pool:_loadApps', { remoteData: { forceReload, autoLoadRetry } });\n        let result = this.get('_loadAppsPromise');\n\n        if (result === null || (forceReload && this.get('currState.name') === POOL_STATES.LOAD_FAILED)) {\n            this._setState(POOL_STATES.LOADING, {\n                loadRetryAttempt: forceReload,\n                autoAttempt: autoLoadRetry\n            });\n            this.set(\n                '_loadAppsPromise',\n                (result = this.__fetchApps()\n                    .then(apps => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps succeeded', {\n                            apps,\n                            remoteData: { apps: apps.map(app => app.get('id')) }\n                        });\n                        this.set('_apps', apps);\n                        this._setState(POOL_STATES.IDLE);\n                        if (!this.get('skipLongRunningTasks')) {\n                            this._scheduleAppReload();\n                        }\n                        return this.get('currState');\n                    })\n                    .catch(e => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps threw exception', e);\n                        let autoRetry = this.get('loadRetryBaseMillis') > 0;\n                        this._setState(POOL_STATES.LOAD_FAILED, {\n                            loadRetryScheduled: autoRetry\n                        });\n                        if (autoRetry) {\n                            this._retryInitialAppLoad();\n                        }\n                        return RSVP.reject(this.get('currState'));\n                    }))\n            );\n        }\n\n        return result;\n    },\n\n    /**\n     * Schedules an app load retry in the future based on attempt state (backoff, jitter, etc.)\n     *\n     * @private\n     */\n    _retryInitialAppLoad() {\n        let retryBase = this.get('loadRetryBaseMillis');\n        if (retryBase > 0) {\n            // pool owner requested automatic retry\n            let retryAttempts = this.incrementProperty('_loadRetryAttempts');\n\n            let retryInterval = retryBase * Math.pow(2, retryAttempts - 1);\n\n            let maxRetryDuration = this.get('loadRetryMaxBackoffMillis');\n            if (maxRetryDuration > 0 && retryInterval >= maxRetryDuration) {\n                // Max specified and reached; use max and a little jitter\n                retryInterval = maxRetryDuration + Math.floor(Math.random() * (maxRetryDuration * 0.1));\n            } else {\n                // Standard retry, Using \"full jitter\"\n                retryInterval = Math.floor(Math.random() * retryInterval);\n            }\n\n            this.get('_loadRetryTask').perform(retryInterval);\n        }\n    },\n\n    _loadRetryTask: task(function* (retryInterval) {\n        let timeoutVal = retryInterval;\n        this.logger.debug('app-pool:_loadRetryTask Pausing before retry', { remoteData: { timeoutVal } });\n        yield timeout(timeoutVal);\n        try {\n            yield this._reloadApps(true);\n        } catch (e) {\n            let abortedAttempts = this.get('_fetchFailureLog.abortedCount');\n            let endpointAttempts = this.get('_fetchFailureLog.endpointFailureCount');\n            if (abortedAttempts + endpointAttempts === 6) {\n                const msg =\n                    'Apps Initial load and 5 retry attempts failed. Continuing to retry but should be investigated';\n                Ember.Logger.warn(this._decorateLogStatement(msg), {\n                    remoteData: { abortedAttempts, endpointAttempts }\n                });\n            }\n        }\n    }),\n\n    /**\n     * Handles scheduling, rescheduling, and backoff of app refreshes per pool config\n     *\n     * @private\n     */\n    _scheduleAppReload() {\n        let reloadInterval = this.get('reloadAppsIntervalMillis');\n        this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadInterval } });\n        if (reloadInterval > 0) {\n            // pool owner requested automatic refresh\n\n            let reloadWait = reloadInterval;\n\n            let reloadFailureCount = this.get('_reloadFailureCount');\n            this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadFailureCount } });\n            if (reloadFailureCount > 0) {\n                // Previous reload failed; backoff and retry\n                reloadWait = Math.min(\n                    reloadInterval,\n                    this.get('reloadAppsRetryBaseMillis') * Math.pow(2, reloadFailureCount - 1)\n                );\n                if (reloadWait === this.get('reloadAppsIntervalMillis')) {\n                    // Max reached; use max and a little jitter\n                    reloadWait += Math.floor(Math.random() * (reloadWait * 0.1));\n                } else {\n                    // Standard retry, Using \"full jitter\"\n                    reloadWait = Math.floor(Math.random() * reloadWait);\n                }\n            }\n            this.logger.debug('app-pool:_scheduleAppReload Kicking off reloadTimer', { remoteData: { reloadWait } });\n            this.get('_reloadTimerTask').perform(reloadWait);\n        }\n    },\n\n    _reloadTimerTask: task(function* (reloadWait) {\n        yield timeout(reloadWait);\n        try {\n            yield this.reloadApps();\n            this.set('_reloadFailureCount', 0);\n        } catch (e) {\n            this.incrementProperty('_reloadFailureCount');\n            if (this.get('_fetchFailureLog.endpointFailureCount') === 6) {\n                Ember.Logger.warn(\n                    this._decorateLogStatement(\n                        'Apps Reload and 5 retry attempts failed. Continuing to retry but should be investigated'\n                    )\n                );\n            } else if (this.get('_fetchFailureLog.abortedCount') === 11) {\n                Ember.Logger.info(\n                    this._decorateLogStatement(\n                        'Apps Reload and 10 retry attempts have been cancelled. This could indicate a lost network connection or CORS issue. Continuing to retry but should be investigated'\n                    )\n                );\n            }\n        } finally {\n            if (!this.get('skipLongRunningTasks')) {\n                this._scheduleAppReload();\n            }\n        }\n    }),\n\n    /**\n     * Internal utility to fetch the apps via the fetchAppsFn\n     *\n     * Important Note: __fetchApps will fetch regardless of pool state.  It is free of side effects,\n     * but will be wasteful if invoked at the wrong state of the pool.  Specifically,\n     * it is only applicable (and should only be called) during the initial apps\n     * load, load failure retries, and apps reloads after successful, initial load\n     * has occurred.\n     *\n     * @returns A promise that resolves with the list of apps or rejects with the reason\n     *\n     * @private\n     */\n    __fetchApps() {\n        return new RSVP.Promise((resolve, reject) => {\n            this.logger.debug('app-pool:__fetchApps entry');\n            let fetchAppsFn = this.get('fetchAppsFn');\n            if (typeof fetchAppsFn !== 'function') {\n                Ember.Logger.error(this._decorateLogStatement('No/Invalid App Fetch function'));\n                reject('badFetchFunction');\n            } else {\n                try {\n                    fetchAppsFn()\n                        .then(apps => {\n                            this.logger.debug('app-pool:__fetchApps fetchAppsFn returned', apps);\n                            this.set('_fetchFailureLog.abortedCount', 0);\n                            this.set('_fetchFailureLog.endpointFailureCount', 0);\n\n                            if (!Array.isArray(apps)) {\n                                Ember.Logger.error(\n                                    this._decorateLogStatement('Invalid App Fetch Payload. Expected Array.'),\n                                    { remoteData: { typeOfApps: Ember.typeOf(apps) } }\n                                );\n                                reject('invalidFetchPayload');\n                            } else {\n                                resolve(apps);\n                            }\n                        })\n                        .catch(reason => {\n                            this.logger.debug('app-pool:__fetchApps apps fetch failed', reason);\n                            if (isAjaxError(reason) && isAbortError(reason)) {\n                                // Skipping logging to avoid flooding sumo with false positives related to the browser sleeping.\n                                // Will log excessive cancelled retries which might indicate a cors issue\n                                this.incrementProperty('_fetchFailureLog.abortedCount');\n                                reject('abortedRequest');\n                            } else {\n                                Ember.Logger.info(this._decorateLogStatement('App fetch request failed.'), { reason });\n                                this.incrementProperty('_fetchFailureLog.endpointFailureCount');\n                                reject('endpointFailure');\n                            }\n                        });\n                } catch (error) {\n                    Ember.Logger.error(this._decorateLogStatement('Failed to invoke App Fetch function.'), { error });\n                    reject('fetchFunctionRuntimeError');\n                }\n            }\n        });\n    },\n\n    _allocateNewInstance(app) {\n        let pendingInstance = AppInstance.create({\n            app\n        });\n\n        this._setState(POOL_STATES.ALLOCATING_SPACE, {\n            appId: app.id,\n            instanceId: pendingInstance.instanceId,\n            instance: pendingInstance\n        });\n\n        return new RSVP.Promise((resolve, reject) => {\n            this._allocateSpace()\n                .then(() => {\n                    // Room at the inn\n                    pendingInstance.start();\n                    this.get('_renderedInstances').pushObject(pendingInstance);\n\n                    this._setState(POOL_STATES.SHOWING_APP, {\n                        appId: app.id,\n                        instanceId: pendingInstance.instanceId,\n                        instance: pendingInstance\n                    });\n\n                    resolve(this.get('currState'));\n                })\n                .catch(() => {\n                    pendingInstance.destroy();\n\n                    this._setState(POOL_STATES.ALLOCATION_FAILED, {\n                        appId: app.id,\n                        app\n                    });\n\n                    reject(this.get('currState'));\n                });\n        });\n    },\n\n    _allocateSpace() {\n        let getMaxActive = this.get('getMaxActive');\n        if (getMaxActive) {\n            let renderedInstances = this.get('_renderedInstances');\n\n            let existingInstances = this._searchInstances(renderedInstances, {\n                appId: null,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (existingInstances.length >= getMaxActive()) {\n                // Make way\n                let sortedInstances = orderBy(\n                    existingInstances,\n                    ['app.lifecycle.ephemeral', 'lastUserAccessTimestamp'],\n                    ['desc', 'asc']\n                );\n\n                let instanceToEvict = sortedInstances[0];\n                instanceToEvict.stop();\n                this._logPoolEvent('eviction', { evictedAppId: instanceToEvict.get('appId') });\n                this._monitorAppLifecycles();\n            }\n        }\n\n        return RSVP.resolve();\n    },\n\n    _searchInstances(instances, { instanceId = null, appId = null, states = [], maxState = null } = {}) {\n        let result = [];\n\n        if (instances && Array.isArray(instances) && instances.length > 0) {\n            if (states && Array.isArray(states) && states.length > 0) {\n                result = instances.filter(currInstance => {\n                    let instanceState = currInstance.get('currState');\n                    return states.indexOf(instanceState) >= 0;\n                });\n            } else if (maxState) {\n                result = instances.filter(currInstance => {\n                    let currInstanceState = currInstance.get('currState');\n                    return maxState.compareTo(currInstanceState) >= 0;\n                });\n            } else {\n                result = instances;\n            }\n\n            if (instanceId) {\n                let specificInstance = find(result, { instanceId });\n                result = specificInstance ? [specificInstance] : [];\n            } else if (appId) {\n                result = result.filter(instance => appId === instance.get('appId'));\n            }\n        }\n\n        return result;\n    },\n\n    _monitorAppLifecycles() {\n        if (this._removeStopped() && !this.get('skipLongRunningTasks')) {\n            this.get('_monitorAppLifecyclesTask').perform();\n        }\n    },\n\n    _monitorAppLifecyclesTask: task(function* () {\n        yield timeout(this.get('stoppedInstanceRemovalInterval'));\n        this._monitorAppLifecycles();\n    }),\n\n    _removeStopped() {\n        let renderedInstances = this.get('_renderedInstances');\n\n        let stoppedInstances = this._searchInstances(renderedInstances, {\n            states: [APP_STATES.STOPPED]\n        });\n        stoppedInstances.forEach(currInstance => {\n            currInstance.destroy();\n            renderedInstances.removeObject(currInstance);\n        });\n\n        return (\n            this._searchInstances(renderedInstances, {\n                states: [APP_STATES.STOPPING]\n            }).length > 0\n        );\n    },\n\n    _decorateLogStatement(logText) {\n        let prefix = 'AppPool';\n        let poolName = this.get('poolName');\n        if (poolName && Ember.typeOf(poolName) === 'string') {\n            prefix += ` (${poolName})`;\n        }\n\n        return `${prefix}: ${logText}`;\n    },\n\n    _logPoolEvent(poolEvent, poolEventDetails = {}) {\n        const getMaxActive = this.get('getMaxActive');\n        const attrs = {\n            poolEvent,\n            poolName: this.get('poolName'),\n            poolState: this.get('currState.name'),\n            maxPoolSize: getMaxActive && getMaxActive(),\n            renderedApps: this.get('renderedAppInstances.length'),\n            totalAttentionCount: this.get('totalAttentionCount')\n        };\n\n        // Only grab primitive fields from the current pool state details\n        // to avoid trying to send NR full app/app-instance models\n        const primitivePoolStateDetails = omitBy(\n            this.get('currState.details'),\n            prop => prop && typeof prop === 'object'\n        );\n        const poolStateDetails = reduce(\n            primitivePoolStateDetails,\n            (acc, val, key) => {\n                acc[`poolState.${key}`] = val;\n                return acc;\n            },\n            {}\n        );\n\n        addPageAction('clientAppPoolEvent', merge({}, poolEventDetails, poolStateDetails, attrs));\n    }\n});\n\nexport default AppPool;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport appUtils from '../utils/apps';\n\nconst { Copyable, computed, copy, getOwner, typeOf, isPresent } = Ember;\n\nconst LIFECYCLE_DEFAULTS = {\n    ephemeral: false,\n    hooks: {\n        bootstrap: false,\n        focus: false,\n        blur: false,\n        stop: false\n    }\n};\n\nexport const DISPLAY_TYPES = {\n    STANDALONE: 'standalone',\n    WIDGET: 'widget',\n    INTERAPPTION: 'interactionWidget'\n};\n\nexport const FEATURE_CATEGORIES = {\n    DIRECTORY: 'directory',\n    CONTACT_CENTER_INSIGHTS: 'contactCenterInsights'\n};\n\nexport const ASSET_CATEGORIES = ['icon', 'monochromicIcon'];\n\nconst URL_REPLACEMENT_PREFIX = '{{';\nconst URL_REPLACEMENT_SUFFIX = '}}';\n// PC\nconst LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'pcLangTag';\nexport const LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_ENV_URL_REPLACEMENT_VAR_NAME = 'pcEnvironment';\nexport const PC_ENV_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_ENV_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'pcConversationId';\nexport const PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'pcUsePopupAuth';\nexport const USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n// GC\nconst GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'gcLangTag';\nexport const GC_LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME = 'gcInteractionId';\nexport const GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'gcConversationId';\nexport const GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME = 'gcInteractionType';\nexport const GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'gcUsePopupAuth';\nexport const GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME = 'gcHostOrigin';\nexport const GC_HOST_ORIGIN_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_TARGET_ENV_REPLACEMENT_VAR_NAME = 'gcTargetEnv';\nexport const GC_TARGET_ENV_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_TARGET_ENV_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n\nconst TOKEN_REPLACEMENTS = {\n    // PC\n    [LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [PC_ENV_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_ENV_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'envTld'\n    },\n    [PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    // GC\n    [GC_LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementValue: (interactionId, interactionType) => {\n            return interactionType === 'conversation' ? interactionId : '';\n        }\n    },\n    [GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionType'\n    },\n    [GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    [GC_HOST_ORIGIN_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcHostOrigin'\n    },\n    [GC_TARGET_ENV_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_TARGET_ENV_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcTargetEnv'\n    }\n};\n\nconst URL_REPLACEMENTS = Object.entries(TOKEN_REPLACEMENTS).map(\n    ([replacementToken, { queryParamName, replacementProp, replacementValue }]) => {\n        return {\n            regExp: new RegExp(replacementToken, 'g'),\n            queryParamName,\n            replacementProp,\n            replacementValue\n        };\n    }\n);\n\nexport const INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS = ['chat', 'call', 'callback', 'email'];\nexport const INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS = [\n    'apple',\n    'sms',\n    'line',\n    'facebook',\n    'open',\n    'instagram',\n    'twitter',\n    'webmessaging',\n    'whatsapp'\n];\nexport const INTERAPPTION_COMMUNICATION_TYPE_FILTERS = [\n    ...INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS,\n    ...INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS\n];\nexport const NO_SUPPORTED_COMMUNICATION_TYPE_FILTER = 'none';\n\nconst App = Ember.Object.extend(Copyable, {\n    typeId: null,\n    id: null,\n    name: null,\n    urlTemplate: null,\n    langTag: null,\n    envTld: null,\n    usePopupAuth: false,\n    displayType: null, // The type of app which dictates how an app behaves, where an app is displayed, etc. - standalone, widget, etc.\n    featureCategory: null, // The category of an app's behavior for grouping purposes - directory, performance, help, etc.\n    permissionsPolicy: null,\n    // sandbox, assets, lifecycle, permissionsPolicy - set in init\n\n    // Interapption specific properties\n    interactionId: null,\n    interactionType: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified queues\n     */\n    enabledQueueIds: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified communication types.\n     * Currently, this only includes the initial communication type (it does not include elevations).\n     * When it includes 'none', it will not display the interapption for any communication type.\n     */\n    enabledCommunicationTypes: null,\n    gcHostOrigin: null,\n    gcTargetEnv: null,\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.get('sandbox')) {\n            this.set('sandbox', []);\n        }\n\n        if (!this.get('assets')) {\n            this.set('assets', {});\n        }\n\n        if (!this.get('permissionsPolicy')) {\n            this.set('permissionsPolicy', []);\n        }\n\n        this.set('lifecycle', _.merge(copy(LIFECYCLE_DEFAULTS, true), this.get('lifecycle')));\n    },\n\n    url: computed('urlTemplate', 'langTag', 'envTld', 'interactionId', 'usePopupAuth', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = this.get('urlTemplate');\n            if (typeOf(result) === 'string' && isPresent(result)) {\n                URL_REPLACEMENTS.forEach(currReplacement => {\n                    let replacementValue = '';\n                    if (currReplacement.replacementValue) {\n                        if (this.get('interactionId') && this.get('interactionType'))\n                            replacementValue = currReplacement.replacementValue(\n                                this.get('interactionId'),\n                                this.get('interactionType')\n                            );\n                    } else {\n                        const rawValue = this.get(currReplacement.replacementProp);\n                        replacementValue = isPresent(rawValue) ? rawValue : '';\n                    }\n                    if (encodeURIComponent) {\n                        replacementValue = encodeURIComponent(replacementValue);\n                        result = result.replace(currReplacement.regExp, replacementValue);\n                    }\n                });\n            } else {\n                result = '';\n            }\n            return result;\n        },\n        set() {\n            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derived url property instead of new urlTemplate property.'),\n                {\n                    urlTemplate: this.get('urlTemplate'),\n                    remoteData: {\n                        appId: this.get('id')\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set url.  Use urlTemplate property.');\n        }\n    }),\n\n    getURLTemplateQueryParams() {\n        const result = [];\n        const urlTemplate = this.get('urlTemplate');\n        if (typeOf(urlTemplate) === 'string' && isPresent(urlTemplate)) {\n            URL_REPLACEMENTS.forEach(currReplacement => {\n                if (urlTemplate.search(currReplacement.regExp) !== -1) {\n                    result.push(currReplacement.queryParamName);\n                }\n            });\n        }\n        return result;\n    },\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return App.create(ownerMixin, {\n            typeId: this.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            urlTemplate: this.get('urlTemplate'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? _.cloneDeep(this.get('sandbox')) : this.get('sandbox'),\n            assets: deep ? _.cloneDeep(this.get('assets')) : this.get('assets'),\n            lifecycle: deep ? _.cloneDeep(this.get('lifecycle')) : this.get('lifecycle'),\n            permissionsPolicy: deep ? _.cloneDeep(this.get('permissionsPolicy')) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default App;\n","define(\"connections-ui/models/call-communication\", [\"exports\", \"ember-purecloud-components/models/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { attr, Model } = DS;\n\nconst { computed } = Ember;\n\nexport default Model.extend({\n    enabled: attr(),\n    phoneNumber: attr(),\n\n    calls: attr(),\n\n    voicemail: attr(),\n\n    isExternalVoicemail: computed.equal('voicemail', 'LASTCALL')\n});\n","define(\"connections-ui/models/callback-communication\", [\"exports\", \"ember-purecloud-components/models/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { computed, get, set } from '@ember/object';\nimport { inject } from '@ember/service';\nimport DS from 'ember-data';\nimport cloneDeep from 'lodash/cloneDeep';\nimport RSVP from 'rsvp';\n\nconst { attr } = DS;\n\nfunction hasSipErrors(party: any) {\n    const codes = get(party, 'sipResponseCodes');\n    if (!codes || codes.length === 0) {\n        return false;\n    }\n    // 487 is Voicemail Not Available, which is not treated as an error\n    // 410 is a queue call that gets transfered to an agent for some reason\n    return !!party.sipResponseCodes.filter((c: number) => c >= 300 && c !== 487 && c !== 410).length;\n}\n\nexport default DS.Model.extend({\n    // required services\n    session: inject('session'),\n    addressformat: inject('addressformat'),\n    application: inject('application'),\n    ajax: inject('ajax'),\n    intl: inject('intl'),\n\n    /**\n     * The conversation (with the same id as this call)\n     * Fetched when we need to distinguish between participants (if there are 2 or more valid otherParties)\n     * Raw object - Not the EPC model\n     */\n    conversation: null,\n\n    //  The relevant part of conversation. Each participant in this list corresponds to participants on callv2, but has\n    //  extra properties such as monitorParticipantId or coachedParticipantId\n    conversationParticipants: computed('conversation.participants', function () {\n        const conversationParties = this.get('conversation.participants') || [];\n        return conversationParties;\n    }),\n\n    participants: attr(),\n    startTime: attr('date'),\n    direction: attr('string'),\n    missedCall: attr('boolean'),\n    wasConference: attr('boolean'),\n    wasCallback: attr('boolean'),\n    wasOutboundCampaign: attr('boolean'),\n    /**\n     * call went to voicemail\n     */\n    wentToVoicemail: attr('boolean'),\n\n    callStart: computed.alias('startTime'),\n\n    sentToVoicemail: computed('wentToVoicemail', 'voicemailParticipant', function () {\n        // sent to my voicemail\n        if (!this.get('wentToVoicemail')) {\n            return false;\n        }\n        return this.get('voicemailParticipant.user.id') === this.get('myGuid');\n    }),\n    reachedVoicemail: computed.and('wentToVoicemail', 'isOutbound'), // went to other user's voicemail\n\n    // my participant computeds\n    myGuid: computed.reads('session.person.guid'),\n    callEnd: computed.reads('myParticipant.endTime'),\n    isOutbound: computed.equal('myParticipant.direction', 'outbound'),\n    isMultiParty: computed.or(\n        'isOutboundCampaign',\n        'isIvrTransfer',\n        'isBlindTransfer',\n        'isConsultTransfer',\n        'wasConference'\n    ),\n    myself: computed.reads('myParticipant'), // convenience for call-history-entity backward compat\n    allParticipants: computed.union(\n        'internalParticipants',\n        'externalParticipants',\n        'stationParticipants',\n        'ivrParticipants',\n        'queueParticipants'\n    ),\n\n    // an acd call is where any participant is an agent\n    isAcdCall: computed('participants.[]', function () {\n        return A(this.get('participants')).any((participant: any) => participant && participant.purpose === 'agent');\n    }),\n\n    // begin participant computed props: myParticipant, internalParticipants, externalParticipants, voicemailParticipant, otherParties\n    myParticipant: computed('participants.[]', 'myGuid', function () {\n        const nonVoicemail = this.get('participants').rejectBy('purpose', 'voicemail') || A([]);\n        let me = nonVoicemail.findBy('user.id', this.get('myGuid'));\n        if (!me) {\n            me = nonVoicemail.findBy('purpose', 'station');\n        }\n        return me;\n    }),\n\n    // internalParticipants and externalParticipants and combined in allParticipants computed above.\n    internalParticipants: computed('participants.[]', function () {\n        return (this.get('participants') || []).filter(\n            (party: any) => party.user !== undefined && party.monitoredCallId === undefined\n        );\n    }),\n\n    externalParticipants: computed('participants.[]', function () {\n        const participants = this.get('participants').reject(\n            (p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p)\n        );\n\n        let externalParticipants = A([\n            ...participants.filterBy('purpose', 'external'),\n            ...participants.filterBy('purpose', 'customer')\n        ]);\n\n        // the edge does dumb stuff like add participants with no error code when\n        // the call gets redirected to another edge. See if there are two identical\n        // participants where both didn't interact, and if so, filter one out.\n        if (\n            externalParticipants.length === 2 &&\n            externalParticipants.filterBy('didInteract').length < 2 &&\n            externalParticipants[0].ani === externalParticipants[0].ani\n        ) {\n            externalParticipants = A([externalParticipants[0]]);\n        }\n        return externalParticipants;\n    }),\n\n    stationParticipants: computed('participants.[]', function () {\n        return this.get('participants')\n            .reject((p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p))\n            .filterBy('purpose', 'station');\n    }),\n\n    voicemailParticipant: computed('participants.[]', function () {\n        return this.get('participants').findBy('purpose', 'voicemail');\n    }),\n\n    ivrParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'ivr');\n    }),\n\n    queueParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'acd');\n    }),\n\n    // All participants that aren't the current user, or a monitor, coach, or barged participant\n    otherParties: computed('allParticipants.[]', 'myGuid', 'conversationParticipants.[]', function () {\n        const conversationParticipants = this.get('conversationParticipants');\n        return this.get('allParticipants')\n            .rejectBy('user.id', this.get('myGuid'))\n            .reject((party: any) => get(party, 'startTime') === get(party, 'endTime') || hasSipErrors(party))\n            .filter((party: any) => {\n                //  Only filter out monitors, coaches, or barged participants (if found from conversation.participants)\n                const partyFromConversation = conversationParticipants.find(\n                    (participant: any) => participant.id === party.id\n                );\n                if (partyFromConversation) {\n                    return !(\n                        get(partyFromConversation, 'monitoredParticipantId') ||\n                        get(partyFromConversation, 'coachedParticipantId') ||\n                        get(partyFromConversation, 'bargedParticipantId')\n                    );\n                }\n                return true;\n            });\n    }),\n\n    callParties: computed('otherParties.[]', 'isGroupRing', 'conversationParticipants', function () {\n        const otherParties = this.get('otherParties');\n        const addressformat = this.get('addressformat');\n\n        // We dont display (all) group call participants in any call UIs\n        if (this.get('isGroupRing')) {\n            return [];\n        }\n\n        return otherParties.rejectBy('purpose', 'voicemail').map((p: any) => {\n            const party = cloneDeep(p); // no side effects\n            if (party.purpose === 'user' || party.purpose === 'agent') {\n                const promise = this.get('store').findRecord('person', party.user.id);\n                promise.then((data: any) => {\n                    set(party, 'name', data.get('name'));\n                });\n                return promise.catch(() => party);\n            }\n\n            if (party.purpose === 'acd') {\n                const promise = this.get('store').findRecord('queue', party.queue.id);\n                promise.then((data: any) => {\n                    set(party, 'name', data.get('name'));\n                    set(party, 'address', `sip:${data.get('id')}`);\n                });\n                return promise.catch(() => party);\n            }\n\n            if (party.purpose === 'ivr') {\n                set(party, 'address', get(party, 'dnis'));\n            } else if (party.direction === 'outbound') {\n                const dnis = get(party, 'dnis');\n                set(party, 'isOutbound', true);\n                //  Sometimes in conference calls the address of a participant is not resolved correctly when accessed from the 'history' bulk endpoint\n                //  In that case we try to fallback on the same participant taken fron the GET conversation/{conversationId} endpoint which may be resolved correctly\n                if (party.address && party.address.startsWith('sip:')) {\n                    const conversationParticipants = this.get('conversationParticipants');\n                    const participant = conversationParticipants.find(\n                        (participant: any) => participant.id === party.id\n                    );\n\n                    // If the participant address is also available from the more detailed 'conversationParticipants', use it\n                    if (participant) {\n                        set(party, 'address', get(participant, 'address'));\n                    } else {\n                        // Otherwise fallback to DNIS\n                        set(party, 'address', dnis);\n                    }\n                } else {\n                    set(party, 'address', dnis);\n                }\n            } else {\n                set(party, 'address', get(party, 'ani'));\n            }\n\n            set(party, 'address', addressformat.formatAddressForDisplay(get(party, 'address')));\n            return RSVP.resolve(party);\n        });\n    }),\n\n    initiator: computed('allParticipants.[]', function () {\n        const all = this.get('allParticipants');\n        const outboundParticipant = all.findBy('direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const external = this.get('externalParticipants');\n        const inboundExternal = external.findBy('direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    disconnectReason: computed('myParticipant.disconnectType', 'isOutbound', 'wentToVoicemail', function () {\n        const intl = this.get('intl');\n\n        const disconnectType = this.get('myParticipant.disconnectType') || 'unknown';\n        let disconnectTypeKey = 'other';\n\n        if (disconnectType === 'client') {\n            disconnectTypeKey = 'you';\n        } else if (disconnectType === 'endpoint') {\n            disconnectTypeKey = 'otherParty';\n        } else if (disconnectType === 'system') {\n            disconnectTypeKey = 'system';\n        } else if (disconnectType && disconnectType.indexOf('transfer') > -1) {\n            if (!this.get('isOutbound') && this.get('wentToVoicemail')) {\n                disconnectTypeKey = 'youDeclined';\n            } else {\n                disconnectTypeKey = 'transfer';\n            }\n        } else if (disconnectType === 'error') {\n            disconnectTypeKey = 'error';\n        }\n\n        return intl.lookup(`purecloud.disconnectReason.${disconnectTypeKey}`);\n    }),\n\n    isIvrTransfer: computed('myParticipant.disconnectType', 'otherParties.[]', function () {\n        return !!this.get('otherParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose === 'ivr' || purpose === 'acd';\n        }).length;\n    }),\n\n    isOutboundCampaign: computed.readOnly('wasOutboundCampaign'),\n\n    isBlindTransfer: computed('sentToVoicemail', 'myParticipant.disconnectType', function () {\n        // if I'm an agent and there were other agents, it's a transfer situation. We can't\n        // distinguish between consult or blind based on analytics or conversation data\n        if (this.get('myParticipant.purpose') === 'agent') {\n            return this.get('participants').filterBy('purpose', 'agent').length > 1;\n        }\n\n        const participants = this.get('participants').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose !== 'ivr' && purpose !== 'acd';\n        });\n\n        if (!participants.any((p: any) => get(p, 'disconnectType') === 'transfer')) {\n            return false;\n        }\n\n        return !this.get('wentToVoicemail');\n    }),\n\n    isConsultTransfer: computed('isBlindTransfer', 'wasConference', 'callParties.[]', function () {\n        // multiple parties, but not marked as a transfer or a conference means consult\n        const parties = this.get('callParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose !== 'ivr' && purpose !== 'acd';\n        });\n        return !this.get('isBlindTransfer') && !this.get('wasConference') && parties.length > 1;\n    }),\n\n    isPersonalVoicemail: computed('voicemailParticipant.dnis', function () {\n        return this.get('voicemailParticipant')\n            ? this.get('voicemailParticipant.dnis').indexOf('user=voicemailbox') > -1\n            : false;\n    }),\n\n    // This an outbound call initiated by the queue - NOT true for normal inbound/outbound ACD calls\n    isQueueCall: computed('initiator', function () {\n        const queueId = this.get('myParticipant.queue.id') || this.get('myParticipant.queueId');\n        return (\n            !!(\n                this.get('initiator.dnis') &&\n                queueId &&\n                this.get('initiator.dnis').indexOf(queueId > -1) &&\n                this.get('isOutbound')\n            ) && !this.get('isAcdCall')\n        );\n    }),\n\n    invalidNumber: computed('myParticipant.{disconnectType,dnis}', function () {\n        return (\n            this.get('myParticipant.disconnectType') === 'error' && this.get('myParticipant.dnis') === 'Invalidnumber'\n        );\n    }),\n\n    groupRingParticipant: computed('participants.[]', function () {\n        return this.get('participants').find((p: any) => get(p, 'groupId') || get(p, 'group.id'));\n    }),\n\n    isGroupRing: computed.bool('groupRingParticipant'),\n\n    groupRingId: computed('groupRingParticipant', function () {\n        const participant = this.get('groupRingParticipant');\n        if (!participant) {\n            return undefined;\n        }\n        return get(participant, 'groupId') || get(participant, 'group.id');\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', 'groupRingCaller.guid', 'isGroupRing', 'myGuid', function () {\n        return !!(\n            this.get('isOutbound') &&\n            this.get('isGroupRing') &&\n            this.get('groupRingCaller.guid') === this.get('myGuid')\n        );\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        if (this.get('groupRingId')) {\n            return this.get('store').findRecord('group', this.get('groupRingId'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    groupRingCaller: computed('isGroupRing', 'initiator', function () {\n        const initiator = this.get('initiator');\n        if (this.get('groupRingParticipant') && initiator) {\n            if (!get(initiator, 'user')) {\n                return RSVP.resolve(initiator);\n            }\n\n            return this.get('store').findRecord('person', get(initiator, 'user.id'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    //  If there are more than 2 parties fetch the conversation individually to distinguish them\n    loadConversation: function () {\n        const personParticipants = this.get('participants').filter((participant: any) =>\n            ['user', 'agent', 'external', 'customer'].includes(participant.purpose.toLowerCase())\n        );\n        let promise = Ember.RSVP.Promise.resolve([]);\n        if (!this.get('conversation') && personParticipants.length > 2) {\n            let id = this.get('id');\n            let url = this.get('application').pcV2Uri(`api/v2/conversations/${id}`);\n            promise = this.get('ajax')\n                .request(url)\n                .then(res => {\n                    this.set('conversation', res);\n                    return !!res ? res.participants : [];\n                })\n                .catch(() => []);\n        }\n        return promise;\n    }\n});\n","define(\"connections-ui/models/chat-communication\", [\"exports\", \"ember-purecloud-components/models/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst SECOND_TO_EDIT = 60;\n\nconst ChatMessage = Ember.Object.extend(ChatMessageMedia, ChatMessageMixin, {\n    /**\n    Any new functionality that needs to be added to the Chat Message Model must\n    be added to the ChatMessageMixin instead. Adding functionality to the model\n    instead of the mixin will cause chat messages to break, and cant guarantee\n    that message will render as they should.\n    */\n\n    // Start of chat message attrs\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    corrects: null,\n    raw: null,\n    links: null,\n    stanza: null,\n    files: null,\n    // End of chat message attrs\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n    messageBody: null,\n    hasMentionLinks: false,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    correction: null,\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n\n    //set by services/chat.parseWidgetData()\n    widget: null,\n    widgetType: 'default',\n\n    //set by chat-room.processSplitMessage()\n    splitMessageIndex: null,\n\n    init() {\n        this._super(...arguments);\n        this.determineMessageEditability();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        Ember.run.cancel(this.get('isEditableTimeout'));\n    },\n\n    isSplitMessage: Ember.computed('stanza', function () {\n        const children = this.get('stanza.children');\n        return children.findBy('name', 'multipart-message') !== undefined;\n    }),\n\n    isEditable: false,\n\n    editableEndTime: Ember.computed('time', function () {\n        const time = this.get('time');\n        if (time) {\n            return moment(time).add(SECOND_TO_EDIT, 'seconds');\n        }\n        return time;\n    }),\n\n    isEditing: Ember.computed('widgetType', function () {\n        return 'editor' === this.get('widgetType');\n    }),\n\n    canEdit: Ember.computed(\n        'isEditable',\n        'isYou',\n        'isYourLastMessage',\n        'endOfBlock',\n        'pending',\n        'files.[]',\n        'correction.{isYou,isYourLastMessage,pending}',\n        'room.isAcdRoom',\n        function () {\n            if (!this.get('isEditable') || this.get('files.length') || this.get('room.isAcdRoom')) {\n                return false;\n            }\n\n            const message = this.get('messageDisplay');\n            return (\n                !message.get('pending') &&\n                message.get('isYou') &&\n                message.get('endOfBlock') &&\n                message.get('isYourLastMessage')\n            );\n        }\n    ),\n\n    meAction: Ember.computed('raw', 'correction.raw', function () {\n        const raw = this.get('correction.raw') || this.get('raw');\n        if (raw && raw.indexOf('/me ') === 0) {\n            return raw.substr(4, raw.length);\n        }\n        return null;\n    }),\n\n    startEditing() {\n        this.set('_originalWidgetType', this.get('widgetType'));\n        this.set('widgetType', 'editor');\n    },\n\n    stopEditing() {\n        const originalWidgetType = this.get('_originalWidgetType');\n        if (originalWidgetType && 'editor' === this.get('widgetType')) {\n            this.set('widgetType', originalWidgetType);\n        }\n    },\n\n    determineMessageEditability() {\n        if (!this.get('corrects') && compareJids(this.get('from'), this.get('session.person.jid'))) {\n            const now = moment();\n            const seconds = SECOND_TO_EDIT - now.diff(this.get('time'), 'seconds');\n            const isEditable = seconds > 0;\n            this.set('isEditable', isEditable);\n            if (isEditable) {\n                const isEditableTimeout = Ember.run.later(\n                    this,\n                    () => {\n                        this.stopEditing();\n                        this.set('isEditable', false);\n                    },\n                    seconds * 1000\n                );\n                this.set('isEditableTimeout', isEditableTimeout);\n            }\n        }\n    }\n});\n\nexport default ChatMessage;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport SortChatUsersMixin from '../mixins/sort-chat-users';\nimport SplitMessage from './split-message';\nimport {\n    compareJids,\n    isAcdJid,\n    isGroupJid,\n    isPersonJid,\n    isRoomJid,\n    isSoftphoneJid,\n    isSupervisorJid\n} from 'ember-purecloud-components/utils/jid-helpers';\n\nconst POPOUT_HEIGHT = 800;\nconst POPOUT_WIDTH = 500;\nconst POPOUT_LOCATION = -2000;\n\nconst haveGroupData = group => {\n    const haveId = !_.isEmpty(group.get('id'));\n    const haveName = !_.isEmpty(group.get('name'));\n    const groupId =\n        group.getFieldValue && group.getFieldValue('general.name') && group.getFieldValue('general.name')._id;\n    const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n    return haveId && haveName && isApiFieldConfigName;\n};\n\n// TODO: Find a better Ember way/spot for this view oriented behavior.\n// This === shared by all chat-room models on purpose.  Rooms decide based\n// mute setting to animate ||!.\n// Similar code exist in interaction.js service\nconst MAX_WAIT = 8000;\nconst animateChatIcon = _.debounce(\n    () => {\n        Ember.$('.action-item.chat a').addClass('faa-horizontal animated');\n        Ember.run.later(() => {\n            Ember.$('.action-item.chat a').removeClass('faa-horizontal animated');\n        }, MAX_WAIT);\n    },\n    MAX_WAIT,\n    { leading: true, trailing: false, maxWait: MAX_WAIT }\n);\n\n// This size mirrors the 'messagesPerHistoryRequest' property in services/chat\nconst PRUNE_SIZE = 25;\n\nconst ChatRoom = Ember.Object.extend(SortChatUsersMixin, {\n    session: Ember.inject.service('session'),\n    webrtc: Ember.inject.service('webrtc'),\n    batchDataRequests: Ember.inject.service(),\n    chat: Ember.inject.service('chat'),\n\n    jid: null,\n    objectId: null,\n    group: null,\n    oneToOneTarget: null,\n    rawSubject: null,\n    pendingRoom: false,\n\n    firstMessageTime: null,\n    lastMessageTime: null,\n    lastMessageTimeRadix: 0,\n    roomClosedTimeRadix: 0,\n\n    mentions: 0,\n    unseen: 0,\n    messageActivity: 0,\n    userActivity: 0,\n\n    loadingHistory: false,\n    moreHistoryAvailable: false,\n    moreForwardHistoryAvailable: false,\n\n    activated: false,\n\n    participants: null,\n    acdCustomerParticipant: null,\n    messages: null,\n    messageCache: null,\n    splitMessageCache: null,\n    inputCache: null,\n\n    isInRoster: false,\n    participantsVisible: false,\n\n    isFavorite: false,\n\n    invited: false,\n    showingVideo: false,\n    joinCallImmediately: false,\n    joinScreenshareImmediately: false,\n\n    type: 'room',\n\n    deferredParticipants: null,\n\n    roomOwners: [],\n\n    setupProperties: Ember.on('init', function () {\n        this.setProperties({\n            participants: [],\n            messages: [],\n            messageCache: Ember.Object.create({}),\n            splitMessageCache: Ember.Object.create({}),\n            firstMessageTime: moment(0),\n            lastMessageTime: moment(0),\n            deferredParticipants: Ember.A([])\n        });\n    }),\n\n    authenticatedUserIsRoomOwner: Ember.computed('session.person', function () {\n        const group = this.get('group');\n        return group && group.isPersonOwner(this.get('session.person'));\n    }),\n\n    resizeNewPopout: Ember.observer('popout', function () {\n        const popout = this.get('popout');\n        if (popout) {\n            popout.resizeTo(POPOUT_WIDTH, POPOUT_HEIGHT);\n            popout.moveTo(POPOUT_LOCATION, POPOUT_LOCATION);\n            popout.focus();\n        }\n    }),\n\n    videoConversation: Ember.computed('webrtc.conversations.[]', function () {\n        let conversations = this.get('webrtc.conversations');\n        if (conversations) {\n            return conversations.findBy('room.jid', this.get('jid'));\n        }\n        return null;\n    }),\n\n    videoRoomFull: false,\n\n    subject: Ember.computed('rawSubject', 'group.{id,name}', 'oneToOneTarget.name', function () {\n        const group = this.get('group');\n\n        if (!group) {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\n        }\n\n        const haveId = !_.isEmpty(group.id);\n        const haveName = !_.isEmpty(group.get('name'));\n        const groupId = group.getFieldValue && group.getFieldValue('general.name') && group.id;\n        const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n        if (haveId && haveName && isApiFieldConfigName) {\n            return this.get('groupName');\n        } else {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\n        }\n    }),\n\n    mapCanRemoveParticipant(participantList) {\n        const group = this.get('group');\n        const personId = this.get('session.person.id');\n        return participantList.map(participant => {\n            const isMember = group && group.isPersonIndividual(participant);\n            const canRemove = !isMember && !this.isRoomOwner(participant) && participant.id !== personId;\n\n            Ember.set(participant, 'canBeRemovedFromRoom', canRemove);\n            return participant;\n        });\n    },\n\n    sortedParticipants: Ember.computed('participants.@each.presence', 'allowUserRemoval', function () {\n        if (this.get('allowUserRemoval')) {\n            const list = this.mapCanRemoveParticipant(this.get('participants'));\n            return this.sortChatUsers(list);\n        }\n        return this.sortChatUsers(this.get('participants'));\n    }),\n\n    skipGroupDataCheckEnabled: true,\n\n    groupName: Ember.computed.reads('group.name'),\n\n    isAdhocRoom: Ember.computed('jid', function () {\n        const jid = this.get('jid');\n        return isRoomJid(jid) && _.isEmpty(this.get('groupName'));\n    }),\n\n    isAcdRoom: Ember.computed('jid', function () {\n        return isAcdJid(this.get('jid'));\n    }),\n\n    isSupervisorRoom: Ember.computed('jid', function () {\n        return isSupervisorJid(this.get('jid'));\n    }),\n\n    isSoftphoneRoom: Ember.computed('jid', function () {\n        return isSoftphoneJid(this.get('jid'));\n    }),\n\n    isOneToOne: Ember.computed('jid', function () {\n        return this.isOneToOneRoom();\n    }),\n\n    allowUserRemoval: true,\n\n    processRoomDetails({ owners }) {\n        this.set('roomOwners', owners);\n    },\n\n    isRoomOwner(person) {\n        const group = this.get('group');\n        const isGroupOwner = !!group && group.isPersonOwner(person);\n        const personId = Ember.get(person, 'id');\n        const isOwner = this.get('roomOwners').some(owner => owner.id === personId);\n\n        return isOwner || isGroupOwner;\n    },\n\n    getRawDisplaySubject() {\n        // Get a version of the room subject that has! been decorated with markdown, for usages in places where the\n        // data will show up without being html rendered (such as mentions)\n        const group = this.get('group');\n        // we're skipping the haveGroupData check\n        if (this.get('skipGroupDataCheckEnabled')) {\n            if (group) {\n                return this.get('groupName');\n            }\n        } else if (group && haveGroupData(group)) {\n            return this.get('groupName');\n        }\n        return this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || '';\n    },\n\n    clearMessageCache() {\n        this.set('activated', false);\n        this.set('messages', []);\n        this.set('messageCache', Ember.Object.create({}));\n    },\n\n    pruneMessages() {\n        const messages = this.get('messages');\n        if (messages.length > PRUNE_SIZE) {\n            const messageCache = this.get('messageCache');\n            const splitMessageCache = this.get('splitMessageCache');\n            const removeCachedItemsCount = messages.length - PRUNE_SIZE;\n            for (let i = 0; i < removeCachedItemsCount; i++) {\n                const message = messages[i];\n\n                if (message.get('splitMessage')) {\n                    message.get('messageArray').forEach(message => {\n                        delete messageCache[message.get('id')];\n                        delete messageCache[message.get('oid')];\n                        message.destroy();\n                    });\n                    delete splitMessageCache[message.get('splitMessageId')];\n                }\n                delete messageCache[message.get('oid')];\n                delete messageCache[message.get('id')];\n                message.destroy();\n            }\n            this.set('messages', _.takeRight(messages, PRUNE_SIZE));\n            this.set('moreHistoryAvailable', true);\n            this.reconcileMessages();\n        }\n    },\n\n    addHistoryMessages(messages) {\n        if (messages && messages.length > 0) {\n            this.processHistoryModels(messages);\n        }\n    },\n\n    processHistoryModels(history) {\n        history = this.filterSeenMessages(_.uniqBy(history, 'id'));\n        this.addSelfReference(history);\n        this.insertHistory(history);\n        this.reconcileMessages();\n    },\n\n    reconcileMessages() {\n        this.sortChatMessages();\n        this.processCorrections();\n        this.processSplitMessageHistory();\n        this.markConversationBlockBoundaries();\n        this.updateFirstUnread();\n        this.updateMessageTimes();\n    },\n\n    filterSeenMessages(history) {\n        const cache = this.get('messageCache');\n        return _.filter(history, message => {\n            return !Object.prototype.hasOwnProperty.call(cache, message.get('id'));\n        });\n    },\n\n    addSelfReference(history) {\n        _.each(history, message => message.set('room', this));\n        return null;\n    },\n\n    bumpActivityCount(message) {\n        this.incrementProperty('messageActivity');\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid'))) {\n            this.incrementProperty('userActivity');\n        }\n    },\n\n    insertHistory(historyMessages) {\n        this.get('messages').unshiftObjects(historyMessages);\n\n        const cache = this.get('messageCache');\n        _.each(historyMessages, message => {\n            cache.set(message.get('id'), message);\n        });\n    },\n\n    sortChatMessages() {\n        const messages = _.sortBy(this.get('messages'), message => {\n            return message.get('time').valueOf();\n        });\n        this.set('messages', messages);\n    },\n\n    processSplitMessageHistory() {\n        const messages = this.get('messages')\n            .map(message => {\n                if (message.get('isSplitMessage')) {\n                    const splitMessage = this.processSplitMessage(message);\n                    if (splitMessage.get('messageArray.length') <= 1) {\n                        return splitMessage;\n                    }\n                    return null;\n                }\n                return message;\n            })\n            .filter(message => !!message);\n        this.set('messages', messages);\n    },\n\n    processCorrections() {\n        const messages = this.get('messages');\n        _.each(messages, message => {\n            if (message.get('corrects')) {\n                const correctedMessage = _.find(messages, m => {\n                    return m.get('id') === message.get('corrects');\n                });\n                if (correctedMessage) {\n                    correctedMessage.set('correction', message);\n                }\n            } else if (message.get('isEdited')) {\n                message.set('correction', message);\n            }\n        });\n        this.set('messages', messages);\n    },\n\n    markConversationBlockBoundaries() {\n        const messages = this.get('messages');\n\n        if (messages.length === 0) {\n            return;\n        }\n\n        _.head(messages).setProperties({\n            startOfBlock: true,\n            endOfBlock: true,\n            isLastMessage: false,\n            isYourLastMessage: false\n        });\n\n        _.last(messages).setProperties({\n            endOfBlock: true,\n            isLastMessage: true\n        });\n\n        if (messages.length === 1) {\n            const message = messages[0];\n            message.set('isYourLastMessage', message.get('isYou'));\n        }\n\n        if (messages.length === 1) {\n            return;\n        }\n\n        let isYourLastMessage = null;\n\n        for (let i = 0; i <= messages.length - 2; i++) {\n            const last = messages[i];\n            const next = messages[i + 1];\n\n            if (last.get('isYou')) {\n                isYourLastMessage = last;\n            } else {\n                last.set('isYourLastMessage', false);\n            }\n\n            if (next.get('isYou')) {\n                isYourLastMessage = next;\n            } else {\n                next.set('isYourLastMessage', false);\n            }\n\n            if (this.shouldGroupMessages(last, next)) {\n                last.set('endOfBlock', false);\n                next.set('startOfBlock', false);\n            } else {\n                last.set('endOfBlock', true);\n                next.set('startOfBlock', true);\n            }\n        }\n\n        if (isYourLastMessage) {\n            isYourLastMessage.set('isYourLastMessage', true);\n        }\n    },\n\n    updateFirstUnread() {\n        if (this.get('firstUnread')) {\n            this.set('firstUnread.firstUnread', false);\n            this.set('firstUnread', null);\n        }\n\n        const messages = this.get('messages');\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            if (message.get('unread')) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n                return;\n            }\n        }\n    },\n\n    processSplitMessage(message) {\n        const splitMessageCache = this.get('splitMessageCache');\n        const stanza = message.get('stanza.children').findBy('name', 'multipart-message');\n        const splitMessageData = JSON.parse(Ember.get(stanza, 'children.lastObject'));\n        const splitMessageParentExists = Object.prototype.hasOwnProperty.call(splitMessageCache, splitMessageData.id);\n        if (!splitMessageParentExists) {\n            const owner = Ember.getOwner(this);\n            let splitMessage = SplitMessage.create(\n                {\n                    id: message.id,\n                    oid: message.oid,\n                    from: message.from,\n                    to: message.to,\n                    time: message.time,\n                    chatUser: message.chatUser,\n                    splitMessageId: splitMessageData.id,\n                    totalMessages: splitMessageData.messageCount\n                },\n                owner.ownerInjection()\n            );\n            this.addSelfReference([splitMessage]);\n            splitMessageCache.set(splitMessageData.id, splitMessage);\n        }\n        let splitMessage = splitMessageCache.get(splitMessageData.id);\n        message.set('splitMessageIndex', splitMessageData.index);\n        splitMessage.addSplitMessage(message);\n        return splitMessage;\n    },\n\n    addMessage(message) {\n        const messages = this.get('messages');\n        const cache = this.get('messageCache');\n        const msgId = message.get('id') || message.get('oid');\n\n        this.addSelfReference([message]);\n\n        if (Object.prototype.hasOwnProperty.call(cache, msgId)) {\n            message.set('duplicate', true);\n            return;\n        }\n        cache.set(msgId, message);\n\n        if (message.get('isSplitMessage')) {\n            const splitMessage = this.processSplitMessage(message);\n            if (splitMessage.get('messageArray.length') > 1) {\n                return;\n            }\n            message = splitMessage;\n        }\n\n        const roomJid = message.get('room.jid');\n        const isSupervisor = this.get('isSupervisorRoom');\n        const isAcd = this.get('isAcdRoom');\n\n        if (!isAcd && !isSupervisor) {\n            this.bumpActivityCount(message);\n        }\n\n        if (message.get('unread') && !message.get('corrects')) {\n            if (!this.get('muted')) {\n                if (roomJid && !isAcd && !isSupervisor) {\n                    animateChatIcon();\n                }\n            }\n\n            if (!this.get('firstUnread')) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n            }\n        }\n\n        // default message to its own block\n        message.set('startOfBlock', true);\n        message.set('endOfBlock', true);\n\n        const lastMessage = _.last(messages);\n        messages.pushObject(message);\n\n        this.updateMessageTimes();\n\n        if (message.get('isYou')) {\n            const yourLast = _.findLast(messages, message => message.get('isYourLastMessage'));\n            if (yourLast) {\n                yourLast.set('isYourLastMessage', false);\n            }\n            message.set('isYourLastMessage', true);\n        }\n\n        if (!lastMessage) {\n            return;\n        }\n\n        if (message.get('time').isBefore(lastMessage.get('time'))) {\n            Ember.Logger.warn('chat-room : Message came in out of order');\n            this.reconcileMessages();\n            return;\n        }\n\n        if (message.get('corrects')) {\n            this.processCorrections();\n        }\n\n        if (this.shouldGroupMessages(lastMessage, message)) {\n            lastMessage.set('endOfBlock', false);\n            message.set('startOfBlock', false);\n        }\n    },\n\n    shouldGroupMessages(oldMessage, newMessage) {\n        return (\n            oldMessage &&\n            newMessage &&\n            oldMessage.get('from') === newMessage.get('from') &&\n            oldMessage.get('unread') === newMessage.get('unread') &&\n            !oldMessage.get('corrects') &&\n            2 >= Math.abs(newMessage.get('time').diff(oldMessage.get('time'), 'minutes'))\n        );\n    },\n\n    updateMessageTimes() {\n        const first = this.get('messages.firstObject');\n        const last = this.get('messages.lastObject');\n        const firstMessageTime = moment(first ? first.get('time') : 0);\n        const lastMessageTime = moment(last ? last.get('time') : 0);\n\n        this.setProperties({ firstMessageTime, lastMessageTime });\n        return this.updateMessageTimeRadix();\n    },\n\n    updateMessageTimeRadix() {\n        // sort messages by last message sent\n        const messages = this.get('messages');\n        const lastMessage = messages[messages.length - 1];\n        return this.set('lastMessageTimeRadix', lastMessage ? lastMessage.get('time').valueOf() : 0);\n    },\n\n    updateClosedTimeRadix() {\n        this.set('roomClosedTimeRadix', moment().valueOf());\n    },\n\n    addParticipant(person) {\n        if (person) {\n            this.get('participants').addObject(person);\n        }\n    },\n\n    removeParticipant(person) {\n        this.get('participants').removeObject(person);\n    },\n\n    clearUnreadMessages() {\n        if (this.get('firstUnread')) {\n            this.get('firstUnread').set('firstUnread', false);\n        }\n        this.set('firstUnread', null);\n        const messages = this.get('messages');\n\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            message.set('unread', false);\n        }\n\n        return this.markConversationBlockBoundaries();\n    },\n\n    isOneToOneRoom() {\n        return isPersonJid(this.get('jid'));\n    },\n\n    isGroupRoom() {\n        return isGroupJid(this.get('jid'));\n    },\n\n    isUserInRoom(userjid) {\n        return this.get('participants').findBy('jid', userjid);\n    },\n\n    clearPending(message) {\n        const existingMessage = this.get(`messageCache.${message.oid}`);\n        if (existingMessage && typeof message === 'object') {\n            existingMessage.set('id', message.id);\n            existingMessage.set('time', moment(message.time));\n            existingMessage.set('pending', false);\n\n            this.set(`messageCache.${message.oid}`, null);\n            this.set(`messageCache.${message.id}`, existingMessage);\n        }\n    },\n\n    setSendError(messageId) {\n        const message = this.get(`messageCache.${messageId}`);\n        if (message) {\n            message.set('pending', false);\n            message.set('sendError', true);\n        }\n    },\n\n    addDeferredParticipant(jid) {\n        this.get('deferredParticipants').addObject(jid);\n    },\n\n    loadDeferredParticipants() {\n        let deferred = Ember.A([...this.get('deferredParticipants')]);\n        deferred.forEach(jid => {\n            this.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    this.addParticipant(person);\n                });\n            // Semi-deferred to run loop\n            Ember.run.join(() => this.get('deferredParticipants').removeObject(jid));\n        });\n    }\n});\n\nexport default ChatRoom;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst ZERO_BITRATE_THRESHOLD = 2;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\n\n    local: false,\n    person: null,\n    audioMuted: false,\n    videoMuted: false,\n    sharingScreen: false, // deprecated. V1 only\n    major: false,\n    selected: false,\n    connectionState: null,\n    domId: null,\n    hasConnected: false,\n    inLastN: false,\n    cameraStream: null,\n    screenStream: null,\n    sessionId: null,\n    isV1: false,\n    startedVideoMuted: false, // HACK: PCDWEBK-3216; bridge doesn't play well with people who don't join with video\n    associatedInteraction: null,\n    zeroBitrateCount: 0,\n    positiveBitrateCount: 0,\n\n    name: Ember.computed('person.name', 'associatedInteraction.customerName', function () {\n        return (\n            this.get('person.name') ||\n            this.get('associatedInteraction.customerName') ||\n            this.get('intl').t('ewc.unknownParticipant')\n        );\n    }),\n\n    // HACK PCDWEBK-2982: remove when video bridge send video when you dont provide it\n    noVideoTrack: Ember.computed('cameraStream', 'isV1', function () {\n        if (this.get('isV1')) {\n            return false;\n        }\n\n        const stream = this.get('cameraStream');\n        return !(stream && stream.getVideoTracks().length);\n    }),\n\n    speaking: false,\n\n    mediaPresence: Ember.computed.reads('person.mediaPresence'),\n\n    _getInteractionAvatarDisplay() {\n        if (this.get('videoMuted')) {\n            return true;\n        }\n        return false;\n    },\n\n    showAvatar: Ember.computed(\n        'videoMuted',\n        'sharingScreen',\n        'connectionState',\n        'inLastN',\n        'isOffline',\n        'noVideoTrack',\n        'screenStream',\n        'zeroBitrateCount',\n        'positiveBitrateCount',\n        function () {\n            if (this.get('associatedInteraction')) {\n                return this._getInteractionAvatarDisplay();\n            }\n\n            const videoMuted = this.get('videoMuted');\n            const sharingScreen = this.get('sharingScreen') || this.get('screenStream');\n            const state = this.get('connectionState');\n            const isOffline = this.get('isOffline');\n            const inLastN = this.get('inLastN');\n            const noVideo = this.get('noVideoTrack') && !sharingScreen;\n            const zeroBitrateCount = this.get('zeroBitrateCount');\n\n            if (\n                _.includes(['failed', 'checking', 'starting'], state) ||\n                isOffline ||\n                noVideo ||\n                zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n            ) {\n                return true;\n            }\n            if (!inLastN) {\n                if (this.get('positiveBitrateCount') > 3) {\n                    Ember.Logger.warn('hiding avatar for !inLastN && positiveBitrateCount > 3', {\n                        remoteData: {\n                            kind: 'webrtcSession',\n                            id: this.get('person.id'),\n                            conversationId: this.get('associatedInteraction.id')\n                        }\n                    });\n                    return false;\n                }\n                return true;\n            }\n            return !sharingScreen && videoMuted;\n        }\n    ),\n\n    avatarDisplay: Ember.computed('showAvatar', function () {\n        return this.get('showAvatar') ? 'avatar-visible' : 'avatar-hidden';\n    }),\n\n    isOffline: Ember.computed('connectionState', 'person.presence', 'zeroBitrateCount', function () {\n        if (this.get('local') || this.get('associatedInteraction')) {\n            return false;\n        }\n\n        const connectionState = this.get('connectionState');\n        const presence = this.get('person.presence');\n        const hasOfflinePresence = this.get('person') && (!presence || presence === 'offline');\n        const zeroBitrateCount = this.get('zeroBitrateCount');\n\n        return (\n            connectionState === 'disconnected' ||\n            connectionState === 'interrupted' ||\n            hasOfflinePresence ||\n            zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n        );\n    }),\n\n    connectionStatus: Ember.computed('connectionState', 'isOffline', 'zeroBitrateCount', function () {\n        const intl = this.get('intl');\n        const state = this.get('connectionState');\n        if (state === 'connected' || state === 'completed') {\n            this.set('hasConnected', true);\n        }\n        if (\n            (state === 'checking' || this.get('isOffline') || this.get('zeroBitrateCount') >= ZERO_BITRATE_THRESHOLD) &&\n            this.get('hasConnected')\n        ) {\n            return intl.lookup('ewc.callStatus.recovering').toString();\n        } else if (state) {\n            return intl.lookup(`ewc.callStatus.${state}`).toString();\n        }\n    }),\n\n    canBeMuted: Ember.computed('audioMuted', 'local', 'associatedInteraction', function () {\n        return !this.get('audioMuted') && !this.get('local') && !this.get('associatedInteraction');\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    name: null,\n    markedAsRead: false,\n    actionType: null,\n    relationship: null,\n    dateStart: null,\n    lengthInMinutes: null,\n    status: null,\n\n    appointment: {\n        id: null,\n        selfUri: null,\n        isOverdue: false\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    city: DS.attr(),\n    region: DS.attr(),\n    country: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport ExternalContactsMixin from 'connections-ui/mixins/external-contacts';\nimport PersonModel from '../models/person';\nimport moment from '../utils/dates';\nimport { userGuidFromParticipant } from '../utils/conversation';\n\nconst { computed, get, inject, observer, run } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Object.extend(ExternalContactsMixin, {\n    application: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    chat: inject.service(),\n    phone: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n    names: inject.service(),\n    store: inject.service(),\n\n    id: null,\n    conversationId: null,\n    participants: null,\n    maxParticipants: 0,\n    selfUri: null,\n    acwNotes: null,\n    selectedWrapupCode: null,\n    conversationIsAConsult: false,\n    conversationInitiator: null,\n    lastPartyTalkingTo: null,\n    attemptingToCall: null,\n    webrtcSession: null,\n\n    hasDisplayedDesktopNotification: false,\n    acceptedByClient: false,\n\n    willDestroy() {\n        run.cancel(this.get('_recomputePartiesTimer'));\n        this._super(...arguments);\n    },\n\n    dialingTime: computed('isDialing', 'isContacting', 'participants.[]', function () {\n        if (this.get('isContacting')) {\n            return moment();\n        } else if (this.get('isDialing') && this.get('participants.length') > 1) {\n            return moment();\n        }\n    }),\n\n    otherPartyJid: null,\n    setOtherPartyJid: observer('onCall', 'otherPartyModel', 'otherParty', function () {\n        const promise = Ember.RSVP.resolve(this.get('otherPartyModel'));\n        promise.then(person => {\n            const isOtherPartyPerson = person instanceof PersonModel;\n            if (\n                person &&\n                isOtherPartyPerson &&\n                this.get('onCall') &&\n                this.get('otherParty') &&\n                this.get('otherParty.purpose') !== 'customer'\n            ) {\n                this.set('otherPartyJid', person.get('jid'));\n            } else {\n                this.set('otherPartyJid', null);\n            }\n        });\n    }).on('init'),\n\n    startTime: computed('myself.connectedTime', 'isDialing', 'dialingTime', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        if (this.get('isDialing') && connectedTime === undefined) {\n            return this.get('dialingTime');\n        }\n        if (!this.get('onCall')) {\n            return null;\n        }\n        if (connectedTime) {\n            return connectedTime;\n        }\n    }),\n\n    connectedDuration: computed('myself.{endTime,connectedTime}', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        const endTime = this.get('myself.endTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    }),\n\n    iAmInitiatorOfConsult: computed('conversationInitiator', 'conversationIsAConsult', 'myself', function () {\n        return this.get('conversationInitiator.userId') === this.get('myGuid');\n    }),\n\n    otherPartyThatIsNotTheInitiator: computed('participants.[]', 'conversationInitiator', 'myGuid', function () {\n        const initiator = this.get('conversationInitiator');\n        const otherParties = _.reject(this.get('participants'), party => {\n            const partyId = party && party.userId;\n            const initiatorId = initiator && initiator.userId;\n            return partyId === initiatorId || partyId === this.get('myGuid');\n        });\n        return _.last(otherParties);\n    }),\n\n    otherParticipantsThatAreNotTheInitiator: computed(\n        'participants.[]',\n        'conversationInitiator',\n        'myGuid',\n        function () {\n            const initiator = this.get('conversationInitiator');\n            const otherParties = _.reject(this.get('participants'), party => {\n                const partyId = party && party.userId;\n                const initiatorId = initiator && initiator.userId;\n                return partyId === initiatorId || partyId === this.get('myGuid');\n            });\n            return _.map(otherParties, participant => {\n                const name = participant.name || participant.aniName;\n                const model = { name };\n                return Object.assign(participant, { model });\n            });\n        }\n    ),\n\n    otherPartyThatIsNotTheInitiatorModel: computed('otherPartyThatIsNotTheInitiator', function () {\n        const guid = userGuidFromParticipant(this.get('otherPartyThatIsNotTheInitiator'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator');\n    }),\n\n    setLastPartyTalkingTo: observer('connectedParties.[]', function () {\n        const connectedParties = _.reject(this.get('connectedParties'), party => {\n            return party && party.userId === this.get('myGuid');\n        });\n        if (connectedParties.length > 0) {\n            return this.set('lastPartyTalkingTo', _.head(connectedParties));\n        }\n    }),\n\n    lastPartyTalkingToModel: computed('lastPartyTalkingTo', function () {\n        const guid = userGuidFromParticipant(this.get('lastPartyTalkingTo'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('lastPartyTalkingTo');\n    }),\n\n    consultOtherParty: computed(\n        'participants.[]',\n        'onCall',\n        'lastDisconnectedPartyModel',\n        'lastPartyTalkingToModel',\n        'otherParties.[]',\n        'conversationIsAConsult',\n        'conversationInitiator',\n        'sortedDisconnectedParties',\n        'connectedParties',\n        'iAmInitiatorOfConsult',\n        'initiatorModel',\n        'otherPartyThatIsNotTheInitiator',\n        function () {\n            const initiatorModel = this.get('initiatorModel');\n            const initiator = _.find(this.get('participants'), party => {\n                return party && party.userId === this.get('conversationInitiator.userId');\n            });\n            const initiatorCall = _.head(initiator && initiator.calls);\n            const initiatorConnected = initiatorCall && initiatorCall.state.toLowerCase() === 'connected';\n            const otherPartyThatIsNotTheInitiatorCall = this.get('otherPartyThatIsNotTheInitiator').calls[0];\n            const otherPartyThatIsNotTheInitiatorConnected =\n                otherPartyThatIsNotTheInitiatorCall.state.toLowerCase() === 'connected';\n            if (this.get('iAmInitiatorOfConsult')) {\n                if (this.get('onCall')) {\n                    return _.head(this.get('otherParties'));\n                }\n                if (this.get('connectedParties.length') < 1) {\n                    return this.get('lastDisconnectedPartyModel');\n                }\n                return _.head(this.get('connectedParties'));\n            } else {\n                if (initiatorConnected) {\n                    return initiatorModel;\n                }\n                if (otherPartyThatIsNotTheInitiatorConnected) {\n                    return this.get('otherPartyThatIsNotTheInitiatorModel');\n                }\n                if (this.get('otherPartyModel') === undefined) {\n                    return this.get('lastPartyTalkingToModel');\n                }\n                return this.get('otherPartyModel');\n            }\n        }\n    ),\n\n    consultOtherPartyModel: computed('consultOtherParty', 'participants.[]', 'onCall', function () {\n        const guid = userGuidFromParticipant(this.get('consultOtherParty'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('consultOtherParty');\n    }),\n\n    participantModels: computed('participants.[]', function () {\n        const participants = _.reject(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isTerminated = maybeLowerCase(communication.state) !== 'terminated';\n            const isNotSelf = this.get('application.session.person.guid') !== guid;\n            return isTerminated && isNotSelf;\n        });\n        return _.map(participants, participant => {\n            const guid = userGuidFromParticipant(participant);\n            const name = participant && participant.name;\n            const model = guid ? this.get('application.store').find('person', guid) : { name };\n            return Object.assign(participant, { model });\n        });\n    }),\n\n    otherPartyModel: computed('otherParty', function () {\n        const otherParty = this.get('otherParty');\n        const guid = userGuidFromParticipant(otherParty);\n        const store = this.get('application.store');\n        if (!guid) {\n            return otherParty;\n        }\n        // running phone service test in isolation always threw an Ember Error:\n        // No model was found for 'person'\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => otherParty);\n            }\n        } catch (e) {\n            personFromStore = otherParty;\n        }\n        return personFromStore;\n    }),\n\n    otherPartyNumber: computed('otherParty.address', function () {\n        const number = this.get('otherParty.address');\n        if (number && 'user' !== this.get('otherParty.purpose')) {\n            return this.get('addressformat').formatAddressForDisplay(number, null, { doLookup: true });\n        }\n    }),\n\n    otherParties: computed('participants.[]', function () {\n        const otherParties = _.filter(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const purpose = maybeLowerCase(participant.purpose);\n            const state = maybeLowerCase(communication.state);\n            const notTerminatedOrDisconnected = state !== 'terminated' && state !== 'disconnected';\n            const isSelf = this.get('myGuid') === guid;\n            const isMonitor = !!participant.monitoredParticipantId;\n            const isCoach = !!participant.coachedParticipantId;\n            const isBarge = !!participant.bargedParticipantId;\n\n            if (notTerminatedOrDisconnected && !isMonitor && !isCoach && !isBarge) {\n                return !isSelf || (isSelf && purpose !== 'user');\n            }\n            return false;\n        });\n        return otherParties;\n    }),\n\n    disconnectedParties: computed('participants.[]', 'participants.@each.endTime', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isDisconnected =\n                maybeLowerCase(communication.state) === 'disconnected' ||\n                maybeLowerCase(communication.state) === 'terminated';\n            return (\n                isDisconnected &&\n                participant.userId !== this.get('myGuid') &&\n                participant.purpose !== 'ivr' &&\n                participant.purpose !== 'group'\n            );\n        });\n    }),\n\n    sortedDisconnectedParties: computed.sort('disconnectedParties', function (a, b) {\n        return moment(b.endTime).valueOf() - moment(a.endTime).valueOf();\n    }),\n\n    lastDisconnectedPartyModel: computed('sortedDisconnectedParties', function () {\n        const last = _.last(this.get('sortedDisconnectedParties'));\n        const guid = userGuidFromParticipant(last);\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n    }),\n\n    selfIsDisconnectedOrTerminated: function () {\n        const myself = this.get('myself');\n        if (!myself) {\n            return false;\n        }\n\n        const communication = _.head(myself.calls) || _.head(myself.callbacks) || {};\n        if (!communication) {\n            return false;\n        }\n\n        const myState = maybeLowerCase(communication.state);\n        return myState === 'disconnected' || myState === 'terminated';\n    },\n\n    otherParty: computed('otherParties.[]', 'connectedParties.[]', 'onConsult', function () {\n        const useDisconnectedParties = this.selfIsDisconnectedOrTerminated();\n        let parties = useDisconnectedParties ? this.get('disconnectedParties') : this.get('connectedParties');\n\n        parties = parties.reject(\n            p =>\n                p.purpose === 'ivr' ||\n                p.purpose === 'group' ||\n                p.userId === this.get('myGuid') ||\n                !!p.coachedParticipantId ||\n                !!p.monitoredParticipantId ||\n                !!p.bargedParticipantId // Both ACD and Communicate should not display monitor/coached or barged in users\n        );\n\n        if (parties.length > 0) {\n            return parties.get('lastObject');\n        }\n        const otherParties = this.get('otherParties').reject(p => p.purpose === 'ivr' || p.purpose === 'group');\n        return otherParties.get('lastObject');\n    }),\n\n    allParties: computed('participants.[]', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.state && communication.state !== 'terminated';\n        });\n    }),\n\n    connectedParties: computed('participants.[]', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return maybeLowerCase(communication.state) === 'connected';\n        });\n    }),\n\n    connectedOnConsult: computed('connectedParties.[]', function () {\n        return _.reject(this.get('connectedParties'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.confined === 'true';\n        });\n    }),\n\n    callParties: computed('onConference', 'onConsult', 'allParties.[]', 'otherParties.[]', 'otherParty', function () {\n        if (!this.get('onConference')) {\n            return this.get('onConsult') ? this.get('otherParties') : [this.get('otherParty')];\n        }\n        const firstCall = party => _.head(party.calls) || _.head(party.callbacks);\n        const isDisconnected = call =>\n            call && (call.state.toLowerCase() === 'disconnected' || call.state.toLowerCase() === 'terminated');\n        const sortedParties = this.get('allParties').sort((a, b) => {\n            const state = 'disconnected';\n            const callStateA = _.head(a.calls).state.toLowerCase() === state ? 0 : 1;\n            const callStateB = _.head(b.calls).state.toLowerCase() === state ? 0 : 1;\n            return callStateA - callStateB;\n        });\n        const parties = _.reject(sortedParties, party => {\n            const disconnected = isDisconnected(firstCall(party));\n            return disconnected && moment().isAfter(moment(party.endTime).add(20, 'seconds'));\n        });\n        const arePartiesDisconnected = _.some(parties, party => {\n            return isDisconnected(firstCall(party));\n        });\n        if (arePartiesDisconnected) {\n            const timer = run.debounce(this, this.recomputeParties, 12000);\n            this.set('_recomputePartiesTimer', timer);\n        }\n        return parties;\n    }),\n\n    otherDisconnectedParty: computed(\n        'participants.[]',\n        'conversationIsAConsult',\n        'iAmInitiatorOfConsult',\n        'lastPartyTalkingToModel',\n        'sortedDisconnectedParties',\n        function () {\n            const isConsult = this.get('conversationIsAConsult');\n            if (isConsult && !this.get('iAmInitiatorOfConsult')) {\n                return this.get('lastPartyTalkingToModel');\n            }\n            const otherParties = _.filter(this.get('participants'), party => {\n                const guid = userGuidFromParticipant(party);\n                const isSelf = guid === this.get('myGuid');\n                const isOngoing = party.endTime === undefined;\n                const isGroup = party.purpose === 'group';\n                const isStation = party.purpose === 'station';\n                const isIvr = party.purpose === 'ivr';\n                return !isSelf && (isConsult ? isOngoing : true) && !isGroup && !isStation && !isIvr;\n            });\n            if (otherParties.length > 1) {\n                /**\n                 * When group ring call ends, there's a period where the endTime properties are set on some\n                 * of the participants but not all. This can cause the display to be incorrect.\n                 */\n                const otherPartiesNoEndTime = otherParties.filter(otherParty => !Ember.get(otherParty, 'endTime'));\n                return _.head(otherPartiesNoEndTime);\n            }\n\n            return _.head(otherParties);\n        }\n    ),\n\n    otherDisconnectedPartyModel: computed('otherDisconnectedParty', function () {\n        const participant = this.get('otherDisconnectedParty');\n        if (participant) {\n            if (get(participant, 'purpose') === 'acd') {\n                return this.get('application.store').find('queue', participant.queueId);\n            }\n            const guid = userGuidFromParticipant(participant);\n            return guid ? this.get('application.store').find('person', guid) : participant;\n        }\n    }),\n\n    recomputeParties() {\n        return this.notifyPropertyChange('callParties');\n    },\n\n    initiator: computed(\n        'participants.[]',\n        'otherParties.[]',\n        'onConsult',\n        'participants.@each.consultParticipantId',\n        function () {\n            return _.find(this.get('participants'), party => {\n                const initiator = get(party, 'attributes.consultInitiator');\n                return initiator === 'true' || initiator === true;\n            });\n        }\n    ),\n\n    initiatorModel: computed('conversationInitiator', 'initiator', function () {\n        const participant = this.get('conversationInitiator');\n        const guid = userGuidFromParticipant(participant);\n        return guid ? this.get('application.store').find('person', guid) : participant;\n    }),\n\n    isDisconnectedQueueCall: computed('otherDisconnectedParty', function () {\n        return this.get('otherDisconnectedParty.purpose') === 'acd';\n    }),\n\n    setConsultInitiator: observer('initiator', 'conversationIsAConsult', function () {\n        const initiator = this.get('initiator');\n        if (!_.isEmpty(initiator) && this.get('conversationIsAConsult')) {\n            return this.set('conversationInitiator', initiator);\n        }\n    }),\n\n    nonInitiatorNumber: computed('otherParties.[]', 'onConsult', 'myself', function () {\n        const myConsultId = this.get('myself.consultParticipantId');\n        const consultParty = _.filter(this.get('otherParties'), party => {\n            return party.id === myConsultId;\n        });\n        const nonInitiator = _.last(consultParty);\n        return this.get('addressformat').formatAddressForDisplay(nonInitiator.address);\n    }),\n\n    hasActiveAgent: computed('participants.@each.purpose', 'myGuid', function () {\n        // Check to see if the current user has an agent participant\n        // that is not currently wrapped up.\n        return _.some(this.get('participants'), participant => {\n            const isMe = this.get('myGuid') === userGuidFromParticipant(participant);\n            const isAgent = participant.purpose.toLowerCase() === 'agent';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            return isMe && isAgent && needsWrapup;\n        });\n    }),\n\n    myGuid: computed.reads('session.person.guid'),\n    myself: computed('participants.[]', 'myGuid', 'hasActiveAgent', function () {\n        const hasActiveAgent = this.get('hasActiveAgent');\n        return _.findLast(this.get('participants'), participant => {\n            const isMe = this.get('myGuid') === userGuidFromParticipant(participant);\n            const purpose = (participant.purpose || '').toLowerCase();\n            const isAgent = purpose === 'agent';\n            const isUser = purpose === 'user';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            let isAlerting = false;\n\n            try {\n                const state = participant.calls[0].state.toLowerCase();\n                isAlerting = state === 'alerting';\n            } catch (e) {\n                isAlerting = false;\n            }\n\n            // If the user has an unwrapped up agent participant, set that as their\n            // current participant.\n            if (hasActiveAgent) {\n                return isMe && isAgent && (needsWrapup || isAlerting);\n            }\n\n            // Otherwise, we just use the last participant for the user\n            // to represent their state.\n            return isMe && (isAgent || isUser);\n        });\n    }),\n\n    myselfIsMonitor: computed.bool('myself.monitoredParticipantId'),\n    myselfIsCoach: computed.bool('myself.coachedParticipantId'),\n\n    myselfIsBarged: computed('myself.bargedParticipantId', function () {\n        const bargedParticipantId = this.get('myself.bargedParticipantId');\n        const bargedParticipant =\n            (this.get('participants') || []).find(participant => participant.id === bargedParticipantId) || {};\n\n        const disconnectType = get(bargedParticipant, 'calls.firstObject.disconnectType');\n        return bargedParticipantId && !disconnectType;\n    }),\n\n    myselfIsMCB: computed.or('myselfIsMonitor', 'myselfIsCoach', 'myselfIsBarged'),\n\n    monitoredParticipant: computed('myselfIsMonitor', 'myself.monitoredParticipantId', 'allParties', function () {\n        if (this.get('myselfIsMonitor')) {\n            return this.get('allParties').findBy('id', this.get('myself.monitoredParticipantId'));\n        }\n        return null;\n    }),\n\n    coachedParticipant: computed('myselfIsCoach', 'myself.coachedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsCoach')) {\n            return this.get('allParties').findBy('id', this.get('myself.coachedParticipantId'));\n        }\n        return null;\n    }),\n\n    bargedParticipant: computed('myselfIsBarged', 'myself.bargedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsBarged')) {\n            return this.get('allParties').findBy('id', this.get('myself.bargedParticipantId'));\n        }\n        return null;\n    }),\n\n    monitoredParticipantPerson: computed('monitoredParticipant', function () {\n        const monitoredParticipant = this.get('monitoredParticipant');\n        const guid = userGuidFromParticipant(monitoredParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return monitoredParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => monitoredParticipant);\n            }\n        } catch (e) {\n            personFromStore = monitoredParticipant;\n        }\n        return personFromStore;\n    }),\n\n    coachedParticipantPerson: computed('coachedParticipant', function () {\n        const coachedParticipant = this.get('coachedParticipant');\n        const guid = userGuidFromParticipant(coachedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return coachedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => coachedParticipant);\n            }\n        } catch (e) {\n            personFromStore = coachedParticipant;\n        }\n        return personFromStore;\n    }),\n    bargedParticipantPerson: computed('bargedParticipant', function () {\n        const bargedParticipant = this.get('bargedParticipant');\n        const guid = userGuidFromParticipant(bargedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return bargedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => bargedParticipant);\n            }\n        } catch (e) {\n            personFromStore = bargedParticipant;\n        }\n        return personFromStore;\n    }),\n\n    isAgentCall: computed('participants.[]', 'myself', 'myselfIsMCB', function () {\n        const isSelfMCB = this.get('myselfIsMCB');\n\n        // Otherwise, if there is another agent on the call, I want to view this conversation in ACD.\n        const participants = this.get('participants') || [];\n        return participants.some(user => maybeLowerCase(user.purpose) === 'agent') || isSelfMCB;\n    }),\n\n    isAfterCallWorkCompleted: computed('myself.wrapup', 'myself.wrapupRequired', function () {\n        const result = this.get('myself.wrapup') || !this.get('myself.wrapupRequired');\n        return result;\n    }),\n\n    isAfterCallWorkForcedTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n    }),\n    isAfterCallWorkTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'timeout';\n    }),\n\n    canUseCommunicationACW: true,\n\n    isWrapupPromptAgentRequested: computed(\n        'myself.{wrapupPrompt,wrapupTimeoutMs}',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('canUseCommunicationACW')) {\n                const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n                return !!this.get('myself.wrapupTimeoutMs') && prompt === 'agentrequested';\n            } else {\n                return false;\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: computed.or(\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout'\n    ),\n\n    isAfterCallWorkMandatory: computed('myself.wrapupPrompt', 'isNonDiscretionaryCompletion', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return prompt === 'mandatory' || this.get('isNonDiscretionaryCompletion');\n    }),\n\n    callState: computed.reads('myself.calls.firstObject'),\n    peerDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'peer';\n    }),\n\n    myselfDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'client';\n    }),\n\n    errorInfo: computed.reads('callState.errorInfo'),\n    errorInfoMessage: computed.reads('errorInfo.message'),\n\n    isIncoming: computed('callState.state', function () {\n        return maybeLowerCase(this.get('callState.state')) === 'alerting';\n    }),\n\n    isDialing: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting' || state === 'contacting' || state === 'dialing';\n    }),\n\n    isRinging: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting';\n    }),\n\n    isDialingOrContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting' || state === 'dialing';\n    }),\n\n    isContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting';\n    }),\n\n    justMyselfOnCall: computed('participants.[]', 'myGuid', 'isContacting', function () {\n        const iAmContacting =\n            this.get('participants.firstObject.userId') === this.get('myGuid') && this.get('isContacting');\n        return this.get('participants').length === 1 && iAmContacting;\n    }),\n\n    theOtherPartyWhileContacting: computed('justMyselfOnCall', 'attemptingToCall', function () {\n        if (!this.get('justMyselfOnCall')) {\n            return;\n        }\n        const address = this.get('attemptingToCall');\n        if (address) {\n            const userId = Ember.get(address, 'userId');\n            const calls = [{ state: 'ALERTING' }];\n            return { userId, address, calls };\n        }\n    }),\n\n    isOutbound: computed('callState.direction', function () {\n        const direction = this.get('callState.direction');\n        return maybeLowerCase(direction) === 'outbound';\n    }),\n\n    isMissed: computed('callState.segments', 'isOutbound', function () {\n        const segments = this.get('callState.segments');\n        if (_.size(segments) === 1 && !this.get('isOutbound')) {\n            const segment = _.last(segments);\n            const { type, howEnded } = segment;\n            const lowType = type.toLowerCase();\n            const endedWithDisconnect = maybeLowerCase(howEnded) === 'disconnect';\n            return (lowType === 'dialing' || lowType === 'alert') && endedWithDisconnect;\n        }\n        return false;\n    }),\n\n    isActive: computed('phone.activeCall', function () {\n        return this.get('id') === this.get('phone.activeCall.id');\n    }),\n\n    isHeld: computed.and('callState.held', 'onCall'),\n    isConfined: computed.and('callState.confined', 'onCall', 'onConsult'),\n    isMuted: computed.and('callState.muted', 'onCall'),\n    isRecording: computed.and('callState.recording', 'onCall'),\n    isDisconnected: computed.not('onCall'),\n    wentToVoicemail: computed('allParties.@each.purpose', function () {\n        const parties = this.get('allParties');\n        if (!parties) {\n            return false;\n        }\n        const voicemail = parties.findBy('purpose', 'Voicemail') || parties.findBy('purpose', 'voicemail');\n        return !_.isEmpty(voicemail);\n    }),\n\n    voicemailParties: computed('wentToVoicemail', function () {\n        return _.filter(this.get('allParties'), party => {\n            return party && party.purpose === 'voicemail';\n        });\n    }),\n\n    onCall: computed('callState', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state !== 'disconnected' && state !== 'terminated';\n    }),\n\n    isConnected: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'connected';\n    }),\n\n    onConsult: computed('otherParties.@each.calls', function () {\n        const others = this.get('otherParties');\n        const consultParties = others.filter(other => !!other.consultParticipantId);\n        if (consultParties.length !== 2) {\n            return false;\n        }\n        const found = _.find(others, other => other.consultParticipantId);\n        return !_.isEmpty(found);\n    }),\n\n    markCallAsConsult: observer('onConsult', 'participants.@each.consultParticipantId', 'participants.[]', function () {\n        const consult = _.find(this.get('participants'), participant => {\n            return participant.consultParticipantId;\n        });\n        if (this.get('onConsult') || consult) {\n            return this.set('conversationIsAConsult', true);\n        }\n    }),\n\n    /**\n     * @deprecated use `isActiveConference` from the interaction model instead\n     */\n    onConference: computed('maxParticipants', function () {\n        return this.get('maxParticipants') > 0;\n    }),\n\n    canUpdateConsult: computed('onConsult', 'participants.@each.attributes', function () {\n        const person = this.get('application.session.person');\n        const initiator = _.find(this.get('participants'), participant => {\n            const initiator = participant.attributes.consultInitiator;\n            return initiator === 'true' || initiator === true;\n        });\n        return get(initiator, 'userId') === person.get('guid');\n    }),\n\n    groupRingId: computed('participants.@each.purpose', function () {\n        // grab most recent group participant with endTime\n        // if no endTime, then that group participant is most recent\n        let mostRecentEndTime = null;\n        let groupParticipant = null;\n        for (const participant of this.get('participants')) {\n            const groupId = get(participant, 'groupId') || get(participant, 'group.id');\n            if (groupId) {\n                const currentTimestamp = moment(get(participant, 'endTime'));\n                // Compare with the current most recent timestamp\n                if (mostRecentEndTime === null || currentTimestamp.isAfter(mostRecentEndTime)) {\n                    mostRecentEndTime = currentTimestamp;\n                    groupParticipant = participant;\n                }\n            }\n        }\n        if (groupParticipant) {\n            return groupParticipant.groupId;\n        }\n        return null;\n    }),\n\n    isGroupRing: computed('groupRingId', function () {\n        return !!this.get('groupRingId');\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        const groupId = this.get('groupRingId');\n        if (groupId) {\n            let promise = this.get('application.store').findRecord('group', groupId, {\n                reload: false,\n                backgroundReload: false\n            });\n            return DS.PromiseObject.create({ promise });\n        }\n    }),\n\n    _groupRingCaller: computed('isGroupRing', 'participants', 'connectedParties.@each.purpose', function () {\n        if (!this.get('isGroupRing')) {\n            return null;\n        }\n\n        // We are going to mimic the callv2 behavior, for consistency\n        let participants = this.get('participants');\n        const outboundParticipant = participants.findBy('calls.firstObject.direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const externalParticipants = participants\n            .reject(p => {\n                return Ember.get(p, 'dnis') === 'unknown';\n            })\n            .filter(p => p.purpose === 'external' || p.purpose === 'customer');\n        const inboundExternal = externalParticipants.findBy('calls.firstObject.direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', '_groupRingCaller', 'myGuid', function () {\n        return this.get('isOutbound') && this.get('_groupRingCaller.userId') === this.get('myGuid');\n    }),\n\n    groupRingCaller: computed('_groupRingCaller', function () {\n        const actualCaller = this.get('_groupRingCaller');\n        let caller = actualCaller;\n\n        if (caller && caller.userId) {\n            let promise = this.get('store').findRecord('person', caller.userId, {\n                reload: false,\n                backgroundReload: false\n            });\n            caller = DS.PromiseObject.create({ promise });\n        }\n        return caller;\n    }),\n\n    connectedToStationAndNotConference: computed('participants.[]', 'onConference', function () {\n        const participants = this.get('participants');\n        const anotherPartyIsStation = !!participants.find(p => {\n            const isStation = Ember.get(p, 'purpose') === 'station';\n            if (!isStation) {\n                return false;\n            }\n            const isStandaloneStation = Ember.get(p, 'name');\n            if (isStandaloneStation) {\n                return false;\n            }\n            return Ember.get(p, 'calls.firstObject.disconnectType') !== 'transfer.forward';\n        });\n        const anotherPartyIsVoicemail = !!participants.findBy('purpose', 'voicemail');\n        return anotherPartyIsStation && !this.get('onConference') && !anotherPartyIsVoicemail;\n    }),\n\n    _doesParticipantHaveActiveSessionShare: function (participant) {\n        const screenShares = Ember.get(participant, 'screenShares') || Ember.get(participant, 'screenshares');\n        const cobrowsesessions = Ember.get(participant, 'cobrowsesessions');\n        const videos = Ember.get(participant, 'videos');\n\n        let allMedia = [];\n        if (screenShares) {\n            allMedia = allMedia.concat(screenShares);\n        }\n        if (cobrowsesessions) {\n            allMedia = allMedia.concat(cobrowsesessions);\n        }\n        if (videos) {\n            allMedia = allMedia.concat(videos);\n        }\n\n        let connectedMedia = _.find(allMedia, media => media.state.toLowerCase() === 'connected');\n        return !!connectedMedia;\n    },\n\n    agentParticipants: computed('participants.[]', 'myGuid', function () {\n        return _.filter(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const purpose = participant.purpose.toLowerCase();\n            return this.get('myGuid') === guid && (purpose === 'agent' || purpose === 'user');\n        });\n    }),\n\n    conversationHasActiveSessionShare: computed('agentParticipants.[]', function () {\n        let hasActiveMedia = _.some(this.get('agentParticipants'), participant => {\n            return this._doesParticipantHaveActiveSessionShare(participant);\n        });\n        return hasActiveMedia;\n    })\n});\n","define(\"connections-ui/models/conversation\", [\"exports\", \"ember-purecloud-components/models/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    homeDivision: DS.attr('boolean')\n});\n","define(\"connections-ui/models/email-communication\", [\"exports\", \"ember-purecloud-components/models/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\n","import TranslationModel from 'ember-intl/models/translation';\n\n/* Allows support for both dot-separated keys and nested objects in the dictionary\n * For example, all of the following are supported\n       {\n            'greeting': \"Hello!\",\n            \"error\": {\n                \"catastrophic.failure\": \"The world has ended.\"\n            },\n            \"my.favorite.color\": \"fuchsia\"\n       }\n*/\nexport default TranslationModel.extend({\n    addTranslation(key, value) {\n        this.get('translations')[key] = value;\n    },\n    getValue(key) {\n        if (key) {\n            let segments = key.split('.');\n            let level = this.get('translations');\n            let i = 0;\n\n            for (i = 0; i < segments.length; i++) {\n                let value = level[segments.slice(i).join('.')];\n\n                if (typeof value === 'string') {\n                    return value;\n                }\n\n                let segment = segments[i];\n\n                if (Object.prototype.hasOwnProperty.call(level, segment)) {\n                    level = level[segment];\n                } else {\n                    break;\n                }\n            }\n        }\n\n        return undefined;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    agent: null,\n    agentHasRead: null,\n    assignedDate: null,\n    releaseDate: null,\n    changedDate: null,\n    conversation: null,\n    evaluationForm: null,\n    evaluator: null,\n    status: null,\n    redacted: false,\n    selected: false,\n    rescore: false,\n    mediaType: [],\n    conversationDate: null,\n    assignee: null,\n    dateAssigneeChanged: null,\n    declinedReview: false,\n\n    displayThumbnail: Ember.computed('agent.userImages', function () {\n        if (this.get('agent.userImages.length')) {\n            return this.get('agent.userImages.firstObject');\n        }\n        return { imageUri: null };\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\n\nexport default DS.Model.extend(EntityMixin, {\n    title: computed('general.title.@each.value', function () {\n        const field = this.getFieldValue('general.title');\n        return field && field.value;\n    }),\n\n    department: computed('general.department.@each.value', function () {\n        const field = this.getFieldValue('general.department');\n        return field && field.value;\n    }),\n\n    organization: computed('general.organization.@each.value', function () {\n        const field = this.getFieldValue('general.organization');\n        return field && field.value;\n    }),\n\n    description: computed('general.notes.@each.value', function () {\n        const field = this.getFieldValue('general.notes')[0];\n        return field && field.value;\n    }),\n\n    phone: computed('contactInfo.phone.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.phone');\n        return field && field[0];\n    }),\n\n    email: computed('contactInfo.email.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.email');\n        return field && field.value;\n    })\n});\n","import DS from 'ember-data';\n\n// This is like a \"union\" type pf the various Relate domain messaging ID types (see the FacebookId, LineId, TwitterId\n// and WhatsApp domain classes in the Relate contact-service project).\n//\n// Also refer to the *_id models in this directory\n//\n// An Ember DS record of this type is built from the inbound message to help detect changes between the message's info, and\n// channel info from an external contact in Relate for the same channel.\nexport default DS.Model.extend({\n    type: DS.attr('string'), // Meta info about the channel\n    channelIdProperty: DS.attr('string'), // Meta info about the domain class property name for the channel (e.g. \"lineId\" or \"twitterId\")\n    isNewChannel: DS.attr('boolean'), // Meta info -- true if this is a new channel for an external contact\n    changesIgnoredByAgent: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they elected to ignore\n    agentRespondedToPrompt: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they responded\n    userId: DS.attr('string'), // The ID of the user from the channel\n    ids: DS.attr(), // An array of strings representing an array of user IDs for the channel (for Facebook or LINE)\n    name: DS.attr('string'), // The name of the user (for Twitter)\n    displayName: DS.attr('string'), // For display name of the user (for LINE, Facebook, and WhatsApp)\n    screenName: DS.attr('string'), // The screen name (AKA handle) of the user (for Twitter)\n    phoneNumber: DS.attr() // Includes e164: an e164-formatted phone number, and display: a display-friendly phone number (for Whatsapp),\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    channelId: DS.attr('string'),\n    isNewChannel: DS.attr('boolean')\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../../utils/dates';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport const PreferredPhoneContactOrder = ['workPhone', 'homePhone', 'cellPhone', 'otherPhone', 'whatsAppId'];\nexport const PreferredEmailContactOrder = ['workEmail', 'personalEmail', 'otherEmail'];\nexport const ENTITY_TYPE = 'externalcontacts/contact';\n\nconst { computed } = Ember;\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    names: Ember.inject.service(),\n    schemaService: Ember.inject.service('schema'),\n    schemaType: 'contact',\n    type: ENTITY_TYPE,\n    externalDataSources: DS.attr(),\n    externalOrganizationId: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    firstName: DS.attr('string'),\n    middleName: DS.attr('string'),\n    lastName: DS.attr('string'),\n    title: DS.attr('string'),\n    address: DS.attr(),\n    workPhone: DS.attr(),\n    cellPhone: DS.attr(),\n    homePhone: DS.attr(),\n    otherPhone: DS.attr(),\n    workEmail: DS.attr('string'),\n    personalEmail: DS.attr('string'),\n    otherEmail: DS.attr('string'),\n    twitterId: DS.attr(),\n    lineId: DS.attr(),\n    facebookId: DS.attr(),\n    whatsAppId: DS.attr(),\n    surveyOptOut: DS.attr('boolean', { defaultValue: false }),\n\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    division: DS.attr(),\n\n    contactType: DS.attr(),\n    mergedTo: DS.attr(),\n    mergedFrom: DS.attr(),\n    canonicalContact: DS.attr(),\n    mergeSet: DS.attr(),\n\n    isCurated: computed('contactType', function () {\n        return this.get('contactType') === 'curated';\n    }),\n    isIdentified: computed('contactType', function () {\n        return this.get('contactType') === 'identified';\n    }),\n\n    canonicalId: computed.alias('canonicalContact.id'),\n    divisionName: computed.alias('division.name'),\n    isCanonical: computed('id', 'canonicalId', function () {\n        const { canonicalId, id } = this.getProperties('canonicalId', 'id');\n        return canonicalId === id;\n    }),\n\n    phoneNumber: null, // Set by the entity-mini/external-contact/component as the phone number the user selected\n    phoneType: null, // Set by the entity-mini/external-contact/component as the phone numbers type the user selected\n    externalOrganization: DS.belongsTo('externalcontacts/externalOrganization', { async: false }),\n    externalSystemUrl: DS.attr('string'),\n\n    createdDate: computed('createDate', function () {\n        return moment(this.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('modifyDate')).format('L');\n    }),\n\n    hasEmailAddresses: Ember.computed.bool('bestEmailAddress'),\n\n    //these aliases are used to aid in validation.\n    address1: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    isSalesForce: computed.bool('salesforceLink'),\n    acdOutboundWhatsApp: true,\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey =\n                phoneName === 'whatsAppId' ? phoneName.replace('Id', 'Number') : phoneName.replace('Phone', 'Number');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    initials: computed('firstName', 'lastName', function () {\n        return this.get('names').initials(this);\n    }),\n    name: computed('firstName', 'lastName', 'middleName', function () {\n        return this.get('names').fullName(this);\n    }),\n    /**\n     * Gets the best email available for this contact, or undefined if there is none\n     */\n    bestEmailAddress: computed(...PreferredEmailContactOrder, function () {\n        const preferredEmailType = this._bestEmailType();\n        return preferredEmailType ? this.get(preferredEmailType) : null;\n    }),\n\n    /**\n     * Gets the best email type available for this contact, or undefined if there is none\n     */\n    bestEmailType: computed(...PreferredEmailContactOrder, function () {\n        return this._bestEmailType();\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumber: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return this.get('acdOutboundWhatsApp') && phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.e164`) || this.get(`${phoneType}.phoneNumber.display`)\n            : this.get(`${phoneType}.e164`) || this.get(`${phoneType}.display`);\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumberDisplay: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.display`) || this.get(`${phoneType}.phoneNumber.e164`)\n            : this.get(`${phoneType}.display`) || this.get(`${phoneType}.e164`);\n    }),\n\n    /**\n     * Gets the best phone type localized string available for this contact, or undefined if there is none\n     */\n    bestPhoneType: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        if (bestPhoneType === 'whatsAppId')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return bestPhoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${bestPhoneType}`)\n            : undefined;\n    }),\n\n    /**\n     * Gets the best phone type parameter key available for this contact, or undefined if there is none\n     */\n    bestPhoneTypeKey: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return bestPhoneType ? bestPhoneType : undefined;\n    }),\n\n    adapterDidCommit() {\n        return; // Does nothing but prevent \"TypeError: _this.adapterDidCommit is not a function(�)\" when canceling an edit due to a EntityMixin call to that method\n    },\n\n    getEmailTitleFor(emailType) {\n        return emailType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`)\n            : this.get('intl').t('purecloud.acdInteraction.relate.emailTypes.otherEmail');\n    },\n\n    getPhoneTitleFor(phoneType) {\n        if (phoneType === 'whatsAppId')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return phoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${phoneType}`)\n            : this.get('intl').t('purecloud.acdInteraction.relate.phoneTypes.otherPhone');\n    },\n\n    _bestEmailType() {\n        return PreferredEmailContactOrder.find(emailType => this.get(emailType));\n    },\n\n    _bestPhoneType(types) {\n        return (\n            this.get('phoneType') ||\n            types.find(type => {\n                return this.get(`${type}.e164`) || this.get(`${type}.display`);\n            }) ||\n            types.find(type => {\n                return this.get(`${type}.phoneNumber.e164`) || this.get(`${type}.phoneNumber.display`);\n            })\n        );\n    },\n\n    hasEmailAddress(address) {\n        return PreferredEmailContactOrder.some(emailType => this.get(emailType) && this.get(emailType) === address);\n    },\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        if (this.get('canShowCustomFields') && id) {\n            return await this.get('schemaService')\n                .getSchema(schemaType, id)\n                .catch(() => {\n                    return SERVICE_ERROR;\n                });\n        } else {\n            return '';\n        }\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData && schemaData !== SERVICE_ERROR ? schemaData.get('name') : schemaData;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport moment from '../../utils/dates';\n\nconst { computed } = Ember;\nexport const PreferredPhoneContactOrder = ['phoneNumber', 'faxNumber'];\nconst getSetter = function (index) {\n    return {\n        get() {\n            const websites = this.get('websites');\n            return websites ? websites[index] : null;\n        },\n        set(key, value) {\n            const websites = this.get('websites');\n            websites[index] = value;\n            return websites[index];\n        }\n    };\n};\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    isOrganization: true,\n    schemaService: Ember.inject.service('schema'),\n    schemaType: 'external-org',\n    type: 'externalcontacts/externalOrganization',\n    name: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    companyType: DS.attr('string'),\n    industry: DS.attr('string'),\n    primaryContactId: DS.attr('string'),\n    address: DS.attr(),\n    phoneNumber: DS.attr(),\n    faxNumber: DS.attr(),\n    employeeCount: DS.attr('number'),\n    revenue: DS.attr('number'),\n    tags: DS.attr(),\n    tickers: DS.attr(),\n    websites: DS.attr(),\n    twitterId: DS.attr(),\n    contact: DS.hasMany('externalcontacts/contact', { async: false }),\n    externalDataSources: DS.attr(),\n    externalSystemUrl: DS.attr('string'),\n    isSalesForce: computed.bool('salesforceLink'),\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey = phoneName.replace('Number', '');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    createdDate: computed('createDate', function () {\n        return moment(this.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('modifyDate')).format('L');\n    }),\n\n    website1: computed('websites.[]', getSetter.call(this, 0)),\n    website2: computed('websites.[]', getSetter.call(this, 1)),\n    //these aliases are used to aid in validation.\n\n    address1: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        return this.get('canShowCustomFields') && id ? await this.get('schemaService').getSchema(schemaType, id) : '';\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData ? schemaData.get('name') : '';\n    })\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const FACEBOOKID_TYPE = 'externalcontacts/facebook-id';\n\nexport default Channel.extend({\n    type: 'facebook',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const LINEID_TYPE = 'externalcontacts/line-id';\n\nexport default Channel.extend({\n    type: 'line',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const TWITTERID_TYPE = 'externalcontacts/twitter-id';\n\nexport default Channel.extend({\n    type: 'twitter',\n    id: DS.attr('string'),\n    name: DS.attr('string'),\n    screenName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const WHATSAPP_TYPE = 'externalcontacts/whatsapp-id';\n\nexport default Channel.extend({\n    type: 'whatsapp',\n    displayName: DS.attr('string'),\n    phoneNumber: DS.attr() // includes e164: an e164-formatted phone number, and display: a display-friendly phone number\n});\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n\n    id: null,\n    name: null,\n    dateCreated: null,\n    dateModified: null,\n    contentUri: null,\n    workspace: null,\n    createdBy: null,\n    contentType: null,\n    contentLength: null,\n    filename: null,\n    read: false,\n    thumbnails: null,\n    selfUri: null,\n    callerAddress: '',\n    receiverAddress: '',\n    selected: false,\n\n    isDefaultName: computed('name', 'callerAddress', function () {\n        let name = this.get('name');\n        if (!name) {\n            return false;\n        }\n        return name.toLowerCase().indexOf('fax from ') === 0;\n    }),\n\n    faxName: computed('isDefaultName', 'name', 'callerAddress', function () {\n        if (this.get('isDefaultName')) {\n            return this.get('intl')\n                .t('notification.inbox.faxFrom', { callerAddress: this.get('callerAddress') })\n                .toString();\n        }\n        return this.get('name');\n    }),\n\n    faxFrom: computed('callerAddress', 'createdBy', function () {\n        const callerAddress = this.get('callerAddress');\n        if (callerAddress) {\n            return callerAddress;\n        }\n        return this.get('intl').lookup('notification.inbox.unknownSender');\n    }),\n\n    faxFile: computed('filename', 'name', function () {\n        const name = this.get('name');\n        if (name) {\n            return name;\n        }\n        return this.get('filename');\n    }),\n    displayThumbnail: computed('thumbnails.[]', function () {\n        const thumbnails = this.get('thumbnails');\n        return (\n            thumbnails[0] || {\n                imageUri: null\n            }\n        );\n    }),\n    /**\n     *  Converts 'this' into an object that can be passed to the faxes standalone app\n     * @returns An object with all of the properties of 'this' that are specified in props\n     */\n    getProperties: function () {\n        const props = [\n            'id',\n            'name',\n            'dateCreated',\n            'dateModified',\n            'contentUri',\n            'workspace',\n            'createdBy',\n            'contentType',\n            'contentLength',\n            'filename',\n            'read',\n            'thumbnails',\n            'pageCount',\n            'selfUri',\n            'callerAddress',\n            'receiverAddress',\n            'selected'\n        ];\n        return props.reduce((accumulator, prop) => {\n            return Object.assign(accumulator, { [prop]: this.get(prop) });\n        }, {});\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    enabled: DS.attr()\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    longitude: DS.attr(),\n    latitude: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, observer } = Ember;\n\nconst ISSUE_REGEX = /http(?:s)?:\\/\\/github\\.com\\/[a-zA-Z0-9_\\-.]+\\/[a-zA-Z0-9\\-.]+\\/issues\\/([0-9]+)$/i;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    preferences: inject.service(),\n\n    mediaType: null,\n\n    username: null,\n    url: null,\n    repo: null,\n    link: null,\n\n    data: null,\n\n    settings: {},\n    showEmbedConfirmation: false,\n\n    init() {\n        this._super(...arguments);\n\n        this.get('preferences.widgets.githubRepo'); // setup observer\n\n        this.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .then(settings => {\n                if (settings === undefined) {\n                    this.set('showEmbedConfirmation', true);\n                } else {\n                    let showEmbed = false;\n                    if (settings.showEmbedConfirmation === undefined) {\n                        showEmbed = true;\n                    }\n                    this.set('settings', settings);\n                    this.set('showEmbedConfirmation', showEmbed);\n                }\n            });\n    },\n\n    isRepo: computed.equal('mediaType', 'github-repo'),\n    isGist: computed.equal('mediaType', 'github-gist'),\n\n    isIssue: computed('link', 'isRepo', function () {\n        if (!this.get('isRepo')) {\n            return false;\n        }\n\n        return ISSUE_REGEX.test(this.get('link'));\n    }),\n\n    issueNumber: computed('link', function () {\n        return _.last(this.get('link').match(ISSUE_REGEX));\n    }),\n\n    title: computed('username', 'repo', 'isRepo', 'isGist', 'isIssue', function () {\n        const intl = this.get('intl');\n        const username = this.get('username');\n        if (this.get('isGist')) {\n            return intl.t('chat.inlineMedia.gistTitle', { username }).toString();\n        } else if (this.get('isRepo')) {\n            const repo = this.get('repo');\n            if (this.get('isIssue')) {\n                const issue = this.get('issueNumber');\n                return intl.t('chat.inlineMedia.githubIssueTitle', { issue, repo }).toString();\n            }\n            return intl.t('chat.inlineMedia.githubRepoTitle', { username, repo }).toString();\n        }\n    }),\n\n    embedString: computed(function () {\n        return this.get('intl').lookup('chat.inlineMedia.githubItems.embedSupport');\n    }),\n\n    shouldEmbed: computed('settings.embed', function () {\n        return this.get('settings.embed') || false;\n    }),\n\n    onSettingsChange: observer('preferences.widgets.githubRepo', function () {\n        this.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .then(settings => {\n                this.set('settings', settings);\n                this.set('showEmbedConfirmation', settings.showEmbedConfirmation);\n            });\n    }),\n\n    setEmbedPreference(pref) {\n        let settings = this.get('settings');\n        Ember.setProperties(settings, {\n            embed: pref,\n            showEmbedConfirmation: false\n        });\n\n        this.set('showEmbedConfirmation', false);\n\n        this.get('preferences').setPreference('widgets.githubRepo', settings);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    division: DS.attr(),\n    role: DS.attr(),\n    subjectId: DS.attr('string')\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    group: DS.attr(),\n    enabled: DS.attr(),\n    groupAlertType: DS.attr(),\n    overflowGroupId: DS.attr(),\n    rotateCallsSecs: DS.attr(),\n    sendEmailNotifications: DS.attr(),\n    disableEmailPii: DS.attr(),\n    stopRingingAfterRotations: DS.attr(),\n    includeEmailTranscriptions: DS.attr(),\n    languagePreference: DS.attr()\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityMixin from '../mixins/entity';\nimport EntityImageComponent from 'ember-purecloud-components/components/entity-image/component';\n\nexport const BASE_GROUP_FIELDS = [\n    'general',\n    'owners',\n    'membership',\n    'individuals',\n    'images.activeProfilePicture',\n    'extMongoId',\n    'contactInfo'\n];\n\nexport const BASE_GROUP = BASE_GROUP_FIELDS.join(',');\n\nconst COMPARATORS = {\n    EqualTo: {\n        label: 'equals (==)',\n        value: 'EqualTo',\n        op: '=='\n    },\n    NotEqualTo: {\n        label: 'not equals (!=)',\n        value: 'NotEqualTo',\n        op: '!='\n    },\n    GreaterThan: {\n        label: 'greater than (>)',\n        value: 'GreaterThan',\n        op: '>'\n    },\n    GreaterThanOrEqualTo: {\n        label: 'greater than or equal to (>=)',\n        value: 'GreaterThanOrEqualTo',\n        op: '>='\n    },\n    LessThan: {\n        label: 'less than (<)',\n        value: 'LessThan',\n        op: '<'\n    },\n    LessThanOrEqualTo: {\n        label: 'less than or equal to (<=)',\n        value: 'LessThanOrEqualTo',\n        op: '<='\n    }\n};\n\nconst PROFICIENCIES = [\n    { name: '0', value: 0 },\n    { name: '1', value: 1 },\n    { name: '2', value: 2 },\n    { name: '3', value: 3 },\n    { name: '4', value: 4 },\n    { name: '5', value: 5 }\n];\n\nvar GroupModel = DS.Model.extend(EntityMixin, {\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    permissions: Ember.inject.service(),\n\n    meta: DS.attr(),\n    policy: DS.belongsTo('group-policy'),\n\n    acdSkills: null,\n\n    lastSavedExpression: null,\n\n    expression: Ember.computed('_expression.content', function () {\n        if (!this.get('_expression.content')) {\n            return null;\n        }\n        return this.parseExpression(this.get('_expression.content.skillConditions'));\n    }),\n\n    isDynamicGroup: Ember.computed(\n        'expression',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            return this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')\n                ? !!this.get('expression')\n                : false;\n        }\n    ),\n\n    reload() {\n        this.notifyPropertyChange('greeting');\n        this.get('policy').then(policy => {\n            if (policy) {\n                policy.reload();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    rollbackAttributes() {\n        this.notifyPropertyChange('greeting');\n        this.notifyPropertyChange('individuals');\n        this.get('policy').then(policy => {\n            if (policy) {\n                policy.rollbackAttributes();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    // convert to attribute on Ember-Data upgrades\n    greeting: Ember.computed('guid', function () {\n        const path = `api/v2/groups/${this.get('guid')}/greetings/defaults`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return DS.PromiseObject.create({\n            promise: this.get('ajax').request(url)\n        });\n    }),\n\n    _expression: Ember.computed(\n        'guid',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            if (this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')) {\n                const path = `api/v2/groups/${this.get('guid')}/dynamicsettings`;\n                const url = this.get('application').pcV2Uri(path);\n                return DS.PromiseObject.create({\n                    promise: this.get('ajax')\n                        .ajaxGet(url, {\n                            retry: true\n                        })\n                        .then(res => {\n                            return Ember.RSVP.resolve(res.query);\n                        })\n                        .catch(err => {\n                            if (err.status === 404) {\n                                //this group is confirmed not a dynamic group\n                                return Ember.RSVP.resolve(null);\n                            } else if (\n                                err.status === 403 && // check and see if it's a permission issue\n                                err.payload.code === 'missing.any.permissions' &&\n                                err.payload.message.indexOf('directory:group:view') > 0\n                            ) {\n                                // this user needs the updated group:view permissions\n                                this.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.permissionErrorMessage')\n                                );\n                            } else {\n                                //actual error\n                                this.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.loadErrorMessage')\n                                );\n                                return Ember.RSVP.resolve(null);\n                            }\n                        })\n                });\n            }\n        }\n    ),\n\n    description: Ember.computed('general.description.@each.value', function () {\n        return this.getFieldValue('general.description').value;\n    }),\n\n    groupType: Ember.computed('general.groupType', function () {\n        var groupTypeValue = this.getFieldValue('general.groupType').value;\n        if (groupTypeValue) {\n            var actualType = groupTypeValue.split('.')[1];\n            var key = `group_general_groupType_value_${actualType}`;\n\n            return this.get('intl').lookup(key, null, true).toString();\n        }\n\n        return '';\n    }),\n\n    memberCount: Ember.computed('general.memberCount.@each.value', function () {\n        if (this.get('general.memberCount')) {\n            return this.getFieldValue('general.memberCount').value;\n        }\n\n        return 0;\n    }),\n\n    profilePictureURL: Ember.computed('images.activeProfilePicture', function () {\n        var images = this.get('images');\n\n        if (images && images.activeProfilePicture && images.activeProfilePicture[0].ref) {\n            return images.activeProfilePicture[0].ref.x128;\n        } else {\n            return EntityImageComponent.placeholderImageForSize(this, 'x200');\n        }\n    }),\n\n    uploadedProfilePictures: Ember.computed('images.profilePictures', function () {\n        var field = this.getFieldValue('images.profilePictures');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: Ember.computed('images.gallery', function () {\n        var field = this.getFieldValue('images.gallery');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    groupVisibility: Ember.computed('privacy.groupVisibility', function () {\n        return this.getFieldValue('privacy.groupVisibility').value;\n    }),\n\n    membershipVisible: Ember.computed('privacy.membershipVisible', function () {\n        return this.getFieldValue('privacy.membershipVisible').value;\n    }),\n\n    includeOwners: Ember.computed('membership.includeOwners', function () {\n        var visible = this.getFieldValue('membership.includeOwners').value;\n        return this.get('intl').lookup(`entity.fieldTypes.boolean.checked-${visible}`).toString();\n    }),\n\n    areOwnersIncluded: Ember.computed('membership.includeOwners', function () {\n        return this.getFieldValue('membership.includeOwners').value;\n    }),\n\n    groupEmailAddress: Ember.computed('general.exchangeNameOverride', {\n        get() {\n            return this.getFieldValue('general.exchangeNameOverride').value;\n        },\n        set(key, value) {\n            if (value === undefined) {\n                value = '';\n            }\n            return this.set('general.exchangeNameOverride', value)[0].value;\n        }\n    }),\n\n    needsCommit: Ember.computed('general.needsCommit', function () {\n        return this.getFieldValue('general.needsCommit').value;\n    }),\n\n    membershipSearchQuery: Ember.computed('membership.compiledQuery.[]', function () {\n        var compiledQuery = this.getFieldValue('membership.compiledQuery');\n        var query = Ember.get(compiledQuery, 'value.q');\n        if (query && query.length) {\n            return query[0].value;\n        }\n\n        return '';\n    }),\n\n    generalSearchQuery: Ember.computed('id', 'general.groupType', function () {\n        var groupType = this.getFieldValue('general.groupType').value;\n        return `${groupType}:${this.get('guid')}`;\n    }),\n\n    isActive: Ember.computed('state', function () {\n        return this.get('state') === 'active';\n    }),\n\n    isDeleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    jid: Ember.computed('_id', function () {\n        const id = this.get('_id');\n        var org = this.get('application.session.org');\n        var name = Ember.get(org, 'general.shortName')[0].value;\n        return `${id}@conference.${name}.orgspan.com`;\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve()\n        });\n    }),\n\n    // -- Handles Grants and Roles Associated with the Group --\n\n    allowPermissionGroup: Ember.computed('general.allowPermissionGroup', {\n        get() {\n            return this.getFieldValue('general.allowPermissionGroup').value;\n        },\n        set(key, value) {\n            return this.set('general.allowPermissionGroup', value)[0].value;\n        }\n    }),\n\n    uniqueRoleCount: 0,\n    grantVersion: -1,\n\n    getGrants() {\n        return new Ember.RSVP.Promise(resolve => {\n            var path = `api/v2/authorization/subjects/${this.get('guid')}`;\n            var url = this.get('application').pcV2Uri(path);\n            this.get('ajax')\n                .ajaxGet(url)\n                .then(data => {\n                    let rolesMap = {};\n                    let uniqueRoleCount = 0;\n                    data.grants.forEach(grant => {\n                        if (!rolesMap[grant.role.id]) {\n                            rolesMap[grant.role.id] = true;\n                            uniqueRoleCount++;\n                        }\n                    });\n                    this.set('uniqueRoleCount', uniqueRoleCount);\n                    this.set('grantVersion', data.version);\n                    resolve(data.grants);\n                });\n        });\n    },\n\n    // --\n\n    number: Ember.computed('contactInfo.groupNumber.@each.value', 'contactInfo.groupNumber.@each.rel', function () {\n        return this.getFieldValue('contactInfo.groupNumber');\n    }),\n\n    //TODO: Delete these references to the policy model when group contact modal is deleted\n    numberOfRotations: Ember.computed('policy.stopRingingAfterRotations', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('stopRingingAfterRotations'));\n            })()\n        });\n    }),\n\n    rotateCallSeconds: Ember.computed('policy.rotateCallsSecs', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('rotateCallsSecs'));\n            })()\n        });\n    }),\n\n    emailNotificationEnabled: Ember.computed.reads('policy.sendEmailNotifications', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('sendEmailNotifications'));\n            })()\n        });\n    }),\n\n    voicemailEnabled: Ember.computed('policy.enabled', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('enabled'));\n            })()\n        });\n    }),\n\n    membershipChange: Ember.observer('membership.inclusions.[]', 'membership.exclusions.[]', function () {\n        var membership = this.get('membership');\n        this.set('membershipDraft', membership);\n    }),\n\n    isPersonOwner(person) {\n        if (!person) {\n            return false;\n        }\n\n        let owner = this.getFieldValue('owners.owners').findBy('value', person.get('id'));\n        let guidOwner = this.getFieldValue('owners.owners').findBy('guid', person.get('id'));\n        return !_.isEmpty(owner) || !_.isEmpty(guidOwner);\n    },\n\n    /**\n     * We derive the Jabber ID for a group from the `_id` property.\n     * Normally, this is set in the group serializer.\n     * Search results do not go through the group serializer.\n     * We need to set the `_id` on the group entity so that `group.get('jid')` resolves properly.\n     * @returns\n     */\n    setIdForGroupEntity() {\n        const existingId = this.get('_id');\n        if (existingId) {\n            return;\n        }\n        const jid = this.get('contactInfo.chat.firstObject.value.jid');\n        if (jid) {\n            const idParts = jid.split('@');\n            const id = idParts.length > 0 ? idParts[0] : '';\n            Ember.run(() => {\n                this.set('_id', id);\n            });\n        }\n    },\n\n    isPersonIndividual(person) {\n        if (!person) {\n            return false;\n        }\n\n        var individual = this.getFieldValue('individuals.individuals').findBy('value', person.get('id'));\n        var guidIndividual = this.getFieldValue('individuals.individuals').findBy('guid', person.get('id'));\n        return !_.isEmpty(individual) || !_.isEmpty(guidIndividual);\n    },\n\n    getReadableSections() {\n        return this.fieldConfig.get('sections').mapBy('key');\n    },\n\n    getWriteableSections() {\n        var currentPerson = this.get('application.session.person');\n        var ownerIds = this.get('owners.owners').mapBy('value');\n        var sections = this.fieldConfig.get('sections').mapBy('key');\n\n        if (currentPerson && currentPerson.get('isAdmin')) {\n            return sections;\n        }\n\n        if (currentPerson && ownerIds.indexOf(currentPerson.get('id')) !== -1) {\n            return sections;\n        }\n\n        return [];\n    },\n\n    getReadableFieldsForSection(section) {\n        return section.get('fieldList').mapBy('key');\n    },\n\n    setProfilePicture(image) {\n        var profileImageSection = this.get('images.activeProfilePicture');\n\n        if (profileImageSection === undefined) {\n            this.set('images.activeProfilePicture', {});\n            profileImageSection = this.get('images.activeProfilePicture');\n        }\n\n        if (profileImageSection && profileImageSection.length) {\n            var profileImage = profileImageSection[0];\n\n            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'images.profilePictures');\n\n            this.notifyPropertyChange('profilePicture');\n        }\n    },\n\n    deleteGrant(grant) {\n        var path = `/api/v2/authorization/subjects/${this.get('id')}/scopes/${grant.get('scope.id')}/roles/${grant.get(\n            'role.id'\n        )}`;\n        var url = this.get('application').pcV2Uri(path);\n        return this.get('ajax').del(url);\n    },\n\n    parseExpression(input) {\n        let output = [];\n\n        if (!input || input.length === 0) {\n            //no need to parse an empty array\n            return output;\n        }\n\n        // childConditions are all nested, so we gotta recurse\n        const addRule = function (condition, rule) {\n            let newSkill =\n                rule.routingSkillConditions.length === 0\n                    ? {\n                          name: rule.languageSkillConditions[0].languageSkill,\n                          type: 'language'\n                      }\n                    : {\n                          name: rule.routingSkillConditions[0].routingSkill,\n                          type: 'routing'\n                      };\n            let skill =\n                rule.routingSkillConditions.length === 0\n                    ? rule.languageSkillConditions[0]\n                    : rule.routingSkillConditions[0];\n            let children = skill.childConditions;\n            let op = rule.operation ? rule.operation.toUpperCase() : null;\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                op = children.operation.toUpperCase();\n            }\n\n            condition.rules.pushObject({\n                comparator: COMPARATORS[skill.comparator],\n                proficiency: PROFICIENCIES[skill.proficiency],\n                operation: op,\n                opAnd: op == 'AND' ? true : false,\n                skill: newSkill\n            });\n\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                addRule(condition, children);\n            }\n        };\n\n        // so here we'll go through each top-level condition and check recursively for children\n        input.forEach(condition => {\n            let conOp = condition.operation ? condition.operation.toUpperCase() : null;\n\n            let newCondition = {\n                rules: [],\n                lastCondition: false,\n                operation: conOp,\n                opAnd: conOp == 'AND' ? true : false\n            };\n\n            addRule(newCondition, condition);\n\n            newCondition.rules.set('lastObject.lastRule', true);\n            newCondition.rules.set('lastObject.operation', 'OR');\n            newCondition.rules.set('lastObject.opAnd', false);\n            output.pushObject(newCondition);\n        });\n        output.set('lastObject.lastCondition', true);\n        output.set('lastObject.operation', 'OR');\n        output.set('lastObject.opAnd', false);\n        return output;\n    }\n});\n\nGroupModel.reopenClass({\n    apiEndpoint: 'v2/groups'\n});\n\nexport default GroupModel;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport App, {\n    PC_ENV_URL_REPLACEMENT_TOKEN,\n    GC_HOST_ORIGIN_REPLACEMENT_TOKEN,\n    GC_TARGET_ENV_REPLACEMENT_TOKEN,\n    GC_LANG_TAG_URL_REPLACEMENT_TOKEN,\n    GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN\n} from './app';\nimport appUtils from '../utils/apps';\nimport netUtils from '../utils/net';\n\nconst { getOwner, computed, copy, typeOf, isPresent } = Ember;\n\n/**\n * An internally-built PureCloud Client App that is hosted on PureCloud's own infrastructure.\n *\n * The url will be dynamically generated based on the specified config:\n *\n * subdomain=apps: Optional. Subdomain to be prepended to the current purecloud domain.\n * envDetails: Required.  The environment details to build the PureCloud domain.\n * path: Required. The path to the app.  Leading slash will be prepended if omitted.\n * query=?gcHostOrigin={{gcHostOrigin}}&gcTargetEnv={{gcTargetEnv}}&gcLangTag={{gcLangTag}}&gcUsePopupAuth={{gcUsePopupAuth}}: Optional. The querystring for the app. Leading ? will be prepended if omitted.\n *\n * [SECURITY NOTE]: Because these apps will have the same purecloud env tld as the host PureCloud app,\n * they can elevate out of the iframe sandbox.  Because of this, this must always be internal code.\n * This is NOT a hosting option for external apps.\n */\nconst InternallyHostedApp = App.extend({\n    subdomain: null,\n    envDetails: null,\n    path: null,\n    query: null,\n    urlTemplate: computed('subdomain', 'envDetails', 'path', 'query', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = null;\n\n            let subdomain = this.get('subdomain') || netUtils.getPcApplicationsSubdomain();\n            let envDetails = this.get('envDetails');\n            let path = this.get('path');\n            let query = this.get('query');\n\n            if (typeOf(path) === 'string' && isPresent(path) && envDetails) {\n                result = `https://${subdomain}.${envDetails.runtime.currentDomainName}`;\n\n                path = path.trim();\n                if (path.charAt(0) !== '/') {\n                    result += '/';\n                }\n                result += path;\n\n                if (query && typeOf(query) === 'string') {\n                    query = query.trim();\n                    if (query.charAt(0) !== '?') {\n                        result += '?';\n                    }\n                    result += query;\n                } else {\n                    result += `?gcHostOrigin=${GC_HOST_ORIGIN_REPLACEMENT_TOKEN}&gcTargetEnv=${GC_TARGET_ENV_REPLACEMENT_TOKEN}&pcEnvironment=${PC_ENV_URL_REPLACEMENT_TOKEN}&pcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&pcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}&gcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&gcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}`;\n                }\n            }\n\n            return result;\n        },\n        set() {\n            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derrived urlTemplate property instead of path property.'),\n                {\n                    path: this.get('path'),\n                    remoteData: {\n                        appId: this.get('id')\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set urlTemplate. Use path property.');\n        }\n    }),\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return InternallyHostedApp.create(ownerMixin, {\n            typeId: this.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            subdomain: this.get('subdomain'),\n            envDetails: copy(this.get('envDetails'), deep),\n            path: this.get('path'),\n            query: this.get('query'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? copy(this.get('sandbox'), true) : this.get('sandbox'),\n            assets: copy(this.get('assets'), deep),\n            lifecycle: copy(this.get('lifecycle'), deep),\n            permissionsPolicy: deep ? copy(this.get('permissionsPolicy'), true) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default InternallyHostedApp;\n","import DS from 'ember-data';\n\nvar LibraryModel = DS.Model.extend({\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    responses: DS.attr()\n});\n\nexport default LibraryModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport const BASE_LOCATION_FIELDS = ['name', 'address', 'images', 'contactPersonId', 'sublocationOrder'];\nexport const BASE_LOCATION = {\n    fl: BASE_LOCATION_FIELDS.join(',')\n};\n\nvar LocationModel = DS.Model.extend({\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    _id: DS.attr(),\n    name: DS.attr(),\n    address: DS.attr(),\n    imageHistory: DS.attr(),\n    contactPersonId: DS.attr(),\n    notes: DS.attr(),\n    sublocationOrder: DS.attr(),\n    images: DS.attr(),\n\n    profileImage: DS.attr(),\n    floorplanImage: DS.attr(),\n    floorplanImageHistory: DS.attr(),\n\n    path: DS.attr(),\n    orgId: DS.attr(),\n\n    version: DS.attr(),\n\n    _entity: DS.attr(),\n\n    floors: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    profilePicture: Ember.computed('profileImage', 'parent.{images,isFulfilled}', 'images', function () {\n        let profileImages = this.get('profileImage');\n\n        if (!_.isEmpty(profileImages)) {\n            let imagex48 = profileImages.find(image => image.resolution === 'x48');\n            let imagex96 = profileImages.find(image => image.resolution === 'x96');\n            let imagex128 = profileImages.find(image => image.resolution === 'x128');\n            let imagex200 = profileImages.find(image => image.resolution === 'x200');\n\n            if (imagex48 && imagex96 && imagex128 && imagex200) {\n                return {\n                    x48: `${imagex48.imageUri}`,\n                    x96: `${imagex96.imageUri}`,\n                    x128: `${imagex128.imageUri}`,\n                    x200: `${imagex200.imageUri}`\n                };\n            }\n        } else if (this.get('images')) {\n            let images = this.get('images');\n            return images;\n        }\n\n        return undefined;\n    }),\n\n    floorCount: Ember.computed('sublocationOrder', function () {\n        var subs = this.get('sublocationOrder');\n\n        if (_.isEmpty(subs)) {\n            return 0;\n        }\n\n        return subs.length;\n    }),\n\n    type: Ember.computed('path', function () {\n        var path = this.get('path');\n\n        if (path && Array.isArray(path) && path.length > 0) {\n            return 'floor';\n        }\n\n        return 'location';\n    }),\n\n    isFloor: Ember.computed('type', function () {\n        return this.get('type') === 'floor';\n    }),\n\n    deleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    hasContactPerson: Ember.computed('contactPersonId', function () {\n        return this.get('contactPersonId') !== null && this.get('contactPersonId') !== undefined;\n    }),\n\n    contactPerson: Ember.computed('contactPersonId', function () {\n        var id = this.get('contactPersonId');\n        if (id) {\n            return this.store.find('person', id);\n        }\n    }),\n\n    floorplan: Ember.computed('floorplanImage', function () {\n        let images = this.get('floorplanImage');\n        if (!_.isEmpty(images)) {\n            let image = images.find(image => image.resolution === 'x1024');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    _parent: null,\n    parent: Ember.computed('type', 'path', function () {\n        if (this.get('type') === 'floor') {\n            let promise;\n            if (this.get('_parent')) {\n                promise = this.get('_parent');\n            } else {\n                promise = this.get('store').findRecord('location', this.get('path')[0]);\n                this.set('_parent', promise);\n            }\n            return DS.PromiseObject.create({\n                promise\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: Ember.RSVP.resolve(undefined)\n        });\n    }),\n\n    containsRichAddress: Ember.computed('address', function () {\n        let address = this.get('address');\n        return typeof address !== 'string';\n    }),\n\n    setFloor() {\n        return;\n    }\n});\n\nexport default LocationModel;\n","import Model from 'ember-data/model';\nimport attr from 'ember-data/attr';\nimport Ember from 'ember';\n\nexport default Model.extend({\n    //id on the model is the occurrence id, not the meeting id\n    roomId: attr(),\n    subject: attr(),\n    description: attr(),\n    organizer: attr(),\n\n    attendees: attr(),\n    notifyAttendees: attr(),\n\n    startDate: attr('iso-date'),\n    endDate: attr(),\n    duration: attr(),\n    recurringType: attr(),\n\n    version: attr(),\n    meeting: attr(), //object that holds the meeting id\n\n    meetingAttendees: Ember.computed('attendees', function () {\n        if (this.get('attendees')) {\n            return Ember.RSVP.resolve(this.get('attendees'));\n        }\n        return this.get('store')\n            .findRecord('meeting', this.get('id'), { reload: true })\n            .then(meeting => meeting.get('attendees'));\n    })\n});\n","define(\"connections-ui/models/message-communication\", [\"exports\", \"ember-purecloud-components/models/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\n\nexport default DS.Model.extend(EntityMixin, {\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    name: computed('general.name.@each.value', function () {\n        const name = this.getFieldValue('general.name');\n        if (name.value) {\n            return name.value;\n        }\n        return '';\n    }),\n\n    shortName: computed('general.shortName.@each.value', function () {\n        const shortName = this.getFieldValue('general.shortName');\n        if (shortName.value) {\n            return shortName.value;\n        }\n        return '';\n    }),\n\n    hasUnifiedCommunications: computed('enabledFeatures.unifiedCommunications.@each.value', function () {\n        const comms = this.getFieldValue('enabledFeatures.unifiedCommunications');\n        if (_.isEmpty(comms)) {\n            return false;\n        }\n        return comms.value;\n    }),\n\n    hasChatEnabled: computed('enabledFeatures.chat.@each.value', function () {\n        const chat = this.getFieldValue('enabledFeatures.chat');\n        return chat.value;\n    }),\n\n    hasHipaaEnabled: computed('enabledFeatures.hipaa.@each.value', function () {\n        const hipaa = this.getFieldValue('enabledFeatures.hipaa');\n        return hipaa.value;\n    }),\n\n    _orgDetails: computed('id', function () {\n        const path = 'api/v2/organizations/me';\n        const url = this.get('application').pcV2Uri(path);\n        const promise = this.get('ajax').request(url);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    orgDefaultCountryCode: computed(\n        'general.defaultCountryCode.@each.value',\n        'session.user.organization.defaultCountryCode',\n        '_orgDetails.content.defaultCountryCode',\n        function () {\n            const fieldValue = this.getFieldValue('general.defaultCountryCode');\n            if (fieldValue && fieldValue.value) {\n                return fieldValue.value;\n            }\n\n            const sessionUserOrgCountryCodeValue = this.get('session.user.organization.defaultCountryCode');\n            if (sessionUserOrgCountryCodeValue) {\n                return sessionUserOrgCountryCodeValue;\n            }\n\n            const orgDetails = this.get('_orgDetails.content');\n            if (orgDetails && orgDetails.defaultCountryCode) {\n                return orgDetails.defaultCountryCode;\n            }\n\n            return null;\n        }\n    ),\n\n    orgPreferences: computed('preferences.preferences.@each.value', function () {\n        const preferences = this.getFieldValue('preferences.preferences');\n        let parsedPreferences;\n        try {\n            parsedPreferences = JSON.parse(preferences.value);\n        } catch (err) {\n            parsedPreferences = {};\n        }\n        return parsedPreferences;\n    })\n});\n","define(\"connections-ui/models/participant\", [\"exports\", \"ember-purecloud-components/models/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { getEntityObjectId } from 'ember-purecloud-components/utils/jid-helpers';\n\nimport EntityMixin from '../mixins/entity';\nimport ChatUserMixin from '../mixins/chat-user';\nimport EntityPresenceMixin from '../mixins/entity-presence';\n\nimport { BASE_GROUP } from '../models/group';\n\n/* /platform/api/v2/users/{id}/profile (or /platform/api/v2/profiles/users) default field list (fl query parameter) */\nexport const BASE_PERSON_FIELDS = [\n    'extMongoId',\n    'general',\n    'contactInfo',\n    'primaryContactInfo',\n    'images.profile',\n    'version'\n];\n/* /platform/api/users expand query parameter list */\nexport const BASE_PERSON_EXPANDS = [\n    'routingStatus',\n    'primaryPresence',\n    'conversationSummary',\n    'outOfOffice',\n    'geolocation',\n    'presence',\n    'locations',\n    'authorization'\n];\nexport const BASE_PERSON = {\n    fl: BASE_PERSON_FIELDS.join(','),\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\nexport const FULL_PERSON = {\n    fl: '*',\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\nconst { get, set, computed } = Ember;\n\nlet permissionRoutes = ['person.detail', 'person.detail.index', 'card.detail'];\n\n// We need to change how data gets merged in Ember-Data to support our field\n// config...not sure of a way around this...\nfunction merge(original, updates) {\n    _.forEach(updates, (sectionValue, sectionKey) => {\n        if (typeof sectionValue !== 'object' || Array.isArray(sectionValue)) {\n            original[sectionKey] = sectionValue;\n            return;\n        }\n\n        _.forEach(sectionValue, (fieldValue, fieldKey) => {\n            if (!original[sectionKey]) {\n                original[sectionKey] = {};\n            }\n\n            Ember.set(original[sectionKey], fieldKey, fieldValue);\n        });\n    });\n}\n\nfunction clearProperties(original, updates, changedKeys, type) {\n    const originalKeys = Object.keys(original);\n    originalKeys.forEach(sectionKey => {\n        if (updates[sectionKey] === undefined) {\n            set(original, sectionKey, {});\n            changedKeys.push(sectionKey);\n        } else {\n            if (type === 'group') {\n                const sectionData = original[sectionKey];\n                const fieldKeys = Object.keys(sectionData);\n                fieldKeys.forEach(fieldKey => {\n                    const pathKey = `${sectionKey}.${fieldKey}`;\n                    if (get(updates, pathKey) === undefined) {\n                        set(original, pathKey, {});\n                        changedKeys.push(pathKey);\n                    }\n                });\n            }\n        }\n    });\n}\n\n/**\n * @param {object | number} contactCenter contact center conversations\n * @param {object | number} enterprise enterprise  conversations\n * @returns {number} The sum of the active conversations for the two arguments, or 0.\n */\nfunction activityCounter(contactCenter, enterprise) {\n    const contactCenterCount = typeof contactCenter === 'object' ? contactCenter.active : contactCenter || 0;\n    const enterpriseCount = typeof enterprise === 'object' ? enterprise.active : enterprise || 0;\n    return contactCenterCount + enterpriseCount;\n}\n\nlet Internal = DS.InternalModel.prototype;\nlet _setupData = Internal.setupData;\nInternal.setupData = function (data) {\n    const type = data.modelName || data.type;\n    if (type === 'person' || type === 'group') {\n        let changedKeys = [];\n        if (this.hasRecord) {\n            changedKeys = this._changedKeys(data.attributes);\n        }\n\n        merge(this._data, data.attributes);\n\n        // Partial reloading is not a thing for people/groups\n        // So we've gotta clear the data that no longer exists\n        if (this.isReloading) {\n            clearProperties(this._data, data.attributes, changedKeys, type);\n        }\n\n        this.pushedData();\n\n        const record = this.record || this._record;\n        if (record) {\n            record._notifyProperties(changedKeys);\n        }\n        if (this.didInitializeData) {\n            this.didInitializeData();\n        }\n    } else {\n        _setupData.apply(this, arguments);\n    }\n};\n\nlet PersonModel = DS.Model.extend(EntityMixin, ChatUserMixin, EntityPresenceMixin, {\n    ajax: Ember.inject.service(),\n    search: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n\n    _readWritePermissions: null,\n\n    _directReports: null,\n    _siblings: null,\n    _superiors: null,\n\n    namedPermissions: Ember.computed.reads('application.session.namedPermissions'),\n\n    // attributes guaranteed to be on models\n    parent: DS.attr(),\n    path: DS.attr(),\n    children: DS.attr(),\n    roleIds: DS.attr(),\n    expands: DS.attr(),\n    version: DS.attr(),\n    divisionId: DS.attr(),\n\n    _activities: computed.alias('expands'),\n    activities: computed.alias('_activities'),\n\n    // private values just used to simplify computed functions\n    _activityCall: computed.reads('activities.conversationSummary.call'),\n    _activityCallback: computed.reads('activities.conversationSummary.callback'),\n    _activityChat: computed.reads('activities.conversationSummary.message'),\n    _activityWebChat: computed.reads('activities.conversationSummary.chat'),\n    _activityEmail: computed.reads('activities.conversationSummary.email'),\n\n    guid: computed.reads('id'),\n\n    // this computed is used in ember-purecloud-components (EPC) addon\n    // to reduce changes across deprecated projects, we are defaulting this to true.\n    // Once EPC is removed, we can remove this property.\n    showConversationSummaryIndicator: true,\n\n    presenceList: null,\n\n    // We will want to switch completely to 'default' as the only default presence source\n    // but will be blocked until the Presence Service is only returning 'default'.\n    currentPresenceSource: 'PURECLOUD',\n\n    init: function () {\n        this._super(...arguments);\n        this.set('presenceList', Ember.A());\n        this.set('personDetail', Ember.getOwner(this).lookup('controller:person/detail'));\n\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\n        }\n        // convert current presence source to 'default'\n        this.set('currentPresenceSource', 'default');\n    },\n\n    totalCalls: computed('_activityCall', function () {\n        const contactCenter = this.get('_activityCall.contactCenter.active');\n        const enterprise = this.get('_activityCall.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalCallbacks: computed('_activityCallback', function () {\n        const contactCenter = this.get('_activityCallback.contactCenter.active');\n        const enterprise = this.get('_activityCallback.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalChats: computed('_activityChat', function () {\n        const contactCenter = this.get('_activityChat.contactCenter.active');\n        const enterprise = this.get('_activityChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalWebChats: computed('_activityWebChat', function () {\n        const contactCenter = this.get('_activityWebChat.contactCenter.active');\n        const enterprise = this.get('_activityWebChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalEmails: computed('_activityEmail', function () {\n        const contactCenter = this.get('_activityEmail.contactCenter.active');\n        const enterprise = this.get('_activityEmail.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    activityValues: computed('totalCalls', 'totalCallbacks', 'totalChats', 'totalEmails', function () {\n        return {\n            calls: this.get('totalCalls') + this.get('totalCallbacks'),\n            emails: this.get('totalEmails'),\n            chats: this.get('totalChats') + this.get('totalWebChats')\n        };\n    }),\n\n    title: Ember.computed('general.title.@each.value', function () {\n        var field = this.getFieldValue('general.title');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    department: Ember.computed('general.department.@each.value', function () {\n        var field = this.getFieldValue('general.department');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.email');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email_main: Ember.computed('contactInfo.email_main', function () {\n        var field = this.getFieldValue('contactInfo.email_main');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    phone: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.voice');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    integrationPhone: Ember.computed('contactInfo.phone_other', function () {\n        let otherPhones = this.get('contactInfo.phone_other');\n        if (otherPhones && otherPhones.length > 0) {\n            return otherPhones.find(phone => phone && phone.value && phone.value.integration);\n        }\n        return null;\n    }),\n\n    agentName: Ember.computed('agent', function () {\n        var field = this.getFieldValue('agent.name');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    uploadedProfilePictures: Ember.computed('uploads.images', function () {\n        var field = this.getFieldValue('uploads.images');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: Ember.computed('images.informal', function () {\n        var field = this.getFieldValue('images.informal');\n\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    socialGroups: Ember.computed('groups.social.[]', function () {\n        return this.getGroupsByType('groups.social');\n    }),\n\n    officialGroups: Ember.computed('groups.official.[]', function () {\n        return this.getGroupsByType('groups.official');\n    }),\n\n    distributionGroups: Ember.computed('purecloud.distributionGroups', function () {\n        return this.getGroupsByType('purecloud.distributionGroups');\n    }),\n\n    ownedGroups: Ember.computed('id', function () {\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.get('search')\n                .performSearch(this.get('guid'), 0, 'groups', [], ['owners.owners.guid'], 'EXACT', [], 100)\n                .then(function ({ results }) {\n                    if (results) {\n                        resolve(results);\n                    } else {\n                        resolve([]);\n                    }\n                })\n                .catch(function (err) {\n                    reject(err);\n                });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    manager: Ember.computed('relationships.manager.[]', 'relationships.manager.@each.value', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'guid') || Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('store').findRecord('person', managerId, BASE_PERSON);\n        } else {\n            promise = Ember.RSVP.resolve({});\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    managerSiblings: Ember.computed('manager', 'manager.isFulfilled', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('manager')\n                .then(function (person) {\n                    return person.get('siblings');\n                })\n                .then(function (siblings) {\n                    if (siblings.get('length')) {\n                        return siblings.filterBy('state', 'active');\n                    }\n\n                    return [];\n                });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    otherRelationships: Ember.computed('relationships.relationships.[]', function () {\n        let values = this.getFieldValue('relationships.relationships');\n        let ids = values.mapBy('value');\n        let promise = Ember.RSVP.resolve([]);\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    groupedOtherRelationships: Ember.computed('relationships.relationships', function () {\n        var fieldValue = this.getFieldValue('relationships.relationships');\n\n        if (!fieldValue) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        var ids = fieldValue.mapBy('value');\n        var promise;\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findByIds('person', ids).then(function (persons) {\n                // Group relationships by label key.\n                var groupedRelationships = [];\n\n                _.each(fieldValue, function (personEntry) {\n                    var person = persons.findBy('id', personEntry.value);\n                    if (person.get('state') === 'deleted') {\n                        return;\n                    }\n\n                    var relationship = groupedRelationships.findBy('labelKey', personEntry.labelKey);\n                    if (relationship) {\n                        relationship.people.push(person);\n                    } else {\n                        groupedRelationships.push({\n                            labelKey: personEntry.labelKey,\n                            i18nKey:\n                                'person_relationships_relationships_labelKey_' + personEntry.labelKey.replace('.', '_'),\n                            people: [person]\n                        });\n                    }\n                });\n\n                return groupedRelationships;\n            });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    adminAssistants: Ember.computed('relationships.administrativeAssistant.[]', function () {\n        if (this.get('_adminAssistantsRequest')) {\n            return this.get('_adminAssistantsRequest');\n        }\n\n        let promise = Ember.RSVP.resolve([]);\n        let field = this.getFieldValue('relationships.administrativeAssistant');\n\n        if (!field) {\n            return DS.PromiseArray.create({ promise });\n        }\n\n        if (typeof field.mapBy !== 'function') {\n            Ember.Logger.warn('adminAssistants had unexpected value', { field });\n            return DS.PromiseArray.create({ promise });\n        }\n\n        let ids = field.mapBy('value');\n        let cachedData = this.get('_adminAssistants');\n\n        // Check cached data and resolve with it if it matches\n        if (!!cachedData && cachedData.length > 0) {\n            let cachedIds = Ember.A(cachedData).mapBy('id');\n            if (cachedIds.length === ids.length) {\n                let sameIds = cachedIds.filter(id => ids.includes(id));\n                if (sameIds.length === cachedIds.length) {\n                    return DS.PromiseArray.create({\n                        promise: Ember.RSVP.resolve(cachedData)\n                    });\n                }\n            }\n        }\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findMany('person', ids, BASE_PERSON);\n        }\n\n        let promiseArray = DS.PromiseArray.create({\n            promise\n        });\n\n        this.set('_adminAssistantsRequest', promiseArray);\n\n        promiseArray\n            .then(results => {\n                this.set('_adminAssistants', results);\n            })\n            .finally(() => this.set('_adminAssistantsRequest', null));\n\n        return promiseArray;\n    }),\n\n    superiors: Ember.computed(\n        '_superiors',\n        'path.[]',\n        'relationships.manager.[]',\n        'relationships.manager.@each.value',\n        function () {\n            if (this._loadingSuperiors && this.get('_superiors')) {\n                return this.get('_superiors');\n            }\n\n            const cache = this.get('_superiors');\n            if (cache) {\n                return cache.then(people => {\n                    const manager = this.getFieldValue('relationships.manager');\n                    if (!manager || _.isEmpty(manager)) {\n                        this.set('_superiors', null);\n                        return [];\n                    } else if (people.length === 0 && manager.value) {\n                        this.set('_superiors', null);\n                        return this.store\n                            .findSuperiors('person', this.get('id'), BASE_PERSON)\n                            .finally(() => (this._loadingSuperiors = false));\n                    }\n                    return people;\n                });\n            }\n\n            this._loadingSuperiors = true;\n\n            var superiors = this.store\n                .findSuperiors('person', this.get('id'), BASE_PERSON)\n                .finally(() => (this._loadingSuperiors = false));\n            this.set('_superiors', superiors);\n            return superiors;\n        }\n    ),\n\n    directReports: Ember.computed('children.[]', function () {\n        if (this.get('_currentReportsRequest')) {\n            return DS.PromiseArray.create({\n                promise: this.get('_currentReportsRequest')\n            });\n        }\n\n        const id = this.get('id');\n        this.get('logger').info('Refreshing direct reports:', { id });\n\n        let promise = Ember.RSVP.resolve([]);\n\n        let children = this.get('children');\n        if (!Array.isArray(children)) {\n            children = [];\n        }\n        const directReportCount = this.getFieldValue('relationships.directReportCount');\n        const cachedReports = this.get('_directReports.content') || [];\n        const attemptedToLoad = !!this.get('_directReports');\n\n        // Check for the existence of the children prop\n        const dataDiscrepancy = !_.isEmpty(this.get('children')) && children.length !== directReportCount.value;\n\n        const noDirectReports = directReportCount.value === 0 && cachedReports.length === 0;\n\n        let doNotLoad = dataDiscrepancy ? children.length === 0 : noDirectReports && attemptedToLoad;\n\n        const cachedIsSame = _.isEqual(Ember.A(children).sort(), Ember.A(cachedReports).mapBy('id').sort());\n\n        if (doNotLoad) {\n            this.get('logger').info('No direct reports needed to be loaded:', { id });\n        } else if (cachedIsSame && this.get('_directReports')) {\n            this.get('logger').info('Resolving with cached direct reports:', { id });\n            promise = this.get('_directReports') || Ember.RSVP.resolve([]);\n        } else {\n            this.get('logger').info('Loading fresh direct reports', { id });\n            promise = this.store.findDirectReports('person', this.get('id'), BASE_PERSON);\n            this.set(\n                '_directReports',\n                DS.PromiseArray.create({\n                    promise\n                })\n            );\n\n            // We don't use the promise array because we want to keep cached results\n            // and request tracking separate (don't want to clear results)\n            this.set('_currentReportsRequest', promise);\n            promise.finally(() => {\n                this.set('_currentReportsRequest', null);\n            });\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    totalReports: Ember.computed('jid', function () {\n        const jid = this.get('jid');\n        const entityId = getEntityObjectId(jid);\n        const id = entityId || this.get('id');\n        const promise = this.get('search')\n            .performSearch(id, 0, 'users', [], ['path'], 'EXACT')\n            .then(results => {\n                if (results && results.results && results.results._meta) {\n                    return results.results._meta.total;\n                }\n            });\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    siblings: Ember.computed('manager', 'selfAndSiblings', function () {\n        var promise = this.get('selfAndSiblings')\n            .then(siblings => {\n                return siblings.filter(person => {\n                    return person.get('id') !== this.get('id') && person.get('state') === 'active';\n                });\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    selfAndSiblings: Ember.computed('manager', function () {\n        var promise = this.get('manager')\n            .then(function (person) {\n                if (person && person.get) {\n                    return person.get('directReports');\n                }\n\n                return [];\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    descendants: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve([])\n        });\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        let promise = new Ember.RSVP.Promise(resolve => {\n            resolve({\n                read: [],\n                write: []\n            });\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    roles: Ember.computed.reads('application.session.roleNames'),\n\n    /* TODO: Start moving these to permissions service */\n    isAdmin: Ember.computed('application.session.roleNames', 'application.session.user.isSuper', function () {\n        if (this.get('application.session.user.isSuper')) {\n            return true;\n        }\n\n        return _.filter(this.get('application.session.roleNames'), 'isAdmin').length > 0;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentUser: Ember.computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_user') > -1;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentAdmin: Ember.computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_admin') > -1;\n    }),\n\n    isNotBusy: Ember.computed('application.session.person.presence', function () {\n        if (this.get('application.session.person.presence') !== 'busy') {\n            return true;\n        }\n        return false;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isCommunicateUser: Ember.computed('application.session.namedPermissions', function () {\n        return _.includes(this.get('application.session.namedPermissions'), 'unified_communications');\n    }),\n\n    updatePermissionsOnRouteChange: Ember.observer('application.currentRouteName', function () {\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\n        }\n    }),\n\n    clearDirectReportsCache() {\n        this.set('_directReports', null);\n        this.set('children', []);\n    },\n\n    onProfilePage: function () {\n        var onProfilePage = false;\n        var route = this.get('application.currentRouteName');\n        if (route) {\n            onProfilePage = permissionRoutes.indexOf(this.get('application.currentRouteName')) > -1;\n        }\n\n        var personDetailController = this.get('personDetail');\n        if (onProfilePage && personDetailController) {\n            var personId = personDetailController.get('model.id');\n            return this.get('id') === personId;\n        }\n        return false;\n    },\n\n    setProfilePicture: function (image) {\n        this.setPicture(image, 'images.profile');\n        this.notifyPropertyChange('images.profile');\n        this.notifyPropertyChange('profilePicture');\n    },\n\n    setAgentPicture(image) {\n        this.setPicture(image, 'agent.profileImage');\n        this.notifyPropertyChange('agent.profileImage');\n    },\n\n    setPicture(image, path) {\n        let imageSection = this.get(path);\n        if (imageSection === undefined) {\n            this.set(path, {});\n            imageSection = this.get(path);\n        }\n\n        if (imageSection && imageSection.length) {\n            let profileImage = imageSection[0];\n\n            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'uploads.images');\n        }\n    },\n\n    getGroupsByType: function (type) {\n        const field = this.get('fieldConfig').getFieldByKey(type);\n        if (!field) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n\n        var membershipIds;\n        var memberships = this.getFieldValue(type);\n        var promise;\n\n        if (!_.isEmpty(memberships) && memberships[0].value && memberships[0].value.length) {\n            membershipIds = memberships.mapBy('value').filter(id => {\n                if (this.store.hasRecordForId('group', id)) {\n                    return !this.store.recordForId('group', id).get('isDeleted');\n                }\n                return true;\n            });\n\n            promise = this.store.findMany('group', membershipIds, BASE_GROUP).then(groups => {\n                if (!groups) {\n                    return [];\n                }\n\n                return groups.rejectBy('state', 'deleted');\n            });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    getFieldPathForFieldValue: function (fieldValue, type) {\n        if (type === 'sms' || type === 'voice') {\n            type = 'phone';\n        }\n\n        var fieldPaths = this.fieldConfig.getFieldListByType(type).mapBy('fieldPath');\n\n        return _.find(fieldPaths, path => {\n            var value = this.getFieldValue(path);\n            if (Array.isArray(value)) {\n                var found = _.find(value, function (actual) {\n                    if (fieldValue.value && fieldValue.value.fieldId) {\n                        return actual._id === fieldValue.value.fieldId;\n                    }\n                    return actual._id === fieldValue._id;\n                });\n\n                return !_.isEmpty(found);\n            } else {\n                if (fieldValue.value && fieldValue.value.fieldId) {\n                    return value._id === fieldValue.value.fieldId;\n                }\n                return value._id === fieldValue._id;\n            }\n        });\n    },\n\n    getContactFieldValuesByType: function (type) {\n        var fieldType = type;\n        var collection = [];\n\n        if (type === 'sms' || type === 'voice') {\n            fieldType = 'phone';\n        }\n\n        var fields = this.fieldConfig.getFieldListByType(fieldType);\n\n        var values = _.map(fields, field => {\n            var path = field.getFieldPath();\n            var value = this.getFieldValue(path);\n\n            if (!Array.isArray(value)) {\n                value = [value];\n            }\n\n            var filteredEntries = _.filter(value, function (value) {\n                if (type === 'email') {\n                    return Ember.get(value, 'value.length') > 0;\n                }\n                return Ember.get(value, 'value.number.length') > 0 || Ember.get(value, 'value.extension.length') > 0;\n            });\n\n            if (type === 'sms') {\n                filteredEntries = filteredEntries.filterBy('value.acceptsSMS');\n            }\n\n            return filteredEntries;\n        });\n\n        _.forEach(values, function (value) {\n            if (Array.isArray(value)) {\n                collection = collection.concat(value);\n            } else if (value && typeof value === 'object') {\n                collection.push(value);\n            }\n        });\n\n        return collection;\n    },\n\n    getPermissableSections: function (permissions) {\n        var sections = _.map(permissions, function (fieldPath) {\n            return fieldPath.split('.')[0];\n        });\n\n        return _.uniq(sections);\n    },\n\n    getReadableSections: function () {\n        var permissions = this.get('_readWritePermissions.read');\n        return this.getPermissableSections(permissions);\n    },\n\n    getWriteableSections: function () {\n        var permissions = this.get('_readWritePermissions.write');\n        return this.getPermissableSections(permissions);\n    },\n\n    getReadableFieldsForSection: function (section) {\n        var permissions = this.get('_readWritePermissions.read');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(section.key) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    getWriteableFieldsForSection: function (sectionKey) {\n        var permissions = this.get('_readWritePermissions.write');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(sectionKey) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    setPrimaryContact(type, entry, fieldPath = null, fieldData = null) {\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        let primary = this.getFieldValue(path, true);\n        if (!fieldPath) {\n            fieldPath = this.getFieldPathForFieldValue(entry, type);\n        }\n\n        if (Array.isArray(primary)) {\n            primary = primary[0];\n        }\n\n        let fieldId = entry._id || entry.tempId;\n        if (fieldData) {\n            fieldId = fieldData.get('value._id') || fieldId;\n        }\n\n        Ember.set(primary, '_id', null);\n        Ember.set(primary, 'ref', entry.value);\n        Ember.set(primary, 'value', {\n            fieldId,\n            fieldPath: fieldPath\n        });\n\n        delete primary._id;\n        delete primary.rel;\n\n        Ember.set(this, path, [primary], { overwrite: true });\n    },\n\n    integrationContactInfo(key) {\n        let phones = this.get('contactInfo.phone_other');\n        if (phones && phones.length > 0) {\n            return phones.find(phone => {\n                return phone && phone.value && phone.value.integration === key;\n            });\n        }\n        return null;\n    }\n});\n\nPersonModel.reopenClass({\n    apiEndpoint: 'v2/people'\n});\n\nexport default PersonModel;\n","define(\"connections-ui/models/presence\", [\"exports\", \"ember-purecloud-components/models/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\n\nconst { attr } = DS;\n\nconst { inject, computed } = Ember;\n\nexport default DS.Model.extend({\n    name: attr(),\n    chat: attr(),\n    department: attr(),\n    email: attr(),\n    primaryContactInfo: attr(),\n    addresses: attr(),\n    state: attr(),\n    title: attr(),\n    username: attr(),\n    images: attr(),\n    version: attr(),\n    station: attr(),\n    authorization: attr(),\n    fieldConfigs: attr(),\n    selfUri: attr(),\n    outOfOffice: attr(),\n    presence: attr(),\n    token: attr(),\n    organization: attr(),\n    type: 'public-api-user',\n\n    intl: inject.service(),\n    session: inject.service(),\n\n    isSuper: false, // set by session service\n    isTrustee: false, // set by session service\n\n    person: computed.reads('session.person'),\n\n    isCloned: computed.bool('token.clonedUser'),\n\n    profile: DS.belongsTo('person', { async: true }),\n\n    // Legacy properties\n    // Here for computed parity with connect-api user\n    // Deprecated. To be phased out soon.\n    userType: computed('isSuper', 'isTrustee', 'isAdmin', function () {\n        if (this.get('isSuper')) {\n            return 'super';\n        } else if (this.get('isTrustee')) {\n            return 'trustee';\n        } else if (this.get('isAdmin')) {\n            return 'admin';\n        } else {\n            return 'employee';\n        }\n    }),\n\n    isAdmin: computed('authorization.roles.@each.name', 'isSuper', function () {\n        if (this.get('isSuper')) {\n            return true;\n        }\n\n        const roles = this.get('authorization.roles') || [];\n        const names = roles.mapBy('name');\n        return _.includes(names, 'admin');\n    }),\n\n    userState: computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('welcomeSent') * 1000));\n        return date.format('L');\n    })\n});\n","import DS from 'ember-data';\n\nvar QueueModel = DS.Model.extend({\n    name: DS.attr(),\n    type: DS.attr(),\n    memberCount: DS.attr('number'),\n    outboundMessagingAddresses: DS.attr(),\n    outboundEmailAddress: DS.attr(),\n    directRouting: DS.attr(),\n    cannedResponseLibraries: DS.attr({ defaultValue: { mode: 'All' } })\n});\n\nexport default QueueModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { inject, computed, RSVP, run } = Ember;\n\n// CM-4671 : max retry count and retry timeout values for loading user audio recording in inbox\nconst maxNumFetchAudioRetry = 10,\n    retryAfterMs = 6000;\n\nlet recordingRetryCountMap = new Map(); // CM-4671 : map to store retry count of each user recording api call\n\nexport default DS.Model.extend({\n    ajaxService: inject.service('ajax'),\n\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    dateModified: DS.attr(),\n    contentUri: DS.attr(),\n    workspace: DS.attr(),\n    createdBy: DS.attr(),\n    conversation: DS.belongsTo('conversation'),\n    contentLength: DS.attr(),\n    durationMilliseconds: DS.attr(),\n    thumbnails: DS.attr(),\n    read: DS.attr(),\n    selfUri: DS.attr(),\n    session: inject.service('session'), // CM-5713: to get the value of userRecordingDownload feature toggle\n\n    date: computed('dateCreated', function () {\n        return this.get('dateCreated');\n    }),\n\n    // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n    userRecordingDownload: computed.readOnly('session.features.userRecordingDownload'),\n\n    mediaUri: computed.or('media.contentLocationUri', 'media.resultUri'), // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n\n    otherParty: computed('conversation', function () {\n        const model = this.get('conversation');\n        return model.get('otherPartyModel');\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(function (response) {\n            // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n            let callRecordingUri = response.contentLocationUri || response.resultUri;\n            return callRecordingUri;\n        });\n    }),\n\n    fetchAudio: function (formatId, reload = false) {\n        let resolver, pollingTimeout;\n        const media = this.get('media');\n        if (media) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            const adapter = this.store.adapterFor('recorded-call');\n            const apiName = this.get('userRecordingDownload') ? '/transcoding' : '/media'; // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n            const endpoint = adapter.buildURL('recordedCall', this.get('id') + apiName);\n            // CM-4671: User Recording Inbox UI: Use async flow to download long-duration user recordings\n            resolver = (resolve, reject) => {\n                this.get('ajaxService')\n                    .raw(endpoint, {\n                        data: { formatId, async: true },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        res => {\n                            let status = res.jqXHR.status,\n                                userRecRetryCountKey = 'userrec_' + this.get('id') + '_retrycount', // map variable to check indivitual user recording api retry count\n                                userRecRetryCurrent = recordingRetryCountMap.get(userRecRetryCountKey) || 0,\n                                response = res.response;\n                            if (status === 200) {\n                                let recordingUri = response.resultUri || response.contentLocationUri; // CM-5713: to set the uri location as audio source. ( resultUri - response param from transcoding api , contentLocationUri - response param from deprecated media api)\n                                recordingRetryCountMap.delete(userRecRetryCountKey); // remove the map variable when the api returns 200 status\n                                this.set('media', response);\n                                this.set('audioSource', recordingUri); // to update the source of the audio player\n                                return run(null, resolve, response); // resolving the promise immediately after 200 response\n                            } else if (++userRecRetryCurrent < maxNumFetchAudioRetry && status === 202) {\n                                recordingRetryCountMap.set(userRecRetryCountKey, userRecRetryCurrent);\n                                pollingTimeout = setTimeout(() => {\n                                    return this.fetchAudio(formatId, reload);\n                                }, retryAfterMs); // retry after 6 secs to fetch audio call until the api request returns 200 status\n                            } else if (userRecRetryCurrent >= maxNumFetchAudioRetry && status === 202) {\n                                // stop the retry fetch audio call once it reaches the max retry count of 10\n                                if (pollingTimeout) clearTimeout(pollingTimeout);\n                                if (userRecRetryCountKey) recordingRetryCountMap.delete(userRecRetryCountKey);\n                                this.set('audioSource', ''); // setting the audiosource to empty to show the error in audio player when the maximum retry count is done and still receive the 202 resource\n                                return RSVP.reject(new Error('Failed to load user recording'));\n                            }\n                        },\n                        reason => {\n                            this.set('media', {\n                                failed: 'Failed to load user recording'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new RSVP.Promise(resolver);\n    }\n}).reopenClass({\n    apiEndpoint: 'v2/userrecordings'\n});\n","define(\"connections-ui/models/recording\", [\"exports\", \"ember-purecloud-components/models/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nfunction singularize(type) {\n    type = type.replace('resource_', '');\n    type = type.replace(/s$/, '');\n    return type;\n}\n\nexport default DS.Model.extend({\n    title: DS.attr(),\n    link: DS.attr(),\n    excerpt: DS.attr(),\n    _type: DS.attr(),\n\n    type: Ember.computed('_type', function () {\n        const type = this.get('_type');\n        return singularize(type);\n    })\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nvar ResponseModel = DS.Model.extend({\n    name: DS.attr(),\n    texts: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    libraries: DS.attr(),\n    substitutions: DS.attr(),\n    responseType: DS.attr(),\n    messagingTemplate: DS.attr(),\n    isOpen: DS.attr(),\n    libraryName: Ember.computed('libraries', function () {\n        var libraries = this.get('libraries');\n\n        return libraries && libraries.length ? libraries[0].name : '';\n    }),\n    isWhatsAppResponse: Ember.computed('responseType', 'messagingTemplate', function () {\n        return this.get('responseType') === 'MessagingTemplate' && !!this.get('messagingTemplate.whatsApp');\n    }),\n    language: Ember.computed.reads('messagingTemplate.whatsApp.language')\n});\n\nexport default ResponseModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.Model.extend({\n    intl: Ember.inject.service(),\n\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    permissions: DS.attr(),\n    permissionPolicies: DS.attr(),\n    userCount: DS.attr('number'),\n    default: DS.attr('boolean'),\n    base: DS.attr('boolean'),\n    type: Ember.computed('default', function () {\n        return this.get('default')\n            ? this.get('intl').lookup('groups.roles.default')\n            : this.get('intl').lookup('groups.roles.custom');\n    })\n});\n","define(\"connections-ui/models/screenshare-communication\", [\"exports\", \"ember-purecloud-components/models/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/models/social-communication\", [\"exports\", \"ember-purecloud-components/models/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from 'moment';\nimport _ from 'lodash';\nimport { markdownToHtml } from '../utils/markdown';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\n\nexport default Ember.Object.extend(ChatMessageMedia, ChatMessageMixin, {\n    //must support default streaming service attributes, but most of these must be overridden to allow\n    //split message functionality, these will be the static streaming service attributes\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    // End of required chat message attrs\n\n    //beginning of split message attributes\n    messageArray: null,\n    splitMessageId: null,\n    splitMessage: true,\n    totalMessages: null,\n    //end of split message attributes\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n    //split messages cannot be edited due to the nature of them, so these are all static\n    isEditable: false,\n    isEditing: false,\n    canEdit: false,\n\n    widgetType: 'default',\n\n    init() {\n        this._super(...arguments);\n        this.set('time', moment(this.get('time')));\n        this.set('messageArray', Ember.A([]));\n    },\n\n    //required streaming service attributes, these are put back together from the individual models.\n    raw: Ember.computed('messageArray.@each.raw', function () {\n        return this.get('messageArray')\n            .map(message => message.get('raw'))\n            .join('');\n    }),\n\n    links: Ember.computed('messageArray.@each.links', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('links'))\n            .flatten()\n            .value();\n    }),\n\n    files: Ember.computed('messageArray.@each.files', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('files'))\n            .flatten()\n            .filter()\n            .value();\n    }),\n\n    mentions: Ember.computed('raw', function () {\n        let match;\n        let mentions = [];\n        const mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        const raw = this.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            let mention = match[0];\n            let oid = match[1];\n            mentions.push(\n                Ember.Object.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        return mentions;\n    }),\n\n    hasMentionLinks: Ember.computed.gt('mentions.length', 0),\n\n    //unfortunately we have to remarkdown the message since these were all individual parts of a message\n    messageBody: Ember.computed('raw', function () {\n        return markdownToHtml(this.get('raw'));\n    }),\n\n    editableEndTime: Ember.computed('time', function () {\n        return moment(this.get('time'));\n    }),\n\n    failedMessages: Ember.computed('messageArray.@each.{sendError}', function () {\n        return _.chain(this.get('messageArray'))\n            .filter(message => message.get('sendError'))\n            .value();\n    }),\n\n    sendError: Ember.computed.gt('failedMessages.length', 0),\n\n    pending: Ember.computed('history', 'messageArray.@each.pending', 'totalMessages', function () {\n        if (this.get('history')) {\n            return false;\n        } else {\n            return this.get('messageArray.length') < this.get('totalMessages');\n        }\n    }),\n\n    addSplitMessage(message) {\n        const messages = this.get('messageArray');\n\n        messages.pushObject(message);\n        messages.sort((a, b) => (a.get('splitMessageIndex') < b.get('splitMessageIndex') ? -1 : 1));\n\n        this.notifyPropertyChange('messageArray');\n    }\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nconst { computed } = Ember;\n\nconst StationModel = DS.Model.extend({\n    intl: Ember.inject.service(),\n\n    userId: DS.attr(),\n    stationId: DS.attr(),\n    name: DS.attr(),\n    status: DS.attr(),\n    type: DS.attr(),\n    webrtcMediaDscp: DS.attr(),\n    webrtcForceTurn: DS.attr(),\n    persistentConnection: DS.attr(),\n    webRtcUserId: DS.attr(),\n    webRtcCallAppearances: DS.attr(),\n    webRtcRequireMediaHelper: DS.attr(),\n\n    state: computed('status', function () {\n        return this.get('intl').lookup(`purecloud.station.status.${this.get('status').toLowerCase()}`);\n    }),\n\n    available: computed('status', function () {\n        return this.get('status').toLowerCase() === 'available';\n    }),\n\n    isWebrtc: computed('type', 'name', function () {\n        return this.get('type') === 'inin_webrtc_softphone';\n    }),\n\n    isRemoteStation: computed.equal('type', 'inin_remote')\n});\n\nStationModel.reopenClass({\n    apiEndpoint: 'v2/stations'\n});\n\nexport default StationModel;\n","import { hasKey, includes } from 'connections-ui/utils/types';\n\nconst GeneralUnrecoverableAppFailureTypes = [\n    'invalidEnv',\n    'timeMachineFailure',\n    'missingAuthenticator',\n    'generalAuthenticationFailure',\n    'sessionInvalidationFailure',\n    'profileFetchServerFailure'\n] as const;\n\nexport type GeneralUnrecoverableAppFailure = {\n    type: (typeof GeneralUnrecoverableAppFailureTypes)[number];\n};\n\nconst SessionBootstrapSteps = [\n    'getTokenFailure',\n    'loadFeatureToggles',\n    'setupTheme',\n    'setupUserAndTrustee',\n    'establishDirectorySession',\n    'initServerTranslations',\n    'loadPresences',\n    'loadUserDetails',\n    'loadUserFavorites',\n    'setupCarrierPigeon',\n    'initAppSession',\n    'loadOrgPermissions',\n    'loadOrgTranscriptSettings',\n    'loadPerson'\n] as const;\n\nexport type SessionBootstrapFailure = {\n    type: 'sessionBootstrapError';\n    status?: number;\n    failedStep: (typeof SessionBootstrapSteps)[number];\n};\n\nexport function isGeneralUnrecoverableAppFailure(toCheck: unknown): toCheck is GeneralUnrecoverableAppFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n        return false;\n    }\n\n    return includes(GeneralUnrecoverableAppFailureTypes, toCheck.type);\n}\n\nexport function isSessionBootstrapFailure(toCheck: unknown): toCheck is SessionBootstrapFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || toCheck.type !== 'sessionBootstrapError') {\n        return false;\n    }\n\n    if (hasKey(toCheck, 'status') && !['undefined', 'number'].includes(typeof toCheck.status)) {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'failedStep') || typeof toCheck.failedStep !== 'string') {\n        return false;\n    }\n\n    return includes(SessionBootstrapSteps, toCheck.failedStep);\n}\n\nexport function isUnrecoverableAppFailure(toCheck: unknown): toCheck is UnrecoverableAppFailure {\n    return isGeneralUnrecoverableAppFailure(toCheck) || isSessionBootstrapFailure(toCheck);\n}\n\ntype UnrecoverableAppFailure = GeneralUnrecoverableAppFailure | SessionBootstrapFailure;\n\nexport default UnrecoverableAppFailure;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../utils/dates';\n\nvar UserModel = DS.Model.extend({\n    _id: DS.attr(),\n    lang: DS.attr(),\n    personId: DS.attr(),\n    personGuid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr(),\n    mt: DS.attr(),\n    email: DS.attr(),\n    welcomeSent: DS.attr(),\n    lastLogin: DS.attr(),\n    clientVersions: DS.attr(),\n    userType: DS.attr(),\n    passwordSaved: DS.attr(),\n    orgId: DS.attr(),\n\n    intl: Ember.inject.service(),\n\n    person: Ember.computed('personGuid', function () {\n        return this.store.find('person', this.get('personGuid'));\n    }),\n\n    isAdmin: Ember.computed('userType', function () {\n        return this.get('userType') === 'admin';\n    }),\n\n    isSuper: Ember.computed('userType', function () {\n        return this.get('userType') === 'super';\n    }),\n\n    userState: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: Ember.computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('welcomeSent') * 1000));\n        return date.format('L');\n    })\n});\n\nUserModel.reopenClass({\n    apiEndpoint: 'v2/users'\n});\n\nexport default UserModel;\n","define(\"connections-ui/models/video-communication\", [\"exports\", \"ember-purecloud-components/models/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed } = Ember;\n\nvar VoicemailMessageModel = DS.Model.extend({\n    conversation: DS.attr(),\n    read: DS.attr(),\n    audioRecordingDurationSeconds: DS.attr(),\n    audioRecordingSizeBytes: DS.attr(),\n    createdDate: DS.attr(),\n    modifiedDate: DS.attr(),\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    callerUser: DS.attr(),\n    name: DS.attr(),\n    selfUri: DS.attr(),\n    parentIds: DS.attr(),\n    group: DS.attr(),\n    note: DS.attr(),\n    copiedTo: DS.attr(),\n    copiedFrom: DS.attr(),\n    otherParties: DS.attr(),\n    displayName: DS.attr(),\n    dnis: DS.attr(),\n\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    useVoicemailApp: true,\n\n    init() {\n        this._super(...arguments);\n        // we will call this method in inbox service when loading voicemails when this feature toggle is enabled.\n        // no need to call here while toggle is enabled.\n        if (!this.get('useVoicemailApp')) {\n            this.loadParticipants();\n        }\n    },\n\n    type: 'voicemail',\n\n    date: computed('createdDate', function () {\n        return this.get('createdDate');\n    }),\n\n    mediaUri: computed('media.mediaFileUri', function () {\n        return this.get('media.mediaFileUri');\n    }),\n\n    caller: computed('callerAddress', 'callerName', function () {\n        return this.get('callerName') || this.get('callerAddress') || 'Not Available';\n    }),\n\n    dateFromNow: computed('createdDate', function () {\n        var createdDate = this.get('createdDate');\n        if (createdDate) {\n            return moment(createdDate).fromNow();\n        }\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(({ mediaFileUri }) => mediaFileUri);\n    }),\n\n    isGroupVoicemail: computed('group.{id,name}', function () {\n        const group = this.get('group');\n        return !_.isEmpty(group) && group.id && group.name;\n    }),\n\n    groupEntity: computed('group.entity', function () {\n        const id = this.get('group.id');\n        return this.get('store').findRecord('group', id, { reload: false, backgroundReload: false });\n    }),\n\n    loadParticipants: function () {\n        if (this.get('callerUser') || this.get('isGroupVoicemail')) {\n            return;\n        }\n        const conversationId = this.get('conversation.id');\n        if (this.get('conversation')) {\n            return this.loadEPCConversation(conversationId);\n        }\n    },\n\n    loadEPCConversation: async function (conversationId) {\n        let conversation;\n        try {\n            conversation = await this.store.findRecord('conversation', conversationId);\n        } catch (err) {\n            Ember.Logger.warn('Failed to load conversation for voicemail', { err });\n            return;\n        }\n\n        const participants = conversation.get('participants');\n        const userId = this.get('session.person.guid');\n        const participant = participants.find(participant => {\n            return participant.get('userId') !== userId;\n        });\n\n        if (participant) {\n            const userId = participant.get('userId');\n            if (userId) {\n                this.set('callerUser', { id: userId });\n            }\n\n            let callerName = participant.get('name');\n            if (!callerName) {\n                callerName = await this.fetchCallerName(userId);\n            }\n\n            this.set('callerName', callerName);\n        }\n\n        this.set('participants', participants);\n    },\n\n    fetchCallerName: function (userId) {\n        return this.store\n            .findRecord('public-api-user', userId)\n            .then(user => user.get('name'))\n            .catch(err => {\n                Ember.Logger.warn('Failed to fetch person name for voicemail', { err });\n                return '';\n            });\n    },\n\n    fetchAudio: function (formatId, forceReload) {\n        forceReload = forceReload || false;\n\n        var resolver;\n        var media = this.get('media');\n        if (media && !forceReload) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            var adapter = this.store.adapterFor('voicemail-message');\n            var endpoint = adapter.buildURL('voicemailMessage', this.get('id') + '/media');\n\n            resolver = (resolve, reject) => {\n                this.get('ajax')\n                    .ajaxGet(endpoint, {\n                        data: { formatId },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        data => {\n                            this.set('media', data);\n\n                            Ember.run(null, resolve, data);\n                        },\n                        reason => {\n                            // var msg = Ember.get(reason, 'responseJSON.message');\n                            this.set('media', {\n                                failed: 'Failed to load voicemail message'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new Ember.RSVP.Promise(resolver);\n    }\n});\n\nVoicemailMessageModel.reopenClass({\n    apiEndpoint: 'v2/voicemail/messages'\n});\n\nexport default VoicemailMessageModel;\n\n/*\nVoicemailMessage {\nconversation (UserCall, optional),\nread (boolean, optional),\naudioRecordingDurationSeconds (integer, optional),\naudioRecordingSizeBytes (integer, optional),\ncreatedDate (string, optional),\nmodifiedDate (string, optional),\ncallerAddress (string, optional),\ncallerName (string, optional),\ncallerUser (User, optional),\nname (string, optional),\nid (string, optional),\nselfUri (URI, optional),\nparentIds (array[Object], optional)\n}\n*/\n\n/*\n    this is separate endpiont from the message list????\n\nVoicemailMediaInfo {\nmediaFileUri (URI, optional),\nmediaImageUri (URI, optional),\nname (string, optional),\nselfUri (URI, optional),\nid (string, optional),\nparentIds (array[Object], optional)\n}\n*/\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    mutableGroupId: null,\n    timestamp: null,\n    type: null,\n    shiftTrade: null,\n    alternativeShift: null,\n    timeOffRequest: null,\n    markedAsRead: null,\n    agentNotification: null,\n    otherNotificationIdsInGroup: null,\n    adherenceExplanation: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"r9Qzlnt4\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"outlet\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/phone/template.hbs\"}});","import Resolver from 'ember-resolver';\nexport default Resolver;\n","import Ember from 'ember';\nimport config from './config/environment';\n\nexport const NOOP_TRANSITION = 'NOOP_TRANSITION';\n\nconst Router = Ember.Router.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    location: config.locationType,\n    rootURL: config.rootURL,\n\n    titleDivider: '-',\n\n    transitionTo: function () {\n        const transition = this._super(...arguments);\n        if (transition && transition.then && typeof transition.then === 'function') {\n            transition.then(() => {\n                if (transition.isActive && !transition.isAborted) {\n                    this.trigger(NOOP_TRANSITION);\n                }\n            });\n        }\n        return transition;\n    }\n});\n\nRouter.map(function () {\n    this.route('maintenance');\n    this.route('no-access');\n    this.route('login');\n    this.route('login-oauth');\n\n    this.route('search');\n\n    this.route('person', { resetNamespace: true }, function () {\n        this.route('list');\n\n        this.route('detail', { path: ':person_id' }, function () {\n            this.route('edit');\n        });\n\n        this.route('new-detail', { path: 'new/:person_id' });\n    });\n\n    this.route('card', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':person_id' });\n        this.route('tree', { path: 'tree/:person_id' });\n    });\n\n    // to do, the link-tos to this route need to be replaced and proxied to\n    // a nav event in the parent frame\n    this.route('group', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':group_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('time-machine', { path: 'timemachine/*buildTag' });\n\n    this.route('skillgroup', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':skillgroup_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('engage.recording-management-redirect', {\n        path: 'admin/quality/recordings/screensessions',\n        resetNamespace: true\n    });\n});\n\nexport default Router;\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\n    beforeModel(transition) {\n        this._super(...arguments);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        const url = transition.intent.url;\n\n        if (url && url.indexOf('/admin/interactions') === 0) {\n            this.replaceWith('/analytics/interactions');\n        }\n    },\n\n    actions: {\n        didTransition() {},\n        gotoRoute(route) {\n            this.transitionTo(route);\n        }\n    }\n});\n","import Ember from 'ember';\n\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';\n\n// Use the uprotectedroutemixin to skip the custom, protected, default Ember.Route\nexport default Ember.Route.extend(UnprotectedRouteMixin, ApplicationRouteMixin, {\n    mediaProviders: Ember.inject.service(),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    purecloudOauth: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    init() {\n        this._super(...arguments);\n\n        this.get('session').on('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        this.get('session').off('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    actions: {\n        willTransition(transition) {\n            this.applicationService.postMessageRouteChange(transition); // broadcast route change to parent if iframed\n\n            if (this.get('applicationService.errorState')) {\n                this.transitionTo('maintenance');\n                return;\n            }\n        },\n\n        transitionToRoute(route, id) {\n            if (id) {\n                this.transitionTo(route, id);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        transitionToEntityDetail(entity) {\n            var route = entity.get('type') + '.detail';\n            this.transitionTo(route, entity.get('id'));\n        },\n\n        logout() {\n            var session = this.get('session');\n            session.logout();\n        },\n\n        linkTo(route, param) {\n            if (param) {\n                this.transitionTo(route, param);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        error(error, transition) {\n            Ember.Logger.error('Error transitioning route: ', {\n                error,\n                remoteData: { routeName: transition.targetName }\n            });\n            Ember.onerror(error);\n            return true;\n        },\n\n        performRecentSearch(recent, filter) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            this.transitionTo('search', {\n                queryParams: {\n                    query: recent.query,\n                    entity: filter,\n                    saveHistory: false\n                }\n            });\n        },\n\n        performSearch(query, filter, queryFacets) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            if (!queryFacets) {\n                queryFacets = '';\n            }\n\n            this.transitionTo(`/search-v2?entity=person&query=${query}`);\n            return;\n        },\n\n        togglePanel() {},\n        openPanel() {},\n        closePanel() {},\n        openPreferencesModal() {},\n        toggleCommunicationSidebarExpanded() {},\n        ensureRouteVisibility() {},\n\n        openChatRoom(jid) {\n            this.get('embedded').startChatByJid(jid);\n        },\n\n        async openChatRoomWithVideo(id, useMediaProviders = false) {\n            if (!useMediaProviders) {\n                this.get('embedded').launchVideoWithPersonById(id);\n            }\n        },\n\n        startCallPersonById(id) {\n            this.get('embedded').startCallPersonById(id);\n        },\n\n        startCallByNumber(phoneNumber) {\n            this.get('embedded').startCallByNumber(phoneNumber);\n        },\n\n        loading(transition, originRoute) {\n            if (\n                originRoute.routeName === 'application' &&\n                !this.get('session.isAuthenticated') &&\n                !this.get('purecloudOauth.inLogoutBounce')\n            ) {\n                // Show the application-loading route on session restore; otherwise,\n                // it's not worth the flash before redirecting or showing the login route\n                return true;\n            }\n        }\n    },\n\n    // Ember Simple Auth Impls\n    sessionAuthenticated() {\n        let stateRestore = this.get('purecloudOauth').popRestoreState();\n        if (stateRestore) {\n            window.location = stateRestore.url;\n            return;\n        }\n        this._super();\n    },\n\n    sessionInvalidated() {\n        // Record the logout time to handle the logout bounce\n        this.get('purecloudOauth').recordLogoutTime();\n        this.set('application.errorState', { type: 'missingAuthenticator' });\n        this.transitionTo('maintenance');\n    },\n\n    onSessionInvalidationFailure() {\n        this.set('application.errorState', { type: 'sessionInvalidationFailure' });\n        this.transitionTo('maintenance');\n    },\n\n    beforeModel(transition) {\n        if (this.get('applicationService.errorState')) {\n            this.transitionTo('maintenance');\n            return;\n        }\n\n        if (Ember.get(transition, 'queryParams.mobile')) {\n            this.get('application').set('mobileQueryParameter', true);\n        }\n\n        return this._super(transition);\n    }\n});\n","import Ember from 'ember';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar CardDetailRoute = Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model: function (params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.cardView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel: function (model) {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n\n        var promises = [model.get('directReports'), model.get('manager'), model.get('managerSiblings')];\n        return Ember.RSVP.all(promises);\n    }\n});\n\nexport default CardDetailRoute;\n","import Ember from 'ember';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport default Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    store: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.tree'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/tree/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model(params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.treeView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel() {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/contacts');\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/external-orgs');\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport ModelRouteMixin from '../../mixins/model-route';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar GroupDetailRoute = Ember.Route.extend(ModelRouteMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Group Profile',\n\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        let namedPermissions = this.get('session.namedPermissions') || [];\n        let hasRolesView = _.includes(namedPermissions, 'authorization:role:view');\n        let hasGrantsEdit = _.includes(namedPermissions, 'authorization:grant:add');\n        return hasRolesView && hasGrantsEdit;\n    }),\n\n    updateParentRoute(groupId) {\n        if (this.get('application.adminUIContext')) {\n            return;\n        }\n        const newHash = `#/group-v2/${groupId}`;\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let controller = this.controllerFor('group.detail');\n            if (controller.get('isEditing')) {\n                let msg = this.get('intl').lookup('notification.group.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n            }\n\n            controller.set('isEditing', false);\n\n            return true;\n        }\n    },\n\n    model: function (params, transition) {\n        const id = params.group_id;\n\n        let currentModel = this.store.peekRecord('group', id);\n        if (currentModel && currentModel.get('isDeleted')) {\n            transition.abort();\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n            return;\n        }\n\n        this.updateParentRoute(id);\n\n        return this.store.findRecord('group', id, { include: 'policy' }).then(group => {\n            if (!group.get('guid') || isGuid(group.get('id'))) {\n                return group;\n            }\n            this.transitionTo('group.detail', group.get('guid'));\n        });\n    },\n\n    afterModel(group) {\n        let state = group.get('state');\n        if (state === 'deleted' || group.get('isDeleted')) {\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n\n            this.transitionTo('person.detail', this.get('session.person.id'));\n            return;\n        }\n\n        return group.reload().then(group => {\n            if (this.get('canEditRoles')) {\n                return group.getGrants();\n            } else {\n                return Ember.RSVP.resolve();\n            }\n        });\n    },\n\n    setupController(controller, model) {\n        this._super(controller, model);\n\n        this.set('routeTitle', model.get('name'));\n\n        let sidebar = this.get('sidebarService');\n        if (sidebar) {\n            sidebar.set('routeTitle', model.get('name'));\n        }\n\n        this.get('embedded').sendPageData({\n            helpPath: 'group.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n\nexport default GroupDetailRoute;\n","import Ember from 'ember';\n\nconst IndexRoute = Ember.Route.extend({\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        /* @see services/Session.authenticateWithSession() as this is the ember-simple-auth\n         * authenicator handler function before this route catch-all (empty) route.\n         */\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        return Ember.RSVP.resolve(result).then(() => {\n            var personId = this.get('session.person.id') || this.get('session.user.personId');\n\n            if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                return this.transitionTo('search');\n            }\n\n            if (!personId) {\n                Ember.Logger.error(\"Index Route: Standard user has no 'personId'.  Transitioning to no-access.\");\n                this.set('session.hasAppAccess', false);\n                return this.transitionTo('no-access');\n            }\n\n            return this.transitionTo('person.detail', personId);\n        });\n    }\n});\n\nexport default IndexRoute;\n","import Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from 'connections-ui/services/session';\n\nconst { Route, inject, RSVP } = Ember;\n\nvar OAuth2LoginRoute = Route.extend(UnauthenticatedRouteMixin, {\n    controllerName: 'login-oauth',\n\n    intl: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    purecloudOauth: inject.service(),\n    authenticator: null,\n\n    routeTitle: Ember.computed(function () {\n        return this.get('intl').lookup('auth.login');\n    }),\n\n    actions: {\n        mobileOfferDeclined() {\n            this.set('application.offerMobileApp', false);\n            return Ember.RSVP.resolve();\n        },\n        authenticate() {\n            return this._authenticate(this.modelFor(this.routeName));\n        }\n    },\n\n    beforeModel: function (transition) {\n        if (!this.get('authenticator')) {\n            let authenticator = Ember.getOwner(this).lookup('authenticator:directory');\n            if (authenticator) {\n                this.set('authenticator', authenticator);\n            } else {\n                Ember.Logger.error(\"Failed to locate 'authenticator:directory' in Container.\");\n                this.set('application.errorState', { type: 'missingAuthenticator' });\n                return this.transitionTo('maintenance');\n            }\n        }\n\n        this._super(transition);\n\n        return this.get('intl').loadTranslations();\n    },\n\n    model: function () {\n        return Ember.Object.create(this.get('authenticator').extractAuthData());\n    },\n\n    afterModel: function (resolvedModel) {\n        if (resolvedModel.access_token) {\n            // Returning from Successful Login\n\n            /*\n             * Set denied so we don't get reprompted by this route or application\n             * The user is either not mobile or previously denied the app before login\n             */\n            this.set('application.offerMobileApp', false);\n\n            resolvedModel.set('offerMobileApp', this.get('application.offerMobileApp'));\n            // Resolve with the model to show loading screen and init local session\n            return RSVP.resolve(resolvedModel);\n        } else {\n            // Need authentication\n\n            resolvedModel.state = this.get('purecloudOauth').serializeRestoreState();\n\n            let offerMobileApp = this.get('application.offerMobileApp') && !this.get('purecloudOauth.inLogoutBounce');\n\n            if (offerMobileApp) {\n                // Resolve with the model to show mobile offer and then auth\n                resolvedModel.set('offerMobileApp', true);\n                return RSVP.resolve(resolvedModel);\n            } else {\n                // Return a non-resolving promise so the redirect can complete without a flash of the route\n                return new RSVP.Promise(() => {\n                    this.set('holdPromiseRef', this._authenticate(resolvedModel));\n                });\n            }\n        }\n    },\n\n    /**\n     * Invokes the OAuth authenticator.\n     *\n     * @returns An promise which will either:\n     * <ul>\n     * <li>Resolve on authenticator success.  [Note:] ESA will transition on success/failure.</li>\n     * <li>Handle the authenticator failure (auth UI, no-access, failure) and reject for callers.  Callers do not need to take any action.</li>\n     * </ul>\n     */\n    _authenticate: function (authData) {\n        return new RSVP.Promise((resolve, reject) => {\n            this.get('session')\n                .authenticate('authenticator:directory', authData)\n                .then(resolve)\n                .catch(rejectionDetails => {\n                    if (rejectionDetails && rejectionDetails.reason === 'noToken') {\n                        if (window === window.parent) {\n                            // Not in an iframe. For the standalone mode for development.\n                            reject('unauthenticated');\n                            window.location = rejectionDetails.authUrl;\n                        } else {\n                            // In an iframe, in WebDirectory?\n                            reject('failure');\n                            this.set('application.errorState', {\n                                type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                                failedStep: 'getTokenFailure'\n                            });\n                            this.transitionTo('maintenance');\n                        }\n                    } else if (rejectionDetails && rejectionDetails.reason === 'noAccess') {\n                        // Currently don't distinguish between 400s and 500s in local session.  Assuming our services are ok\n                        reject('unauthorized');\n                        this.transitionTo('no-access');\n                    } else if (rejectionDetails && rejectionDetails.reason === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                        // Bootstrap error will already have been logged\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                            failedStep: rejectionDetails.failedStep,\n                            status: rejectionDetails.status\n                        });\n                        this.transitionTo('maintenance');\n                    } else {\n                        let authFailureReason =\n                            rejectionDetails && rejectionDetails.reason ? rejectionDetails.reason : 'authFailure';\n                        Ember.Logger.error('Authentication Failed:', {\n                            rejectionDetails,\n                            remoteData: {\n                                sensitive: {\n                                    reason: authFailureReason\n                                }\n                            }\n                        });\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: 'generalAuthenticationFailure'\n                        });\n                        this.transitionTo('maintenance');\n                    }\n                });\n        });\n    }\n});\n\nexport default OAuth2LoginRoute;\n","import Ember from 'ember';\n\n// This route's sole purpose is to redirect users to the index page. It's for people who have bookmarked the login page\nvar LoginRoute = Ember.Route.extend({\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return result;\n        } else {\n            return this.transitionTo('index');\n        }\n    }\n});\n\nexport default LoginRoute;\n","import Ember from 'ember';\nimport { Promise, resolve } from 'rsvp';\nimport UnrecoverableAppFailure, { isSessionBootstrapFailure } from 'connections-ui/models/unrecoverable-app-failure';\nimport { buildCommonTelemetryContext } from 'connections-ui/services/analytics';\nimport { hasKey } from 'connections-ui/utils/types';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport { Transition } from '../utils/ember-types';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { inject, Route } = Ember;\n\nconst MaintenanceRoute = Route.extend(UnprotectedRouteMixin, {\n    intl: inject.service(),\n    session: inject.service(),\n    applicationService: inject.service('application'),\n\n    beforeModel: function (transition: Transition): any {\n        return resolve()\n            .then(() => {\n                return this._super(transition);\n            })\n            .then(() => {\n                if (hasKey(transition, 'isActive') && transition.isActive === false) {\n                    // Route canceled for auth\n                    return;\n                }\n\n                const errorState = this.get('applicationService').get('errorState');\n                if (!errorState) {\n                    return this.transitionTo('index');\n                }\n\n                if (!isSessionBootstrapFailure(errorState)) {\n                    addPageAction(\n                        'maintenanceMode',\n                        Object.assign(\n                            {\n                                failedStep: errorState.type\n                            },\n                            buildCommonTelemetryContext({\n                                applicationService: this.get('applicationService'),\n                                sessionService: this.get('session'),\n                                intlService: this.get('intl')\n                            })\n                        )\n                    );\n                }\n\n                return (this.get('intl') as any).loadTranslations();\n            });\n    },\n\n    model: function (): Promise<undefined | UnrecoverableAppFailure> {\n        return resolve()\n            .then(() => {\n                return this._super(...arguments);\n            })\n            .then(() => {\n                // We assert errorState exists in the beforeModel hook.\n                // The controller still needs to account for untyped errorState until we're fully TS\n                return this.get('applicationService').get('errorState')!;\n            });\n    },\n\n    actions: {\n        reloadApp: function () {\n            (this.get('session') as any)._reloadApplication();\n        }\n    }\n});\n\nexport default MaintenanceRoute;\n","import Ember from 'ember';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\n\nexport default Ember.Route.extend(UnprotectedRouteMixin, {\n    beforeModel() {\n        this._super(...arguments);\n        return this.get('intl').loadTranslations();\n    }\n});\n","import EngageSupervisor from 'connections-ui/routes/engage-supervisor';\n\nexport default EngageSupervisor.extend();\n","import Ember from 'ember';\n\nimport ModelRouteMixin from '../../mixins/model-route';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport default Ember.Route.extend(ModelRouteMixin, LoggerMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Person Profile',\n\n    getUserId(transition) {\n        const id = transition.params['person.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('person.detail', res[0].get('id'));\n                }\n            })\n            .catch(err => {\n                this.get('logger').error('route/person: getUserId failed', {\n                    personId: id,\n                    error: err\n                });\n                this.transitionTo('person.detail', this.get('session.person.id'));\n            });\n    },\n\n    updateParentRoute(transition, userId) {\n        if (this.get('application.adminUIContext')) {\n            return;\n        }\n        let newHash;\n        if (transition.intent && transition.intent.url) {\n            const initialIntent = `#${transition.intent.url}`;\n            newHash = initialIntent.replace(/person/, 'person-v2');\n        } else {\n            newHash = `#/person-v2/${userId}`;\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let editing = this.get('controller.editing') && this.get('controller.editingSection');\n            if (editing) {\n                let msg = this.get('intl').lookup('notification.person.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n\n                this.set('controller.editing', false);\n                this.set('controller.editingSection', false);\n            }\n\n            return true;\n        }\n    },\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n        var id = transition.params['person.detail'].person_id;\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n            if (id === this.get('session.person.id')) {\n                // if (transition.params['person.detail'].person_id === this.get('session.person.id')) {\n                transition.abort();\n            }\n            return;\n        }\n\n        return Ember.RSVP.resolve(result)\n            .then(() => {\n                var person;\n\n                return this.getUserId(transition)\n                    .then(id => {\n                        this.updateParentRoute(transition, id);\n\n                        if (id === this.get('session.person.id')) {\n                            person = this.get('session.person');\n                        } else {\n                            person = this.store.recordForId('person', id);\n                        }\n\n                        if (\n                            person &&\n                            !person.get('isEmpty') &&\n                            !person.get('isSaving') &&\n                            !person.get('isLoading') &&\n                            !person.get('isReloading')\n                        ) {\n                            return person\n                                .reload()\n                                .then(function (p) {\n                                    p.rollbackAttributes();\n                                })\n                                .catch(err => {\n                                    this.get('logger').error(\n                                        'route/person: beforeModel failed at reload/rollback step',\n                                        {\n                                            personId: id,\n                                            error: err\n                                        }\n                                    );\n                                    return Ember.RSVP.reject();\n                                });\n                        } else {\n                            return true;\n                        }\n                    })\n                    .catch(err => {\n                        this.get('logger').error('route/person: beforeModel failed after getUserId step', {\n                            personId: id,\n                            error: err\n                        });\n                        return Ember.RSVP.reject();\n                    });\n            })\n            .catch(err => {\n                this.get('logger').error('route/person: beforeModel operation failed', {\n                    personId: id,\n                    error: err\n                });\n                return Ember.RSVP.reject();\n            });\n    },\n\n    model(params) {\n        // We have a guid by this point due to the beforeModel hook performing a transition for us\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.store\n                .findRecord('public-api-user', params.person_id, {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => {\n                    if (params.person_id === this.get('session.person.id')) {\n                        resolve({\n                            user,\n                            person: this.get('session.person')\n                        });\n                        return;\n                    }\n                    user.get('profile')\n                        .then(profile => {\n                            resolve({\n                                user,\n                                person: profile\n                            });\n                        })\n                        .catch(reject);\n                })\n                .catch(reject);\n        });\n    },\n\n    setupController(controller, model) {\n        this._super.apply(this, arguments);\n\n        if (this.get('session.person.id') !== model.person.get('id')) {\n            controller.set('editing', false);\n        } else {\n            controller.set('editing', true);\n        }\n\n        this.set('routeTitle', model.person.get('name'));\n        this.get('embedded').sendPageData({\n            helpPath: 'person.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    routing: Ember.inject.service('-routing'),\n\n    routeTitle: '',\n\n    updateParentRoute(transition) {\n        let routing = this.get('routing');\n        let params = Object.values(transition.params).filter(param => {\n            return Object.values(param).length;\n        });\n        let url = routing.generateURL(transition.targetName, params, transition.queryParams);\n\n        const initialIntent = transition.intent.url ? `#${transition.intent.url}` : url;\n        let newHash;\n        if (initialIntent) {\n            newHash = initialIntent.replace(/search/, 'search-v2');\n        } else {\n            newHash = '#/search-v2';\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    model: function (params, transition) {\n        this.updateParentRoute(transition);\n    },\n\n    afterModel() {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.search').toString());\n        this.get('embedded').sendPageData({\n            helpPath: 'search',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { POOL_STATES } from '../../models/app-pool';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport appUtils from '../../utils/apps';\n\nconst { Route, inject, get, computed } = Ember;\n\nconst STANDALONE_APP_ROUTE_LOG_NS = 'Route';\n\nexport default Route.extend(LoggerMixin, {\n    apps: inject.service(),\n    intl: inject.service(),\n\n    appsProblem: false,\n    unknownApp: false,\n    currAppName: null,\n\n    routeTitle: computed('appsProblem', 'unknownApp', 'currAppName', function () {\n        let result = null;\n\n        if (this.get('appsProblem')) {\n            result = this.get('intl').lookup('apps.loadFailedTitle').toString();\n        } else if (this.get('unknownApp')) {\n            result = this.get('intl').lookup('apps.notFoundTitle').toString();\n        } else {\n            result = this.get('currAppName') || this.get('intl').lookup('apps.title').toString();\n        }\n\n        return result;\n    }),\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        this.set('appsProblem', false);\n        this.set('unknownApp', false);\n        if (this.get('apps.appsSupported')) {\n            /*\n             * Clear currAppName so it will trigger a routeTitle update if the\n             *  user is bouncing between a single app and a non-app route.\n             */\n            this.set('currAppName', null);\n            return result;\n        } else {\n            // Apps are disabled.  go to index\n            return this.transitionTo('index');\n        }\n    },\n\n    model(params) {\n        let appPool = this.get('apps.standaloneAppPool');\n\n        return appPool\n            .showApp(params.app_id)\n            .then(poolState => {\n                let result = null;\n\n                if (poolState && poolState.name === POOL_STATES.SHOWING_APP) {\n                    this.set('currAppName', get(poolState, 'details.instance.app.name'));\n\n                    result = {\n                        instanceId: get(poolState, 'details.instance.instanceId')\n                    };\n                }\n\n                return result;\n            })\n            .catch(poolState => {\n                if (poolState && poolState.name === POOL_STATES.APP_NOT_FOUND) {\n                    this.set('unknownApp', true);\n\n                    // Possible Causes:\n                    // User using old or unauthorized link\n                    // User reloaded PureCloud on this route and the app has been deleted or he/she no longer has permission\n                    // Pool state and menu out of sync (Should not happen)\n                    this.logger.warn(\n                        appUtils.buildStandaloneAppLogMsg(\n                            'Unknown App requested in route param.',\n                            STANDALONE_APP_ROUTE_LOG_NS\n                        ),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: Ember.get(poolState, 'name')\n                            }\n                        }\n                    );\n                } else {\n                    this.set('appsProblem', true);\n\n                    this.logger.error(\n                        appUtils.buildStandaloneAppLogMsg('Failed to show App in route', STANDALONE_APP_ROUTE_LOG_NS),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: Ember.get(poolState, 'name')\n                            }\n                        }\n                    );\n                }\n\n                return null;\n            })\n            .finally(() => {\n                this.set('apps.standaloneAppPoolVisible', true);\n            });\n    },\n\n    actions: {\n        willTransition() {\n            let model = this.modelFor(this.routeName);\n\n            if (model && model.instanceId) {\n                // Determine if the pool is still showing the app for this route.\n                // The app for this route may not be shown if the app has been hidden/stopped/closed for\n                // another reason (e.g. Removed App closed by user) and we are transitioning to another route (e.g. index).\n                let initPoolState = this.get('apps.standaloneAppPool.currState');\n\n                if (\n                    initPoolState &&\n                    initPoolState.name === POOL_STATES.SHOWING_APP &&\n                    get(initPoolState, 'details.instanceId') === model.instanceId\n                ) {\n                    // Pool is showing this route's app, attempt to hide it.\n                    this.get('apps.standaloneAppPool')\n                        .hideApp(model.instanceId)\n                        .catch(rejectionPoolState => {\n                            // Ignore the failure as we still want to proceed and hide the pool\n                            // Log this as it should not happen\n                            this.logger.error(\n                                appUtils.buildStandaloneAppLogMsg(\n                                    'Failed to hide standalone app when trying to transition out of route',\n                                    STANDALONE_APP_ROUTE_LOG_NS\n                                ),\n                                {\n                                    initPoolState,\n                                    rejectionPoolState,\n                                    remoteData: {\n                                        routeAppId: model.instanceId,\n                                        initPoolState: Ember.get(initPoolState, 'name'),\n                                        rejectionPoolState: Ember.get(rejectionPoolState, 'name')\n                                    }\n                                }\n                            );\n                        });\n                }\n            }\n\n            this.set('apps.standaloneAppPoolVisible', false);\n\n            return true;\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { Route, inject, RSVP, Logger } = Ember;\n\nexport default Route.extend({\n    queryParams: {\n        targetRoute: {\n            refreshModel: true\n        }\n    },\n    application: inject.service(),\n    intl: inject.service(),\n\n    routeTitle() {\n        return this.get('intl').lookup('timemachine.title');\n    },\n\n    model(params, transition) {\n        let redirectUrl = window.location.origin || `${window.location.protocol}//${window.location.host}`;\n\n        redirectUrl += window.location.pathname;\n\n        if (redirectUrl.charAt(redirectUrl.length - 1) !== '/') {\n            redirectUrl += '/';\n        }\n\n        let hashRoute = '';\n        let targetRoute = (params.targetRoute || '').trim();\n        if (targetRoute) {\n            if (targetRoute.charAt(0) !== '/') {\n                targetRoute = '/' + targetRoute;\n            }\n            hashRoute = '#' + targetRoute;\n        }\n\n        redirectUrl += `${params.buildTag}/index.html`;\n        redirectUrl += window.location.search;\n        redirectUrl += hashRoute;\n\n        const runtime = this.get('application.runtime');\n        if (runtime.local) {\n            Logger.error('Timemachine is not available locally.  Use the Git Capacitor.');\n            transition.abort();\n            this.transitionTo('index');\n        } else if (['prod', 'fedramp'].includes(runtime.env)) {\n            return {\n                redirectUrl,\n                buildTag: params.buildTag\n            };\n        } else {\n            // Return a non-resolving promise to let the redirect complete\n            return new RSVP.Promise(() => {\n                window.location = redirectUrl;\n            });\n        }\n    },\n\n    actions: {\n        confirm() {\n            let currModel = this.modelFor(this.routeName);\n\n            if (currModel && currModel.redirectUrl) {\n                window.location = currModel.redirectUrl;\n            } else {\n                this.set('application.errorState', { type: 'timeMachineFailure' });\n                this.transitionTo('maintenance');\n            }\n        },\n\n        cancel() {\n            this.transitionTo('index');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\n\nconst DEFAULT_PARAMS = {\n    pageNumber: 1,\n    pageSize: 25,\n    types: ['users', 'groups', 'locations'],\n    sortOrder: 'ASC',\n    expand: ['authorization']\n};\n\nexport default Mixin.create({\n    search: inject.service('search'),\n\n    performSimpleKeywordSearch(query, params) {\n        params = Object.assign({}, DEFAULT_PARAMS, params, {\n            query: [\n                {\n                    value: query,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            returnFields: this.get('search.fields')\n        });\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    performSearch(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    suggest(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.suggestEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { SEARCH_QUERY_OPERATORS, SEARCH_AGGREGATE_TYPES, SEARCH_QUERY_TYPES } from './service';\n\nimport { BASE_PERSON_FIELDS, BASE_PERSON_EXPANDS } from '../models/person';\n\nconst { computed } = Ember;\n\nexport default Ember.Object.extend({\n    service: null,\n\n    page: null,\n    limit: null,\n\n    types: null,\n    queries: null,\n    aggregations: null,\n    returnFields: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.queries = [];\n        this.aggregations = [];\n        this.types = ['users', 'groups', 'locations'];\n    },\n\n    data: computed('queries.[]', 'aggregations.[]', 'types.[]', function () {\n        const { queries, aggregations, page, limit, types, returnFields } = this.getProperties(\n            'queries',\n            'aggregations',\n            'page',\n            'limit',\n            'types',\n            'returnFields'\n        );\n\n        const data = {\n            types\n        };\n\n        if (queries.length) {\n            data.query = queries;\n        }\n\n        // You can only search on users when you have aggregations\n        if (aggregations.length) {\n            data.aggregations = aggregations;\n            data.types = ['users'];\n        }\n\n        if (typeof page === 'number') {\n            data.pageNumber = page;\n        }\n\n        if (typeof limit === 'number') {\n            data.pageSize = limit;\n        }\n\n        if (returnFields && Array.isArray(returnFields)) {\n            data.returnFields = returnFields;\n        } else {\n            if (data.types.indexOf('users') === -1) {\n                data.returnFields = ['ALL_FIELDS'];\n            } else {\n                data.returnFields = BASE_PERSON_FIELDS;\n            }\n        }\n\n        data.expand = BASE_PERSON_EXPANDS;\n\n        return data;\n    }),\n\n    addQuery(value, operator = 'AND', type = 'QUERY_STRING', fields = []) {\n        Ember.assert(\n            `Operator must be one of: ${SEARCH_QUERY_OPERATORS}`,\n            _.includes(SEARCH_QUERY_OPERATORS, operator)\n        );\n        Ember.assert(`Type must be one of: ${SEARCH_QUERY_TYPES}`, _.includes(SEARCH_QUERY_TYPES, type));\n\n        if (type === 'QUERY_STRING') {\n            Ember.assert('If query type is `QUERY_STRING`, the query value must have a length >= 2', value.length >= 2);\n        }\n\n        const query = {\n            type\n        };\n\n        if (type !== 'MATCH_ALL') {\n            query.operator = operator;\n            query.value = value;\n        }\n\n        if (!_.isEmpty(fields)) {\n            query.fields = fields;\n        }\n\n        this.queries.pushObject(query);\n\n        return this;\n    },\n\n    // Add multiple queries at once. Pass in as arrays:\n    // [value, operator, ...], [value, operator, ...]\n    addQueries() {\n        const queries = [...arguments];\n        queries.forEach(query => {\n            this.addQuery(...query);\n        });\n        return this;\n    },\n\n    addTagQuery() {\n        return this;\n    },\n\n    addAggregation(name, value, field = 'profileSkills', type = 'CONTAINS', size = 15) {\n        Ember.assert(`Type must be one of: ${SEARCH_AGGREGATE_TYPES}`, _.includes(SEARCH_AGGREGATE_TYPES, type));\n        if (type !== 'COUNT') {\n            Ember.assert(\n                'You much include a name and value when type is not `COUNT`',\n                type !== 'COUNT' || (!!name && !!value)\n            );\n        }\n\n        const aggregation = {\n            name,\n            field,\n            type,\n            size\n        };\n\n        if (value) {\n            aggregation.value = value;\n        }\n\n        this.aggregations.pushObject(aggregation);\n\n        return this;\n    },\n\n    addAggregations() {\n        const aggregations = [...arguments];\n        aggregations.forEach(aggregation => {\n            this.addAggregation(...aggregation);\n        });\n        return this;\n    },\n\n    setPaging(page, limit) {\n        this.setProperties({ page, limit });\n        return this;\n    },\n\n    setTypes(types) {\n        types = types.map(type => {\n            if (type === 'people') {\n                return 'users';\n            }\n            return type;\n        });\n        this.set('types', types);\n        return this;\n    },\n\n    setReturnFields(returnFields) {\n        if (returnFields && returnFields.length) {\n            this.set('returnFields', returnFields);\n        } else {\n            this.set('returnFields', undefined);\n        }\n        return this;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport RequestBuilder from './request-builder';\nimport { singularize } from 'ember-inflector';\n\nconst { computed, inject, RSVP, Service } = Ember;\n\nconst resourceTypes = [\n    'resource_article',\n    'resource_page',\n    'resource_faq',\n    'resource_glossary',\n    'resource_releasenote'\n];\n\nexport const SEARCH_FACET_KEYPATHS = {\n    profileSkills: 'skills.skills',\n    department: 'general.department',\n    title: 'general.title',\n    hobbies: 'bio.hobbies',\n    interests: 'bio.interests',\n    certifications: 'skills.certs',\n    languages: 'languages.name'\n};\n\nexport const SEARCH_QUERY_TYPES = [\n    'EXACT',\n    'CONTAINS',\n    'STARTS_WITH',\n    'REQUIRED_FIELDS',\n    'RANGE',\n    'DATE_RANGE',\n    'LESS_THAN',\n    'LESS_THAN_EQUAL_TO',\n    'GREATER_THAN',\n    'GREATER_THAN_EQUAL_TO',\n    'SIMPLE',\n    'TERM',\n    'TERMS',\n    'QUERY_STRING',\n    'MATCH_ALL'\n];\n\nexport const SEARCH_QUERY_OPERATORS = ['AND', 'OR', 'NOT'];\n\nexport const SEARCH_AGGREGATE_TYPES = ['COUNT', 'SUM', 'AVERAGE', 'CONTAINS', 'STARTS_WITH', 'ENDS_WITH', 'TERM'];\n\nconst ALL_FIELDS = 'ALL_FIELDS';\n\nexport default Service.extend({\n    ajax: inject.service(),\n    store: inject.service(),\n    application: inject.service(),\n\n    apiEndpoint: computed.reads('_searchUrl'),\n    suggestEndpoint: computed.reads('_suggestUrl'),\n\n    _searchUrl: computed(function () {\n        return this.get('application').pcV2Uri('api/v2/search');\n    }),\n\n    _suggestUrl: computed('_searchUrl', function () {\n        return `${this.get('_searchUrl')}/suggest`;\n    }),\n\n    _docUrl: computed('_searchUrl', function () {\n        return this.get('application').pcV2Uri('api/v2/documentation/search');\n    }),\n\n    search(data) {\n        const url = this.get('_searchUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    suggest(data) {\n        const url = this.get('_suggestUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    searchDocumentation(data) {\n        const url = this.get('_docUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    modelResults(results) {\n        // turn search results into DS models\n        const store = this.get('store');\n        const entities = results.map(result => {\n            let type = singularize(result._type);\n            if (type === 'external_contact') {\n                type = 'external-contact';\n            }\n            if (type === 'user') {\n                type = 'person';\n            }\n            if (resourceTypes.includes(type)) {\n                type = 'resource-article';\n                const normObj = store.normalize(type, result).data;\n\n                // id fails to be set on normalized object when\n                // running locally.\n                normObj.id = result.id;\n                return normObj;\n            }\n            result.id = result.id || result.guid || result._id;\n            return store.normalize(type, result).data;\n        });\n        return store.push({ data: entities });\n    },\n\n    performSearch(\n        query,\n        page,\n        entity = 'all',\n        facets = [],\n        fields = [ALL_FIELDS],\n        type = 'QUERY_STRING',\n        returnFields = [],\n        pageSize = 25\n    ) {\n        if (type === 'QUERY_STRING' && (!query || query.length < 2)) {\n            return RSVP.resolve([]);\n        }\n\n        const store = this.get('store');\n\n        const defaultAggregations = [\n            ['department', null, 'department', 'TERM'],\n            ['title', null, 'title', 'TERM'],\n            ['profileSkills', null, 'profileSkills', 'TERM'],\n            ['hobbies', null, 'hobbies', 'TERM'],\n            ['interests', null, 'interests', 'TERM'],\n            ['certifications', null, 'certifications', 'TERM']\n            // ['languages', null, 'languages', 'TERM']\n        ];\n\n        if (entity === null) {\n            entity = 'all';\n        }\n\n        // Two requests while working out issues with Ember Data\n        const entityRequest = this.requestBuilder()\n            .setPaging(page + 1, pageSize)\n            .setReturnFields(returnFields);\n        const facetsRequest = this.requestBuilder()\n            .setPaging(page + 1, 0)\n            .addAggregations(...defaultAggregations);\n\n        if (entity !== 'all') {\n            if (entity === 'people') {\n                entity = 'users';\n            }\n\n            if (!Array.isArray(entity)) {\n                entity = [entity];\n            }\n            entityRequest.setTypes(entity);\n        }\n\n        if (!_.isEmpty(facets)) {\n            const selectedTerms = facets.rejectBy('isKeyword');\n            _.forEach(selectedTerms, term => {\n                const searchField = term.get('searchField');\n                const value = term.get('term.term');\n                entityRequest.addQuery(value, 'AND', 'EXACT', [searchField]);\n            });\n\n            if (!_.isEmpty(selectedTerms)) {\n                entityRequest.setTypes(['users']);\n            }\n        } else if (_.isEmpty(facets) && entity === 'users') {\n            entityRequest.addAggregations(...defaultAggregations);\n        }\n\n        if (_.isEmpty(query)) {\n            entityRequest.addQuery(null, 'OR', 'MATCH_ALL', fields);\n            facetsRequest.addQuery(null, 'OR', 'MATCH_ALL');\n        } else {\n            entityRequest.addQuery(query, 'AND', type, fields);\n            facetsRequest.addQuery(query);\n        }\n\n        const searchResults = store.search(null, entityRequest.get('data'));\n        let aggregateResults = Ember.RSVP.resolve([]);\n\n        if (entity === 'all') {\n            aggregateResults = store.search(null, facetsRequest.get('data'));\n        }\n\n        const data = Ember.RSVP.all([searchResults, aggregateResults]);\n\n        return data.then(([results, facets]) => {\n            if (!facets.get('_aggregations')) {\n                facets = results.get('_aggregations');\n            } else {\n                facets = facets.get('_aggregations');\n            }\n\n            facets = this.processFacets(facets);\n\n            return { results, facets };\n        });\n    },\n\n    performSuggestSearch(query, entity = 'all') {\n        const store = this.get('store');\n        const request = this.requestBuilder().addQuery(query).setPaging(1, 4);\n\n        if (entity === 'people') {\n            entity = 'users';\n        }\n\n        if (entity !== 'all') {\n            request.setTypes([entity]);\n        }\n\n        return store.suggest(request.get('data'));\n    },\n\n    performCustomSearch(requestBuilder) {\n        return this.get('store').search(null, requestBuilder.get('data'));\n    },\n\n    processFacets(facets) {\n        facets = _.chain(facets)\n            .map((terms, key) => {\n                if (!Object.prototype.hasOwnProperty.call(SEARCH_FACET_KEYPATHS, key)) {\n                    return null;\n                }\n\n                return {\n                    key,\n                    facetName: SEARCH_FACET_KEYPATHS[key],\n                    terms: _.map(terms, term => {\n                        return {\n                            term: term.key,\n                            count: term.count\n                        };\n                    })\n                };\n            })\n            .filter()\n            .value();\n\n        const orderKeys = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => orderKeys.indexOf(key));\n    },\n\n    requestBuilder() {\n        return RequestBuilder.create({\n            service: this\n        });\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    searchService: inject.service('search'),\n\n    search(query, params = {}) {\n        const adapter = this.adapterFor('search');\n        let promise;\n\n        if (query && !params.query) {\n            // This is a simple keyword search, no special queries\n            promise = adapter.performSimpleKeywordSearch(query, params);\n        } else {\n            promise = adapter.performSearch(params);\n        }\n\n        promise = Ember.RSVP.resolve(promise, 'Adapter#performSearch');\n\n        return promise\n            .then(\n                payload => {\n                    const { aggregations } = payload;\n                    const data = this._extractData(payload, 'search');\n                    return { aggregations, data, payload };\n                },\n                null,\n                'Store#search'\n            )\n            .then(({ aggregations, data, payload }) => {\n                Ember.set(data, '_aggregations', aggregations);\n                Ember.set(data, '_meta', payload);\n                return data;\n            });\n    },\n\n    suggest(query) {\n        const adapter = this.adapterFor('search');\n        let promise = adapter.suggest(query);\n\n        promise = Ember.RSVP.resolve(promise, 'Adapter#suggest');\n\n        return promise.then(\n            payload => {\n                return this._extractData(payload, 'search');\n            },\n            null,\n            'Store#suggest'\n        );\n    },\n\n    _extractData(payload, type = 'findMany') {\n        const serializer = this.serializerFor('application');\n\n        if (!payload.results && payload.aggregations) {\n            return payload.aggregations;\n        }\n\n        if (!payload.results) {\n            payload.results = [];\n        }\n\n        payload = serializer.normalizeArrayResponse(this, null, payload, null, type);\n\n        if (!payload.data) {\n            payload.data = [];\n        }\n\n        if (payload.included) {\n            payload.data = [].concat(payload.data, payload.included);\n            payload.included = [];\n        }\n\n        return this.push(payload);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { singularize } from 'ember-inflector';\n\nimport Validators from '../components/entity-fields/validators';\n\nexport var filterMissingFields = function (record, json) {\n    _.forEach(record.fieldConfig.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let fieldPath = field.get('fieldPath');\n            let type = field.get('type');\n            let values = record.getFieldValue(fieldPath);\n            let splitField = fieldPath.split('.');\n            let sectionKey = splitField[0],\n                fieldKey = splitField[1];\n\n            let container = json[sectionKey] ? json[sectionKey][fieldKey] : null;\n\n            if (Validators[type] && container) {\n                let validator = Validators[type];\n                if (typeof validator.isEmpty === 'function') {\n                    if (!Array.isArray(values)) {\n                        values = [values];\n                    }\n\n                    let toRemove = _.filter(values, function (value) {\n                        let isEmpty = validator.isEmpty(value, record, field);\n                        if (!value || (value.value !== undefined && isEmpty)) {\n                            if (container) {\n                                Ember.Logger.info('Removing field value:', fieldPath, container);\n                                return true;\n                            }\n                        }\n                    });\n\n                    container.removeObjects(toRemove);\n                }\n            }\n        });\n\n        if (_.isEmpty(json[section.get('key')])) {\n            delete json[section.get('key')];\n        }\n    });\n\n    return json;\n};\n\nlet OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nvar ApplicationSerializer = DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    primaryKey: 'guid',\n\n    isPrimaryType(store, typeName, primaryTypeClass) {\n        if (!primaryTypeClass) {\n            return false;\n        }\n\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = payload;\n        let groupKey = '_entity';\n\n        if (payload.res) {\n            data = payload.res;\n            delete payload.res;\n        } else if (payload.results) {\n            data = payload.results;\n            delete payload.results;\n        }\n\n        if (requestType === 'search') {\n            groupKey = '_type';\n        }\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            if (data && typeof data === 'object' && !Array.isArray(data)) {\n                data = _.map(data, value => value);\n            }\n\n            const finalData = {};\n            const groupedData = _.groupBy(data, groupKey);\n\n            _.forOwn(groupedData, (list, key) => {\n                if (key === undefined || key === 'undefined' || key === 'conversations') {\n                    key = primaryModelClass.modelName;\n                }\n\n                let type = singularize(key);\n                if (type === 'user' && requestType === 'search') {\n                    type = 'person';\n                }\n                finalData[type] = list.map(data => {\n                    data.id = data.id || data.guid || data._id;\n                    return data;\n                });\n            });\n\n            if (_.isEmpty(finalData) && primaryModelClass) {\n                finalData[primaryModelClass.modelName] = [];\n            }\n\n            let meta = {};\n            if (typeof payload === 'object' && !Array.isArray(payload)) {\n                meta = payload;\n            }\n\n            payload = _.merge(finalData, {\n                meta\n            });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        if (payload.res && !payload._id) {\n            payload = payload.res;\n        }\n\n        if (primaryModelClass.modelName === 'call') {\n            payload.id = payload.conversationId;\n        }\n\n        data[primaryModelClass.modelName] = payload;\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    serialize(snapshot, options) {\n        var json = this._super(snapshot, options);\n        delete json._entity;\n        return json;\n    }\n});\n\nexport default ApplicationSerializer;\n","define(\"connections-ui/serializers/call-communication\", [\"exports\", \"ember-purecloud-components/serializers/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n        const data = this.serialize(snapshot, options);\n        Object.assign(hash, data);\n    },\n\n    serialize(snapshot) {\n        const options = snapshot.adapterOptions;\n        let serialized;\n\n        if (options && options.patch) {\n            const attrsToSerialize = options.attrs;\n            const changed = snapshot.changedAttributes();\n            const attrs = Object.keys(changed);\n            if (!changed || attrs.length === 0) {\n                return this._super(...arguments);\n            }\n            const data = {};\n            attrs.forEach(attr => {\n                if (attrsToSerialize) {\n                    if (attrsToSerialize.indexOf(attr) > -1) {\n                        data[attr] = snapshot.attr(attr);\n                    }\n                } else {\n                    data[attr] = snapshot.attr(attr);\n                }\n            });\n\n            data.enabled = snapshot.attr('enabled');\n            data.voicemail = snapshot.attr('voicemail');\n\n            serialized = data;\n        } else {\n            serialized = this._super(...arguments);\n        }\n\n        delete serialized.phoneNumber;\n\n        return serialized;\n    }\n});\n","define(\"connections-ui/serializers/callback-communication\", [\"exports\", \"ember-purecloud-components/serializers/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\n  });\n});\n","import DS from 'ember-data';\n\nexport default DS.JSONSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = payload.entities || [];\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/chat-communication\", [\"exports\", \"ember-purecloud-components/serializers/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        payload.links = {\n            recordings: `/api/v2/conversations/${payload.id}/recordings`\n        };\n\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = _.map(payload.entities, convo => {\n                convo.links = {\n                    recordings: `/api/v2/conversations/${convo.id}/recordings`\n                };\n\n                return convo;\n            });\n            payload = data;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/conversation\", [\"exports\", \"ember-purecloud-components/serializers/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/email-communication\", [\"exports\", \"ember-purecloud-components/serializers/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport PurecloudSerializer from '../purecloud';\nimport { EMPTY_ORGANIZATION_MODEL } from './external-organization';\n\nconst EMPTY_MODEL_OBJECTS = {\n    workPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    cellPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: true\n    },\n    homePhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    otherPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    }\n};\n\nconst EXTERNAL_ORGANIZATION = 'externalOrganization';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        workPhone: { embedded: 'always' },\n        cellPhone: { embedded: 'always' },\n        homePhone: { embedded: 'always' },\n        otherPhone: { embedded: 'always' },\n        externalOrganization: { embedded: 'always' }\n    },\n\n    _normalizeContact(contact) {\n        if (contact.type) {\n            contact.contactType = contact.type.toLowerCase();\n            delete contact.type;\n        }\n        if (!contact.canonicalContact) {\n            contact.canonicalContact = { id: contact.id };\n        }\n        if (!contact.mergeSet) {\n            contact.mergeSet = [{ id: contact.id }];\n        }\n        if (!contact.middleName) {\n            contact.middleName = '';\n        }\n        return contact;\n    },\n\n    _getPojo(jsonProfile) {\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/contact' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(store)(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || payload.contacts || []).map(\n            this._fillEmptyPropertiesWithModelObjects(store)\n        );\n        payload = {\n            'externalcontacts/contacts': filledEntities,\n            meta: {\n                total: payload.total || filledEntities.length,\n                pageOffset: payload.pageNumber || 1,\n                pageSize: payload.pageSize,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(store) {\n        return payload => {\n            const emptyModel = EMPTY_MODEL_OBJECTS;\n            const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n            for (const property of Object.getOwnPropertyNames(emptyModel)) {\n                this._fillPropertyIfNecessary(property, payload, emptyModel);\n            }\n            if (payload[EXTERNAL_ORGANIZATION]) {\n                const organization = payload[EXTERNAL_ORGANIZATION];\n\n                try {\n                    store.hasRecordForId('externalcontacts/externalOrganization', organization.id);\n                } catch (err) {\n                    for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n                        this._fillPropertyIfNecessary(property, organization, emptyOrgModel);\n                    }\n                }\n            }\n            return this._normalizeContact(payload);\n        };\n    },\n\n    /**\n     * Updates the property value with the pre-filled defaultData if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and defaultData to access\n     * @param {*} data the new data\n     * @param {*} defaultData the original preset data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport PurecloudSerializer from '../purecloud';\n\nexport const EMPTY_ORGANIZATION_MODEL = {\n    websites: [],\n    tickers: [],\n    tags: [],\n    phoneNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    faxNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    },\n    twitterId: {\n        screenName: ''\n    }\n};\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, RelateFeaturesMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        phoneNumber: { embedded: 'always' },\n        faxNumber: { embedded: 'always' },\n        twitterId: { embedded: 'always' }\n    },\n\n    _getPojo(jsonProfile) {\n        if (jsonProfile.twitterId && !jsonProfile.twitterId.screenName) {\n            // If there is no Twitter screen name, don't send the twitterId property to the mid-tier\n            // Ref. https://s3.amazonaws.com/connect-apidocs/contacts-service/basic-objects.html#twitterid-object\n            delete jsonProfile.twitterId;\n        }\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/externalOrganization' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || []).map(entity =>\n            this._fillEmptyPropertiesWithModelObjects(entity)\n        );\n        payload = {\n            'externalcontacts/external-organizations': filledEntities,\n            meta: {\n                total: payload.total,\n                pageSize: payload.pageSize,\n                pageOffset: payload.pageNumber,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(payload) {\n        const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n        for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n            this._fillPropertyIfNecessary(property, payload);\n        }\n        return payload;\n    },\n\n    /**\n     * Updates the property value with the pre-filled model data if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and model to access\n     * @param {*} data the new data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData = EMPTY_ORGANIZATION_MODEL) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('facebook')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('line')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('twitter')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('whatsapp')\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeFindRecordResponse(store, primaryModelClass, payload) {\n        let jsonapiPayload = {\n            data: {\n                type: 'geolocation-settings',\n                id: '1',\n                attributes: payload\n            }\n        };\n        return jsonapiPayload;\n    }\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n    serializeIntoHash(data, type, record, options) {\n        Ember.merge(data, this.serialize(record, options));\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const data = {\n            geolocation: payload\n        };\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    extractId(modelClass, resourceHash) {\n        return resourceHash.subjectId + resourceHash.role.id + resourceHash.division.id;\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload.id) {\n            payload.id = id;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import ApplicationSerializer from './application';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport uuid from 'connections-ui/utils/uuid';\n\nconst { inject } = Ember;\n\nconst OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nexport default ApplicationSerializer.extend({\n    session: inject.service(),\n    serialize(snapshot, options) {\n        const json = this._super(snapshot, options);\n\n        // Never update contactInfo.chat, thats autogenerated\n        if (json && json.contactInfo && json.contactInfo.chat) {\n            delete json.contactInfo.chat;\n        }\n        return json;\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const meta = {};\n\n        if (requestType === 'deleteRecord') {\n            payload = payload.entities[0];\n            delete payload.entities;\n            payload.contactInfo = {\n                chat: []\n            };\n            payload.contactInfo.chat.push({\n                value: {\n                    jid: payload.chat.jabberId\n                },\n                labelKey: 'chat'\n            });\n            payload._id = this.getJabberId(payload.chat.jabberId);\n            delete payload.chat;\n        } else {\n            if (payload.general.links && payload.general.links.length > 0) {\n                this.generateGroupLinkIds(payload.general.links);\n            }\n            const jId = payload.contactInfo.chat[0].value.jid;\n            payload._id = this.getJabberId(jId);\n        }\n\n        payload.guid = payload.id || payload.guid;\n\n        if (payload.guid) {\n            payload.policy = {\n                id: payload.guid,\n                type: 'group-policy'\n            };\n        }\n\n        if (requestType === 'deleteRecord' && !payload._id) {\n            payload._id = id;\n        }\n\n        payload.meta = meta;\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        // normalizeArrayResponse was only implmented to handle bevy group results.\n        let data = payload;\n        if (payload.entities) {\n            data = payload.entities;\n            delete payload.entities;\n        }\n\n        const finalData = {};\n        let meta = {};\n        if (typeof payload === 'object' && !Array.isArray(payload)) {\n            meta = payload;\n        }\n\n        const groups = {};\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            _.forEach(data, g => {\n                if (g.contactInfo.chat && g.contactInfo.chat.length > 0) {\n                    const jId = g.contactInfo.chat[0].value.jid;\n                    g._id = this.getJabberId(jId);\n                }\n\n                if (g.general.links && g.general.links.length > 0) {\n                    this.generateGroupLinkIds(g.general.links);\n                }\n\n                g.guid = g.id;\n                g.orgGuid = g.id;\n\n                g.mt = moment(g.dateModified).unix();\n                g.search_key = g.general.name[0].value.toLowerCase();\n                groups[g._id] = g;\n            });\n        }\n        finalData.res = groups;\n        finalData.meta = meta;\n\n        return this._super(store, primaryModelClass, finalData, id, requestType);\n    },\n\n    getJabberId(id) {\n        const idParts = id.split('@');\n        return idParts.length > 0 ? idParts[0] : '';\n    },\n\n    /*  When using the public-api/bevy group requests\n        the group sub-objects don't contain a _id property.\n        Normally this is not an issue but for the general.links\n        it does.  The UI uses the _id  property on each link.\n        The following methods add/strip unique ids on the links.\n    */\n    generateGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (!link._id) {\n                link._id = uuid.generate();\n            }\n        });\n    },\n\n    cleanGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (link._id) {\n                delete link._id;\n            }\n        });\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend();\n","import Ember from 'ember';\n\nimport PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    session: Ember.inject.service(),\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        let location = data.location;\n        location.floors = [];\n        if (data.floors && data.floors.entities) {\n            location.floors = data.floors.entities.map(floor => store.push(store.normalize('location', floor)));\n        }\n        return this._super(store, model, location, guid);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n        const data = this.serialize(snapshot, options);\n        Object.assign(hash, data);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        const type = primaryModelClass.modelName;\n        const data = {\n            [type]: payload.entities\n        };\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/message-communication\", [\"exports\", \"ember-purecloud-components/serializers/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/serializers/participant\", [\"exports\", \"ember-purecloud-components/serializers/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport PurecloudSerializer from './purecloud';\nimport { filterMissingFields } from './application';\nimport LoggerMixin from '../mixins/logger';\n\nimport Validators from '../components/entity-fields/validators';\n\nfunction cleanFields(record) {\n    var config = record.fieldConfig;\n    _.forEach(config.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let type = field.get('type');\n\n            if (Validators[type]) {\n                let validator = Validators[type];\n                let values = record.getFieldValue(field.getFieldPath());\n\n                if (typeof validator.cleanFieldForEntity === 'function') {\n                    if (Array.isArray(values)) {\n                        _.forEach(values, function (value) {\n                            validator.cleanFieldForEntity(record, field, value);\n                        });\n                    } else {\n                        validator.cleanFieldForEntity(record, field, values);\n                    }\n                }\n            }\n        });\n    });\n}\n\nfunction extractSectionData(record, json) {\n    let section = record._currentSection;\n    if (section) {\n        let key = section.get('key');\n        if (Object.prototype.hasOwnProperty.call(json, key)) {\n            let data = {\n                _id: json._id\n            };\n            data[key] = json[key];\n            return data;\n        }\n    }\n    return json;\n}\n\nexport default PurecloudSerializer.extend(LoggerMixin, {\n    session: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    serialize: function (snapshot, options) {\n        let record = snapshot.record;\n\n        cleanFields(record);\n\n        let json = this._super(snapshot, options);\n\n        json = extractSectionData(record, json);\n\n        delete json._id;\n\n        return filterMissingFields(record, json);\n    },\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        if (data) {\n            data.id = guid || data.guid || data.id;\n        }\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload || !payload.entities) {\n            return this._super(...arguments);\n        }\n\n        if (payload.meta && payload.meta.usingIntegrationSource && requestType === 'findMany') {\n            if (!payload.meta.integrationSource) {\n                this.logger.warn(\n                    \"We are using an integration source, but I'm not sure which integration source it is:\",\n                    {\n                        meta: payload.meta\n                    }\n                );\n                return this._super(...arguments);\n            }\n            let entities = (payload.entities || []).map(entity => {\n                let data = Object.assign({}, entity);\n                // note: we may not need to do this and instead just return 'data'\n                if (\n                    data.expands &&\n                    (data.expands.integrationPresence === undefined || data.expands.integrationPresence === null)\n                ) {\n                    // Default to empty\n                    data.expands.integrationPresence = {};\n                }\n\n                return data;\n            });\n            let data = Object.assign({}, payload, {\n                entities: entities\n            });\n            return this._super(store, primaryModelClass, data, id, requestType);\n        }\n\n        return this._super(...arguments);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id) {\n        payload.links = {\n            profile: `/api/v2/users/${id}/profile`\n        };\n        const normalized = this._super(...arguments);\n        return normalized;\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        // Support for search results\n        if (payload.results) {\n            data[type] = payload.results;\n            delete payload.results;\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudSerializer.extend({\n    normalizeArrayResponse: function (store, primaryModelClass, payload, id, requestType) {\n        _.forEach(payload.entities, function (entity) {\n            entity.type = 'queue';\n            return entity;\n        });\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse: function (store, primaryModelClass, payload, id, requestType) {\n        payload.type = 'queue';\n        // Queue lookup can either go through the typical detail API or through the divisionviews API\n        // so we can handle situations where you might run into queue lookups from a different division\n        // Handle that response type here\n        // See API docs: https://developer.inindca.com/api/rest/v2/routing/#get-api-v2-routing-queues-divisionviews\n        if (payload.entities && payload.entities.length === 1) {\n            payload = payload.entities[0];\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport DS from 'ember-data';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        conversation: { embedded: 'always' }\n    },\n    normalizeArrayResponse() {\n        const response = this._super(...arguments);\n\n        if (!response || !response.data) {\n            response.data = [];\n        }\n\n        response.data.forEach(entity => {\n            entity.relationships.conversation.data.type = 'conversation';\n        });\n\n        return response;\n    }\n});\n","define(\"connections-ui/serializers/recording\", [\"exports\", \"ember-purecloud-components/serializers/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n    isNewSerializerAPI: true,\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (requestType === 'query' && payload.results && payload.results.entities) {\n            data[type] = payload.results.entities;\n            delete payload.results.entities;\n\n            payload = _.merge(data, { meta: payload.results });\n        } else if (requestType === 'findMany' && payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/screenshare-communication\", [\"exports\", \"ember-purecloud-components/serializers/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","define(\"connections-ui/serializers/social-communication\", [\"exports\", \"ember-purecloud-components/serializers/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    attrs: {\n        webrtcMediaDscp: 'webRtcMediaDscp',\n        webrtcForceTurn: 'webRtcForceTurn',\n        persistentConnection: 'webRtcPersistentEnabled',\n        requireMediaHelper: 'webRtcRequireMediaHelper'\n    }\n});\n","import ApplicationSerializer from './application';\n\nexport default ApplicationSerializer.extend();\n","define(\"connections-ui/serializers/video-communication\", [\"exports\", \"ember-purecloud-components/serializers/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    extractMeta(store, typeClass, payload) {\n        const meta = payload.meta;\n        delete payload.meta;\n        return meta;\n    },\n\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        if (requestType === 'query') {\n            payload.entities = payload.results || [];\n            delete payload.results;\n        }\n\n        return this._super(...arguments);\n    },\n\n    serializeIntoHash(hash, type) {\n        this._super(...arguments);\n\n        const key = this.payloadKeyFromModelName(type.modelName);\n        Object.assign(hash, hash[key]);\n        delete hash[key];\n    },\n\n    serializeAttribute(snapshot, json, key, attributes) {\n        const changed = snapshot.changedAttributes();\n        if (snapshot.record.get('isNew') || changed[key]) {\n            this._super(snapshot, json, key, attributes);\n        }\n    }\n});\n","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport QueueModel from '../models/queue';\nimport PersonModel from '../models/person';\nimport ExternalContactModel from '../models/external-contact';\n\nimport { formatAddressForDisplay, formatSipAddressForDisplay } from 'ember-purecloud-components/utils/address-format';\n\nconst wordCharsRegex = /[^\\w]/g; // Matches anything that is a word character (i.e[a-zA-Z0-9_])\nconst nonDigitRegex = /\\D/g; // Matches anything that isn't a digit\nconst removeLeadingPlusRegex = /^[+]+/g; // Used to remove the pluses at the beginning of the number\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    countryCode: Ember.computed('intl.isoLocale', function () {\n        if (this.get('intl.isoLocale')) {\n            return this.get('intl.isoLocale').toUpperCase().split('-').pop();\n        } else {\n            return null;\n        }\n    }),\n\n    /**\n     * This method is meant to take in a varying number of types and return the appropriate\n     * string to make a call. It is used primarily for phone:makeCall\n     *\n     * @param  {string|object|model} itemToFormat the item we are trying to format\n     * @return {string}              the formatted version of itemToFormat\n     */\n    format(itemToFormat) {\n        if (itemToFormat instanceof PersonModel) {\n            return itemToFormat.get('guid');\n        }\n        if (itemToFormat instanceof QueueModel) {\n            return itemToFormat.get('id');\n        }\n        if (itemToFormat instanceof ExternalContactModel) {\n            return itemToFormat.get('phone.rel.e164');\n        }\n        if (itemToFormat && typeof itemToFormat === 'object') {\n            return this.formatFieldConfigEntry(itemToFormat);\n        }\n        if (typeof itemToFormat === 'string') {\n            return this.formatAddress(itemToFormat);\n        }\n        return itemToFormat;\n    },\n\n    /**\n     * Format numbers to E164. If number has sip: prefix, format sipAddress\n     * @param  {string} phoneNumber the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {string}             the formatted number\n     */\n    formatAddress(phoneNumber, country, subMsgType) {\n        if (_.startsWith(phoneNumber, 'sip:')) {\n            return this.formatSipAddress(phoneNumber);\n        }\n        if (_.startsWith(phoneNumber, 'tel:')) {\n            phoneNumber = phoneNumber.split(':').pop();\n        }\n\n        if (subMsgType === 'whatsapp') {\n            phoneNumber = phoneNumber.replace(wordCharsRegex, '');\n        } else if (subMsgType === 'open') {\n            return phoneNumber;\n        } else {\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.get('countryCode'); // make a guess on the country code\n            if (intlTelInputUtils.isValidNumber(phoneNumber, countryCode)) {\n                const extension = intlTelInputUtils.getExtension(phoneNumber, countryCode);\n                const e164 = intlTelInputUtils.formatNumber(\n                    phoneNumber,\n                    countryCode,\n                    intlTelInputUtils.numberFormat.E164\n                );\n                if (intlTelInputUtils.isValidNumber(e164, countryCode)) {\n                    // check again b/c libphonenumber could 'E164' a number into an invalid (e.g., '5555555' => '+15555555')\n                    if (extension) {\n                        // add extension back b/c libphonenumber strips it out after E164ing the number\n                        return `${e164};ext=${extension}`;\n                    }\n                    return e164;\n                }\n            }\n        }\n\n        return phoneNumber;\n    },\n\n    /**\n     * Format sip numbers to remove extraneous parameters\n     * @param  {string} address the number to formatSipAddress\n     * @return {string}             the formatted address\n     */\n    formatSipAddress(address) {\n        const regex = /(sip:)([^;]*)?(?:[^@]*)(@.*)/;\n        const addressParts = address.match(regex);\n        if (!addressParts || addressParts.length < 3) {\n            return address;\n        }\n        if (\n            intlTelInputUtils.isValidNumber(addressParts[2]) ||\n            intlTelInputUtils.isValidNumber(addressParts[2], this.get('countryCode'))\n        ) {\n            return this.formatAddress(addressParts[2]);\n        }\n        return addressParts.slice(1).join('');\n    },\n\n    formatOrLookupAddressForDisplay(address, country) {\n        return Ember.RSVP.resolve(this.formatAddressForDisplay(address, country, undefined, { doLookup: true }));\n    },\n\n    lookupAddressFormatResultId(result = {}) {\n        const fallback = result.displayText || '';\n\n        try {\n            if (result.jid) {\n                const existingRecord = this.get('store').peekAll('person').findBy('jid', result.jid);\n\n                if (existingRecord) {\n                    return new DS.PromiseObject({ promise: Ember.RSVP.resolve(existingRecord.get('name')) });\n                }\n\n                const promise = this.get('store')\n                    .findMany('person', [result.jid])\n                    .then(records => {\n                        if (records && records.length === 1) {\n                            return records[0].get('name');\n                        }\n                        return fallback;\n                    })\n                    .catch(() => fallback); // don't log this, it just means the lookup failed, return fallback\n\n                return new DS.PromiseObject({ promise }); // has to be re-wrapped since we then/catch the original store promise\n            }\n\n            if (result.queueId) {\n                const promise = this.get('store')\n                    .findRecord('queue', result.queueId)\n                    .then(queue => queue.get('name'))\n                    .catch(() => fallback);\n                return new DS.PromiseObject({ promise });\n            }\n        } catch (e) {\n            // no op;\n        }\n\n        return new DS.PromiseObject({ promise: Ember.RSVP.resolve(fallback) });\n    },\n\n    resolveAddressFormatResult(result = {}, opts = {}) {\n        const fallback = result.displayText || '';\n\n        if (opts.doLookup) {\n            if (result.isEntity) {\n                return this.lookupAddressFormatResultId(result);\n            }\n\n            return new DS.PromiseObject({ promise: Ember.RSVP.resolve(fallback) });\n        }\n\n        return fallback;\n    },\n\n    /**\n     * Format International Numbers (e.g., +1 (919) 555-5555)\n     * If phoneNumber has 'sip:' prefix, call formatSipAddressForDisplay\n     * @param  {string} address     the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @param  {object} opts        options with `doLookup` bool for performing async lookup of username or queue name for sip addresses\n     * @return {string}             the formatted number (always string by default)\n     * @return {Promise}            a Promise which will resolve to the username of the associated sip address, if applicable (will return promise only if { doLookup: true } is provided)\n     */\n    formatAddressForDisplay(address, country, subMsgType, opts = {}) {\n        if (subMsgType === 'whatsapp') {\n            return address.replace(removeLeadingPlusRegex, '');\n        }\n        if (subMsgType === 'open') {\n            return address;\n        }\n        return this.resolveAddressFormatResult(formatAddressForDisplay(address, country), opts);\n    },\n\n    /**\n     * This is a mild improvement over our naiive formatting of just stripping 'sip:'\n     * it does a regex to try to find a jid, in the case that the address might identify a purecloud user\n     * otherwise, otherwise, see if the address part is a phone number, and try to format it as such. Otherwise, fallback\n     * to the original sip address, without the prefix\n     */\n    formatSipAddressForDisplay(address, opts) {\n        return this.resolveAddressFormatResult(formatSipAddressForDisplay(address), opts);\n    },\n\n    /**\n     * Checks to see if a number is valid. Passing in strict will not allow things to pass through.\n     * (strict option may seem weird but the intent is to allow individual authors to make the decision on\n     *  whether this method is blocking or should just pass the number through -- to the api for example)\n     * @param  {string}  phoneNumber the phone number to Checks\n     * @param  {string}  country     the country countryCode\n     * @param  {Boolean} strict      should return false if doesn't pass isValidNumber\n     * @param  {string}  subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {Boolean}\n     */\n    isValidNumber(phoneNumber, country, strict, subMsgType) {\n        try {\n            if (subMsgType === 'whatsapp') {\n                phoneNumber = phoneNumber.replace(removeLeadingPlusRegex, '');\n                return !phoneNumber.match(nonDigitRegex);\n            }\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.get('countryCode'); // make a guess on the country code\n            const isValid = intlTelInputUtils.isValidNumber(phoneNumber, countryCode);\n            return strict ? isValid : true;\n        } catch (e) {\n            return !strict;\n        }\n    },\n\n    /**\n     * Remove 'tel:' or 'sip:' from a string\n     * @param  {string} phoneNumber the number to format\n     * @return {string}             the number sans (tel:|sip:)\n     */\n    formatRawNumber(phoneNumber) {\n        if (_.includes(phoneNumber, 'tel')) {\n            return phoneNumber.replace(/tel:/gi, '');\n        } else if (_.includes(phoneNumber, 'sip')) {\n            return phoneNumber.replace(/sip:/gi, '');\n        } else {\n            return phoneNumber;\n        }\n    },\n\n    /**\n     * Format a field config entry value\n     * @param  {object} itemToFormat the thing to format\n     * @return {string}              the formatted string\n     */\n    formatFieldConfigEntry(itemToFormat) {\n        const e164 = Ember.get(itemToFormat, 'rel.e164');\n        if (e164) {\n            return e164;\n        }\n        let number = Ember.get(itemToFormat, 'value.number');\n        number = number != null ? number.replace(/\\D/g, '') : void 0;\n        let extension = Ember.get(itemToFormat, 'value.extension');\n        extension = extension != null ? extension.replace(/\\D/g, '') : void 0;\n        if (number) {\n            // number = this.formatAddress(number);\n            if (extension) {\n                itemToFormat = number + ';ext=' + extension;\n            } else {\n                itemToFormat = '' + number;\n            }\n        } else if (extension) {\n            itemToFormat = extension;\n        }\n        return itemToFormat;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport AjaxService from 'ember-ajax/services/ajax';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst RateLimitPromise = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin, {\n    isRateLimited: false,\n    rateLimitResetTime: 0\n});\n\n/**\n * A symbol to use as a key in the options hash of requests made through the ajax service to specify\n * subsection(s) of the app from which the request is being made. Provided values can be a string or string[].\n * Strings should not include `/` chars as they are the header primary separator.\n * leading/trailing ws will be dropped and slashes will be replaced.\n *\n * Examples:\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = 'my-cool-web-dir-section';\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = ['my-cool-web-dir-section', '1.0.0']\n */\nexport const REQUEST_TELEMETRY_APP_SUBSECTIONS = Symbol();\n\n// Exported for testing purposes\nexport function shouldRetryRequest(xhr) {\n    if (!xhr || xhr.status !== 429) {\n        return false;\n    }\n    const header = xhr.getResponseHeader('retry-after');\n    return !!header && retryStringToNumber(header) !== null;\n}\n\nfunction retryStringToNumber(value) {\n    const number = parseInt(value, 10);\n    if (isNaN(number) || number < 0) {\n        return null;\n    }\n    return number;\n}\n\nfunction retryResetTime(xhr) {\n    let headerRateLimit = xhr.getResponseHeader('retry-after');\n\n    if (!!headerRateLimit) {\n        return retryStringToNumber(headerRateLimit);\n    }\n    return null;\n}\n\nfunction getHeader(headers, name) {\n    if (!headers || !name) {\n        return;\n    }\n    let foundKey = Ember.A(Object.keys(headers)).find(key => {\n        return key.toLowerCase() === name.toLowerCase();\n    });\n    if (!foundKey) {\n        return;\n    }\n    return headers[foundKey];\n}\n\nfunction isRootAPIRequest(url) {\n    // Is a domain-root request and contains an API version path\n    return url.startsWith('/') && url.includes('/api/v2/');\n}\n\nexport default AjaxService.extend(LoggerMixin, Ember.Evented, {\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    _timers: null,\n\n    authData: null,\n    currentRequest: {}, // { url: ..., options: ... }\n\n    enableRetryHeaderParsing: Ember.computed.reads('session.features.enableUIAjaxRetryHeader'),\n    enableAPIDomainRewrites: Ember.computed.reads('session.rewriteRootAPIRequests'),\n\n    headers: Ember.computed(function () {\n        return {\n            'Content-Type': 'application/json'\n        };\n    }),\n\n    trustedHosts: Ember.computed('application.purecloudV2BaseUri', function () {\n        const purecloudV2BaseUri = this.get('application.purecloudV2BaseUri');\n        const purecloudV2Host = _.startsWith(purecloudV2BaseUri, 'https://')\n            ? purecloudV2BaseUri.substring(8)\n            : purecloudV2BaseUri;\n\n        return [purecloudV2Host];\n    }),\n\n    init() {\n        this._super(...arguments);\n        this._timers = Ember.A([]);\n    },\n\n    willDestroy() {\n        if (this._timers) {\n            this._timers.forEach(timer => Ember.run.cancel(timer));\n        }\n        this._super(...arguments);\n    },\n\n    post(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    put(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    patch(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    ajaxGet(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = $.param(options.data);\n        }\n        options.method = 'GET';\n\n        return this.request(url, options);\n    },\n\n    _scheduleRequest(url, options, retryTime, deferred) {\n        const scheduleTime = retryTime * 1000;\n        const timer = Ember.run.later(() => {\n            this._timers.removeObject(timer);\n            this.raw(url, options, deferred);\n        }, scheduleTime);\n        this._timers.pushObject(timer);\n    },\n\n    /**\n     * Overriden to make sure we are rate-limited by using `raw`, but returning the same payload as\n     * inherited `request` function.\n     * Please do not make heavy use of the retry option. It is meant as a last resort.\n     *\n     * @param url {string} request URL\n     * @param options {object}\n     * @param [options.retry=false] {boolean} Honor the retry header. Defaults to false. Pass true to retry the request automatically\n     */\n    request(url, options) {\n        let reqUrl = this.addApiDomainIfMissing(url);\n        return this.raw(reqUrl, options)\n            .then(({ response }) => Ember.RSVP.resolve(response))\n            .catch(({ response }) => Ember.RSVP.reject(response));\n    },\n\n    addApiDomainIfMissing(url) {\n        if (this.get('enableAPIDomainRewrites') && isRootAPIRequest(url)) {\n            let apiDomain = window.location.hostname.replace(/^app\\./, 'api.');\n            return `${window.location.protocol}//${apiDomain}${url}`;\n        } else {\n            return url;\n        }\n    },\n\n    raw(url, options = {}, deferred = null) {\n        const canParseHeaders = this.get('enableRetryHeaderParsing');\n        const retryDisabled = options && !options.retry;\n        if (retryDisabled || !canParseHeaders) {\n            return this._super(...arguments);\n        }\n\n        if (!deferred) {\n            deferred = Ember.RSVP.defer();\n        }\n\n        const promiseProxy = RateLimitPromise.create({\n            promise: deferred.promise\n        });\n\n        this._super(...arguments)\n            .then(data => deferred.resolve(data))\n            .catch(data => {\n                const { jqXHR } = data;\n\n                const shouldRetry = shouldRetryRequest(jqXHR);\n                const retryTime = retryResetTime(jqXHR);\n                this._logPossibleRetryEvent(url, jqXHR, retryTime, shouldRetry);\n\n                if (!shouldRetry) {\n                    deferred.reject(data);\n                    return;\n                }\n\n                this._scheduleRequest(url, options, retryTime, deferred);\n\n                if (promiseProxy) {\n                    Ember.set(promiseProxy, 'isRateLimited', true);\n                    Ember.set(promiseProxy, 'rateLimitResetTime', retryTime);\n                }\n\n                this.trigger('rateLimited', {\n                    url,\n                    options,\n                    jqXHR\n                });\n            });\n\n        return promiseProxy;\n    },\n\n    /**\n     * Overridden here to preserve error data, since the base\n     * ember-ajax class ignored important parts of error responses.\n     */\n    normalizeErrorResponse(status, headers, payload) {\n        let err = this._super(status, headers, payload);\n        if (err && typeof error === 'object') {\n            err.errorResponse = payload;\n        }\n        return err;\n    },\n\n    _logPossibleRetryEvent(url, xhr, retryTime, shouldRetry) {\n        const headers = xhr.getAllResponseHeaders();\n        if (retryTime === null && !!xhr.getResponseHeader('retry-after')) {\n            this.logger.error('Found retry header, but unable to parse time:', {\n                url,\n                headers\n            });\n            return;\n        }\n\n        if (!shouldRetry) {\n            return;\n        }\n\n        this.logger.warn('Request failed, but a retry header was found. Scheduling to run in the future:', {\n            url,\n            headers,\n            seconds: retryTime\n        });\n    },\n\n    generateDetailedMessage(status, headers, payload, requestData) {\n        let url = requestData.url;\n        if (url) {\n            // Try to strip out everything but the host + path\n            try {\n                const urlObject = url.startsWith('/') ? new URL(url, window.location.origin) : new URL(url);\n                url = `${urlObject.origin}${urlObject.pathname}`;\n            } catch (_) {\n                this.logger.info('Redacted possibly sensitive URL:', {\n                    url\n                });\n                url = 'REDACTED';\n            }\n        }\n\n        let correlationId;\n        try {\n            const correlationHeaderKey = 'ININ-Correlation-Id';\n            const headerCorrelationId = getHeader(headers, correlationHeaderKey);\n            const payloadCorrelationId = !!payload && payload.contextId;\n            correlationId = headerCorrelationId || payloadCorrelationId || '(unknown)';\n        } catch (_) {\n            correlationId = '(unknown)';\n        }\n\n        return [\n            'Ember AJAX request',\n            `Method: ${requestData.type}`,\n            `URL: ${url}`,\n            `Status: ${status}`,\n            `Correlation ID: ${correlationId}`\n        ].join('\\n');\n    }\n});\n","import Ember from 'ember';\nimport * as PlatformJS from 'platform';\n\nexport default Ember.Service.extend({});\n\n/**\n * Builds common properties that could be useful in many telemetry and logging situations.\n * The data must ALWAYS be safe for logging.  i.e. no customer or PII data.\n */\nexport function buildCommonTelemetryContext({ applicationService, sessionService, intlService }) {\n    const isHosted = applicationService.get('hostedContext.isHostedProp');\n\n    const commonCtxt = {\n        applicationVersion: applicationService.get('semver'),\n        organizationId: sessionService.get('org.guid'),\n        organization: sessionService.get('org.shortName'),\n        userId: sessionService.get('person.guid'),\n        uiLanguage: intlService.get('isoLocale'),\n        envName: applicationService.get('runtime.name'),\n        isPopout: applicationService.get('isPopout'),\n        webDirAgent: isHosted ? 'desktop' : 'browser',\n        platformJsBrowserName: PlatformJS.name,\n        platformJsBrowserVersion: PlatformJS.version,\n        platformJsProduct: PlatformJS.product,\n        platformJsManufacturer: PlatformJS.manufacturer,\n        platformJsLayout: PlatformJS.layout,\n        platformJsOperatingSystem: PlatformJS.os.toString(),\n        platformJsDescription: PlatformJS.description\n    };\n\n    if (isHosted) {\n        return Object.assign({}, commonCtxt, {\n            desktopOS: applicationService.get('hostedContext._operatingSystem'),\n            desktopVersion: applicationService.get('hostedContext._version')\n        });\n    }\n\n    return commonCtxt;\n}\n","/* global navigator */\nimport Ember from 'ember';\nimport request from 'ember-ajax';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\nimport adapter from 'npm:webrtc-adapter';\nimport { APP_NAME } from './stash-logger';\nimport { EVENTS } from '../utils/hosted-context';\nimport netUtils from '../utils/net';\n// import { addPageAction } from '../utils/newrelic';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport config from '../config/environment';\n\nconst { computed, inject, observer } = Ember;\n\nconst BRIDGE_CONFIGURATION = {};\nconst deprecation = {\n    id: 'directory-core.deprecate-application-locale',\n    until: '6.0.0',\n    url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md'\n};\n\nconst COOKIES = {\n    session: 'X-OrgSpan-Auth-Key',\n    proxyPersonId: 'proxy-person-id',\n    locale: 'locale',\n    prevU_id: '_pu_i',\n    activePersonId: '_ap_i',\n    activeGroupId: '_ag_i',\n    lastSearchQuery: '_lsq2',\n    lastProfileQuery: '_lpq2',\n    debug: 'debug',\n    debugOrgName: 'debug-orgName',\n    debugAppModeReadOnly: 'debug-readOnly',\n    debugMasonry: 'debug-masonry'\n};\n\nexport default Ember.Service.extend({\n    ajax: inject.service(),\n    chat: inject.service(),\n    intl: inject.service(),\n    store: inject.service(),\n    cookies: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    preferences: inject.service(),\n    pigeon: inject.service(),\n    feature: inject.service(),\n    webrtc: inject.service(),\n    mediaProviders: inject.service(),\n    stashLogger: inject.service(),\n    embedded: inject.service(),\n\n    envDetails: null,\n    // Runtime is injected via the instance-initializer and is resolved at runtime. It will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n    runtime: null,\n    dragging: false,\n    browserHidden: false,\n    iframeFocused: false,\n    currentRouteName: null,\n    urlprefix: '',\n    authUri: null,\n    cobrowseUri: null,\n    purecloudAppsUri: null,\n    streamingServiceUri: null,\n    orgspanBaseUri: '/directory',\n    purecloudBaseUri: '/platform',\n    purecloudV2BaseUri: '',\n    realtimeScriptUri: '/static-realtime-js/realtime.js',\n    hostedContext: null,\n\n    isMobile: false,\n    mobileQueryParameter: false,\n    belowMobileThreshold: false,\n\n    showAdminModal: false,\n    showLoader: false,\n\n    trialSupportDisplayed: false,\n\n    debugSettings: {},\n\n    offerMobilePreference: true,\n    offerMobilePreferenceRetreived: false,\n\n    currentYear: new Date().getFullYear(),\n\n    offerMobileApp: computed(\n        'mobileQueryParameter',\n        'isMobile',\n        'offerMobilePreference',\n        'offerMobilePreferenceRetreived',\n        {\n            get() {\n                if (this.get('mobileQueryParameter') || !this.get('offerMobilePreferenceRetreived')) {\n                    return false;\n                }\n\n                return this.get('isMobile') && this.get('offerMobilePreference');\n            },\n            set(key, value) {\n                this.get('preferences').setPreference('offerMobileApp', value);\n                this.set('offerMobilePreference', value);\n            }\n        }\n    ),\n\n    orgName: computed.alias('session.org.name'),\n    orgShortName: computed.alias('session.org.shortName'),\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) {\n            this.set('urlprefix', '/');\n        }\n        this.checkForDebugMode();\n        this.gatherEnvDetails();\n        this.initIframeFocusListener();\n        this.setVisibilityListener();\n\n        const pigeon = this.get('pigeon');\n        pigeon.on('connect', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n\n        let hasRecentlyLostSubscriptions = false;\n        pigeon.on('no_longer_subscribed', () => {\n            if (!hasRecentlyLostSubscriptions) {\n                Ember.Logger.info('Resubscribing to pigeon after no_longer_subscribed');\n                hasRecentlyLostSubscriptions = true;\n                Ember.run.later(() => (hasRecentlyLostSubscriptions = false), 2000);\n                pigeon._registerTopics(); // trigger immediate resubscribe\n                return;\n            }\n            Ember.Logger.warn(\n                'Multiple no_longer_subscribed events, showing warning to user and stopping resubscribe.'\n            );\n            // ENGAGEUI-1563: Warn users if channel limit\n            // has been hit and current channel will no longer\n            // receive updates.\n            this.set('session.shouldWarnNoLongerSubscribed', true);\n        });\n\n        this.get('preferences')\n            .getPreference('offerMobileApp')\n            .then(value => {\n                // needed for unit tests\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.set('offerMobilePreference', value !== false);\n                this.set('offerMobilePreferenceRetreived', true);\n            });\n\n        this.get('pigeon').on('topicsRegistered', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n        this.get('pigeon').on('hawkSubscriptionError', err => {\n            this.get('stashLogger').error('Hawk Subscription Error', { err });\n        });\n\n        Ember.Logger.log('WebRTC Adapter loaded at application level', { adapter });\n    },\n\n    async openChatRoomWithVideo() {\n        // no op for now\n    },\n\n    destroy() {\n        if (this.get('csRunLater')) {\n            Ember.run.cancel(this.get('csRunLater'));\n        }\n        this._super(...arguments);\n    },\n\n    currentRouteClass: Ember.computed('currentRouteName', function () {\n        var name = this.get('currentRouteName');\n        if (name) {\n            return name.replace(/[./]+/g, '-');\n        }\n\n        return '';\n    }),\n\n    isoLocale: computed.deprecatingAlias('intl.isoLocale', deprecation),\n    systemLocale: computed.deprecatingAlias('intl.systemLocale', deprecation),\n    iso2LocaleCountry: computed.deprecatingAlias('intl.iso2LocaleCountry', deprecation),\n    setLocale(locale) {\n        const message =\n            'The \"setLocale\" method in \"connections-ui/service/application\" has been deprecated. Please use \"service:intl\" for all locale information.';\n        Ember.deprecate(message, false, deprecation);\n        return this.get('intl').setLocale(locale);\n    },\n\n    gatherEnvDetails() {\n        if (isTesting) {\n            return;\n        }\n        try {\n            this.set('envDetails', netUtils.getEnvDetails());\n        } catch (error) {\n            Ember.Logger.error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js', {\n                reason: error.message\n            });\n            this.set('errorState', { type: 'invalidEnv' });\n        }\n    },\n\n    initIframeFocusListener() {\n        const guid = Ember.guidFor(this);\n        Ember.$(window)\n            .on(`focus.${guid}`, () => this.set('iframeFocused', false))\n            .on(`blur.${guid}`, () => {\n                if (!document) {\n                    return;\n                }\n                const nodeName = Ember.get(document, 'activeElement.nodeName');\n                if (nodeName && nodeName.toLowerCase() === 'iframe') {\n                    this.set('iframeFocused', true);\n                }\n            });\n    },\n\n    setVisibilityListener() {\n        let hidden;\n        let visibilityChange;\n        if (typeof document.hidden !== 'undefined') {\n            hidden = 'hidden';\n            visibilityChange = 'visibilitychange';\n        } else if (typeof document.mozHidden !== 'undefined') {\n            hidden = 'mozHidden';\n            visibilityChange = 'mozvisibilitychange';\n        } else if (typeof document.msHidden !== 'undefined') {\n            hidden = 'msHidden';\n            visibilityChange = 'msvisibilitychange';\n        } else if (typeof document.webkitHidden !== 'undefined') {\n            hidden = 'webkitHidden';\n            visibilityChange = 'webkitvisibilitychange';\n        }\n        const guid = Ember.guidFor(this);\n        Ember.$(document).on(`${visibilityChange}.${guid}`, () => {\n            this.set('browserHidden', document[hidden]);\n        });\n        Ember.$(window)\n            .on(`blur.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', true);\n                }\n            })\n            .on(`focus.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', false);\n                }\n            });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off('connect');\n        this.get('pigeon').off('topicsRegistered');\n        const pigeonUserSubscribed = this.get('pigeonUserSubcribed');\n        if (pigeonUserSubscribed) {\n            this.get('pigeon').off(pigeonUserSubscribed);\n        }\n        const guid = Ember.guidFor(this);\n        Ember.$(window).off(`.${guid}`);\n        Ember.$(document).off(`.${guid}`);\n    },\n\n    loadStreamingService() {\n        const authenticated = this.get('session.isAuthenticated');\n        if (isTesting || !authenticated) {\n            return Ember.RSVP.reject();\n        }\n        const scriptUri = this.realtimeScriptUri;\n        const streamingService = this.get('streaming');\n        streamingService.set('scriptUrl', scriptUri);\n        let features;\n        if (this.get('session.features')) {\n            features = Ember.RSVP.resolve(this.get('session.features'));\n        } else {\n            features = this.get('feature')\n                .getFeatureToggles('webrtcRelayOnly')\n                .catch(err => {\n                    Ember.Logger.warn('Failed to fetch toggles for realtime connection', { err });\n                    // do not rethrow, don't want this to prevent realtime connection\n                    return {};\n                });\n        }\n        return features.then(res => {\n            const runAsMediaHelper =\n                (this.get('hostedContext.isHostedProp') || window.testMediaHelperMode) &&\n                this.get('hostedContext.runAsMediaHelper');\n\n            if (runAsMediaHelper) {\n                Ember.Logger.info('Running in media helper mode');\n                this.set('mediaHelperMode', true);\n                Ember.Logger.info('Letting webrtcSdk set up media helper jid');\n            }\n\n            return streamingService.setupConnection({\n                jid: this.get('session.person.jid'),\n                accessToken: this.get('session.accessToken'),\n                iceTransportPolicy: res.webrtcRelayOnly ? 'relay' : 'all',\n                signalIceConnected: true,\n                disableEOCShortCircuit: true,\n                referenceStanza: true,\n                streamingServiceUri: this.get('streamingServiceUri'),\n                envDetails: this.get('envDetails'),\n                originAppName: APP_NAME,\n                originAppVersion: config.APP.semver,\n                originAppId: this.get('stashLogger.clientSessionId'),\n                splitHawkAndRealtime: true,\n                useServerSidePings: true,\n                customHeaders: {\n                    'Genesys-App': 'connections-ui-webui'\n                }\n            });\n        });\n    },\n\n    streamingServiceConnect: task(function* (debounce = 1000) {\n        yield timeout(debounce);\n        const authenticated = this.get('session.isAuthenticated');\n        const jid = this.get('session.person.jid');\n        const accessToken = this.get('session.accessToken');\n        const chatEnabled = this.get('session.org.hasChatEnabled');\n        const adminUIContext = this.get('adminUIContext');\n        const streamingService = this.get('streaming');\n        return this.loadStreamingService().then(() => {\n            if (authenticated && accessToken && chatEnabled && !adminUIContext) {\n                this.get('chat').set('enabled', true);\n\n                if (!this.get('pigeonUserSubscribed')) {\n                    const myGuid = this.get('session.person.guid');\n                    Ember.Logger.debug('Subscribing to user guid for system topic', { myGuid });\n                    this.set('pigeonUserSubscribed', myGuid);\n                    this.get('pigeon').on(myGuid, data => {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n                        Ember.Logger.debug('System topic', { data });\n                        if (data.systemTopicType === 'token_revoked') {\n                            this.get('session').invalidate({ notified: true });\n                        }\n                    });\n                }\n\n                return streamingService.connect(accessToken, jid).then(() => {\n                    this.get('pigeon')._registerTopics();\n                });\n            }\n        });\n    }).drop(),\n\n    /**\n     * This logic will ultimately be replaced by the pipeline\n     * script insertion logic, but we wanted to enabled with a\n     * feature toggle before migrating.\n     */\n    csEnabled: false,\n    csRunLater: null,\n    checkContentSquare: observer(\n        'session.features.ATLAS-536_EnableContentSquare',\n        'session.features.AGORA-137_connections-ui-contentsquare',\n        function () {\n            this.set(\n                'csRunLater',\n                Ember.run.later(() => {\n                    if (\n                        !this.get('csEnabled') &&\n                        this.get('session.features.ATLAS-536_EnableContentSquare') &&\n                        this.get('session.features.AGORA-137_connections-ui-contentsquare') &&\n                        !this.isDestroyed &&\n                        !this.isDestroying\n                    ) {\n                        const csLoaderScript = document.createElement('script');\n                        csLoaderScript.type = 'text/javascript';\n                        csLoaderScript.src = '/contentsquare/1632/loader.js';\n                        csLoaderScript.crossOrigin = 'anonymous';\n                        csLoaderScript.async = true;\n                        document.body.appendChild(csLoaderScript);\n                        this.set('csEnabled', true);\n                    }\n                }, 500)\n            );\n        }\n    ).on('init'),\n\n    syncStreamingConnectionToAuthState: observer(\n        'session.{isAuthenticated,accessToken}',\n        'session.org.hasChatEnabled',\n        'preferences.chat.disableStreaming',\n        function () {\n            this.get('streamingServiceConnect').perform();\n        }\n    ).on('init'),\n\n    syncVideoChatStateToAdminContext: observer(\n        'session.isAuthenticated',\n        _.debounce(function () {\n            if (this.get('adminUIContext')) {\n                this.set('session.features.videoChat', false);\n            }\n        }, 20)\n    ),\n\n    clearActiveRoomMessagesOnAppFocus: observer('browserHidden', function () {\n        if (this.get('browserHidden')) {\n            return;\n        }\n        this.get('_delayedRefocusChatRoom').perform();\n    }),\n\n    _delayedRefocusChatRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n        this.get('chat').refocusActiveRoom();\n    }),\n\n    displayTrialSupport() {\n        this.set('trialSupportDisplayed', true);\n    },\n\n    dismissTrialSupport() {\n        this.set('trialSupportDisplayed', false);\n    },\n\n    adminUIContext: false,\n\n    uvOptions: {\n        mode: 'feedback',\n        feedback_tab_name: 'Your Feedback or Idea',\n        primary_color: '#4498b4',\n        link_color: '#007dbf',\n        default_mode: 'feedback',\n        forum_id: 294075\n    },\n\n    navigateTo(routeType, routeId, queryParams) {\n        let newHash = '';\n        if (routeType === 'group') {\n            newHash = `#/admin/groupprofile/${routeId}`;\n        } else if (routeType === 'person') {\n            newHash = `#/admin/users/${routeId}`;\n        } else if (routeType === 'search') {\n            const searchParams = Object.entries(queryParams)\n                .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n                .join('&');\n            if (searchParams) {\n                newHash = `#/search-v2/?${searchParams}`;\n            }\n        }\n\n        if (newHash && newHash !== window.top.location.hash) {\n            this.get('embedded').publishMessage('close', {}); // Close the \"Person Details\" in Users-UI\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    postMessageRouteChange(transition) {\n        if (!this.get('adminUIContext')) {\n            return;\n        }\n        const { targetName, params } = transition;\n        const routeType = _.head(targetName.split('.detail.index')) || false;\n        const route = params[`${routeType}.detail`];\n        const routeId = route && route[`${routeType}_id`];\n        if (this.get('session.features') && this.get('session.features')['PAUI-80.PeopleUiDecomposition']) {\n            // We are inside Users-UI, we can navigate through IFC.\n            this.navigateTo(routeType, routeId, transition.queryParams);\n        } else {\n            // We are inside Admin-UI, we navigate with a postMessage.\n            const data = {\n                type: 'directory:route:changed',\n                data: { routeType, routeId }\n            };\n            Ember.Logger.debug('postMessage -> window.parent', { data });\n            window.parent.postMessage(JSON.stringify(data), '*');\n        }\n    },\n\n    uri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.orgspanBaseUri, path).join('/');\n        }\n    },\n\n    pcUri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.purecloudBaseUri, path).join('/');\n        }\n    },\n\n    pcV2Uri(path) {\n        return [].concat(this.purecloudV2BaseUri, path).join('/');\n    },\n\n    localGCBAUri(path, port) {\n        return `https://127.0.0.1:${port}/${path}`;\n    },\n\n    changePreferredLanguage(lang) {\n        const path = this.uri(['api/v2/preferredLanguage']);\n        return request(path, {\n            type: 'post',\n            data: JSON.stringify({ lang })\n        }).then(() => {\n            window.location.reload(true);\n        });\n    },\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (error) {\n            return true;\n        }\n    },\n\n    sendDiagnostics(data) {\n        return this._sendDiagnostics(data, 'diagnostics');\n    },\n\n    sendFeedback(data) {\n        return this._sendDiagnostics(data, 'diagnostics/support');\n    },\n\n    checkForMobile: Ember.on('init', function () {\n        if (\n            /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet|Silk/i.test(\n                navigator.userAgent\n            )\n        ) {\n            return this.set('isMobile', true);\n        } else {\n            return this.set('isMobile', false);\n        }\n    }),\n\n    isMobilePhone: computed('isMobile', function () {\n        if (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini|Silk/i.test(navigator.userAgent)) {\n            return true;\n        } else {\n            return false;\n        }\n    }),\n\n    showTinyNavMenu: computed.or('belowMobileThreshold', 'isMobilePhone'),\n\n    showContextualHelp: computed('showTinyNavMenu', function () {\n        const person = this.get('session.person');\n        return this.get('showTinyNavMenu') && (person.get('isEngageAgent') || person.get('isAdmin'));\n    }),\n\n    isPopout: computed('isPef', 'currentRouteName', function () {\n        if (this.get('isPef')) {\n            return true;\n        }\n\n        const route = this.get('currentRouteName');\n        const popoutRoutes = [\n            'chat-room',\n            'screen-share',\n            // TODO: Remove interactions route from popout\n            // The interactions route has historically been considered a popout\n            // route; however, I don't believe it's used in any production\n            // capacity which is reinforced by the currently broken styles.\n            // I suspect the interactions route will be repurposed for the AgentUI\n            // decomp and/or IA.  When that happens, we should remove this from the\n            // popout computed.  Ultimately, the popout concept needs to be reworked\n            // as well.\n            'interactions',\n            'phone',\n            'engage.quality.quality.interactions.screen-recordings'\n        ];\n        return popoutRoutes.includes(route);\n    }),\n\n    isScreenRecordingPopout: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n        const popoutRoutes = ['engage.quality.quality.interactions.screen-recordings'];\n        return popoutRoutes.includes(route);\n    }),\n\n    /**\n     * Indicates if we're in the legacy, PEF-specific route used for embedding inside\n     * of other CRMs (aka the embedded framework).\n     *\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps externally.  Uses of this computed should be strictly limited to\n     * cases where behavior must diverge between standard CX and PEF mode.\n     * Furthermore, this computed should not be used within the MP/v2 fork of\n     * interactions as it's inherently checked.  If an interaction sub-view is\n     * shared between v1 and v2, then this computed can be used.\n     */\n    isPef: computed('currentRouteName', function () {\n        return this.get('currentRouteName') === 'interaction';\n    }),\n\n    /**\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps.  This computed can be used, however, it should not be used within\n     * the MP/v2 fork of interactions as it's inherently checked.  If an interaction\n     * sub-view is shared between v1 and v2, then this computed can be used.\n     *\n     * @deprecated Use isPef for PEF detection (note that embedded PEF is also\n     * soon to be removed).  A separate `isInteractionsPopout` utility shouldn't be needed,\n     * but a separate computed can be added if deemed necessary in the future.\n     */\n    isInteractionPopout: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n        const popoutRoutes = ['interaction', 'interactions'];\n        return popoutRoutes.includes(route);\n    }),\n\n    isAdminRoute: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n\n        if (route === 'engage.embedded') {\n            return window.location.hash.toLowerCase().includes('admin');\n        }\n\n        const adminRoutes = [\n            'admin',\n            'billing.upgrades',\n            'people-permissions.people-permissions.auth-orgs.access-to-my-org'\n        ];\n        return adminRoutes.some(r => route.search(r) === 0);\n    }),\n\n    _sendDiagnostics(data, uri) {\n        const request = {\n            url: this.pcUri(`api/v2/${uri}`),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify(data),\n            cache: false,\n            context: this\n        };\n        function successHandler(data) {\n            Ember.Logger.debug('applicationService: sendFeedback', { id: data.id });\n            return data;\n        }\n        function errorHandler(jqXHR) {\n            Ember.onerror(jqXHR);\n            return jqXHR;\n        }\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendFeedback')\n            .then(successHandler)\n            .catch(errorHandler);\n    },\n\n    setBridgeConfiguration(type, data) {\n        return (BRIDGE_CONFIGURATION[type] = data);\n    },\n\n    checkForDebugMode() {\n        const cookies = this.get('cookies');\n        var params = this.getQueryParams();\n        var debugCookie = cookies.read(COOKIES.debug);\n\n        if (params[COOKIES.debug] !== undefined) {\n            this.set('debug', true);\n            cookies.write(COOKIES.debug, true);\n        } else if (debugCookie) {\n            this.set('debug', true);\n        }\n\n        if (this.get('debug')) {\n            this.buildDebugSettings();\n        }\n    },\n\n    buildDebugSettings() {\n        const cookies = this.get('cookies');\n        const params = this.getQueryParams();\n\n        var orgName = params[COOKIES.debugOrgName],\n            orgNameCookie = cookies.read(COOKIES.debugOrgName);\n\n        var readOnly = params[COOKIES.debugAppModeReadOnly],\n            readOnlyCookie = cookies.read(COOKIES.debugAppModeReadOnly);\n\n        var masonry = params[COOKIES.debugMasonry],\n            masonryCookie = cookies.read(COOKIES.debugMasonry);\n\n        if (orgName !== undefined && orgName.length > 0) {\n            this.set('debugSettings.orgName', orgName);\n            cookies.write(COOKIES.debugOrgName, orgName);\n        } else if (orgNameCookie) {\n            this.set('debugSettings.orgName', orgNameCookie);\n        }\n\n        if (readOnly !== undefined) {\n            this.set('debugSettings.readOnly', true);\n            cookies.write(COOKIES.debugAppModeReadOnly, true);\n        } else if (readOnlyCookie) {\n            this.set('debugSettings.readOnly', true);\n        }\n\n        if (masonry !== undefined) {\n            masonry = masonry !== 'false';\n\n            this.set('debugSettings.masonry', masonry);\n            cookies.write(COOKIES.debugMasonry, masonry);\n        } else if (masonryCookie) {\n            masonryCookie = masonryCookie !== 'false';\n\n            this.set('debugSettings.masonry', masonryCookie);\n        }\n    },\n\n    getQueryParams() {\n        const obj = {};\n        const params = window.location.search.slice(1).split('&');\n\n        _.each(params, function (param) {\n            const split = param.split('=');\n            obj[split[0]] = split.length > 1 ? split[1] : '';\n        });\n\n        return obj;\n    }\n});\n","import Ember from 'ember';\nconst { RSVP, getOwner, typeOf, inject } = Ember;\n\nexport const SHOW_PROFILE_APP_API_ACTION_NAME = 'showProfile';\nexport const SHOW_GROUP_APP_API_ACTION_NAME = 'showGroup';\n\nconst DirectoryNavHandler = Ember.Object.extend({\n    session: inject.service(),\n    routerService: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('routerService', getOwner(this).lookup('router:main'));\n    },\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalid. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return (\n            appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME ||\n            appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME\n        );\n    },\n\n    handle(appApiCall) {\n        if (appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME) {\n            return this._handleShowProfile(appApiCall);\n        } else if (appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME) {\n            return this._handleShowGroup(appApiCall);\n        }\n    },\n\n    _handleShowProfile(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { profileId } = appApiCall.get('actionDetails');\n            if (!profileId) {\n                reject('profileId not found');\n                return;\n            }\n            if (typeOf(profileId) !== 'string') {\n                reject('profileId is not a string');\n                return;\n            }\n\n            const routerService = this.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('person.detail', profileId);\n            return resolve();\n        });\n    },\n\n    _handleShowGroup(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { groupId } = appApiCall.get('actionDetails');\n            if (!groupId) {\n                reject('groupId not found');\n                return;\n            }\n            if (typeOf(groupId) !== 'string') {\n                reject('groupId is not a string');\n                return;\n            }\n\n            const routerService = this.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('group.detail', groupId);\n            return resolve();\n        });\n    }\n});\n\nexport default DirectoryNavHandler;\n","import Ember from 'ember';\nimport pick from 'lodash/pick';\nimport pickBy from 'lodash/pickBy';\nimport mapKeys from 'lodash/mapKeys';\nimport omit from 'lodash/omit';\nconst { RSVP, inject } = Ember;\n\nexport const SHOW_TOAST_APP_API_ACTION_NAME = 'showToast';\n\nconst TOAST_MSG_PROPS = {\n    id: {\n        type: 'string',\n        internalPropName: 'tag'\n    },\n    type: {\n        type: 'enum',\n        values: ['info', 'success', 'error'],\n        required: true\n    },\n    title: {\n        type: 'string',\n        required: true\n    },\n    message: {\n        type: 'string',\n        required: true\n    },\n    markdownMessage: {\n        type: 'boolean',\n        internalPropName: 'markdownToHtml'\n    },\n    timeout: {\n        type: 'int',\n        internalPropName: 'hideAfter'\n    },\n    showCloseButton: {\n        type: 'boolean'\n    },\n    fallbackToInBrowser: {\n        type: 'boolean'\n    },\n    forceBrowserNotification: {\n        type: 'boolean'\n    },\n    showNotificationEverywhere: {\n        type: 'boolean'\n    }\n};\nconst TOAST_MSG_PROP_NAMES = Object.keys(TOAST_MSG_PROPS);\nconst REQUIRED_TOAST_MSG_PROP_NAMES = TOAST_MSG_PROP_NAMES.filter(prop => TOAST_MSG_PROPS[prop].required);\n\nexport default Ember.Object.extend({\n    notification: inject.service('notification-proxy'),\n    stashLogger: Ember.inject.service(),\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === SHOW_TOAST_APP_API_ACTION_NAME;\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const notification = this.get('notification');\n            const stashLogger = this.get('stashLogger');\n\n            let appId = appApiCall.get('appId') || 'localApp';\n            let apiActionDetails = appApiCall.get('actionDetails');\n\n            let {\n                errors,\n                invalidProps,\n                ignoredProps,\n                validatedToastData: data\n            } = this._processToastPayload(apiActionDetails);\n\n            if (errors.length > 0) {\n                return reject(errors);\n            }\n\n            if (ignoredProps.length > 0) {\n                let ignored = ignoredProps.join(', ');\n                stashLogger.warn('The following props were ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            if (invalidProps.length > 0) {\n                let ignored = invalidProps.join(', ');\n                stashLogger.warn('The following props were invalid and ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            let fullTag = data.tag ? `${appId}_${data.tag}` : appId;\n            data.tag = fullTag;\n\n            if (!['info', 'error', 'success'].includes(data.type)) {\n                return reject(`Unsupported notification type: ${data.type}`);\n            }\n\n            notification[data.type](data.title, data.message, data);\n            return resolve();\n        });\n    },\n\n    /**\n     * Filters, renames, and validates the toast message payload\n     *\n     * @returns the filtered, validated, renamed payload (if successful) and:\n     *  errors - unrecoverable errors\n     *  ignoredProps - props not applicable for toast messages\n     *  invalidProps - known props which were not provided in the correct format, etc.\n     */\n    _processToastPayload(apiActionDetails) {\n        let requiredCount = 0;\n        const invalidProps = [];\n        const errors = [];\n\n        const filteredPickData = pick(apiActionDetails, TOAST_MSG_PROP_NAMES);\n        const filteredData = pickBy(filteredPickData, (value, prop) => {\n            const config = TOAST_MSG_PROPS[prop];\n            const result = this._checkPropValid(config, value);\n\n            if (!result) {\n                invalidProps.push(prop);\n            }\n            if (config.required && result) {\n                requiredCount++;\n            }\n\n            return result;\n        });\n\n        if (requiredCount !== REQUIRED_TOAST_MSG_PROP_NAMES.length) {\n            errors.push(\n                'One or more of the following required toast message properties were missing or invalid' +\n                    REQUIRED_TOAST_MSG_PROP_NAMES.join(', ')\n            );\n        }\n\n        if (!filteredData.showCloseButton) {\n            if (filteredData.type === 'error') {\n                errors.push('Toasts with type error must have a close button');\n            } else if (filteredData.timeout === 0) {\n                errors.push('Toast must have either a nonzero timeout or a close button');\n            }\n        }\n\n        const ignoredProps = Object.keys(omit(apiActionDetails, TOAST_MSG_PROP_NAMES));\n        const validatedToastData = errors.length > 0 ? null : this._mapDataToInternalProperties(filteredData);\n\n        return {\n            errors,\n            invalidProps,\n            ignoredProps,\n            validatedToastData\n        };\n    },\n\n    _mapDataToInternalProperties(data) {\n        return mapKeys(data, (value, prop) => TOAST_MSG_PROPS[prop].internalPropName || prop);\n    },\n\n    _checkPropValid(config, value) {\n        if (!config) {\n            return false;\n        }\n\n        switch (config.type) {\n            case 'string':\n                return typeof value === 'string';\n            case 'int':\n                return Number.isFinite(value) && parseInt(value, 10) === value;\n            case 'boolean':\n                return typeof value === 'boolean';\n            case 'enum':\n                return typeof value === 'string' && config.values.includes(value);\n            default:\n                return false;\n        }\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport ENV from '../config/environment';\nimport appUtils from '../utils/apps';\nimport netUtils from '../utils/net';\nimport { addPageAction } from '../utils/newrelic';\nimport App, {\n    DISPLAY_TYPES as APP_DISPLAY_TYPES,\n    FEATURE_CATEGORIES as APP_FEATURE_CATEGORIES,\n    ASSET_CATEGORIES as APP_ASSET_CATEGORIES,\n    INTERAPPTION_COMMUNICATION_TYPE_FILTERS,\n    NO_SUPPORTED_COMMUNICATION_TYPE_FILTER\n} from '../models/app';\nimport InternallyHostedApp from '../models/internally-hosted-app';\nimport ApiCall from '../models/app-api-call';\nimport AppPool from '../models/app-pool';\nimport { APPS_API_PROTOCOL, parseMessage } from '../models/app-api-call';\nimport { SHOW_TOAST_APP_API_ACTION_NAME } from './apps-api-handlers/toast-handler';\nimport { SHOW_PROFILE_APP_API_ACTION_NAME } from './apps-api-handlers/directory-nav-handler';\n\nconst SHOW_HELP_APP_API_ACTION_NAME = 'showHelp';\nconst HIDE_HELP_APP_API_ACTION_NAME = 'hideHelp';\nconst SHOW_RC_ARTIFACT_APP_API_ACTION_NAME = 'showResourceCenterArtifact';\n\nexport const APP_SIDEBAR_PANEL_NAME_PREFIX = 'apps-';\n\nconst APPS_BASE_URL = 'api/v2/integrations/clientapps';\n\nconst REMOTE_APPS_CACHE_TTL_MILLIS = 5 * 60 * 1000;\nconst STANDALONE_LOAD_RETRY_BASE_MILLIS = 1000;\nconst STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst STANDALONE_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst STANDALONE_RELOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst WIDGET_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst WIDGET_RELOAD_RETRY_BASE_MILLIS = 1000;\n\n/**\n * List of SDK calls pre-dating the protocol field on the SDK payload.\n *\n * This list allows us to log internal usages of the SDK without the protocol field\n * as deprecations to ensure we're ready to remove the lenient parse of the sdk message.\n *\n * [IMPORTANT:] New SDK methods should not be added to this list.\n */\nconst PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES = [\n    SHOW_PROFILE_APP_API_ACTION_NAME,\n    SHOW_TOAST_APP_API_ACTION_NAME,\n    SHOW_HELP_APP_API_ACTION_NAME,\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n];\n\n/* App Parsing Props */\n\nconst APP_PROTOCOL_CHECK_REG_EXG = new RegExp(/^\\s*https?:\\/\\/.+$/);\nconst ALLOWED_SANDBOX_VALUES = [\n    'allow-forms',\n    'allow-modals',\n    'allow-popups',\n    'allow-presentation',\n    'allow-same-origin',\n    'allow-scripts',\n    'allow-downloads'\n];\nconst ALLOWED_PERMISSION_VALUES = [\n    'camera',\n    'clipboard-write',\n    'display-capture',\n    'fullscreen',\n    //\"fullscreen 'none'\" is explicitly required to disable fullscreen for nested iframes\n    \"fullscreen 'none'\",\n    'geolocation',\n    'microphone'\n];\nconst VECTOR_IMG_KEY = 'vector';\nconst RASTER_IMG_KEY_REG_EXP = /^(\\d+)x(\\d+)$/i;\n\nconst LIFECYCLE_HOOK_KEYS = ['blur', 'stop', 'focus', 'bootstrap'].map(hook => `hooks.${hook}`);\nconst LIFECYCLE_KEYS = ['ephemeral', ...LIFECYCLE_HOOK_KEYS];\nconst INTERAPPTION_PROP_MAPPING_CONFIG = {\n    name: {\n        type: 'string',\n        destPath: 'name'\n    },\n    sandbox: {\n        destPath: 'properties.sandbox',\n        convert(valueIn) {\n            let typeIn = Ember.typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    permissions: {\n        destPath: 'properties.permissions',\n        convert(valueIn) {\n            let typeIn = Ember.typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    url: {\n        type: 'string',\n        destPath: 'properties.url'\n    },\n    lifecycle: {\n        destPath: 'advanced.lifecycle',\n        convert(lifecycleObj) {\n            if (Ember.typeOf(lifecycleObj) !== 'object') {\n                throw new Error('lifecycle must be an object if specified');\n            }\n\n            const result = {};\n            for (let key of LIFECYCLE_KEYS) {\n                const value = _.get(lifecycleObj, key);\n                const valueType = Ember.typeOf(value);\n\n                // Set boolean/Boolean values and ignore undefined (use default)\n                if (valueType === 'boolean') {\n                    _.set(result, key, value.valueOf());\n                } else if (valueType !== 'undefined') {\n                    throw new Error(`Expected ${key} to be boolean or undefined`);\n                }\n            }\n            return result;\n        }\n    },\n    subdomain: {\n        type: 'string',\n        destPath: 'properties.subdomain',\n        trustedOnly: true\n    },\n    path: {\n        type: 'string',\n        destPath: 'properties.path',\n        trustedOnly: true\n    },\n    query: {\n        type: 'string',\n        destPath: 'properties.query',\n        trustedOnly: true\n    }\n};\n\nAPP_ASSET_CATEGORIES.forEach(currCategory => {\n    INTERAPPTION_PROP_MAPPING_CONFIG[currCategory] = {\n        type: 'object',\n        destPath: `advanced.${currCategory}`\n    };\n});\n\nexport default Ember.Service.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    intl: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    ajax: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    standaloneAppPool: null,\n    standaloneAppPoolVisible: false, // true when an app route is active\n    widgetAppPool: null,\n    externalUrlExemptIntegrationTypeIds: Ember.get(ENV, 'purecloud-apps.externalUrlExemptIntegrationTypeIds'),\n\n    // Exposed only for automation to test with smaller pool sizes.\n    // These can only be changed prior to loading any apps.\n    standaloneMaxActivePoolSize: Ember.get(ENV, 'purecloud-apps.maxActivePoolSize.standalone'),\n    widgetMaxActivePoolSize: Ember.get(ENV, 'purecloud-apps.maxActivePoolSize.widget'),\n\n    // Bypass all (client/server) app caching.  Should only be used internally (Testing/Automation)\n    _bypassAppCache: false,\n\n    // All globally available handlers (not pool or instance specific) will be injected by the instance initializer\n    globalApiHandlers: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set(\n            'standaloneAppPool',\n            AppPool.create(\n                {\n                    poolName: 'standaloneAppPool',\n                    getMaxActive: () => this.get('standaloneMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_findAllStandaloneApps').bind(this),\n                    loadRetryBaseMillis: STANDALONE_LOAD_RETRY_BASE_MILLIS,\n                    loadRetryMaxBackoffMillis: STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                    reloadAppsIntervalMillis: STANDALONE_RELOAD_INTERVAL_MILLIS,\n                    reloadAppsRetryBaseMillis: STANDALONE_RELOAD_RETRY_BASE_MILLIS\n                },\n                Ember.getOwner(this).ownerInjection()\n            )\n        );\n        this.set(\n            'widgetAppPool',\n            AppPool.create(\n                {\n                    poolName: 'widgetAppPool',\n                    getMaxActive: () => this.get('widgetMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_findAllWidgetApps').bind(this),\n                    loadRetryBaseMillis: WIDGET_LOAD_RETRY_BASE_MILLIS,\n                    loadRetryMaxBackoffMillis: WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                    reloadAppsIntervalMillis: WIDGET_RELOAD_INTERVAL_MILLIS,\n                    reloadAppsRetryBaseMillis: WIDGET_RELOAD_RETRY_BASE_MILLIS\n                },\n                Ember.getOwner(this).ownerInjection()\n            )\n        );\n\n        // Listen to local PC-sourced app messages\n        let localMsgListener = Ember.run.bind(this, '_handleLocalMsg');\n        this.set('_localMsgListener', localMsgListener);\n        Ember.$(window).on('message onmessage', localMsgListener);\n    },\n\n    appsSupported: Ember.computed(function () {\n        /* globals Modernizr */\n        return !!(Modernizr && Modernizr.sandbox);\n    }),\n\n    /**\n     * Process the app api call from the app specified in app or appInstance\n     */\n    handleAppApiCall(apiCall, contextualApiHandlers) {\n        this._handleApiCall(apiCall, contextualApiHandlers);\n    },\n\n    /**\n     * Checks if an app instance (App) is trusted or not\n     * It's considered trusted if the App is an internal app (InternallyHostedApp)\n     * or if the app type is part of exempted external URLs.\n     *\n     * This should be used to check if an app can receive internal data or not.\n     *\n     * @param {App} appInstance The app instance\n     * @returns whether the app instance is considered trusted or not\n     */\n    isTrustedApp(appInstance) {\n        return (\n            appInstance instanceof InternallyHostedApp ||\n            this.get('externalUrlExemptIntegrationTypeIds').includes(appInstance.typeId)\n        );\n    },\n\n    /**\n     * Builds and validates Interapptions from the provided config.\n     *\n     * Config must conform to supported properties and the resulting app instance must be valid.\n     * Invalid config or the built app will log in addition to returning null.\n     *\n     * @param {string} typeId - The typeId of the interapption\n     * @param {string} id - The id of the interapption\n     * @param {Object} config - Interapption config\n     * @param {string} config.name - Interapption name\n     * @param {string|string[]} config.sandbox - Interapption sandbox (comma-separated string or array)\n     * @param {string|string[]} config.permissions - Interapption permissions (comma-separated string or array)\n     * @param {string} config.url - Interapption url. Only URL or path can be specified\n     * @param {Object} config.icon - URLs of assets for the icon class of images for this Interapption\n     * @param {Object} config.icon.vector - A URL to a vector icon asset\n     * @param {Object} config.icon.{width}x{height} - A URL to a raster icon asset of the size class indicated by the property\n     * @param {Object} config.monochromicIcon - URLs of assets for the monochrome icon class of images for this Interapption\n     * @param {Object} config.monochromicIcon.vector - A URL to a vector monochrome icon asset\n     * @param {Object} config.monochromicIcon.{width}x{height} - A URL to a raster monochrome icon asset of the size class indicated by the property\n     * @param {Object} config.lifecycle - Lifecycle config\n     * @param {boolean} config.lifecycle.ephemeral - Is app ephemeral\n     * @param {Object} config.lifecycle.hooks - Opt-in lifecycle hooks config\n     * @param {boolean} config.lifecycle.hooks.bootstrap - Should app receive bootstrap event\n     * @param {boolean} config.lifecycle.hooks.focus - Should app receive focus event\n     * @param {boolean} config.lifecycle.hooks.blur - Should app receive blur event\n     * @param {boolean} config.lifecycle.hooks.stop - Should app receive stop event\n     * @param {string} config.subdomain - A subdomain for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.path - A Path for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.query - A querystring for an InternallyHostedApp (Trusted Only)\n     * @param {boolean} trustedProvider - Indicates if this provider can generate trusted apps.\n     *  This should only be used for internal app providers that wish to register internal apps.\n     *  e.g. Altocloud, Relate, Scripter, etc.\n     *\n     * @returns an App or InternallyHostedApp instance if valid; null otherwise\n     */\n    buildValidInterapption(typeId, id, config, trustedProvider = false) {\n        // FUTURE: Support for i10n, full validation, etc. (See: ATEAM-152)\n        if (Ember.typeOf(typeId) !== 'string' || typeId.trim().length === 0) {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty typeId.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (Ember.typeOf(id) !== 'string' || id.trim().length === 0) {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty id.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (Ember.typeOf(config) !== 'object') {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg(\n                    'Interapption is being ignored due to an invalid config object type.'\n                ),\n                {\n                    config,\n                    remoteData: {\n                        type: Ember.typeOf(config),\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let normalizedConfig = {\n            properties: {\n                displayType: APP_DISPLAY_TYPES.INTERAPPTION\n            },\n            advanced: {}\n        };\n\n        // Validate and map config properties to normalized config\n        let propError = null;\n\n        let configKeys = Object.keys(config);\n        for (let index = 0; index < configKeys.length; index++) {\n            let currKey = configKeys[index];\n            let currValue = config[currKey];\n            let currPropConfig = INTERAPPTION_PROP_MAPPING_CONFIG[currKey];\n\n            if (!currPropConfig) {\n                propError = `${currKey} is not a supported interapption property`;\n                break;\n            }\n\n            if (currPropConfig.convert) {\n                try {\n                    currValue = currPropConfig.convert(currValue);\n                } catch (e) {\n                    propError = `Failed to convert ${currKey} to a valid input`;\n                    break;\n                }\n            } else if (Ember.typeOf(currValue) !== currPropConfig.type) {\n                propError = `${currKey} should be of type ${currPropConfig.type}`;\n                break;\n            }\n\n            if (currPropConfig.trustedOnly && !trustedProvider) {\n                propError = `${currKey} is only allowed to be configured for trustedProviders`;\n                break;\n            }\n\n            Ember.set(normalizedConfig, currPropConfig.destPath, currValue);\n        }\n\n        if (\n            !propError &&\n            Object.prototype.hasOwnProperty.call(config, 'url') &&\n            (Object.prototype.hasOwnProperty.call(config, 'subdomain') ||\n                Object.prototype.hasOwnProperty.call(config, 'path') ||\n                Object.prototype.hasOwnProperty.call(config, 'query'))\n        ) {\n            propError = 'Cannot specify both a URL and any of subdomain, path, or query';\n        }\n\n        if (propError) {\n            this.get('stashLogger').error(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to invalid config.'),\n                {\n                    config,\n                    details: propError,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let result = this._buildApp(\n            typeId,\n            id,\n            normalizedConfig,\n            trustedProvider && Object.prototype.hasOwnProperty.call(config, 'path')\n        );\n\n        if (!this._isValidApp(result, 'Interapption')) {\n            return null;\n        }\n\n        return result;\n    },\n\n    /**\n     * Handles app postMessage events from the local frame to support app-like\n     * integrations.\n     */\n    _handleLocalMsg(evt) {\n        if (!evt.originalEvent.source || !this._isLocalMsg(evt.originalEvent.source)) {\n            // Not a valid internal app event\n            return;\n        }\n\n        let apiCall = null;\n\n        try {\n            // Strict parse\n            apiCall = parseMessage(evt.originalEvent.data, true);\n        } catch (parseError) {\n            // TECHDEBT: Remove lenient retry after deprecation period; will have to change logic to ensure only error cases are logged\n            if (parseError.message === 'missingProtocol') {\n                try {\n                    // Re-parse leniently to allow for short deprecation period and logging\n                    apiCall = parseMessage(evt.originalEvent.data, false);\n\n                    // Check the action to reduce deprecation log false positives further\n                    if (PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES.indexOf(apiCall.action) >= 0) {\n                        this.get('stashLogger').info(\n                            appUtils.buildApiLogMsg(\n                                'Potential internal apps message posted message without protocol information.  This will be deprecated soon.'\n                            ),\n                            {\n                                apiCall,\n                                remoteData: {\n                                    internalPcCall: apiCall.get('internalPcCall'),\n                                    appId: apiCall.get('appId')\n                                }\n                            }\n                        );\n                    } else {\n                        // No protocol and either an unknown or not a legacy action.\n                        // Safe to assume this is not an apps message or is a new action type which should require the protocol\n                        apiCall = null;\n                    }\n                } catch (ignored) {\n                    // Not a client-apps message (e.g. no action field)\n                }\n            } else if (\n                parseError.message === 'missingAction' &&\n                typeof evt.originalEvent.data === 'object' &&\n                evt.originalEvent.data.protocol\n            ) {\n                // Apps Protocol and no action\n                this.get('stashLogger').error(\n                    appUtils.buildApiLogMsg('(Local) sent an apps message with no action.'),\n                    evt.originalEvent.data\n                );\n            } else {\n                // Not a client-apps message (e.g. invalid payload, unknown protocol, no action)\n            }\n        }\n\n        if (apiCall) {\n            apiCall.set('internalPcCall', true);\n            this._handleApiCall(apiCall);\n        }\n    },\n\n    _isLocalMsg(msgSource) {\n        return msgSource === window;\n    },\n\n    _handleApiCall(apiCall, contextualApiHandlers = []) {\n        if (!apiCall || (!apiCall.get('internalPcCall') && !apiCall.get('appId'))) {\n            // Not a valid app call\n            return;\n        }\n\n        let apiHandlers = contextualApiHandlers.concat(this.get('globalApiHandlers'));\n\n        let appId = apiCall.get('appId');\n        let apiActionDetails = apiCall.get('actionDetails');\n        let asyncHandlerPromise;\n\n        if (apiHandlers.length > 0) {\n            let availHandler = apiHandlers.find(currHandler => {\n                try {\n                    let result = currHandler.canHandle(apiCall);\n\n                    if (Ember.typeOf(result) === 'boolean') {\n                        return result;\n                    } else {\n                        this.get('stashLogger').error(\n                            appUtils.buildApiLogMsg('Handler returned a non-boolean result from canHandle')\n                        );\n                    }\n                } catch (e) {\n                    this.get('stashLogger').error(\n                        appUtils.buildApiLogMsg('Handler threw an Error when running canHandle'),\n                        e\n                    );\n                }\n\n                return false;\n            });\n            if (availHandler) {\n                try {\n                    asyncHandlerPromise = availHandler.handle(apiCall);\n                } catch (error) {\n                    asyncHandlerPromise = Ember.RSVP.reject(error);\n                }\n            } else {\n                asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n            }\n        } else {\n            asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n        }\n        asyncHandlerPromise\n            .then(() => {\n                this._instrumentApiCall(apiCall);\n            })\n            .catch(reason => {\n                this.get('stashLogger').error(\n                    appUtils.buildApiLogMsg(\n                        `${apiCall.get('internalPcCall') ? '(Local)' : 'App'} sent a message that could not be handled.`\n                    ),\n                    {\n                        apiActionDetails,\n                        msgFailureDetails: reason,\n                        remoteData: {\n                            appId,\n                            internalPcCall: apiCall.get('internalPcCall')\n                        }\n                    }\n                );\n            });\n    },\n\n    _instrumentApiCall(apiCall) {\n        if (!(apiCall instanceof ApiCall)) {\n            throw new Error('ApiCall instance must be provided');\n        }\n\n        // Redact any non-standard protocols/agents ... just in case\n        let pcAppProtocol = apiCall.get('protocol');\n        if (pcAppProtocol && pcAppProtocol !== APPS_API_PROTOCOL) {\n            pcAppProtocol = 'redactedProtocol';\n        }\n        let pcAppProtocolAgentName = apiCall.get('protocolAgentName');\n        let pcAppProtocolAgentVersion = apiCall.get('protocolAgentVersion');\n        if (pcAppProtocolAgentName && pcAppProtocolAgentName !== 'purecloud-client-app-sdk') {\n            pcAppProtocolAgentName = 'redactedProtocolAgentName';\n            pcAppProtocolAgentVersion = 'redactedProtocolAgentVersion';\n        }\n\n        // Note: Some details are not applicable in all cases.\n        // Providing the entire payload allows for easy filtering on the PageAction\n        this._addPageAction('clientAppApiCall', {\n            apiAction: apiCall.get('action'),\n            pcAppProtocol,\n            pcAppProtocolAgentName,\n            pcAppProtocolAgentVersion,\n\n            // App Details\n            internalPcCall: apiCall.get('internalPcCall'),\n            pcAppTypeId: apiCall.get('srcApp.typeId'),\n            pcAppId: apiCall.get('srcApp.id'),\n            pcAppDisplayType: apiCall.get('srcApp.displayType'),\n            pcAppInternallyHosted: apiCall.get('srcApp') instanceof InternallyHostedApp,\n            pcAppFeatureCategory: apiCall.get('srcApp.featureCategory'),\n\n            // AppInstance Details\n            pcAppInstanceId: apiCall.get('srcAppInstance.instanceId'),\n            pcAppProblemName: apiCall.get('srcAppInstance.problem.name'),\n\n            // Interapption Details\n            interactionId: apiCall.get('srcApp.interactionId')\n        });\n    },\n\n    _addPageAction() {\n        addPageAction(...arguments);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let localMsgListener = this.get('_localMsgListener');\n        if (localMsgListener) {\n            Ember.$(window).off('message onmessage', localMsgListener);\n            this.set('_localMsgListener', null);\n        }\n\n        // Clean up pools\n        [this.get('standaloneAppPool'), this.get('widgetAppPool')].forEach(currPool => {\n            if (currPool && !currPool.isDestroying && !currPool.isDestroyed) {\n                currPool.destroy();\n            }\n        });\n    },\n\n    _findAllStandaloneApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.STANDALONE);\n    },\n\n    _findAllWidgetApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.WIDGET);\n    },\n\n    findAllInterapptions() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.INTERAPPTION);\n    },\n\n    _fetchAppsByType(type) {\n        return this._fetchAppsByTypeRemote(type);\n    },\n\n    /*\n     * Cache the list of apps for awhile reduce network traffic\n     * due to fetching multiple app types at boot and reload\n     */\n    _remoteAppPromise: null,\n    _remoteAppRequestTimestamp: null,\n    _fetchAppsByTypeRemote(type) {\n        let now = Date.now();\n        let allAppsPromise = this.get('_remoteAppPromise');\n        let lastRequestTs = this.get('_remoteAppRequestTimestamp');\n\n        if (\n            !allAppsPromise ||\n            this.get('_bypassAppCache') ||\n            (lastRequestTs && now - lastRequestTs > REMOTE_APPS_CACHE_TTL_MILLIS)\n        ) {\n            allAppsPromise = new Ember.RSVP.Promise((resolve, reject) => {\n                this._accumulateApps(\n                    apps => {\n                        if (apps && apps.length > 1) {\n                            apps.sort((app1, app2) => {\n                                return app1.get('name').localeCompare(app2.get('name'));\n                            });\n                        }\n\n                        resolve(apps);\n                    },\n                    reason => {\n                        // clear the instance's promise on falures so we dont cache failed requests\n                        this.set('_remoteAppPromise', null);\n                        reject(reason);\n                    },\n                    1,\n                    50,\n                    null\n                );\n            });\n            this.set('_remoteAppPromise', allAppsPromise);\n            this.set('_remoteAppRequestTimestamp', now);\n        }\n\n        return allAppsPromise.then(apps => {\n            return apps.filter(currApp => currApp.get('displayType') === type);\n        });\n    },\n\n    _accumulateApps(resolve, reject, pageNumber, pageSize, type, apps) {\n        if (typeof apps === 'undefined' || apps === null) {\n            apps = [];\n        }\n\n        let appsUrl = this.get('application').pcV2Uri(`${APPS_BASE_URL}`);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        appsUrl += `?${Ember.$.param(queryParams, true)}`;\n\n        let headers = {};\n\n        const primaryLocale = this._getPrimaryLocale();\n        if (primaryLocale) {\n            headers['Accept-Language'] = primaryLocale;\n        }\n        if (this.get('_bypassAppCache')) {\n            headers['Cache-Control'] = 'no-cache';\n        }\n\n        this.get('ajax')\n            .request(appsUrl, {\n                headers\n            })\n            .then(result => {\n                if (!result) {\n                    reject('Invalid clientapps return value');\n                    return;\n                }\n\n                if (Array.isArray(result.entities)) {\n                    let validAppObjs = _.chain(result.entities)\n                        .filter(currIntegration => {\n                            return (\n                                currIntegration &&\n                                typeof currIntegration === 'object' &&\n                                Ember.typeOf(Ember.get(currIntegration, 'integrationType.id')) === 'string' &&\n                                !_.isEmpty(Ember.get(currIntegration, 'config.effective.properties'))\n                            );\n                        })\n                        .map(currIntegration => {\n                            let internallyHosted = this._isInternallyHostedApp(currIntegration.integrationType.id);\n                            return this._buildApp(\n                                currIntegration.integrationType.id,\n                                currIntegration.id,\n                                currIntegration.config.effective,\n                                internallyHosted\n                            );\n                        })\n                        .filter(currApp => {\n                            return (\n                                !!currApp &&\n                                this._isValidApp(\n                                    currApp,\n                                    currApp.get('displayType') === APP_DISPLAY_TYPES.INTERAPPTION\n                                        ? 'Interapption'\n                                        : undefined\n                                ) &&\n                                (!type || currApp.get('displayType') === type)\n                            );\n                        })\n                        .value();\n\n                    apps.push(...validAppObjs);\n                }\n\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateApps(resolve, reject, result.pageNumber + 1, pageSize, type, apps);\n                } else {\n                    resolve(apps);\n                }\n            })\n            .catch(reject);\n    },\n\n    _getPrimaryLocale() {\n        let isoLocale = this.get('intl.isoLocale');\n\n        if (Ember.typeOf(isoLocale) === 'string' && Ember.isPresent(isoLocale)) {\n            return isoLocale;\n        } else {\n            this.get('stashLogger').warn(appUtils.buildLogMsg('Unable to find current locale'), {\n                remoteData: {\n                    intlLocale: this.get('intl.locale'),\n                    intlIsoLocale: this.get('intl.isoLocale')\n                }\n            });\n            return null;\n        }\n    },\n\n    _buildApp(typeId, id, config, internallyHosted = false) {\n        let result = null;\n        let langTag = this._getPrimaryLocale();\n\n        // Common app props\n        let appProps = {\n            typeId,\n            id,\n            name: this._parseLangTagProp(config, 'advanced.i10n', langTag, 'name') || Ember.get(config, 'name'),\n            sandbox: this._parseMultiValueProp(config, 'properties.sandbox', ALLOWED_SANDBOX_VALUES),\n            displayType: this._parseProp(config, 'properties.displayType', _.values(APP_DISPLAY_TYPES)),\n            featureCategory: this._parseProp(config, 'properties.featureCategory', _.values(APP_FEATURE_CATEGORIES)),\n            permissionsPolicy: this._parseMultiValueProp(config, 'properties.permissions', ALLOWED_PERMISSION_VALUES),\n            enabledQueueIds: this._parseProp(config, 'properties.queueIdFilterList'),\n            lifecycle: Ember.get(config, 'advanced.lifecycle'),\n            assets: {},\n            // Set runtime state for internal model use\n            langTag: langTag || '',\n            envTld: this.get('application.envDetails.envTld') || '',\n            usePopupAuth: !!this.get('session').get('popoutAuthForIframes'),\n            ucIntegrationKey: this._parseProp(config, 'properties.ucIntegrationKey'), // UC Integration use\n            integrationPresenceSource: this._parseProp(config, 'properties.integrationPresenceSource'), // UC Integration use\n            pbxPermission: this._parseProp(config, 'properties.pbxPermission'), // UC Integration use\n            gcHostOrigin: netUtils.getCurrentWindowOrigin(),\n            gcTargetEnv: this.get('application.runtime.name')\n        };\n\n        // Only attempt to parse communicationTypeFilter when specifed to differentiate undefined/null from []\n        if (!Ember.isNone(Ember.get(config, 'properties.communicationTypeFilter'))) {\n            appProps.enabledCommunicationTypes = this._parseMultiValueProp(\n                config,\n                'properties.communicationTypeFilter',\n                [...INTERAPPTION_COMMUNICATION_TYPE_FILTERS, NO_SUPPORTED_COMMUNICATION_TYPE_FILTER]\n            );\n        }\n\n        if (!internallyHosted) {\n            appProps.urlTemplate = Ember.get(config, 'properties.url');\n            result = App.create(Ember.getOwner(this).ownerInjection(), appProps);\n        } else {\n            appProps.subdomain = Ember.get(config, 'properties.subdomain');\n            appProps.envDetails = this.get('application.envDetails');\n            appProps.path = Ember.get(config, 'properties.path');\n            appProps.query = Ember.get(config, 'properties.query');\n\n            result = InternallyHostedApp.create(Ember.getOwner(this).ownerInjection(), appProps);\n        }\n\n        // Extract assets for each supported asset category\n        APP_ASSET_CATEGORIES.forEach(currAssetCategory => {\n            let currAssetCategoryCfg = {};\n\n            const currVector = Ember.get(config, `advanced.${currAssetCategory}.${VECTOR_IMG_KEY}`);\n            if (currVector) {\n                currAssetCategoryCfg.vector = currVector;\n            }\n            const currRasters = this._extractRasterImgs(config, `advanced.${currAssetCategory}`);\n            if (Object.keys(currRasters).length > 0) {\n                currAssetCategoryCfg.raster = currRasters;\n            }\n\n            const icon = Ember.get(config, `advanced.${currAssetCategory}`);\n            if (icon && icon.guxIcon) {\n                currAssetCategoryCfg.guxIcon = icon.guxIcon;\n            }\n\n            if (Object.keys(currAssetCategoryCfg).length > 0) {\n                result.set(`assets.${currAssetCategory}`, currAssetCategoryCfg);\n            } else if (config) {\n                const advanced = Ember.get(config, `advanced`);\n                if (advanced) {\n                    const assetCategory = Ember.get(advanced, currAssetCategory);\n                    if (assetCategory) {\n                        const classNames = Ember.get(assetCategory, 'classNames');\n                        if (classNames) {\n                            const assets = Ember.get(result, 'assets');\n                            if (!Ember.get(assets, currAssetCategory)) {\n                                Ember.set(assets, currAssetCategory, { classNames });\n                            } else {\n                                Ember.set(assets, `${currAssetCategory}.classNames`, classNames);\n                            }\n                        }\n                    }\n                }\n            }\n        });\n\n        return result;\n    },\n\n    /**\n     * Extract all images of pattern digit(s)xdigit(s) from the basePath\n     */\n    _extractRasterImgs(config, basePath) {\n        let result = {};\n\n        let imgs = Ember.get(config, basePath);\n\n        if (imgs && typeof imgs === 'object') {\n            for (let currImgKey in imgs) {\n                if (currImgKey !== VECTOR_IMG_KEY) {\n                    let parseResult = RASTER_IMG_KEY_REG_EXP.exec(currImgKey);\n                    if (parseResult && parseResult[1] === parseResult[2]) {\n                        result[`x${parseResult[1]}`] = imgs[currImgKey];\n                    }\n                }\n            }\n        }\n\n        return result;\n    },\n\n    _isValidApp(app, appType = 'App') {\n        try {\n            this._validateApp(app);\n\n            return true;\n        } catch (e) {\n            let logMessageAppType = appType === 'App' ? 'App' : 'Interapption';\n            let logLevel;\n            let logMessage;\n\n            switch (e.message) {\n                case 'invalidTypeId':\n                case 'invalidId':\n                case 'invalidName':\n                case 'invalidDisplayType':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing typeId, id, name, or displayType.`;\n                    break;\n                case 'invalidPath':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to a missing/invalid path.`;\n                    break;\n                case 'invalidSubdomain':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an emptystring/invalid subdomain.`;\n                    break;\n                case 'invalidQuery':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an invalid query type.`;\n                    break;\n                case 'missingUrl':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing url.`;\n                    break;\n                case 'invalidUrlProtocol':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an invalid protocol.`;\n                    break;\n                case 'reservedPureCloudDomain':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to use of a PC reserved domain.`;\n                    break;\n                case 'malformedUrl':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unparsable URL.`;\n                    break;\n                case 'unexpectedInterapptionProperty':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unexpected Interaction Widget property.`;\n                    break;\n                default:\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored`;\n                    break;\n            }\n\n            let fullLogMsg = null;\n            if (appType === 'Interapption') {\n                fullLogMsg = appUtils.buildInterapptionsLogMsg(logMessage);\n            } else {\n                fullLogMsg = appUtils.buildLogMsg(logMessage);\n            }\n\n            this.get(`stashLogger.${logLevel}`)(fullLogMsg, {\n                appUrl: app.get('url'),\n                remoteData: { appId: app.get('id') }\n            });\n\n            return false;\n        }\n    },\n\n    _validateApp(app) {\n        if (Ember.typeOf(app.typeId) !== 'string' || app.typeId.trim().length === 0) {\n            throw new Error('invalidTypeId');\n        }\n\n        if (Ember.typeOf(app.id) !== 'string' || app.id.trim().length === 0) {\n            throw new Error('invalidId');\n        }\n\n        if (Ember.typeOf(app.name) !== 'string' || app.name.trim().length === 0) {\n            throw new Error('invalidName');\n        }\n\n        if (Ember.typeOf(app.displayType) !== 'string' || app.displayType.trim().length === 0) {\n            throw new Error('invalidDisplayType');\n        }\n\n        if (app instanceof InternallyHostedApp) {\n            let internalAppPath = app.get('path');\n            if (Ember.typeOf(internalAppPath) !== 'string' || Ember.isBlank(internalAppPath)) {\n                throw new Error('invalidPath');\n            }\n\n            // subdomain can be null, undefined, or non-empty String\n            let internalAppSubdomain = app.get('subdomain');\n            let subdomainType = Ember.typeOf(internalAppSubdomain);\n            if (\n                !(\n                    subdomainType === 'null' ||\n                    subdomainType === 'undefined' ||\n                    (subdomainType === 'string' && internalAppSubdomain.trim().length > 0)\n                )\n            ) {\n                throw new Error('invalidSubdomain');\n            }\n\n            // query can be null, undefined, or a string (blank allowed)\n            let internalAppQuery = app.get('query');\n            if (['null', 'undefined', 'string'].indexOf(Ember.typeOf(internalAppQuery)) < 0) {\n                throw new Error('invalidQuery');\n            }\n        }\n\n        if (Ember.isBlank(app.get('url'))) {\n            throw new Error('missingUrl');\n        }\n\n        // Enforce app URL protocol of http/https (http should primarily be used for development)\n        if (APP_PROTOCOL_CHECK_REG_EXG.exec(app.get('url')) === null) {\n            throw new Error('invalidUrlProtocol');\n        }\n\n        let externalUrl = null;\n        try {\n            // IMPORTANT: In addition to checking internal/external, this checks the validity of the url.  It must be run regardless of app type\n            externalUrl = netUtils.isExternalDomain(app.get('url'));\n        } catch (invalidUrl) {\n            throw new Error('malformedUrl');\n        }\n\n        if (\n            !externalUrl &&\n            !(app instanceof InternallyHostedApp) &&\n            this.get('externalUrlExemptIntegrationTypeIds').indexOf(app.get('typeId')) < 0\n        ) {\n            // Disallow internal URLs on external apps due to sandbox concerns\n            throw new Error('reservedPureCloudDomain');\n        }\n\n        // Interapptions validation\n        if (app.displayType !== APP_DISPLAY_TYPES.INTERAPPTION) {\n            ['interactionId', 'interactionType', 'enabledQueueIds', 'enabledCommunicationTypes'].forEach(currKey => {\n                if (app.get(currKey) !== undefined && app.get(currKey) !== null) {\n                    throw new Error('unexpectedInterapptionProperty');\n                }\n            });\n        }\n\n        return true;\n    },\n\n    _isInternallyHostedApp(integrationTypeId) {\n        return Ember.get(ENV, 'purecloud-apps.internallyHostedIntegrationTypeIds').indexOf(integrationTypeId) >= 0;\n    },\n\n    _parseProp(obj, prop, validItems = null) {\n        let propVal = Ember.get(obj, prop);\n        if (propVal && (validItems === null || validItems.indexOf(propVal) >= 0)) {\n            return propVal;\n        }\n    },\n\n    _parseBooleanProp(obj, prop) {\n        let propVal = Ember.get(obj, prop);\n        if (typeof propVal === 'boolean') {\n            return propVal;\n        }\n        return undefined;\n    },\n\n    _parseMultiValueProp(obj, prop, validItems = null, separator = ',') {\n        let result = [];\n\n        let propVal = Ember.get(obj, prop);\n        if (propVal) {\n            result = propVal.split(separator).reduce((validatedItems, curr) => {\n                if (curr) {\n                    let toCheck = curr.trim();\n\n                    if (toCheck.length > 0 && (validItems === null || validItems.indexOf(toCheck) >= 0)) {\n                        validatedItems.push(toCheck);\n                    }\n                }\n\n                return validatedItems;\n            }, []);\n        }\n\n        return result;\n    },\n\n    // Storage for previous langTag regexp instances\n    _langTagRegExps: {},\n\n    /**\n     * Leniently locate a langTag-specific property within the specified object and baseProp. The\n     * provided langTag will searched in a padding space and case insensitive manor.\n     *\n     * @param {Object} obj - The base object to search\n     * @param {String} baseProp - single or dot-separated list of hierarchical props identifying the base object to search\n     * @param {String} langTag - the bcp47 langTag to search for within obj[baseProp]\n     * @param {String} langTagRelProp - single or dot-separated list of hierarchical props identifying the langTag-relative property to return\n     *\n     * @returns the value of the prop if it is found for the current locale; undefined otherwise.\n     */\n    _parseLangTagProp(obj, baseProp, langTag, langTagRelProp) {\n        if (Ember.typeOf(langTag) !== 'string' || !langTag.trim()) {\n            // Log and return undefined as this is an internal method. No need to throw and handle outside\n            this.get('stashLogger').warn(\n                appUtils.buildLogMsg('Missing/Invalid langTag provided to parse langTag specific prop', {\n                    remoteData: {\n                        langTag\n                    }\n                })\n            );\n\n            return undefined;\n        }\n\n        let result = Ember.get(obj, `${baseProp}.${langTag}.${langTagRelProp}`);\n\n        if (typeof result === 'undefined') {\n            // Check for lenient langTags\n            let baseObj = Ember.get(obj, baseProp);\n            if (baseObj) {\n                let lenientLangTag = langTag.trim().toLowerCase();\n                let langTagRegExp = this._langTagRegExps[lenientLangTag];\n                if (!langTagRegExp) {\n                    langTagRegExp = new RegExp(`^\\\\s*${lenientLangTag}\\\\s*$`, 'i');\n                    this._langTagRegExps[lenientLangTag] = langTagRegExp;\n                }\n\n                let langKey = Object.keys(baseObj).find(key => {\n                    return langTagRegExp.test(key);\n                });\n\n                if (Ember.typeOf(langKey) === 'string') {\n                    result = Ember.get(baseObj, `${langKey}.${langTagRelProp}`);\n                }\n            }\n        }\n\n        return result;\n    }\n});\n","define(\"connections-ui/services/asset-loader\", [\"exports\", \"ember-asset-loader/services/asset-loader\"], function (_exports, _assetLoader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _assetLoader.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getEntityObjectId, isDirectoryId } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP } = Ember;\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isJid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/(?!.*\\/).*@.*$/i);\n}\n\nexport default Ember.Service.extend(LoggerMixin, {\n    store: Ember.inject.service(),\n    peopleQueue: {},\n    groupQueue: {},\n\n    getUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(id, 'person', resolve);\n        });\n    },\n\n    refreshUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.queueEntity('person', id, resolve);\n        });\n    },\n\n    getChatUser(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'person', resolve);\n        });\n    },\n\n    getGroup(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'group', resolve);\n        });\n    },\n\n    checkCacheForEntity(objectId, entityType, resolve) {\n        let cachedModel = this.get('store').peekRecord(entityType, objectId);\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        if (objectId.indexOf('@') > -1) {\n            const possibleCache = this.get('store').peekAll(entityType);\n            if (possibleCache) {\n                cachedModel = possibleCache.findBy('jid', objectId);\n            }\n        }\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        this.queueEntity(entityType, objectId, resolve);\n    },\n\n    queueEntity(entityType, entityId, resolve) {\n        let possibleJid = entityId;\n        if (isJid(entityId)) {\n            entityId = getEntityObjectId(entityId);\n        }\n\n        if (!isGuid(entityId) && !isDirectoryId(entityId) && !isDirectoryId(getEntityObjectId(entityId))) {\n            const placeholder = this.get('store').push({\n                data: {\n                    type: entityType,\n                    id: entityId,\n                    _id: entityId,\n                    general: {\n                        name: [\n                            {\n                                labelKey: 'name',\n                                value: entityId\n                            }\n                        ]\n                    }\n                }\n            });\n            return resolve(placeholder);\n        }\n\n        let queue = {};\n        switch (entityType) {\n            case 'person':\n                queue = this.get('peopleQueue');\n                break;\n            case 'group':\n                queue = this.get('groupQueue');\n                break;\n        }\n        if (queue[possibleJid] == null) {\n            queue[possibleJid] = [];\n        }\n        queue[possibleJid].push(resolve);\n        this.scheduleQueues();\n    },\n\n    scheduleQueues() {\n        Ember.run.debounce(this, this._scheduleQueues, 500);\n    },\n\n    _scheduleQueues() {\n        Ember.run.once(this, this._handleQueues);\n    },\n\n    _handleQueues() {\n        if (!(this.isDestroyed || this.isDestroying)) {\n            const people = this.clearQueue('peopleQueue');\n            const groups = this.clearQueue('groupQueue');\n\n            if (!_.isEmpty(people)) {\n                this.processQueue('person', people);\n            }\n            if (!_.isEmpty(groups)) {\n                this.processQueue('group', groups);\n            }\n        }\n    },\n\n    clearQueue(queue) {\n        const value = this.get(queue);\n        this.set(queue, {});\n        return value;\n    },\n\n    processQueue(entityType, queue) {\n        const ids = _.keys(queue);\n        this.logger.debug('BATCH: Processing queue', entityType, ids.length);\n\n        return this.get('store')\n            .findMany(entityType, ids, FL[entityType])\n            .then(results => {\n                return this.resolveResults(entityType, queue, results);\n            })\n            .catch(err => {\n                this.logger.error('BATCH: Failed to fetch entities in bulk:', {\n                    entityType,\n                    ids: ids.length < 25 ? ids.join(',') : ids.length,\n                    err\n                });\n                return this.resolveResults(entityType, queue, []);\n            });\n    },\n\n    resolveResults(entityType, queue, results) {\n        const ids = Object.keys(queue);\n\n        _.forEach(results, entity => {\n            // entities are requested/queued by jid, id (guid) or id (_id, mongoid)\n            ['id', 'jid', '_id'].forEach(id => {\n                const entityId = entity.get(id);\n                const promises = queue[entityId];\n                if (promises) {\n                    promises.forEach(resolve => resolve(entity));\n                }\n                _.remove(ids, id => id === entityId);\n            });\n        });\n\n        if (ids.length > 0) {\n            const missingIds = ids.length < 100 ? ids.join(',') : ids.length;\n            this.logger.info(\n                'BATCH: Queue had remaining items not resolved, resolving with placeholder for single request:',\n                {\n                    entityType,\n                    missingIds\n                }\n            );\n            _.forEach(ids, id => {\n                const keyId = id;\n                if (isJid(id)) {\n                    id = getEntityObjectId(id);\n                }\n                const placeholder = this.get('store').push({\n                    data: {\n                        type: entityType,\n                        id: id,\n                        _id: id,\n                        general: {\n                            name: [\n                                {\n                                    labelKey: 'name',\n                                    value: id\n                                }\n                            ]\n                        }\n                    }\n                });\n\n                _.forEach(queue[keyId], resolve => resolve(placeholder));\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport CacheChatRoomsMixin from '../mixins/cache-chat-rooms';\nimport ChatMessage from '../models/chat-message';\nimport ChatRoom from '../models/chat-room';\nimport ChatEvents from '../mixins/chat-service/chat-events';\nimport BatchDataRequests from '../mixins/batch-data-requests';\nimport MessageNotificationsMixin from '../mixins/chat-service/message-notifications';\nimport moment from '../utils/dates';\nimport timeoutPromise from '../utils/timeout-promise';\nimport { markdownToHtml } from '../utils/markdown';\nimport MessageSplitting from '../mixins/chat-service/message-splitting';\nimport {\n    compareJids,\n    getEntityObjectId,\n    isRoomJid,\n    isSupervisorJid,\n    isAcdJid\n} from 'ember-purecloud-components/utils/jid-helpers';\nimport { task, timeout } from 'ember-concurrency';\nimport { v4 as uuid } from 'uuid';\n\nconst Promise = Ember.RSVP.Promise;\nconst respondingTimeout = {};\nconst preferencePaths = {\n    interactionNotificationVolume: 'chat.interactionNotificationVolume',\n    chatNotificationVolume: 'chat.chatNotificationVolume'\n};\n\nconst mixins = [\n    Ember.Evented,\n    ChatEvents,\n    BatchDataRequests,\n    CacheChatRoomsMixin,\n    MessageNotificationsMixin,\n    MessageSplitting\n];\n\nexport const supportedChatWidgets = [\n    'jira',\n    'salesforce',\n    'pagerduty',\n    'videoNotification' // New stanza returned when using useVoltVideoMessages\n];\n\nexport default Ember.Service.extend(...mixins, {\n    batchDataRequests: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    // timeline: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    store: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n\n    applicationController: null,\n\n    widgets: supportedChatWidgets,\n    firstRoomChosen: false,\n    responding: {},\n    popoutRoom: null,\n    activeRoom: null,\n    activeEmpty: null,\n    messagesPerHistoryRequest: 25,\n    maxHistoryRequestSize: 100,\n\n    dashboardRooms: [],\n    mutedRooms: [],\n    roomHistoryStack: [],\n    replyMessage: null,\n\n    collabChatShowChatSplat: false,\n\n    // clean up after chat decomp goes GA\n    useChatBetaCleanUp: true,\n\n    canCorrectMessages: Ember.computed.reads('connected'),\n\n    initializePreferences: Ember.on('init', function () {\n        let preferences = this.get('preferences');\n\n        preferences\n            .getPreference('chat.mutedRooms')\n            .then((mutedRoomsValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const mutedRooms = JSON.parse(mutedRoomsValue);\n                if (mutedRooms && !this.isDestroyed) {\n                    this.set('mutedRooms', mutedRooms);\n                }\n            })\n            .catch(e =>\n                Ember.Logger.error('Error getting preference (mutedRooms):', {\n                    error: e,\n                    remoteData: {\n                        preference: 'mutedRooms'\n                    }\n                })\n            );\n\n        preferences\n            .getPreference('chat.roomHistoryStack')\n            .then((roomHistoryStackValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const roomHistoryStack = JSON.parse(roomHistoryStackValue);\n                if (roomHistoryStack && !this.isDestroyed) {\n                    this.set('roomHistoryStack', roomHistoryStack);\n                }\n            })\n            .catch(e =>\n                Ember.Logger.error('Error getting preference:', {\n                    error: e,\n                    remoteData: {\n                        preference: 'roomHistoryStack'\n                    }\n                })\n            );\n    }),\n\n    isEditing: Ember.computed('activeRoom.messages.@each.isEditing', function () {\n        if (!this.get('activeRoom')) {\n            return false;\n        }\n\n        let messages = this.get('activeRoom.messages');\n        if (!messages) {\n            return false;\n        }\n\n        return !_.isEmpty(messages.filterBy('isEditing'));\n    }),\n\n    _chatNotificationVolume: 50,\n    chatNotificationVolume: Ember.computed('_chatNotificationVolume', {\n        get: function () {\n            return this.get('_chatNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.chatNotificationVolume, val);\n            this.set('_chatNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    _interactionNotificationVolume: 50,\n    interactionNotificationVolume: Ember.computed('_interactionNotificationVolume', {\n        get: function () {\n            return this.get('_interactionNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.interactionNotificationVolume, val);\n            this.set('_interactionNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    allowUserRemoval: false,\n\n    init() {\n        this._super(...arguments);\n        this._initNotificationVolumes();\n        this._setupRateLimitListener();\n        this._startWatchVideoParticipantCount();\n    },\n\n    _startWatchVideoParticipantCount() {},\n\n    _initNotificationVolumes: function () {\n        Ember.run.next(() => {\n            const preferences = this.get('preferences');\n            if (!preferences) {\n                return;\n            }\n\n            preferences.getPreference(preferencePaths.chatNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_chatNotificationVolume', val);\n                }\n            });\n\n            preferences.getPreference(preferencePaths.interactionNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_interactionNotificationVolume', val);\n                }\n            });\n        });\n    },\n\n    setMessageReply(message) {\n        this.set('replyMessage', message);\n    },\n\n    _setupRateLimitListener() {\n        this.get('ajax').on('rateLimited', this, this._handleRateLimit);\n    },\n\n    _handleRateLimit(data) {\n        if (data && data.url && data.options) {\n            try {\n                let url = new URL(data.url);\n                let options = data.options;\n                let requestingJids = options.data && options.data.jid && options.data.jid.length > 0;\n                if (url.pathname.indexOf('users') > -1 && requestingJids) {\n                    // We are loading up jids for chat and got rate limited. Let's notify the user.\n                    Ember.run.debounce(this, this._notifyRosterRateLimit, 500);\n                }\n            } catch (error) {\n                // Ignore error\n            }\n        }\n    },\n\n    _notifyRosterRateLimit() {\n        let title = this.get('intl').t('chat.roster.errors.rateLimit.title').toString();\n        let message = this.get('intl').t('chat.roster.errors.rateLimit.message').toString();\n        this.get('notification').info(title, message, {\n            tag: 'chat-rate-limit',\n            hideAfter: 20\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forEach(respondingTimeout, value => {\n            Ember.run.cancel(value);\n        });\n\n        this.get('ajax').off('rateLimited', this, this._handleRateLimit);\n    },\n\n    saveMutedRooms: Ember.observer('mutedRooms.[]', function () {\n        this.get('preferences').setPreference('chat.mutedRooms', JSON.stringify(this.get('mutedRooms')));\n    }),\n\n    saveRoomHistoryStack: Ember.observer('roomHistoryStack.[]', function () {\n        this.get('preferences').setPreference('chat.roomHistoryStack', JSON.stringify(this.get('roomHistoryStack')));\n    }),\n\n    addResponder(room, person) {\n        var responding, respondingTimeoutId;\n        if (!person.get('name') && isAcdJid(room)) {\n            person.set('name', this.get('intl').t('purecloud.acdInteraction.chats.customerName'));\n        }\n        if (person.get('id') !== this.get('session.person.id')) {\n            responding = this.get('responding');\n            if (!Object.prototype.hasOwnProperty.call(responding, room)) {\n                responding[room] = Ember.A();\n            }\n            responding[room].addObject(person.get('name'));\n            respondingTimeoutId = room + '-' + person.get('id');\n            Ember.run.cancel(respondingTimeout[respondingTimeoutId]);\n            respondingTimeout[respondingTimeoutId] = Ember.run.later(\n                this,\n                function () {\n                    return this.removeResponder(room, person.get('name'), person.get('jid'));\n                },\n                20000\n            );\n            return this.notifyPropertyChange('responding');\n        }\n    },\n\n    removeResponder(room, person, from) {\n        if (!_.isEmpty(this.get('responding')[room])) {\n            this.get('responding')[room].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n        if (!_.isEmpty(this.get('responding')[from])) {\n            this.get('responding')[from].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n    },\n\n    sendChatState(jid, state) {\n        return this.getChatRoom(jid).then(room => {\n            if (room.get('participants.length') < 2) {\n                return false;\n            }\n            return this.get('streaming.connection') && this.get('streaming.connection').sendChatState(jid, state);\n        });\n    },\n\n    toggleRoomMuted(roomJid) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.get('mutedRooms');\n            if (this.roomMuted(roomJid)) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    setRoomMuted(roomJid, muted) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.get('mutedRooms');\n            if (!muted) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    roomMuted(roomJid) {\n        var mutedRooms;\n        mutedRooms = this.get('mutedRooms');\n        return roomJid && mutedRooms && mutedRooms.any(jid => jid === roomJid);\n    },\n\n    getRecents() {\n        return new Promise(function (resolve, reject) {\n            this.get('streaming.connection').getRecents(function (error, recents) {\n                if (error) {\n                    reject(error);\n                } else {\n                    resolve(recents);\n                }\n            });\n        });\n    },\n\n    clearRoomUnreadMessages(room) {\n        return room.clearUnreadMessages();\n    },\n\n    addRoomToDashboard(room) {\n        return this.get('dashboardRooms').addObject(room);\n    },\n\n    messageFailedToSend(room, time) {\n        room.get('messages').forEach(function (message) {\n            if (message.id === null && message.time._d.toString() === time._d.toString()) {\n                message.setProperties({\n                    sendError: true,\n                    pending: false\n                });\n            }\n        });\n    },\n\n    sendMessageProxy(jid, room, message, options) {\n        if (message.length > 4000) {\n            let messageQueue = this._splitOverSizedMessage(message);\n            messageQueue = this._convertSplitMessagesToWidgets(room, messageQueue);\n            return this.sendSplitMessageQueue(room, messageQueue);\n        } else {\n            return this.sendMessageToRoom(jid, message, options);\n        }\n    },\n\n    sendMessageToRoom(jid, text, options) {\n        return new Promise((resolve, reject) => {\n            if (!jid || (text && text.length <= 0 && !options)) {\n                Ember.Logger.error(`JID and not-empty message required to send message ${jid}, ${text}`);\n                reject('send failure');\n            }\n\n            this.get('streaming.connection').setActive(jid);\n\n            this.getChatRoom(jid).then(room => {\n                let id, timeoutIdentifier;\n                this.clearRoomUnreadMessages(room);\n\n                const sendCallback = (error, message) => {\n                    Ember.run.cancel(timeoutIdentifier);\n                    if (error) {\n                        Ember.Logger.error('Error in message send', {\n                            jid,\n                            error\n                        });\n                        reject(id);\n                    } else {\n                        if (message.oid) {\n                            room.clearPending(message);\n                        }\n                        resolve(null);\n                    }\n                };\n\n                timeoutIdentifier = Ember.run.later(this, sendCallback, 'timeout-error', null, 25000);\n\n                if (options) {\n                    id = this.get('streaming.connection').sendMessage(options, sendCallback);\n                } else {\n                    id = this.get('streaming.connection').sendMessage(jid, text, sendCallback);\n                }\n            });\n        });\n    },\n\n    sendVideoProviderNotification(room, provider) {\n        if (room && !room.get('isAcdRoom')) {\n            let to = room.get('jid');\n            let body = provider.get('notification');\n            let data = provider.get('data') || {};\n\n            if (!body) {\n                return;\n            }\n\n            let stanza = {\n                name: `${provider.get('id')}-notification`,\n                contents: JSON.stringify(data)\n            };\n            let children = [stanza];\n            let options = { to, body, children };\n            this.get('streaming.connection').sendMessage(options, (error, message) => {\n                room.clearPending(message);\n            });\n        }\n    },\n\n    removeAttachment(fileDescriptor) {\n        let keys = Object.keys(fileDescriptor);\n        if (!keys.length) {\n            return Promise.resolve();\n        } else {\n            let url = fileDescriptor[keys[0]];\n            let request = this.get('ajax').del(url, { dataType: '' });\n            return Promise.cast(request);\n        }\n    },\n\n    joinScreenShareRoomViaHawk(roomJid, rejoiningRoom = false) {\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    room.set('joinError', null);\n                    room.set('activated', true);\n                    if (!rejoiningRoom) {\n                        room.set('lastMessageTime', moment());\n                    }\n                    resolve(room);\n                });\n            }),\n            8000,\n            `chat#joinRoomViaHawk: ${roomJid}`\n        );\n    },\n\n    checkJid(roomJid) {\n        if (!roomJid) {\n            return `adhoc-${uuid()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            return `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return roomJid;\n    },\n\n    joinRoom(roomJid, rejoiningRoom = false) {\n        if (!roomJid) {\n            roomJid = `adhoc-${uuid()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    this.get('streaming.connection').joinRoom(roomJid, err => {\n                        if (err) {\n                            room.set('joinError', err);\n                        } else {\n                            room.set('joinError', null);\n                            room.set('activated', true);\n                            room.loadDeferredParticipants();\n                        }\n\n                        this.get('streaming.connection').setActive(roomJid);\n                        if (!rejoiningRoom) {\n                            room.set('lastMessageTime', moment());\n                        }\n                        resolve(room);\n                    });\n                });\n            }),\n            8000,\n            `chat#joinRoom: ${roomJid}`\n        );\n    },\n\n    /**\n     * Used to do local updates when a room is joined. The actual work to join a room via\n     * realtime has been moved to collaborate-chat.\n     */\n    joinRoomEvent(room, err, rejoiningRoom = false) {\n        if (err) {\n            room.set('joinError', err);\n        } else {\n            room.set('joinError', null);\n            room.set('activated', true);\n            room.loadDeferredParticipants();\n        }\n        if (!rejoiningRoom) {\n            room.set('lastMessageTime', moment());\n        }\n        return room;\n    },\n\n    syncPendingRoomWithStreamingService(room) {\n        return new Promise(resolve => {\n            this.addRoomToCache(room);\n            const participants = room.get('participants');\n            //room.set('participants', []);\n            this.joinRoom(room.jid).then(room => {\n                this.changeActiveRoom(room);\n                room.set('pendingRoom', false);\n                room.set('showingVideo', true);\n                participants.forEach(person => {\n                    this.inviteToRoom(room, person);\n                });\n                resolve(room);\n            });\n        });\n    },\n\n    joinAcdRoom(roomJid) {\n        // ACD room jids from conversation service are in the form\n        // `{id}@conference.{orgId}.orgspan.com`\n        // but we should use the form\n        // `{id}@conference.{orgShortName}.orgspan.com`\n        const roomId = roomJid.split('@')[0];\n        roomJid = `${roomId}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n\n        return timeoutPromise(\n            new Promise((resolve, reject) => {\n                return this.get('streaming.connection').joinRoom(roomJid, () => {\n                    Ember.run(() => {\n                        Ember.run.schedule('actions', err => {\n                            if (err) {\n                                return reject(err);\n                            }\n                            this.get('streaming.connection').setActive(roomJid);\n                            return this.getChatRoom(roomJid).then(function (room) {\n                                room.set('lastMessageTime', moment());\n                                return resolve(room);\n                            });\n                        });\n                    });\n                });\n            }),\n            4000,\n            'chat#joinAcdRoom'\n        );\n    },\n\n    leaveAcdRoom(roomJid) {\n        let request = new Promise((resolve, reject) =>\n            this.get('streaming.connection').leaveRoom(roomJid, err => (err ? reject(err) : resolve()))\n        );\n        request = timeoutPromise(request, 4000, 'chat#leaveAcdRoom');\n\n        request.catch(err => {\n            Ember.Logger.error(`chat#leaveAcdRoom error for jid '${roomJid}'`, err);\n\n            return Ember.RSVP.reject(err);\n        });\n\n        return request;\n    },\n\n    newRoom(jid) {\n        return ChatRoom.create(\n            {\n                jid: jid,\n                objectId: getEntityObjectId(jid)\n            },\n            Ember.getOwner(this).ownerInjection()\n        );\n    },\n\n    makeNewEmptyRoom() {\n        return new Promise(resolve => {\n            this.joinRoom()\n                .then(room => {\n                    return this.changeActiveRoom(room);\n                })\n                .then(room => {\n                    this.addEmptyRoomObserver(room);\n                    resolve(room);\n                });\n        });\n    },\n\n    addEmptyRoomObserver(room) {\n        var handler, i, key, keys, len;\n        this.set('activeEmpty', room);\n        keys = ['messages.length', 'participants.length', 'activated', 'subject'];\n        handler = () => {\n            var i, key, len, roomIsDirty;\n            if (!room.get('initialSubject')) {\n                room.set('initialSubject', room.get('subject'));\n            }\n            roomIsDirty =\n                room.get('messages.length') > 0 ||\n                room.get('participants.length') > 1 ||\n                room.get('subject') !== room.get('initialSubject') ||\n                !room.get('activated');\n            if (roomIsDirty) {\n                this.set('activeEmpty', null);\n                for (i = 0, len = keys.length; i < len; i++) {\n                    key = keys[i];\n                    room.removeObserver(key, handler);\n                }\n            }\n            return null;\n        };\n        for (i = 0, len = keys.length; i < len; i++) {\n            key = keys[i];\n            room.addObserver(key, handler);\n        }\n    },\n\n    addPersonToRoom(room, person) {\n        if (room.get('pendingRoom')) {\n            room.addParticipant(person);\n        } else {\n            if (room.isOneToOneRoom()) {\n                const oneToOneTarget = room.get('oneToOneTarget');\n                return this.makeNewEmptyRoom().then(newRoom => {\n                    this.trigger('oneToOneChangeToGroup', room, newRoom);\n                    this.inviteToRoom(newRoom, oneToOneTarget);\n                    this.inviteToRoom(newRoom, person);\n                });\n            } else {\n                this.inviteToRoom(room, person);\n                return Ember.RSVP.resolve();\n            }\n        }\n    },\n\n    inviteToRoom(room, user) {\n        this.get('streaming').inviteToRoom(room, user);\n    },\n\n    requestHistory(room, options) {\n        return new Promise((resolve, reject) => {\n            if (!room.get('activated') && !room.get('oneToOneTarget')) {\n                return reject(new Error('room must be activated before you can request history'));\n            }\n\n            const historyOptions = {\n                jid: options.jid,\n                before: options.before,\n                after: options.after,\n                limit: options.limit || this.get('messagesPerHistoryRequest')\n            };\n            this.get('streaming.connection').getMessages(historyOptions, (err, messages) => {\n                if (err) {\n                    return reject(err);\n                }\n                if (options.history) {\n                    messages = this.markAsHistory(messages);\n                }\n                return resolve(this.loadUsersForHistory(messages));\n            });\n        });\n    },\n\n    markAsHistory(messages) {\n        var i, len, message;\n        for (i = 0, len = messages.length; i < len; i++) {\n            message = messages[i];\n            message.history = true;\n        }\n        return messages;\n    },\n\n    setRoomSubject(room, subject, callback) {\n        if ((subject != null ? subject.length : void 0) > 0) {\n            return this.get('streaming.connection').setRoomSubject(room.get('jid'), subject, callback);\n        }\n    },\n\n    setPresence(presence) {\n        return this.get('streaming.connection').setPresence(presence);\n    },\n\n    setOrganizationPresenceId(presenceId) {\n        return this.get('streaming.connection').setOrganizationPresenceId(presenceId);\n    },\n\n    setStatus(status) {\n        return this.get('streaming').setStatus(status, this.get('session.person'));\n    },\n\n    openRoom(jid) {\n        return this.oldOpenRoom(jid);\n    },\n\n    oldOpenRoom(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.changeActiveRoom(room);\n        });\n    },\n\n    /**\n       @desc Opens the video panel in the chat room with the given JID.\n       @param {string} jid\n       @returns {Promise}\n    */\n    async openChatRoomWithVideo(jid) {\n        this.get('application').openChatRoomWithVideo(jid);\n    },\n\n    /**\n       @desc Opens the video panel in the chat room for the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async openChatRoomWithVideoForPersonById(id) {\n        const person = await this.get('store').findRecord('person', id);\n        this.logger.info('opening chat room with video for', person);\n        return this.openChatRoomWithVideo(person.get('jid'));\n    },\n\n    async openChatRoomForPersonById() {},\n\n    loadChatRoom(jid) {\n        return this.getChatRoom(jid).then(room => this.changeActiveRoom(room));\n    },\n\n    /**\n     * Syncs the authenticated user's chat data.\n     * Goal is to sync roster sort order, fetch badges, and fetch recent messages.\n     */\n    async syncUserChatData() {\n        try {\n            // sync the roster order\n            await this.syncAllRoomsLastMessageTime();\n            // fetch all badges\n            const roster = this.get('roster');\n            await roster.getAllBadgeCounts();\n\n            // fetch recent messages\n            const activeRoom = this.get('activeRoom');\n\n            this.logger.debug('<services/chat> syncUserChatData loading room history for room: ', activeRoom);\n            await this.loadRoomHistory(activeRoom);\n        } catch (err) {\n            this.logger.error('<services/chat> syncUserChatData failed: ', err);\n        }\n    },\n\n    /**\n     * Fetch the active chats from Realtime\n     */\n    getActiveChatsFromRealtime() {\n        return new Promise((resolve, reject) => {\n            this.get('streaming.connection').getActiveChats((err, activeRooms) => {\n                if (err) {\n                    return reject(err);\n                }\n                resolve(activeRooms);\n            });\n        });\n    },\n\n    /**\n     * Use the active chats and sync the last message radix. If the user has their roster\n     * sort order as 'Most Recent', then this will sync their roster.\n     */\n\n    async syncAllRoomsLastMessageTime() {\n        const activeChatsFromRealtime = await this.getActiveChatsFromRealtime();\n        const jids = Object.keys(activeChatsFromRealtime);\n        for (let i = 0; i < jids.length; i++) {\n            const room = await this.getChatRoom(jids[i]);\n            const { last } = activeChatsFromRealtime[jids[i]];\n            if (last) {\n                const time = moment(last);\n                room.set('lastMessageTime', time);\n                room.set('lastMessageTimeRadix', time.valueOf());\n            }\n        }\n    },\n\n    checkActiveRoomAgainstHistory(room) {\n        var historyStack, jid, lastActiveRoom, mostRecent;\n        if (this.get('firstRoomChosen')) {\n            return;\n        }\n        jid = room.get('jid');\n        historyStack = this.get('roomHistoryStack');\n        lastActiveRoom = this.get('roomHistoryStack.lastObject');\n        mostRecent = this.get('mostRecentActiveRoom');\n        if (!isSupervisorJid(jid)) {\n            if (!!this.get('popoutRoom')) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(this.get('popoutRoom'));\n            } else if (jid === lastActiveRoom) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(room);\n            } else if (!mostRecent || (historyStack && historyStack.indexOf(jid) > historyStack.indexOf(mostRecent))) {\n                this.set('mostRecentActiveRoom', jid);\n                this.get('selectHighestAppearingActiveRoom').perform();\n            }\n        }\n    },\n\n    selectHighestAppearingActiveRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n\n        if (this.get('firstRoomChosen')) {\n            return;\n        }\n        this.set('firstRoomChosen', true);\n        return this.getChatRoom(this.get('mostRecentActiveRoom')).then(room => this.changeActiveRoom(room));\n    }).drop(),\n\n    clearRoomNotificationCounts(room) {\n        return this.get('roster').clearRoomNotificationCounts(room);\n    },\n\n    changeActiveRoom(newActive) {\n        var previousActiveRoom;\n        previousActiveRoom = this.get('activeRoom');\n        return this.attemptRoomChange(newActive).then(() => {\n            this.removeRoomFromHistoryStack(newActive);\n            this.addRoomToHistoryStack(newActive);\n            if (previousActiveRoom) {\n                this.clearRoomNotificationCounts(newActive);\n                this.clearRoomUnreadMessages(previousActiveRoom);\n                previousActiveRoom.pruneMessages();\n            }\n\n            if (this.get('allowUserRemoval') && !newActive.isOneToOneRoom() && !newActive.get('isAcdRoom')) {\n                return this.setRoomDetails(newActive.get('jid'));\n            }\n            return newActive;\n        });\n    },\n\n    closeRoomAndClearCounts(room) {\n        return this.clearRoomNotificationCounts(room)\n            .catch(err => {\n                this.logger.error('Failed to clear counts, closing room anyway', { err, jid: this.room.get('jid') });\n            })\n            .finally(() => this.closeActiveRoom(room));\n    },\n\n    closeActiveRoom(room) {\n        room.set('showingVideo', false);\n        room.updateClosedTimeRadix();\n\n        return this.deactivateRoom(room).then(() => this.get('streaming').setRoomInactive(room));\n    },\n\n    deactivateRoom(room) {\n        var replacementRoomJid, selectRoomPromise;\n        this.removeRoomFromHistoryStack(room);\n        if (room.get('jid') === this.get('activeRoom.jid')) {\n            replacementRoomJid = this.get('roomHistoryStack.lastObject');\n            selectRoomPromise = replacementRoomJid\n                ? this.getChatRoom(replacementRoomJid)\n                : this.get('roster').getNextRoomFromActiveSection();\n            return selectRoomPromise.then(selectedRoom => this.attemptRoomChange(selectedRoom));\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('chatNotificationVolume', deviceVolumes.chatNotificationVolume);\n        this.set('interactionNotificationVolume', deviceVolumes.interactionNotificationVolume);\n        // depending on who calls updateVolumes, skip server could be undefined\n        // in those moments, we shouldn't need to 'save' the preference\n    },\n\n    removeRoomFromHistoryStack(room) {\n        if (room) {\n            return this.get('roomHistoryStack').removeObject(room.get('jid'));\n        }\n    },\n\n    addRoomToHistoryStack(room) {\n        var jid, historyStack;\n        if (room) {\n            jid = room.get('jid');\n            historyStack = this.get('roomHistoryStack');\n            historyStack.removeObject(jid).pushObject(jid);\n            if (historyStack.length > 10) {\n                historyStack = historyStack.slice(historyStack.length - 10);\n            }\n            this.set('roomHistoryStack', historyStack);\n        }\n    },\n\n    attemptRoomChange(room) {\n        return new Promise(resolve => {\n            var activeRoom, activeRoomJid, newRoomJid, ref;\n            activeRoom = this.get('activeRoom');\n            activeRoomJid = this.get('activeRoom.jid');\n            newRoomJid = room != null ? room.get('jid') : void 0;\n            if (activeRoomJid && activeRoomJid !== newRoomJid) {\n                activeRoom.set('active', false);\n            }\n            this.set('activeRoom', room);\n            if (room) {\n                room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n                room.set('active', true);\n                this.activateRoom(room).then(function () {\n                    resolve(room);\n                });\n            } else {\n                resolve(room);\n            }\n        });\n    },\n\n    trackRoomChange(room) {\n        var activeRoom, activeRoomJid, newRoomJid, ref;\n        activeRoom = this.get('activeRoom');\n        activeRoomJid = this.get('activeRoom.jid');\n        newRoomJid = room != null ? room.get('jid') : void 0;\n        if (activeRoomJid && activeRoomJid !== newRoomJid) {\n            activeRoom.set('active', false);\n        }\n        this.set('activeRoom', room);\n        if (room) {\n            room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n            room.set('active', true);\n        }\n        return room;\n    },\n\n    refocusActiveRoom() {},\n\n    activateRoom() {},\n\n    focusRoom(room) {\n        return this.get('streaming.connection').setFocused(room.get('jid'));\n    },\n\n    loadRecentHistoryForAllActiveRooms() {\n        let rooms = this.get('rooms');\n        for (let id in rooms) {\n            if (Object.prototype.hasOwnProperty.call(rooms, id)) {\n                let room = rooms[id];\n                if (\n                    room &&\n                    typeof room.get === 'function' &&\n                    room.get('activated') &&\n                    room.get('lastMessageTimeRadix') > 0\n                ) {\n                    this.loadRecentRoomHistory(room);\n                }\n            }\n        }\n    },\n\n    loadRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            before: room.get('firstMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistoryAfter(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadContextualRoomHistory(room, date) {\n        var afterDate, hash;\n        room.set('loadingHistory', true);\n        afterDate = moment(date).subtract(1, 'ms').toDate();\n        hash = Ember.RSVP.hash({\n            beforePromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                before: date,\n                history: true\n            }),\n            afterPromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                after: afterDate,\n                history: true\n            })\n        });\n        hash.then(hash => {\n            var combinedMessages;\n            combinedMessages = hash.beforePromise.concat(hash.afterPromise.reverse());\n            return this._addHistoryMessages(room, combinedMessages);\n        });\n        hash.catch(function (error) {\n            return Ember.Logger.error('Error loading history for chat room', {\n                jid: room.get('jid'),\n                error\n            });\n        });\n        return hash.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    requestRoomHistory(room, options) {\n        return this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._updateRoomStatus(room, options, messages);\n        });\n    },\n\n    loadRoomHistoryWithOptions(room, options) {\n        room.set('loadingHistory', true);\n        let history = this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._processHistoryResults(room, options, messages);\n        });\n        history.catch(function (error) {\n            Ember.Logger.error('Error loading history for chat room', {\n                error,\n                jid: room.get('jid')\n            });\n            room.set('historyError', true);\n        });\n        return history.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    _processHistoryResults(room, options, messages) {\n        this._updateRoomStatus(room, options, messages);\n        return this._addHistoryMessages(room, messages);\n    },\n\n    _updateRoomStatus(room, options, messages) {\n        if (options.after) {\n            room.set('moreForwardHistoryAvailable', messages.length >= this.get('messagesPerHistoryRequest'));\n        } else {\n            room.set('moreHistoryAvailable', messages.length >= this.get('messagesPerHistoryRequest'));\n        }\n        return messages;\n    },\n\n    _addHistoryMessages(room, messages) {\n        room.addHistoryMessages(messages);\n        return room.get('messages');\n    },\n\n    loadRecentRoomHistory(room) {\n        var maxHistoryRequestSize, options;\n        room.set('loadingHistory', true);\n        maxHistoryRequestSize = this.get('maxHistoryRequestSize');\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            limit: maxHistoryRequestSize\n        };\n        return this.requestHistory(room, options).then(messages => {\n            var i, len, message;\n            if (messages == null) {\n                messages = [];\n            }\n            for (i = 0, len = messages.length; i < len; i++) {\n                message = messages[i];\n                room.addMessage(message);\n            }\n            if (messages.length === maxHistoryRequestSize) {\n                return this.loadRecentRoomHistory(room);\n            } else {\n                room.set('loadingHistory', false);\n                return room;\n            }\n        });\n    },\n\n    _resolveRealtimeDependentCalls: Ember.observer('connected', function () {\n        if (this.get('connected') && this.get('streamingConnectDeferred')) {\n            this.get('streamingConnectDeferred').resolve();\n            this.set('streamingConnectDeferred', null);\n        }\n    }),\n\n    /**\n     * Uses Realtime Chat API to get room details and pass to room model.\n     * @param {string} jid room jid\n     * @returns\n     */\n    setRoomDetails(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.get('ajax')\n                .ajaxGet(this.get('application').pcV2Uri(`api/v2/chats/rooms/${jid}`))\n                .then(details => {\n                    room.processRoomDetails(details);\n                    return room;\n                })\n                .catch(err => {\n                    Ember.Logger.error('service/chat setRoomDetails: ', {\n                        error: err\n                    });\n                    return room;\n                });\n        });\n    },\n\n    async deleteParticipantFromChatRoom(room, participant) {\n        try {\n            await this.get('ajax').delete(\n                this.get('application').pcV2Uri(`api/v2/chats/rooms/${room.jid}/participants/${participant.id}`)\n            );\n            this.removeParticipantFromRoom(room, participant);\n        } catch (err) {\n            throw err;\n        }\n    },\n\n    getStreamingRoomInfo(roomJid) {\n        const getRoomInfo = () => {\n            return new Promise((resolve, reject) => {\n                return this.get('streaming.connection').getRoomInfo(roomJid, function (err, description) {\n                    if (err) {\n                        return reject(err);\n                    } else {\n                        return resolve(description);\n                    }\n                });\n            });\n        };\n\n        const deferred = this.get('streamingConnectDeferred');\n\n        if (deferred) {\n            return deferred.promise.then(getRoomInfo);\n        } else {\n            return getRoomInfo();\n        }\n    },\n\n    updateRoomSubject(room, subject) {\n        return room.set('rawSubject', subject);\n    },\n\n    getTargetRoomJid(arg) {\n        let { to, from } = arg;\n        if (isRoomJid(to)) {\n            return to;\n        } else if (compareJids(to, this.get('session.person.jid'))) {\n            return from;\n        } else {\n            return to;\n        }\n    },\n\n    addParticipantToRoom(room, person) {\n        if (room && person) {\n            return room.addParticipant(person);\n        }\n    },\n\n    removeParticipantFromRoom(room, person) {\n        if (room && person) {\n            return room.removeParticipant(person);\n        }\n    },\n\n    loadRoomAndUser(roomJid, userJid) {\n        return Ember.RSVP.hash({\n            room: this.getChatRoom(roomJid),\n            person: this.get('batchDataRequests').getChatUser(userJid)\n        });\n    },\n\n    loadUsersForHistory(historyMessages) {\n        var message;\n        if (_.isEmpty(historyMessages)) {\n            return Ember.RSVP.resolve(historyMessages);\n        }\n        return Ember.RSVP.all(\n            function () {\n                var i, len, results;\n                results = [];\n                for (i = 0, len = historyMessages.length; i < len; i++) {\n                    message = historyMessages[i];\n                    results.push(this.processNewChatMessage(message));\n                }\n                return results;\n            }.call(this)\n        );\n    },\n\n    processNewChatMessage(message) {\n        const owner = Ember.getOwner(this);\n        let messageBody = this.parseMessageBody(message);\n\n        delete message.body;\n\n        Ember.setOwner(message, owner);\n        let messageModel = ChatMessage.create(message);\n\n        this.parseWidgetData(messageModel);\n\n        messageModel.set('messageBody', messageBody);\n        messageModel.set('time', moment(message.time));\n\n        this.checkForMentions(messageModel);\n\n        return this.get('batchDataRequests')\n            .getChatUser(message.from)\n            .then(person => {\n                messageModel.set('chatUser', person);\n                this.setMessageReadState(messageModel);\n                return messageModel;\n            });\n    },\n\n    parseWidgetData(message) {\n        message.get('stanza.children').forEach(child => {\n            if (this.widgets.indexOf(child.name) >= 0) {\n                let data;\n\n                try {\n                    if (child.name === 'videoNotification' && child.children.length == 0) {\n                        data = child.attrs;\n                    } else {\n                        data = JSON.parse(child.children[0]);\n                    }\n                } catch (e) {\n                    Ember.Logger.error('Error parsing chat widget data', {\n                        name: child.name,\n                        child: child.children[0],\n                        error: e\n                    });\n                    return;\n                }\n\n                message.set('widgetType', child.name);\n                message.set('widget', Ember.Object.create({ data }));\n            }\n        });\n    },\n\n    parseMessageBody(message) {\n        var body, raw;\n        raw = message.raw;\n        body = message.body;\n        if (raw) {\n            return markdownToHtml(raw);\n        } else {\n            return body;\n        }\n    },\n\n    checkForMentions(message) {\n        /* eslint-disable */\n        var match, mention, mentionRegex, mentions, oid, raw;\n        mentions = [];\n        mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        raw = message.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            mention = match[0];\n            oid = match[1];\n            mentions.push(\n                Ember.Object.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        message.set('mentions', mentions);\n        return message.set('hasMentionLinks', mentions.length > 0);\n        /* eslint-enable */\n    },\n\n    setMessageReadState(message) {\n        var roomIsVisible, windowFocused;\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid')) || message.get('history')) {\n            return message.set('unread', false);\n        } else {\n            windowFocused = this.windowInFocus();\n            return message.set('unread', !roomIsVisible || !windowFocused);\n        }\n    },\n\n    isActiveRoom(room) {\n        return this.isActiveRoomJid(Ember.get(room, 'jid'));\n    },\n\n    isActiveRoomJid(jid) {\n        return jid && this.get('activeRoom.jid') === jid;\n    },\n\n    isRoomVisible() {\n        return false;\n    },\n\n    isChatVisible() {\n        return false;\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return !this.get('application.browserHidden');\n        }\n    },\n\n    async popoutChatRoom() {\n        // no op for now\n    },\n\n    handleXMPPReferenceMention(message) {\n        const {\n            stanza: { children },\n            from,\n            to\n        } = message;\n        const personJid = this.get('session.person.jid');\n        const referenceChildren = _.filter(children, {\n            name: 'reference',\n            attrs: {\n                uri: personJid,\n                action: 'SUCCEEDED'\n            }\n        });\n\n        referenceChildren.forEach(() => {\n            this.handleMentionEvent(from, to, message);\n        });\n    },\n\n    async handleMentionEvent(from, room, message) {\n        const user = await this.get('batchDataRequests').getChatUser(from);\n        const chatRoom = await this.getChatRoom(room);\n\n        this.sendMentionNotification(chatRoom, user, message);\n    },\n\n    handleCollaborateChatMessage(message) {\n        const children = message.stanza.children;\n        const isMention = children.findBy('name', 'reference') !== undefined;\n        if (isMention) {\n            this.handleXMPPReferenceMention(message);\n        }\n        const roomJid = this.getTargetRoomJid(message);\n        this.getChatRoom(roomJid).then(room => {\n            this.processNewChatMessage(message).then(async messageModel => {\n                messageModel.set('room', room);\n                if (room.isOneToOneRoom()) {\n                    // this.savePersonalChats(messageModel, room);\n                } else {\n                    // this.savePersonalMentions(messageModel);\n                    // this.saveRoomChats(messageModel, room);\n                    this.get('roster').incrementUnreadGroupMessage(messageModel, room);\n                }\n\n                if (this.get('permissions.canViewBusinessChat')) {\n                    this.sendNotification(messageModel);\n                }\n            });\n        });\n    }\n});\n","define(\"connections-ui/services/clock\", [\"exports\", \"ember-purecloud-components/services/clock\"], function (_exports, _clock) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clock.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport _ from 'lodash';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport moment from 'connections-ui/utils/dates';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport UriBuilder from '../mixins/conversation-uri-builder';\nimport participantStatus from '../utils/acdParticipantStatuses';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { inject, Evented } = Ember;\nconst { Promise } = Ember.RSVP;\nconst INTERACTION_TYPE = {\n    call: 'calls',\n    chat: 'chats',\n    email: 'emails',\n    callback: 'callbacks',\n    message: 'messages'\n};\n\nexport default Ember.Service.extend(UriBuilder, LoggerMixin, ConversationMixin, Evented, {\n    // Note:\n    //\n    // Most of this was ported from the design pattern we had in Engage.\n    // We'll need to re-evaluate its usage here to determine if this is\n    // still something we want to do or if its a little heavy-handed since\n    // we're not abstracting this logic from all interaction types like\n    // we previously were.\n\n    application: inject.service(),\n    session: inject.service(),\n    store: inject.service(),\n    addressformat: inject.service(),\n    ajax: inject.service(),\n    phone: inject.service(),\n\n    validationWaitTime: isTesting ? 0 : 15000,\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('_timers').forEach(item => Ember.run.cancel(item));\n    },\n\n    getAllActiveConversations() {\n        const url = this.baseUri();\n        return this.makeRequest(url, {}, 'get').then(response => response.entities);\n    },\n\n    getAllActive(communicationType) {\n        const url = this.baseUri();\n        const options = { data: { communicationType } };\n        return this.makeRequest(url, options, 'get').then(response => response.entities);\n    },\n\n    /**\n     * Places a call on the participantForCurrentUser for the given interaction.\n     * @param {Interaction} interaction - the interaction to add a call to\n     * @param {string} number - the number to dial\n     * @param {string} phoneColumn - for a dialer preview/scheduled callback, the phone column associated with the number\n     */\n    addCall(interaction, number, phoneColumn) {\n        const id = interaction.get('id');\n        const url = this.callsUri(id);\n        const options = { data: { callNumber: number, phoneColumn: phoneColumn } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    /**\n     * Schedules a callback for an existing conversation.\n     *\n     * @param {Interaction} interaction - the interaction to schedule a callback for\n     * @param {object} data -\n     *              {array} callbackNumbers - the numbers for the callback\n     *              {string} callbackScheduledTime - ISO8601 string for when to send the callback\n     *                  {object} routingData -\n     *                  {array} preferredAgents - list of preferred agent ids\n     */\n    scheduleCallback(interaction, data) {\n        const customer = interaction.get('participantForCustomer');\n        let queueId = interaction.get('participantForCurrentUser.queueId') || customer.queueId;\n        const callbackUserName = customer.name ? customer.name.toString() : null;\n        const countryCode = this.get('addressformat.countryCode');\n        const id = interaction.get('id');\n\n        if (data && data.routingData) {\n            if (!data.routingData.queueId) {\n                Object.assign(data.routingData, { queueId: queueId });\n            } else {\n                queueId = data.routingData.queueId;\n            }\n        }\n\n        const uri = this.scheduleCallbackUri(id, customer.id);\n        const postData = Object.assign(\n            {},\n            {\n                callbackUserName: callbackUserName,\n                countryCode: countryCode,\n                queueId: queueId\n            },\n            data\n        );\n        const options = { data: postData };\n\n        return this.makeRequest(uri, options, 'post');\n    },\n\n    answer(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interaction.id, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { state: participantStatus.CONNECTED } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', participantStatus.CONNECTED);\n        });\n    },\n\n    disconnectParticipant(interactionId, participantId, mediaType) {\n        const url = this.participantUri(interactionId, participantId, INTERACTION_TYPE[mediaType]);\n        const options = { data: { state: participantStatus.DISCONNECTED } };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    hold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: true } };\n\n        if (!Ember.get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to hold non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', true);\n        });\n    },\n\n    unhold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: false } };\n\n        if (!Ember.get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to set hold state for non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', false);\n        });\n    },\n\n    pause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'PAUSED' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', true);\n            }\n        });\n    },\n\n    unpause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'ACTIVE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', false);\n            }\n        });\n    },\n\n    requestAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: true } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    skipAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: false } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    disconnect(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        let options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        //\n        // Note We only want to apply communicationWrapupSkipped to callbacks not within campains. We do this\n        // to prevent wrapup showing now where it did not use to show before.\n        //\n        const isDialerCampaign = Ember.get(interaction, 'isCampaignCallback');\n        const isSkippingPreviewCampaign =\n            isDialerCampaign && Ember.get(interaction, 'selectedWrapupCode.id') === 'ININ-OUTBOUND-PREVIEW-SKIPPED';\n        const hasPlacedCallsInCallback =\n            typeof Ember.get(interaction, 'participantForCurrentUser.calls.firstObject') === 'object';\n        if (\n            Ember.get(interaction, 'useCommunicationACW') &&\n            Ember.get(interaction, 'isCallback') &&\n            hasPlacedCallsInCallback &&\n            !isSkippingPreviewCampaign\n        ) {\n            options.data.communicationWrapupSkipped = true;\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', [\n                undefined,\n                participantStatus.DISCONNECTED\n            ]);\n        });\n    },\n\n    park(interaction) {\n        // PATCH /api/v2/conversations/emails/{id}/participants/{id} + state\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { state: participantStatus.PARKED } };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    disconnectCall(interaction) {\n        const conversation = this.get('phone.conversations').findBy('id', interaction.get('id'));\n        if (conversation) {\n            this.trigger('endCall', conversation);\n        }\n    },\n\n    getWrapUpCodes(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const url = this.participantWrapupCodesUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getProvisionalACWNotes(interaction, participantId) {\n        const userId = participantId ? participantId : interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const communicationId = interaction.get('communicationMedia.id');\n        const options = {\n            type: 'GET',\n            data: { provisional: 'true' }\n        };\n        let url = this.participantWrapupUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n\n        if (Ember.get(interaction, 'useCommunicationACW')) {\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n        }\n\n        return this.makeRequest(url, options, 'raw');\n    },\n\n    loadParticipantPerson(userId) {\n        if (userId) {\n            if (this.get('store').hasRecordForId('person', userId)) {\n                return Promise.resolve(this.get('store').peekRecord('person', userId));\n            }\n            return this.get('store')\n                .findRecord('person', userId)\n                .catch(error => {\n                    this.logger.error('Unable to retrieve person for participant', { userId, error });\n                    return Promise.resolve();\n                });\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    /**\n     * Fetches the notes based on the participant and their corresponding wrap up object within a\n     * specified interaction. If the notes are within the data already then it prevents the need to\n     * fetch the participants current provisional notes.\n     * @param interaction The currently active interaction\n     * @param {{ wrapup }} param1 Any data object that could contain the wrapup information\n     * @param participantId The id of the participant that the notes are coming from\n     * @returns A promise that resolves to a data object containing wrap up and note information\n     */\n    getParticipantNotes(interaction, { wrapup }, participantId) {\n        if (wrapup) {\n            return Promise.resolve(wrapup);\n        } else {\n            return this.getProvisionalACWNotes(interaction, participantId);\n        }\n    },\n\n    /**\n     * Iterates through all of the historical notes in an interaction and fetches additional information needed\n     * to populate the historical notes timeline. Based on the `useCommunicationACW` model function in an interaction,\n     * it determines where we are pulling the notes from.\n     * @param interaction The currently active interaction\n     * @returns An array of promises to fetch the notes of the interaction\n     */\n    getAllHistoricalACWNotes(interaction) {\n        const currentParticipantId = interaction.get('participantForCurrentUser.id');\n        let promiseArray = [];\n\n        interaction.participants.forEach(participant => {\n            const participantId = participant.id;\n            const userId = participant.userId;\n\n            if (participantId && userId) {\n                if (Ember.get(interaction, 'useCommunicationACW')) {\n                    const media = [...(participant[interaction.type] || participant[`${interaction.type}s`] || [])];\n\n                    //An agent receiving a callback should be able to read notes from all previous calls and callbacks\n                    //So callback interactions need to include data from previous calls (aka participant['calls']), and vice versa\n                    if (interaction.type === 'callback') {\n                        media.push(...(participant['calls'] || []));\n                    }\n\n                    if (interaction.type === 'call') {\n                        media.push(...(participant['callbacks'] || []));\n                    }\n\n                    if (!!media.length) {\n                        /**\n                         * For this implementation we are no longer fetching the other agents provisional notes\n                         * and adding them to the historical timeline. That is why this iteration is not using the\n                         * `getParticipantNotes` function like it is below. We do not need to check if the `purpose`\n                         * value on the participant is equal to `agent` since media items only show up on a\n                         * participants that can add notes and wrap up. In short, this will allow any participant to add\n                         * notes to the timeline if we ever decide to support that elsewhere.\n                         */\n                        promiseArray.push(\n                            ...media\n                                // This filter prevents empty promises and ensures that the array will not have duplicate messages\n                                .filter((data, index, array) => {\n                                    return (\n                                        !!data.wrapup &&\n                                        index ===\n                                            array.findIndex(\n                                                element =>\n                                                    !!element.wrapup &&\n                                                    element.wrapup.endTime === data.wrapup.endTime &&\n                                                    element.wrapup.notes === data.wrapup.notes\n                                            )\n                                    );\n                                })\n                                .map(async data => {\n                                    const { wrapup } = data;\n                                    const person = await this.loadParticipantPerson(userId);\n                                    if (person) {\n                                        wrapup.person = person;\n                                    }\n                                    return wrapup;\n                                })\n                        );\n                    }\n                } else if (\n                    /**\n                     * If the participant object has a `wrapup` object on it then allow it to pass through regardless no matter what the purpose\n                     * of the participant is. However, if there is not a `wrapup` object then we check the `id`'s to prevent the return of the\n                     * current users own provisional notes, and we only want to try and fetch the provisional notes if the purpose is of `agent`.\n                     * This implementation allows the fetching of other agents provisional notes. In contrast, the implementation above does NOT.\n                     * This is intentional and we will want to move to the implementation above eventually.\n                     */\n                    participant.wrapup ||\n                    (currentParticipantId !== participantId && participant.purpose !== 'agent')\n                ) {\n                    promiseArray.push(\n                        this.getParticipantNotes(interaction, participant, participantId).then(async response => {\n                            const result = response.payload || response;\n                            const person = await this.loadParticipantPerson(userId);\n                            if (person) {\n                                result.person = person;\n                            }\n                            return result;\n                        })\n                    );\n                }\n            }\n        });\n\n        return Promise.all(promiseArray);\n    },\n\n    saveProvisionalACW(interaction, { notes, wrapup }) {\n        if (!interaction) {\n            return Ember.RSVP.Promise.reject('No interaction provided.');\n        }\n\n        if (!notes && !wrapup) {\n            return Ember.RSVP.Promise.reject('Nothing to save to provisional ACW');\n        }\n\n        const interactionId = Ember.get(interaction, 'id');\n        const userId = Ember.get(interaction, 'participantForCurrentUser.id');\n        const mediaType = Ember.get(interaction, 'type');\n        const communicationId = Ember.get(interaction, 'communicationMedia.id');\n        const code = wrapup ? wrapup.id : Ember.get(interaction, 'selectedWrapupCode.id');\n        const name = wrapup ? wrapup.name : Ember.get(interaction, 'selectedWrapupCode.name');\n        notes = notes || Ember.get(interaction, 'notes');\n\n        let method = 'patch';\n        let url = this.participantUri(interactionId, userId, INTERACTION_TYPE[mediaType]);\n        let payload = {\n            wrapup: { provisional: true }\n        };\n\n        if (code && name) {\n            payload.wrapup.code = code;\n            payload.wrapup.name = name;\n        }\n\n        if (notes) {\n            payload.wrapup.notes = notes;\n        }\n\n        if (Ember.get(interaction, 'useCommunicationACW')) {\n            method = 'post';\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n            payload = payload.wrapup;\n        }\n\n        const options = { data: payload };\n        return this.makeRequest(url, options, method);\n    },\n\n    /**\n     * Start a monitor on a participant in a conversation\n     */\n    monitor(callId, participantId) {\n        const url = this.monitorUri(callId, participantId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    transfer(interaction, options, query, entityType = '') {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const interactionType = !this.get('session.features.acdTransferPermissions')\n            ? INTERACTION_TYPE[interaction.get('type')]\n            : null;\n        const url = this.replaceUri(interactionId, userId, null, interactionType, entityType);\n        const transferType = query.transferType || 'Unattended';\n\n        options = options || {};\n        options.data = query;\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this.trigger('callTransferred', interaction);\n\n            if (transferType === 'Attended') {\n                return this.validateActionSucceeded(interaction, 'isAttendedTransferring', true);\n            } else {\n                return this.validateActionSucceeded(interaction, 'interactionState', [\n                    participantStatus.DISCONNECTED,\n                    participantStatus.TERMINATED\n                ]);\n            }\n        });\n    },\n\n    cancelTransfer(interaction, participant) {\n        const interactionId = interaction.get('id');\n        const interactionType = INTERACTION_TYPE[interaction.get('type')];\n        const communicationId = participant[interactionType].get('firstObject.id');\n\n        return this.makeRequest(\n            this.communicationsUri(interactionId, participant.id, interactionType, communicationId),\n            { data: { state: 'disconnected' } },\n            'patch'\n        )\n            .then(() => this.validateActionSucceeded(interaction, 'wasTransferCanceled', true))\n            .catch(error => {\n                this.get('logger').error('There was an issue canceling the transfer', error);\n            });\n    },\n\n    // Once we move interactions to use Ember data, we'll extract this into a stand alone utility.\n    // (https://inindca.atlassian.net/browse/UI-2200)\n    validateActionSucceeded(interaction, attributeToMonitor, expectedValue) {\n        const logger = this.logger;\n        const ajax = this.get('ajax');\n        const userId = this.get('session.person.guid');\n\n        logger.debug('ACD: validateActionSucceeded: Validating interaction', interaction);\n\n        return new Promise((resolve, reject) => {\n            const requestUri = this.baseUri();\n            const communicationType = interaction.get('type');\n            const data = { communicationType };\n            const VALIDATION_INTERVAL = this.get('validationWaitTime');\n\n            const VALIDATION_TIMEOUT = Ember.run.later(function () {\n                return verifyViaAjax();\n            }, VALIDATION_INTERVAL);\n            this.get('_timers').push(VALIDATION_TIMEOUT);\n\n            if (!interaction) {\n                return valResolve();\n            }\n\n            checkForSuccessUpdate();\n            createObserver();\n\n            function valResolve() {\n                destroyObserver();\n                return resolve();\n            }\n\n            function valReject() {\n                destroyObserver();\n                return reject();\n            }\n\n            function createObserver() {\n                logger.debug(`ACD: validateActionSucceeded: Observer created on ${attributeToMonitor}`);\n                interaction.addObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function destroyObserver() {\n                logger.debug(`ACD: validateActionSucceeded: Observer destroyed on ${attributeToMonitor}`);\n                interaction.removeObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function checkForSuccessUpdate() {\n                if (actionHasSucceeded()) {\n                    Ember.run.cancel(VALIDATION_TIMEOUT);\n                    return valResolve();\n                }\n            }\n\n            /**\n             * Formats the expected value to an array with all string expectations lowercase.\n             * @param {string|boolean|undefined|string[]} expectedValue\n             *          The expected value(s)\n             * @returns {[]} An array containing the expected value(s). All strings are lowercased, booleans and 'undefined' are unchanged.\n             */\n            function formatExpectedValue(expectedValue) {\n                if (Array.isArray(expectedValue)) {\n                    let lowercaseValues = _.chain(expectedValue)\n                        .filter(value => typeof value === 'string')\n                        .map(value => value.toLowerCase())\n                        .value();\n                    if (_.includes(expectedValue, undefined)) {\n                        lowercaseValues.push(undefined);\n                    }\n                    return lowercaseValues;\n                } else if (typeof expectedValue === 'string') {\n                    return [expectedValue.toLowerCase()];\n                } else if (typeof expectedValue === 'boolean') {\n                    return [expectedValue];\n                } else if (expectedValue === undefined) {\n                    return [expectedValue];\n                }\n                return [];\n            }\n\n            function actionHasSucceeded() {\n                let formattedExpectedValues = formatExpectedValue(expectedValue);\n\n                let currentValue = interaction.get(`${attributeToMonitor}`);\n                if (typeof currentValue === 'string') {\n                    currentValue = currentValue.toLowerCase();\n                }\n\n                const actionSucceeded = _.includes(formattedExpectedValues, currentValue);\n\n                if (actionSucceeded) {\n                    logger.debug('ACD: validateActionSucceeded: action succeeded for attr ', attributeToMonitor);\n                    return true;\n                }\n\n                return false;\n            }\n\n            function verifyViaAjax() {\n                return timeoutPromise(\n                    new Promise((resolve, reject) => {\n                        logger.debug('ACD: validateActionSucceeded: Will verify via ajax', attributeToMonitor);\n                        return ajax\n                            .ajaxGet(requestUri, { data })\n                            .then(interactions => {\n                                if (interaction && (interaction.isDestroyed || interaction.isDestroying)) {\n                                    logger.debug(\n                                        'ACD: validateActionSucceeded: interaction destroyed while verifying.'\n                                    );\n                                    return resolve();\n                                }\n\n                                let newInteraction = _.find(interactions.entities, { id: interaction.get('id') });\n\n                                if (interaction && newInteraction) {\n                                    interaction.setProperties(newInteraction);\n                                    if (Ember.get(interaction, 'conversation')) {\n                                        interaction.get('conversation').setProperties(newInteraction);\n                                    }\n                                }\n\n                                if (actionHasSucceeded()) {\n                                    return resolve();\n                                }\n\n                                logger.info('Conversation attribute resolved, but never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n\n                                reject('Attribute never updated.');\n                            })\n                            .catch(err => {\n                                logger.error('Conversation attribute never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    error: err,\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n                                reject(err);\n                            });\n                    }),\n                    VALIDATION_INTERVAL,\n                    'communication#verifyViaAjax'\n                )\n                    .then(function () {\n                        return valResolve();\n                    })\n                    .catch(function (err) {\n                        return valReject(err);\n                    });\n            }\n        });\n    },\n\n    /** Begins a consult transfer interaction for the provided participant\n     * with a given address.\n     * @param {string} interaction the model for the call\n     * @param {Object} destination the destination participant to consult with\n     * @param {string} entityType the type of entity participant is consulting with | Values queue, person, ''\n     */\n    initiateConsult(interaction, destination, entityType = '') {\n        const customerId = interaction.get('participantForCustomer.id');\n        const interactionId = interaction.get('id');\n        let data = {\n            speakTo: 'DESTINATION',\n            destination: destination\n        };\n        if (this.get('session.features.acdTransferPermissions') && typeof destination === 'object' && entityType) {\n            data = destination;\n        }\n        const options = { data };\n        const url = this.consultUri(interactionId, customerId, INTERACTION_TYPE[interaction.get('type')], entityType);\n\n        return !customerId\n            ? Ember.RSVP.reject(new Error('customer not present'))\n            : this.makeRequest(url, options, 'post');\n    },\n\n    /** Updates a consult transfer interaction to speak to both consulting parties\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultBoth(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'BOTH' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to Conference\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultConference(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'CONFERENCE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to the destination consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultDestination(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'DESTINATION' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', true),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /**\n     * Updates a consult transfer interaction to speak to the object (customer) consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultObject(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'OBJECT' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', true)\n            ]);\n        });\n    },\n\n    /**\n     * Cancels a consult transfer interaction\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    cancelConsult(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    /**\n     * Initiates a shared session (screen share, co-browse, video)\n     *\n     * NOTE: This request does not require the mediaType in URL.  This\n     * is essentially the same URL pattern as v1.\n     *\n     * @param {object} interaction object\n     * @param {object} customer participant\n     */\n    initiateSessionShare(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const mediaType = 'screenshare';\n        const sessionCodeUrl = this.sessionShareCodeUri(interactionId, customerId);\n        const options = { data: { mediaType } };\n\n        if (interaction.get('isV2Provider')) {\n            return this.makeRequest(sessionCodeUrl, options, 'post').then(res => {\n                if (!res.sourceCommunicationId || !res.addCommunicationCode) {\n                    return Ember.RSVP.reject(new Error('No session share code.'));\n                }\n\n                const types = [];\n                if (interaction.get('canCobrowse')) {\n                    types.push('cobrowse');\n                }\n                if (interaction.get('canScreenShare')) {\n                    types.push('screenshare');\n                }\n\n                const url = this.mediaRequestUri(interactionId, 'chats');\n                const toId = interaction.get('participantForCustomer.chats.firstObject.id');\n                const fromId = interaction.get('participantForCurrentUser.chats.firstObject.id');\n                const mediaRequestOptions = {\n                    data: {\n                        types,\n                        state: 'PENDING',\n                        toCommunicationId: toId,\n                        fromCommunicationId: fromId,\n                        communicationId: res.sourceCommunicationId,\n                        securityKey: res.addCommunicationCode\n                    }\n                };\n                return Ember.RSVP.all([Ember.RSVP.resolve(res), this.makeRequest(url, mediaRequestOptions, 'post')]);\n            });\n        }\n\n        return Ember.RSVP.all([this.makeRequest(sessionCodeUrl, options, 'post')]);\n    },\n\n    /**\n     * Ends a shared session (screen share, co-browse, video)\n     * @param {object} interaction object\n     */\n    expireSessionShareCode(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const securityKey = interaction.get('sessionShareCode');\n        const url = this.expireSessionShareCodeUri(interactionId, customerId, securityKey);\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    disconnectMediaType(interaction, mediaType, mediaId) {\n        const userId = Ember.get(interaction, 'participantForCurrentUser.id');\n        const interactionId = Ember.get(interaction, 'id');\n        const url = this.disconnectMediaTypeUri(interactionId, mediaId, userId, mediaType);\n        const options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'sessionShareState', 'disconnected');\n        });\n    },\n\n    createEmail: function (queueId, email, externalContactId) {\n        const url = '/platform/api/v2/conversations/emails';\n        const options = {\n            data: {\n                direction: 'OUTBOUND',\n                queueId: queueId,\n                toAddress: email\n            },\n            headers: {\n                'Content-Type': 'application/json'\n            },\n            method: 'post'\n        };\n        if (externalContactId) {\n            options.data.externalContactId = externalContactId;\n        }\n        return this.makeRequest(url, options);\n    },\n\n    /**\n     * Initializes the draft to be ready for use in editor.\n     * @param {string} emailId: id of conversation\n     * @param {object} options: object containing draft options\n     * @param {object} query: endpoint query paramaters\n     * @returns promise\n     */\n    initializeDraft(emailId, options, query) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    /**\n     * Discards the draft to be ready for initializing once more.\n     * @param {string} emailId: id of conversation\n     * @param {object} query: enpoint query paramaters\n     * @returns promise\n     */\n    discardDraft(emailId, options, query = { autoFill: false, discard: true }) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    loadSMSHistory: function (interactionId) {\n        const url = this.smsHistoryUri(interactionId);\n        return this.makeRequest(url, {}, 'get').then(response => {\n            let messageIds = [];\n            _.each(response.participants, participant => {\n                _.each(participant.messages, message => {\n                    _.each(message.messages, msg => {\n                        messageIds.push(msg.messageId);\n                    });\n                });\n            });\n            return _.uniq(messageIds);\n        });\n    },\n\n    sendSMSMessage: function (interactionId, communicationId, message) {\n        const url = this.sendSMSMessageUri(interactionId, communicationId);\n        const timestamp = moment().utc().format();\n        const options = {\n            data: {\n                direction: 'outbound',\n                timestamp: timestamp\n            },\n            method: 'post'\n        };\n        if (this.get('session.features.acdNormalizedMessages')) {\n            if (\n                message.normalizedMessage &&\n                message.normalizedMessage.content &&\n                message.normalizedMessage.content.length > 0 &&\n                message.normalizedMessage.content[0].attachment\n            ) {\n                if (message.normalizedMessage.content[0].attachment.mime === 'image/vnd.genesys.sticker')\n                    options.data.stickerIds = [message.normalizedMessage.content[0].attachment.id];\n                else options.data.mediaIds = [message.normalizedMessage.content[0].attachment.id];\n            } else if (message.messagingTemplate) {\n                options.data.messagingTemplate = message.messagingTemplate;\n            } else {\n                options.data.textBody = message.normalizedMessage.text;\n            }\n        } else {\n            if (message.media && message.media.length > 0 && message.attachmentId) {\n                options.data.mediaIds = [message.attachmentId];\n            } else if (message.stickers && message.stickers.length > 0) {\n                options.data.stickerIds = [message.stickers[0].id];\n            } else if (message.messagingTemplate) {\n                options.data.messagingTemplate = message.messagingTemplate;\n            } else {\n                options.data.textBody = message.textBody;\n            }\n        }\n        return this.makeRequest(url, options);\n    },\n\n    createMediaAttachment: function (interactionId, communicationId) {\n        const url = this.createMediaAttachmentUri(interactionId, communicationId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    createMessage: function (options, useExistingConversation) {\n        const url = this.createCommunicationUri('messages');\n        const isExternalContact = Ember.get(options, 'entity.entity.type') === 'externalcontacts/contact';\n        const requestOptions = {\n            data: {\n                queueId: options.queueId,\n                toAddress: options.entity.value,\n                useExistingConversation,\n                toAddressMessengerType: options.toAddressMessengerType,\n                useUserFromAddress: options.useUserFromAddress,\n                externalContactId: isExternalContact ? options.entity.id : null\n            }\n        };\n        return this.makeRequest(url, requestOptions, 'post');\n    },\n\n    getMediaAttachment: function (interactionId, communicationId, mediaId) {\n        const url = this.getMediaAttachmentUri(interactionId, communicationId, mediaId);\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getSMSDetails: function (interactionId, smsIds) {\n        if (_.isEmpty(smsIds)) {\n            return Promise.resolve([]);\n        }\n        const url = this.smsMessageBatchUri(interactionId);\n        const options = {\n            data: smsIds\n        };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    getMessageSupportedContent: function (interaction) {\n        const subMessageType = interaction.get('subMessageType');\n        if (subMessageType) {\n            const integrationId = interaction.get(\n                'participantForCustomer.messages.firstObject.toAddress.addressNormalized'\n            );\n            const deploymentId = interaction.get('participantForCustomer.messages.firstObject.toAddress.addressRaw');\n            if (integrationId && subMessageType !== 'webmessaging') {\n                const integrationUri = this.getSupportedContentUri(subMessageType, integrationId);\n                return this.makeRequest(integrationUri, {}, 'get');\n            } else if (deploymentId) {\n                return this.getDeploymentConfig(deploymentId, true);\n            }\n        }\n\n        return Ember.RSVP.reject(\n            new Error('Missing integration Id or sub message type from interaction ', Ember.get(interaction, 'id'))\n        );\n    },\n\n    getDeploymentConfig(deploymentId, getSupportedContent = false) {\n        if (deploymentId) {\n            const deploymentConfigUri = this.getDeploymentConfigUri(deploymentId, getSupportedContent);\n            return this.makeRequest(deploymentConfigUri, {}, 'get');\n        }\n        return Ember.RSVP.reject(new Error('Missing deployment Id', deploymentId));\n    },\n\n    getMessagingSettings(subMessageType, integrationId) {\n        if (integrationId && subMessageType) {\n            const integrationIdConfigUri = this.getIntegrationConfigUri(subMessageType, integrationId);\n            return this.makeRequest(integrationIdConfigUri, {}, 'get');\n        }\n        return Ember.RSVP.reject(new Error(`Missing integration Id: ${integrationId} or subtype: ${subMessageType}`));\n    },\n\n    createConversationSummaryFeedback(conversationId, summaryId, data) {\n        if (conversationId && summaryId) {\n            const url = this.getConversationSummaryFeedbackUri(conversationId, summaryId);\n            const options = data ? { data } : {};\n            return this.makeRequest(url, options, 'post');\n        }\n        return Ember.RSVP.reject(new Error(`Missing conversation Id: ${conversationId} or summary Id: ${summaryId}`));\n    }\n});\n","define(\"connections-ui/services/conversation\", [\"exports\", \"ember-purecloud-components/services/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import CookiesService from 'ember-cookies/services/cookies';\n\nexport default CookiesService;\n","import { observer } from '@ember/object';\nimport Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, inject, computed, Evented } = Ember;\n\nconst notificationTag = 'device-list-updated';\n\nfunction arrayComparerByDeviceId(otherArray) {\n    return current => {\n        const itemInOtherArray =\n            otherArray.filter(other => {\n                return other.deviceId === current.deviceId;\n            }).length === 0;\n\n        return itemInOtherArray;\n    };\n}\n\nfunction diffListsByDeviceId(existingList, newList) {\n    const itemsRemoved = (existingList || []).filter(arrayComparerByDeviceId(newList));\n    const itemsAdded = newList.filter(arrayComparerByDeviceId(existingList || []));\n\n    return { added: itemsAdded, removed: itemsRemoved };\n}\n\nfunction sanitizeDeviceLabel(deviceLabel) {\n    const idRegex = /(.*)\\s?\\(.*/;\n    const defaultTextRegex = /^(.*\\s-\\s)/;\n\n    // Remove the trailing numbers\n    let sanitizedLabel = deviceLabel ? deviceLabel.replace(idRegex, '$1').trim() : '';\n\n    // Remove the 'Default - ' text added by the browser\n    sanitizedLabel = sanitizedLabel ? sanitizedLabel.replace(defaultTextRegex, '').trim() : '';\n\n    return sanitizedLabel;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    session: inject.service(),\n    webrtcSettings: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n    intl: inject.service(),\n    phone: inject.service(),\n    chat: inject.service(),\n    settings: inject.service(),\n    feature: inject.service(),\n\n    selectedProfileId: null,\n    vanillaProfiles: [],\n    profiles: [],\n\n    microphone: null,\n    camera: null,\n    outputDevice: null,\n    notificationDevice: null,\n\n    notification: inject.service('notification-proxy'),\n    incomingInvitations: Ember.A(),\n    headset: inject.service(),\n\n    deviceUpdateDelay: 1500,\n    deviceChanges: null,\n    recentlyConnectedDevices: null,\n    allowDisableProfileNotifications: Ember.computed.readOnly(\n        'session.features.webrtcDisableDeviceProfileNotifications'\n    ),\n    // Returns settings once the webrtc-settings service has initialized and fetched settings.\n    profileSettingsPromise: computed.readOnly('webrtcSettings.userSettingsPromise'),\n    allowDefaultProfiles: computed.reads('session.features.webrtcDefaultDeviceProfile'),\n    initProfiles: observer('allowDefaultProfiles', async function () {\n        // Fetch profiles again when we have a value here.\n        await this._fetchProfiles();\n    }),\n\n    async init() {\n        this._super(...arguments);\n        this.get('webrtcSdkService').on('mediaStateChange', this._handleMediaStateChange.bind(this));\n        this.get('webrtcSettings').on('sdkSettingsUpdate', async () => {\n            await this._updateVolumes();\n        });\n        await this._fetchProfiles();\n        const currentMediaState = this.get('webrtcSdkService.mediaState');\n        if (currentMediaState) {\n            this._handleMediaStateChange(currentMediaState);\n        }\n    },\n\n    async _fetchProfiles() {\n        this.logger.debug('Fetching device profiles');\n        const settings = await this.get('profileSettingsPromise');\n        const selectedProfile = (settings.directorySettings && settings.directorySettings.selectedProfile) || '';\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        const defaultExists =\n            settings.directorySettings &&\n            settings.directorySettings.profiles &&\n            settings.directorySettings.profiles.find(profile => profile.id === defaultProfileId);\n\n        // If a default device profile isn't saved or no longer exists, resort to the last selected profile or computer settings.\n        this.setProperties({\n            selectedProfileId: defaultExists && this.get('allowDefaultProfiles') ? defaultProfileId : selectedProfile,\n            vanillaProfiles: (settings.directorySettings && settings.directorySettings.profiles) || []\n        });\n    },\n\n    async _handleMediaStateChange(mediaState) {\n        if (!mediaState.hasMicPermissions) {\n            return;\n        }\n\n        const camerasDiff = diffListsByDeviceId(this.get('mediaState.videoDevices'), mediaState.videoDevices);\n        const microphonesDiff = diffListsByDeviceId(this.get('mediaState.audioDevices'), mediaState.audioDevices);\n        const outputDevicesDiff = diffListsByDeviceId(this.get('mediaState.outputDevices'), mediaState.outputDevices);\n\n        const isInitialUpdate = !this.get('mediaState');\n\n        const added = {\n            cameras: camerasDiff.added,\n            microphones: microphonesDiff.added,\n            outputDevices: outputDevicesDiff.added,\n            total: camerasDiff.added.length + microphonesDiff.added.length + outputDevicesDiff.added.length\n        };\n        const removed = {\n            cameras: camerasDiff.removed,\n            microphones: microphonesDiff.removed,\n            outputDevices: outputDevicesDiff.removed,\n            total: camerasDiff.removed.length + microphonesDiff.removed.length + outputDevicesDiff.removed.length\n        };\n        this.set('mediaState', mediaState);\n        await this._updateProfileAvailability();\n        await this._maybeFixSelectedProfile();\n\n        if (added.total && !isInitialUpdate) {\n            this._updateRecentlyConnectedDevices(added);\n            await this._conditionallyShowToastForAddedDevices(added);\n        }\n\n        this.trigger('deviceListsUpdated', { added, removed });\n    },\n\n    async _updateProfileAvailability() {\n        const profiles = this.get('vanillaProfiles').map(profile => {\n            let canBeSelected = true;\n            let matchingCamera = null;\n            let matchingOutputDevice = null;\n            let matchingMicrophone = null;\n            let matchingNotificationDevice = null;\n\n            if (profile.camera) {\n                matchingCamera = this._findMatchingDevice(this.get('mediaState.videoDevices'), profile.camera);\n                const profileCameraIsNotDefault = profile.camera.deviceId !== 'default';\n                if (!matchingCamera && profileCameraIsNotDefault && !profile.validWithoutCamera) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.microphone) {\n                matchingMicrophone = this._findMatchingDevice(this.get('mediaState.audioDevices'), profile.microphone);\n                if (!matchingMicrophone) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.outputDevice) {\n                matchingOutputDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.outputDevice\n                );\n                if (!matchingOutputDevice) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.notificationDevice) {\n                matchingNotificationDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.notificationDevice\n                );\n                if (!matchingNotificationDevice) {\n                    canBeSelected = false;\n                }\n            }\n            return Object.assign({}, profile, {\n                canBeSelected: !!canBeSelected,\n                camera: matchingCamera || profile.camera,\n                microphone: matchingMicrophone || profile.microphone,\n                outputDevice: matchingOutputDevice || profile.outputDevice,\n                notificationDevice: matchingNotificationDevice || profile.outputDevice\n            });\n        });\n\n        this.set('profiles', profiles);\n\n        const settings = await this.get('profileSettingsPromise');\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        if (this.get('selectableProfiles').findBy('id', defaultProfileId)) {\n            this.setProfile(defaultProfileId);\n        }\n    },\n\n    async _maybeFixSelectedProfile() {\n        // start with default devices\n        let camera = this.mediaState.videoDevices && this.mediaState.videoDevices[0];\n        let mic = this.mediaState.audioDevices && this.mediaState.audioDevices[0];\n        let outputDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        let notificationDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        const currentProfile = this.get('profiles').findBy('id', this.get('selectedProfileId'));\n        const hasOutputDeviceSupport = this.mediaState.hasOutputDeviceSupport;\n\n        // check if selectedProfile is valid\n        if (currentProfile) {\n            const profileCamera = this._findMatchingDevice(this.mediaState.videoDevices, currentProfile.camera);\n            const profileMic = this._findMatchingDevice(this.mediaState.audioDevices, currentProfile.microphone);\n            const profileOutputDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.outputDevice\n            );\n            const profileNotificationDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.notificationDevice\n            );\n\n            const cameraValid =\n                currentProfile.validWithoutCamera ||\n                profileCamera ||\n                (currentProfile.camera && currentProfile.camera.deviceId === 'default');\n            const outputValid = !hasOutputDeviceSupport || profileOutputDevice;\n            const notificationsValid = !hasOutputDeviceSupport || profileNotificationDevice;\n\n            const profileValid = cameraValid && outputValid && notificationsValid && profileMic;\n\n            if (profileValid) {\n                camera = profileCamera || camera;\n                mic = profileMic;\n                outputDevice = profileOutputDevice || outputDevice;\n                notificationDevice = profileNotificationDevice || notificationDevice;\n            } else {\n                this._showNotificationForCurrentProfileNoLongerValid();\n\n                return await this.setProfile('');\n            }\n        }\n\n        // make sure devices match what is in the profile\n        const cameraMatches = this.get('camera') === camera;\n        const micMatches = this.get('microphone') === mic;\n        const outputDeviceMatches = !hasOutputDeviceSupport || this.get('outputDevice') === outputDevice;\n        const notificationDeviceMatches =\n            !hasOutputDeviceSupport || this.get('notificationDevice') === notificationDevice;\n\n        if (!cameraMatches || !micMatches || !outputDeviceMatches || !notificationDeviceMatches) {\n            const newDevices = {\n                camera,\n                microphone: mic,\n                outputDevice,\n                notificationDevice\n            };\n            this.setProperties(newDevices);\n            await this._updateVolumes();\n\n            this.get('webrtcSdkService').setDevices(newDevices);\n            this.trigger('profileDevicesChanged', newDevices);\n        }\n    },\n\n    async _updateVolumes() {\n        const outputDeviceVolumes = await this._getVolumesForDevice(this.get('outputDevice'));\n        this.get('phone').updateVolumes(outputDeviceVolumes);\n\n        this.get('webrtcSdkService').setCallVolume(outputDeviceVolumes.callVolume);\n\n        const notificationDeviceVolumes = await this._getVolumesForDevice(this.get('notificationDevice'));\n        this.get('chat').updateVolumes(notificationDeviceVolumes);\n    },\n\n    async _getVolumesForDevice(device) {\n        const defaults = {\n            callVolume: 100,\n            ringerVolume: 100,\n            chatNotificationVolume: 100,\n            interactionNotificationVolume: 100\n        };\n\n        if (!device) {\n            return defaults;\n        }\n\n        // It is possible to have saved settings for a device but also for that device to be the default system device with its own default system settings.\n        const sanitizedLabel = device.deviceId === 'default' ? 'default' : sanitizeDeviceLabel(device.label);\n        const settings = await this.get('profileSettingsPromise');\n        const volumes = settings.volumeSettings ? settings.volumeSettings[sanitizedLabel] : undefined;\n        return volumes || defaults;\n    },\n\n    _getActionHandler(label, { profileToSet, createProfile, showOptions } = {}) {\n        return {\n            label,\n            action: notification => {\n                if (profileToSet) {\n                    this.setProfile(profileToSet.id);\n                } else if (createProfile || showOptions) {\n                    this._openPhoneSettingsTab();\n                }\n\n                if (createProfile) {\n                    Ember.run.later(() => this.trigger('showProfileSelection'));\n                }\n\n                notification.hide();\n            }\n        };\n    },\n\n    _openPhoneSettingsTab() {},\n\n    _findMatchingDevice(deviceList, device) {\n        const foundDevice = deviceList.find(deviceA => this._deviceMatches(deviceA, device));\n\n        return foundDevice;\n    },\n\n    _deviceMatches(deviceA, deviceB) {\n        if (!deviceA || !deviceB) {\n            return false;\n        }\n\n        const hasSameId = deviceA.deviceId === deviceB.deviceId;\n\n        const formattedNameA = deviceA.label ? deviceA.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const formattedNameB = deviceB.label ? deviceB.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const hasSameName = formattedNameA === formattedNameB;\n\n        return hasSameId || hasSameName;\n    },\n\n    async _conditionallyShowToastForAddedDevices(addedDevices) {\n        const settings = await this.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n        /*\n          DESIRED BEHAVIOR\n          When a new device is connected:\n            if (theres a profile that contains newly connected device)\n              show toast asking if you'd like to switch to profile containing new device\n            else\n              ask if you'd like to create a new profile with this device\n        */\n        const filteredSelectableProfiles = [];\n\n        // find selectable profiles that contain the new device(s)\n        this.get('selectableProfiles').forEach(profile => {\n            if (addedDevices.cameras.length && this._deviceMatches(profile.camera, addedDevices.cameras[0])) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.microphones.length &&\n                this._deviceMatches(profile.microphone, addedDevices.microphones[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.outputDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.notificationDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            }\n        });\n\n        const intl = this.get('intl');\n\n        // devices added and profiles are available\n        if (filteredSelectableProfiles.length) {\n            const title = intl.t('deviceProfiles.notifications.hardwareChangeTitle');\n            let message;\n            let actionHandlers = {};\n\n            if (filteredSelectableProfiles.length > 1) {\n                message = intl.t('deviceProfiles.notifications.newDevicesMatchMultipleProfiles');\n            } else {\n                message = intl.t('deviceProfiles.notifications.profilesAvailable');\n            }\n\n            if (filteredSelectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            actionHandlers = filteredSelectableProfiles\n                .slice(0, 2)\n                .map(item => {\n                    return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                        profileToSet: item\n                    });\n                })\n                .reduce((acc, cur, i) => {\n                    acc[i] = cur;\n                    return acc;\n                }, actionHandlers);\n\n            this.get('notification').info(title, message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n        } else {\n            this.get('notification').info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.promptAddProfileForNewDevice'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: {\n                            label: intl.t('deviceProfiles.notifications.yesButton'),\n                            action: async notification => {\n                                notification.hide();\n                                await this.get('settings').openPreference('sound');\n                                this.trigger('showProfileSelection');\n                            }\n                        },\n                        no: {\n                            label: intl.t('deviceProfiles.notifications.noButton'),\n                            action: notification => {\n                                notification.hide();\n                            }\n                        }\n                    }\n                }\n            );\n        }\n    },\n\n    async _showNotificationForCurrentProfileNoLongerValid(hasNonDefaultDevices) {\n        const settings = await this.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n\n        const intl = this.get('intl');\n        const selectableProfiles = this.get('selectableProfiles');\n\n        // has profiles to choose from\n        if (selectableProfiles.length) {\n            let actionHandlers = {};\n\n            // option to go to the settings if there are too many possibilities\n            if (selectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            if (selectableProfiles.length >= 2) {\n                actionHandlers = selectableProfiles\n                    .slice(0, 2)\n                    .map(item => {\n                        return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                            profileToSet: item\n                        });\n                    })\n                    .reduce((acc, cur, i) => {\n                        acc[i] = cur;\n                        return acc;\n                    }, actionHandlers);\n            }\n\n            let message = !this.get('selectedProfileId')\n                ? intl.t('deviceProfiles.notifications.usingDefaultTextWithOptions')\n                : intl.t('deviceProfiles.notifications.switchDefaultTextWithOptions');\n\n            if (selectableProfiles.length === 1) {\n                message = intl.t('deviceProfiles.notifications.profileAvailable', { name: selectableProfiles[0].name });\n                if (this.get('selectedProfileId')) {\n                    message = intl.t('deviceProfiles.notifications.switchDefaultProfileAvailable', {\n                        name: selectableProfiles[0].name\n                    });\n                }\n\n                actionHandlers = {\n                    yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                        profileToSet: selectableProfiles[0]\n                    }),\n                    no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                };\n            }\n\n            this.get('notification').info(intl.t('deviceProfiles.notifications.hardwareChangeTitle'), message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n            return;\n        }\n\n        // does not have profiles to choose from but has non default devices\n        if (hasNonDefaultDevices) {\n            this.get('notification').info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.switchDefaultTextPromptCreateProfile'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                            createProfile: true\n                        }),\n                        no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                    }\n                }\n            );\n\n            return;\n        }\n\n        // no profiles and no devices that aren't default\n        this.get('notification').info(\n            intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n            intl.t('deviceProfiles.notifications.switchDefaultText'),\n            {\n                target: this,\n                tag: notificationTag\n            }\n        );\n    },\n\n    _updateRecentlyConnectedDevices(addedDevices) {\n        const deviceConfig = {};\n\n        if (addedDevices.cameras && addedDevices.cameras.length) {\n            deviceConfig.camera = addedDevices.cameras[0];\n        }\n        if (addedDevices.microphones && addedDevices.microphones.length) {\n            deviceConfig.microphone = addedDevices.microphones[0];\n        }\n        if (addedDevices.outputDevices && addedDevices.outputDevices.length) {\n            deviceConfig.outputDevice = addedDevices.outputDevices[0];\n        }\n\n        this.set('recentlyConnectedDevices', deviceConfig);\n    },\n\n    // Select an already created profile.\n    async setProfile(profileId, skipProfileSave) {\n        this.set('recentlyConnectedDevices', null);\n        if (!skipProfileSave) {\n            this.get('webrtcSettings').updateSetting('directorySettings.selectedProfile', profileId);\n        }\n\n        this.set('selectedProfileId', profileId);\n        await this._maybeFixSelectedProfile();\n        await this._updateVolumes();\n    },\n\n    selectableProfiles: computed('profiles', function () {\n        return Ember.A(this.get('profiles').filter(p => p.canBeSelected));\n    }),\n\n    async deleteProfile(profileId) {\n        const profiles = [].concat(this.get('vanillaProfiles'));\n        const profileObj = profiles.find(p => p.id === profileId);\n        const index = profiles.indexOf(profileObj);\n        profiles.splice(index, 1);\n        this.set('vanillaProfiles', profiles);\n\n        if (this.get('selectedProfileId') === profileId) {\n            await this.setProfile('');\n        }\n\n        // Remove profile from stored profiles.\n        const settingsService = this.get('webrtcSettings');\n        await settingsService.updateSetting('directorySettings.profiles', profiles);\n        await this._updateProfileAvailability();\n    },\n\n    // Profile creation.\n    async saveAndSelectProfile(profile) {\n        try {\n            const vanillaProfiles = [].concat(this.get('vanillaProfiles'));\n            let savedProfile = vanillaProfiles.find(p => p.id === profile.id);\n\n            if (!savedProfile) {\n                vanillaProfiles.push(profile);\n            } else {\n                const index = vanillaProfiles.indexOf(savedProfile);\n                vanillaProfiles.splice(index, 1, profile);\n            }\n\n            this.set('vanillaProfiles', vanillaProfiles);\n\n            const settings = await this.get('profileSettingsPromise');\n            settings.directorySettings.selectedProfile = profile.id;\n            settings.directorySettings.profiles = this.get('vanillaProfiles');\n\n            await this.get('webrtcSettings').updateSettings(settings);\n            await this._updateProfileAvailability();\n            // Set the profile but skip the save because it's already been updated as the selected.\n            await this.setProfile(profile.id, true);\n        } catch (error) {\n            this.logger.error('Failed to save and select device profile', error);\n        }\n    },\n\n    clearRecentlyConnectedDevices() {\n        this.set('recentlyConnectedDevices', null);\n    }\n});\n","import Ember from 'ember';\nimport { Client } from 'iframe-coordinator/dist/client.js';\nimport { setCustomAttribute } from 'ember-purecloud-components/utils/newrelic-legacy';\nimport { getEnvDetails } from 'connections-ui/utils/net';\n\nconst { run } = Ember;\nconst defaultLocale = 'en-us';\nconst hostResponseTimeout = 10000;\nconst embeddedStatus = window.self !== window.parent;\nconst urlSearchParams = new URLSearchParams(window.location.search);\nconst isLocallyIntegrated = urlSearchParams.get('host-is-local') === 'false';\nconst integrationContext = urlSearchParams.get('context');\n\nexport const EmbeddedEvents = {\n    ENVIRONMENTAL_DATA: 'environmentalData',\n    NOTIFICATION: 'notificationEvent',\n    DISMISS_NOTIFICATION: 'dismissToast',\n    SHOW_NOTIFICATION: 'showToast',\n    PAGE_DATA: 'page.data',\n    LAUNCH_VIDEO_WITH_PERSON_BY_ID: 'launchVideoWithPersonById',\n    LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID: 'launchVideoProviderWithPersonById',\n    START_CHAT_WITH_PERSON_BY_ID: 'startChatWithPersonById',\n    UPDATE_PROFILE_IMAGE: 'updateProfileImage',\n    START_CHAT_BY_JID: 'startChatByJid',\n    FAVORITE_ENTITY_BY_ID: 'favoriteEntityById',\n    START_CALL_PERSON_BY_ID: 'callPersonById',\n    START_CALL_BY_NUMBER: 'phone.makeCall',\n    USER_GENERAL_FIELD_UPDATED: 'userGeneralFieldUpdated',\n    EMERGENCY_ADDR_UPDATED: 'emergencyAddrUpdated',\n    STREAMING_TOPIC_SUBSCRIBE: 'streamingTopicSubscribe',\n    STREAMING_TOPIC_UNSUBSCRIBE: 'streamingTopicUnsubscribe'\n};\n\nconst LISTENERS = {\n    NOTIFICATION_ACTION: 'toastAction',\n    ENTITY_FAVORITE_ACTION: 'entityFavoriteAction',\n    STREAMING_TOPIC_MESSAGE: 'streamingTopicMessage',\n    STREAMING_TOPIC_SUBSCRIBE_ERROR: 'streamingTopicSubscribeError'\n};\n\nclass IframeClientTimeoutError extends Error {\n    constructor(event, timeout) {\n        super('Iframe coordinator client event listener timed out');\n        this.name = 'IframeClientTimeoutError';\n        this.event = event;\n        this.timeout = timeout;\n    }\n}\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    stashLogger: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    application: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    session: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n\n    isEmbedded: embeddedStatus,\n\n    getHostOrigin() {\n        let env = getEnvDetails();\n        if (isLocallyIntegrated) {\n            return `https://apps.${env.runtime.currentDomainName}/`;\n        } else {\n            return env.local ? 'https://localhost:4300' : `${window.location.origin}`;\n        }\n    },\n\n    setLocale(locale) {\n        if (!locale) {\n            return;\n        }\n\n        setCustomAttribute('uiLanguage', locale);\n        return this.get('intl').setLocale(locale);\n    },\n\n    checkForHostRedirect() {\n        // noop for now\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initializeFrame();\n    },\n\n    async initializeFrame() {\n        await this.initializeClient();\n    },\n\n    async initializeClient() {\n        if (integrationContext === 'adminui') {\n            this.set('application.adminUIContext', true);\n        }\n\n        // Do not initialize client if not rendered in a frame\n        if (!this.get('isEmbedded')) {\n            this.setLocale(defaultLocale);\n            return;\n        }\n\n        // Only initialize client once\n        if (this.get('client')) {\n            return;\n        }\n\n        const client = new Client({\n            hostOrigin: this.getHostOrigin()\n        });\n\n        this.set('client', client);\n\n        const environmentalDataListener = new Promise((resolve, reject) => {\n            client.addListener(EmbeddedEvents.ENVIRONMENTAL_DATA, data => {\n                this.set('hostRootUrl', data.hostRootUrl);\n\n                if (data.custom) {\n                    this.set('application.browserHidden', data.custom.browserHidden);\n                }\n\n                resolve(this.setLocale(data.locale));\n            });\n\n            run.later(\n                this,\n                () => reject(new IframeClientTimeoutError(EmbeddedEvents.ENVIRONMENTAL_DATA, hostResponseTimeout)),\n                hostResponseTimeout\n            );\n        });\n\n        client.start();\n\n        try {\n            await environmentalDataListener;\n        } catch (e) {\n            if (\n                this.get('application.adminUIContext') &&\n                !(this.get('session.features') && this.get('session.features')['PAUI-80.PeopleUiDecomposition'])\n            ) {\n                return; // We are embedded in Admin-UI, and we don't need IFC,\n                // only when we are embedded in Web-Directory or Users-UI, we needs IFC.\n            }\n            this.setLocale(defaultLocale);\n            this.get('stashLogger').error(e.message, e);\n        }\n\n        this.registerEventHandlers();\n    },\n\n    //==========================================================\n    // Handle events from IFC\n    //==========================================================\n\n    registerEventHandlers() {\n        if (!this.get('client')) {\n            return;\n        }\n\n        const client = this.get('client');\n        Object.keys(LISTENERS).forEach(key => {\n            client.messaging.addListener(LISTENERS[key], event => {\n                if (event && event.payload) {\n                    this[LISTENERS[key]](event);\n                }\n            });\n        });\n    },\n\n    toastAction(event) {\n        const { action, id } = event.payload;\n        this.get('notification').handleNotificationAction(action, id);\n    },\n\n    entityFavoriteAction(event) {\n        this.get('favorites').handleEntityFavoriteAction(event.payload);\n    },\n\n    streamingTopicMessage(message) {\n        this.get('pigeon').onMessage('streaming', message.payload);\n    },\n    streamingTopicSubscribeError(message) {\n        this.get('pigeon').onSubscriptionError(message.payload);\n    },\n\n    //==========================================================\n    // Publish events to IFC\n    //==========================================================\n\n    requestNotification(notification) {\n        const client = this.get('client');\n\n        if (!client || !notification) {\n            return;\n        }\n        client.requestNotification(notification);\n    },\n\n    publishMessage(topic, payload) {\n        const client = this.get('client');\n\n        if (!topic || !payload || !client) {\n            return;\n        }\n\n        return client.publish({\n            topic,\n            payload\n        });\n    },\n\n    dismissNotification(id) {\n        this.publishMessage(EmbeddedEvents.DISMISS_NOTIFICATION, { id });\n    },\n\n    showNotification(options) {\n        this.publishMessage(EmbeddedEvents.SHOW_NOTIFICATION, { options });\n    },\n\n    notifyAcdCount(count) {\n        this.publishMessage(EmbeddedEvents.ACDCOUNT_EVENT, { count });\n    },\n\n    sendSidebarEvent(event, panel, key, value) {\n        if (!this.get('isEmbedded')) {\n            return;\n        }\n\n        const options = {\n            type: event\n        };\n\n        if (panel) {\n            options.panel = panel;\n        }\n\n        if (key) {\n            options.key = key;\n        }\n\n        if (value) {\n            options.value = value;\n        }\n\n        this.publishMessage(EmbeddedEvents.SIDEBAR_EVENT, options);\n    },\n\n    sendNavigationEvent({ hash }) {\n        const client = this.get('client');\n\n        if (!client || !hash) return;\n\n        const url = new URL(window.location.origin);\n        url.hash = hash;\n\n        if (!url) {\n            this.get('stashLogger').error('Unable to parse provided hash into url.', {\n                hash\n            });\n            return;\n        }\n\n        client.requestNavigation({ url: url.href });\n    },\n\n    sendPageData(options) {\n        this.publishMessage(EmbeddedEvents.PAGE_DATA, options);\n    },\n\n    launchVideoWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    launchVideoProviderWithPersonById(personId, providerId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID, { personId, providerId });\n    },\n\n    startChatWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CHAT_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    notifyUserGeneralFieldUpdated(entityId) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, {});\n        }\n    },\n\n    notifyEmergencyAddrUpdated() {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADDR_UPDATED, {});\n    },\n\n    notifyUpdateProfileImage(images, entityJid) {\n        this.publishMessage(EmbeddedEvents.UPDATE_PROFILE_IMAGE, {\n            image: images,\n            entityJid\n        });\n    },\n\n    startChatByJid(jid) {\n        this.publishMessage(EmbeddedEvents.START_CHAT_BY_JID, { jid: jid.toString() });\n    },\n\n    favoriteEntityById(options) {\n        this.publishMessage(EmbeddedEvents.FAVORITE_ENTITY_BY_ID, options);\n    },\n\n    startCallPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CALL_PERSON_BY_ID, personId.toString());\n    },\n\n    startCallByNumber(phoneNumber) {\n        this.publishMessage(EmbeddedEvents.START_CALL_BY_NUMBER, { phoneNumber });\n    },\n\n    entityGeneralFieldUpdated(entityId, field) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, field);\n        }\n    },\n\n    emergencyAdrUpdated(emergencyAdr) {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADR_UPDATED, emergencyAdr);\n    },\n\n    streamingTopicSubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_SUBSCRIBE, topic);\n    },\n\n    streamingTopicUnsubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_UNSUBSCRIBE, topic);\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport EmergencyLocationUtil from '../utils/emergency-location-util';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject } = Ember;\n\nconst POLL_INTERVAL = 1200000; //20min\n\nexport default Ember.Service.extend({\n    session: inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    addressformat: inject.service(),\n    embedded: inject.service(),\n\n    eLocation: null,\n    isAuthenticated: computed.reads('session.isAuthenticated'),\n    isEligibleForE911: false,\n    eLocationInlineWarning: null,\n    primaryVoice: null,\n\n    emergencyLocationData: computed(\n        'eLocation',\n        'isEligibleForE911',\n        'eLocationInlineWarning',\n        'primaryVoice',\n        function () {\n            return {\n                eLocation: this.get('eLocation'),\n                eLocationInlineWarning: this.get('eLocationInlineWarning'),\n                primaryVoice: this.get('primaryVoice'),\n                isEligibleForE911: this.get('isEligibleForE911')\n            };\n        }\n    ),\n\n    /**\n     * Gets emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise} promise wraps object containing address location\n     */\n    getEmergencyLocation(phoneNumber) {\n        phoneNumber = !!phoneNumber ? phoneNumber : this.get('primaryVoice.number');\n        phoneNumber = this.get('addressformat').formatAddress(phoneNumber);\n\n        let url = this.get('application').pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('ajax').request(url, options);\n    },\n\n    /**\n     * Fetches and loads primary contact information for user and sets primary number in service\n     * @param  {string} userId Optional userId for whom the primary contact information is fetched.\n     * @return {promise} returns promise containing number and also sets primaryVoice in this service\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadUserPrimaryNumber(userId) {\n        let url = this.get('application').pcV2Uri(`api/v2/users/me`);\n        if (userId) {\n            url = this.get('application').pcV2Uri(`api/v2/users/${userId}`);\n        }\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                let number = null;\n                if (data && data.primaryContactInfo) {\n                    const primaryPhoneObject = data.primaryContactInfo.findBy('mediaType', 'PHONE');\n\n                    if (primaryPhoneObject && (primaryPhoneObject.address || primaryPhoneObject.display)) {\n                        number = this.get('addressformat').formatAddress(\n                            primaryPhoneObject.address || primaryPhoneObject.display\n                        );\n                        this.set('primaryVoice', {\n                            number,\n                            display: this.get('addressformat').formatAddressForDisplay(number)\n                        });\n                        return number;\n                    }\n                }\n                this.set('primaryVoice', {\n                    number,\n                    display: ''\n                });\n                this.set(\n                    'eLocationInlineWarning',\n                    this.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                );\n                return Ember.RSVP.reject({\n                    err: 'No primary number found',\n                    softError: this.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                });\n            })\n            .catch(err => {\n                if (err.softError) {\n                    return Ember.RSVP.reject(err);\n                }\n                this.set(\n                    'eLocationInlineWarning',\n                    this.get('intl').lookup('emergencyLocation.errors.primaryNumberLookup')\n                );\n                return Ember.RSVP.reject({\n                    err,\n                    hardError: this.get('intl').lookup('emergencyLocation.errors.primaryNumberLookup')\n                });\n            });\n    },\n\n    /**\n     * Fetches e911 eligibility status for a given phone number and sets isEligibleForE911 service property\n     * @param  {string} phoneNumber e164 formatted phone number that is checked for e911 eligibility\n     * @return {promise resolved} returns promise containing eligibility status\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadELocationEligibility(phoneNumber) {\n        let url = this.get('application').pcV2Uri(\n            'api/v2/carrierservices/integrations/emergencylocations/verifyphonenumber'\n        );\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('ajax')\n            .post(url, options)\n            .then(data => {\n                if (data && data.supported) {\n                    this.set('isEligibleForE911', true);\n                    return data;\n                }\n                this.set('isEligibleForE911', false);\n                return Ember.RSVP.resolve({\n                    supported: false\n                });\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                return Ember.RSVP.reject({\n                    err,\n                    softError: this.get('intl').lookup('emergencyLocation.errors.e911IsSupported')\n                });\n            });\n    },\n\n    /**\n     *  Resets the eLocation property to an emty address.\n     */\n    clearElocation() {\n        const emptyAddress = {\n            id: '',\n            address: {\n                street1: '',\n                street2: '',\n                city: '',\n                state: '',\n                zipcode: '',\n                country: ''\n            },\n            did: '',\n            source: ''\n        };\n\n        this.set('eLocation', emptyAddress);\n    },\n\n    /**\n     * Refreshes the eLocation property containing the emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise resolved} returns promise containing emergency address\n     * @return {promise rejected} returns error message to display in notification\n     */\n    refreshEmergencyLocation(phoneNumber) {\n        return this.getEmergencyLocation(phoneNumber)\n            .then(result => {\n                this.set('isEligibleForE911', true);\n                this.set('eLocation', result);\n\n                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                this.clearElocation();\n                const defaultMessage = this.get('intl').lookup('emergencyLocation.errors.e911LocationLookup', {\n                    number: this.get('primaryVoice.display')\n                });\n\n                const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err, defaultMessage));\n\n                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n\n                return Ember.RSVP.reject({\n                    err,\n                    softError: errorMessage\n                });\n            });\n    },\n\n    /**\n     * Refreshes all emergency contact information properties:\n     *     1 - eLocation\n     *     2 - primaryVoice\n     *     3 - isEligibleForE911\n     * @return {promise} returns promise\n     */\n    refreshAllEmergencylocationInfo() {\n        this.set('eLocationInlineWarning', null);\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return Ember.RSVP.resolve();\n        }\n        if (!this.get('isAuthenticated')) {\n            return Ember.RSVP.resolve();\n        }\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                if (number) {\n                    return this.refreshEmergencyLocation(number);\n                }\n                this.clearElocation();\n                throw {\n                    err: 'Number not supported.',\n                    softError: this.get('intl').lookup('emergencyLocation.errors.e911NotEligible')\n                };\n            })\n            .catch(errObject => {\n                const messageBody = errObject.softError;\n                if (messageBody && !this.get('eLocationInlineWarning')) {\n                    this.set('eLocationInlineWarning', messageBody);\n                }\n\n                return Ember.RSVP.reject(errObject);\n            });\n    },\n\n    /**\n     * Begins polling to refresh all eLocation data\n     */\n    startPolling() {\n        if (isTesting) return;\n\n        const service = this;\n        const pollingIntervalInMinutes = moment.duration(POLL_INTERVAL).minutes();\n        let pollCounter = 0;\n        const pollingIntervalId = setInterval(() => {\n            this.get('logger').info(\n                `E911UI: Polling count: ${pollCounter++} - Polling time: ${moment().format()} - Polling every ${pollingIntervalInMinutes}min.`\n            );\n            service._refreshAllEmergencylocationInfo();\n        }, POLL_INTERVAL);\n        this.set('pollingIntervalId', pollingIntervalId);\n    },\n\n    init() {\n        this._super(...arguments);\n        if (this.get('session.features.emergencyLocation')) {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n            this.startPolling();\n        }\n    },\n\n    /**\n     * Wrapper function to put in runloop\n     */\n    _refreshAllEmergencylocationInfo() {\n        Ember.run.later(() => {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n        }, 100);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        clearInterval(this.get('pollingIntervalId'));\n    },\n\n    /**\n     * Sets eLocation on backend\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    setElocation(newAddress, number) {\n        let url = this.get('application').pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                did: number,\n                address: newAddress,\n                source: 'User'\n            }\n        };\n        return this.get('ajax')\n            .post(url, options)\n            .catch(err => {\n                let errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                return Ember.RSVP.reject({\n                    err,\n                    hardError: errorMessage\n                });\n            });\n    },\n\n    /**\n     * Saves eLocation property on this service\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    saveElocation(newAddress) {\n        if (!this.get('session.features.emergencyLocation')) {\n            return;\n        }\n        this.set('eLocationInlineWarning', null);\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                return this.setElocation(newAddress, number);\n            })\n            .then(() => {\n                return this.refreshAllEmergencylocationInfo();\n            });\n    }\n});\n","import Service from '@ember/service';\nimport Evented from '@ember/object/evented';\n\nexport const TOGGLE_EVENT = 'system.event.toggle';\nexport const TOGGLE_NAV_EVENT = 'system.event.navtoggle';\nexport const TOGGLE_ACTIVE_DRAWER_EVENT = 'system.event.drawerselect';\n\nconst eventsService = Service.extend(Evented, {\n    triggerEvent(event: any, payload: any) {\n        console.log('jrr: event triggered', {\n            event,\n            payload\n        });\n        this.trigger(event, payload);\n    }\n});\n\nexport default eventsService;\nexport class EventsService extends eventsService {}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        events: EventsService;\n    }\n}\n","import Ember from 'ember';\nimport { createContactPojo } from 'connections-ui/utils/acd';\nconst { Service, inject, setProperties, get, computed } = Ember;\n\nexport const CONTACT_CHANGED_EVENT = 'contact-changed-event';\nexport const CONTACT_MERGED_EVENT = 'contact-merged-event';\n\nconst CONTACT_CHANGED = 'contact-changed';\nconst EXTERNAL_CONTACT = 'externalcontacts/contact';\nconst EXPANDED_PARTICIPANT_PURPOSES = ['customer', 'external'];\n\nconst TOPIC_PREFIX = 'v2.externalcontacts.contacts.';\n\n/**\n * Service supports expansion of external contacts for interactions and observation of changes associated with\n * with those contacts.  This dispatches an change event when an external contact is changed and a merge event\n * along with a change event when an external contact is merged with another contact\n */\nexport default Service.extend(Ember.Evented, {\n    store: inject.service(),\n    pigeon: inject.service(),\n    names: inject.service(),\n    permissions: inject.service(),\n    logger: inject.service('stash-logger'),\n\n    _trackedContacts: [],\n    contacts: computed.oneWay('_trackedContacts'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_trackedContacts', []);\n        this.set('contactCallbackData', []);\n        this.get('pigeon').on(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    /**\n     * Mutates (sets or resets) the provided interactionModel with the externalContact info.  This method\n     * assumes that the interactionModel participants have already been sync'd with the payload.\n     *\n     * @returns A promise which always resolves with undefined.  Any errors in expansion will be logged.\n     */\n    async setExternalContactInfo(interactionModel, payload) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        const participantsToExpand = (interactionModel.get('participants') || []).filter(currParticipant => {\n            return currParticipant && EXPANDED_PARTICIPANT_PURPOSES.includes(Ember.get(currParticipant, 'purpose'));\n        });\n\n        if (!participantsToExpand.length) {\n            return;\n        }\n\n        for (let index = 0; index < participantsToExpand.length; index++) {\n            const currParticipant = participantsToExpand[index];\n\n            const rawParticipant =\n                payload && payload.participants ? payload.participants.find(p => p.id === currParticipant.id) : null;\n            if (!rawParticipant) {\n                this.get('logger').warn('ACD Relate: Could not correlate a model participant with a rawParticipant', {\n                    remoteData: {\n                        conversationId: interactionModel.get('id'),\n                        participantId: currParticipant.id\n                    }\n                });\n\n                continue;\n            }\n\n            if (!rawParticipant.externalContactId) {\n                setProperties(currParticipant, {\n                    isExternal: false,\n                    name: rawParticipant.name || '',\n                    externalContact: null\n                });\n            } else {\n                const externalContact = (await this._getContact(rawParticipant.externalContactId)) || null;\n                const name = externalContact ? this.get('names').fullName(externalContact) : null;\n\n                setProperties(currParticipant, {\n                    isExternal: true,\n                    name: name || rawParticipant.name || '',\n                    externalContact\n                });\n            }\n        }\n    },\n\n    /**\n     * Attempts to get a local contact model from the store and if none is found gets a remote model\n     * @param id - the contact id to load\n     * @param reload - if true - forces a reload of the contact\n     * @param errorMessage - specific error message for retrieval of contact context\n     * @returns {Promise.<*|{id}>}\n     */\n    async _getContact(id, reload, errorMessage = 'ACD Relate: failed to fetch contact') {\n        if (!id) return;\n        const store = this.get('store');\n        let contact = reload ? null : store.peekRecord(EXTERNAL_CONTACT, id);\n        if (!contact) {\n            try {\n                contact = await store.findRecord(EXTERNAL_CONTACT, id, { reload: true });\n            } catch (e) {\n                const { message: generalMessage, errors } = e;\n                const [errorData] = errors || [];\n                const { status, title, detail } = errorData || {};\n                const { message, contextId } = detail || {};\n                this.get('logger').error(errorMessage, {\n                    remoteData: {\n                        externalContactId: id,\n                        generalMessage,\n                        status,\n                        title,\n                        message,\n                        contextId\n                    }\n                });\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Gets the canonical contact based on the current contact.  It retrieves the local store's record first for\n     * both contact types if possible.  Changes to the contacts would have triggered updates through the update handler.\n     * @param id - the contact ID that will be used to retrieve the canonical contact.\n     * @param reload - if true forces reload of the contact and the canonical contact if applicable\n     * @returns {Promise.<*>} resolves to the current canonical contact for the passed in contact id\n     */\n    async getCanonicalExternalContact(id, reload = false) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        let contact;\n        if (id) {\n            contact = await this._getContact(id, reload, 'ACD Relate: Failed to fetch External Contact from store');\n            const canonicalId = get(contact || {}, 'canonicalId');\n            if (canonicalId && canonicalId !== id) {\n                contact = await this._getContact(\n                    canonicalId,\n                    reload,\n                    'ACD Relate: Failed to fetch canonical External Contact from store'\n                );\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Synchronously gets the local contact canonical contact being tracked based on the passed in id.\n     * if nothing can be found - returns undefined\n     * @param contactId\n     */\n    getCanonicalContactSync(contactId) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        // gets the contacts array since it is gated by the feature toggle\n        const contacts = this.get('contacts') || [];\n        let contact = contacts.findBy('id', contactId);\n        if (contact) {\n            const canonicalId = get(contact, 'canonicalId');\n            if (canonicalId && canonicalId !== contactId) {\n                contact = contacts.findBy('id', canonicalId);\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Adds change listener for customer participant bound contacts on their id in the payloads participant array.  It diffs the\n     * previous interaction states participants array to remove listeners that were previously attached.\n     * @param ModelBuilder - The Ember Class or a function to create an interaction model\n     * @param payload - the payload from an interaction update\n     * @param prevRaw - the previous payload for an the payload - for determining removed contacts\n     * @param callback - the callback that will be fired when a contact changes - The callbacks are invoked without\n     * contact binding to an appropriate context will be necessary\n     */\n    async addContactChangeListenersForInteraction(ModelBuilder, payload, prevRaw, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n\n        const currInteraction = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n            ? ModelBuilder.create(payload, Ember.getOwner(this).ownerInjection())\n            : ModelBuilder(payload);\n        const externalContactId = get(currInteraction, 'participantForCustomer.externalContactId');\n        currInteraction.destroy();\n\n        if (prevRaw) {\n            const prevInteraction = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n                ? ModelBuilder.create(prevRaw, Ember.getOwner(this).ownerInjection())\n                : ModelBuilder(prevRaw);\n            const previousContactId = get(prevInteraction, 'participantForCustomer.externalContactId');\n            prevInteraction.destroy();\n            if (previousContactId && previousContactId !== externalContactId) {\n                this.removeContactChangeListener(previousContactId, callback);\n            }\n        }\n\n        if (externalContactId) {\n            await this.addContactChangeListener(externalContactId, callback);\n        }\n    },\n\n    /**\n     * Cleans up listeners in an interaction payload attached to external contacts attached to the participants\n     * @param model\n     * @param callback\n     */\n    removeContactChangeListenersForInteraction(model, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!model) {\n            return;\n        }\n\n        const externalContactId = get(model, 'participantForCustomer.externalContactId');\n        this.removeContactChangeListener(externalContactId, callback);\n    },\n\n    /**\n     * Adds a change listener for the canonical contact associated with the passed in external contact id\n     * as well as the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    async addContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) return;\n        if (!(contactId && callback)) return;\n\n        const contact = await this._getContact(contactId);\n        if (!contact) {\n            throw new Error('ACD Relate: failed to load external contact', { cause: contactId });\n        }\n\n        const divisionId = Ember.get(contact, 'division.id') || '*';\n\n        if (!this.get('permissions').validateDonutPermission('externalContacts:contact:view', divisionId)) {\n            throw new Error('ACD Relate: insufficient privileges to add contact listeners');\n        }\n\n        const canonicalId = get(contact, 'canonicalId');\n        const canonicalContact = await this._getContact(canonicalId);\n        if (!canonicalContact) {\n            throw new Error('ACD Relate: failed to load canonical external contact', { cause: canonicalId });\n        }\n\n        const contactData = this.get('contactCallbackData').findBy('contactId', contactId);\n\n        if (!contactData) {\n            this.get('contactCallbackData').pushObject({ contactId, canonicalId, callbacks: [callback] });\n        } else {\n            const { callbacks } = contactData;\n            if (callbacks.indexOf(callback) === -1) {\n                callbacks.pushObject(callback);\n            }\n        }\n\n        if (!this.get('_trackedContacts').findBy('id', contactId)) {\n            this.get('_trackedContacts').pushObject(createContactPojo(contact));\n        }\n        if (canonicalId !== contactId && !this.get('_trackedContacts').findBy('id', canonicalId)) {\n            this.get('_trackedContacts').pushObject(createContactPojo(canonicalContact));\n        }\n        if (contactId) {\n            this._watchContactForChanges(contactId);\n        }\n        if (canonicalId && canonicalId !== contactId) {\n            this._watchContactForChanges(canonicalId);\n        }\n    },\n\n    /**\n     * Removes a change listener for a canonical contact based on the passed in external contact is as well as\n     * the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    removeContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!(contactId && callback)) return;\n\n        const contactCallbackData = this.get('contactCallbackData');\n        const contactData = contactCallbackData.findBy('contactId', contactId);\n        if (contactData) {\n            const { callbacks } = contactData;\n            callbacks.removeObject(callback);\n            if (!callbacks.length) {\n                contactCallbackData.removeObject(contactData);\n            }\n        }\n        this._updateTrackedContactsAndTopics();\n    },\n\n    /**\n     * Adds watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _watchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) === -1) {\n                this.get('pigeon').registerPriorityTopic(topic, CONTACT_CHANGED);\n            }\n        }\n    },\n\n    /**\n     * Removes watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _unwatchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) !== -1) {\n                this.get('pigeon').unRegisterPriorityTopic(topic);\n            }\n        }\n    },\n\n    _invokeCallbacks(callbacks = [], data = {}) {\n        callbacks.forEach(callback => {\n            if (typeof callback === 'function') {\n                callback(data);\n            }\n        });\n    },\n\n    /**\n     * Rolls through tracked contacts and topics to remove any orphan contacts or topics that\n     * whose callback data has been removed.\n     */\n    _updateTrackedContactsAndTopics() {\n        const trackedContactIds = this.get('trackedContactIds');\n        const trackedContacts = this.get('_trackedContacts');\n        for (let i = trackedContacts.length - 1; i >= 0; i--) {\n            const { id } = trackedContacts.objectAt(i);\n            if (id && trackedContactIds.indexOf(id) === -1) {\n                trackedContacts.splice(i, 1);\n                this._unwatchContactForChanges(id);\n            }\n        }\n    },\n\n    /**\n     * Returns an array of all the contact ids that are currently being tracked\n     */\n    trackedContactIds: computed('contactCallbackData.[]', function () {\n        return this.get('contactCallbackData')\n            .reduce((trackedIds, callbackData) => {\n                const { contactId, canonicalId, callbacks } = callbackData;\n                if (callbacks.length) {\n                    trackedIds.pushObject(contactId);\n                    if (contactId !== canonicalId) {\n                        trackedIds.pushObject(canonicalId);\n                    }\n                }\n                return trackedIds;\n            }, [])\n            .uniq();\n    }),\n\n    /**\n     * Reloads an external contact when it has changed and dispatches an external contact changed event.  If the change\n     * in question was a merger of contacts, a merge event is also generated containing the initial contact and the\n     * canonical contact that resulted from the merge event.\n     * @param externalContactId - an object that contains a single id property corresponding to which contact changed\n     * @returns {Promise.<void>}\n     */\n    async _handleContactChanged({ id: contactId }) {\n        if (contactId) {\n            try {\n                if (!this.get('contactCallbackData.length')) {\n                    return;\n                }\n                const contacts = this.get('_trackedContacts');\n                const contactCallbackData = this.get('contactCallbackData');\n\n                const staleContact = await this._getContact(contactId);\n                const staleCanonicalId = get(staleContact, 'canonicalId');\n\n                const freshContact = await this._getContact(contactId, true);\n                const freshCanonicalId = get(freshContact, 'canonicalId');\n                const freshCanonicalContact = await this._getContact(freshCanonicalId);\n\n                if (freshContact && freshCanonicalContact) {\n                    contacts.removeObject(contacts.findBy('id', contactId));\n                    contacts.pushObject(createContactPojo(freshContact));\n\n                    if (freshCanonicalId !== contactId) {\n                        contacts.removeObject(contacts.findBy('id', freshCanonicalId));\n                        contacts.pushObject(createContactPojo(freshCanonicalContact));\n                    }\n\n                    let callbacks, type, eventData;\n                    if (staleCanonicalId === freshCanonicalId) {\n                        type = CONTACT_CHANGED_EVENT;\n                    } else {\n                        type = CONTACT_MERGED_EVENT;\n\n                        //if this is a base contact - it will have a contactCallbackData\n                        // update it if it does to give it the new canonical contact id\n                        const callbackData = contactCallbackData.findBy('contactId', contactId);\n                        if (callbackData) {\n                            const { callbacks } = callbackData;\n                            contactCallbackData.removeObject(callbackData);\n\n                            // update the contact data with the new canonical and watch the news canonical\n                            contactCallbackData.pushObject({ contactId, canonicalId: freshCanonicalId, callbacks });\n                            this._watchContactForChanges(freshCanonicalId);\n                        }\n\n                        // removes orphan contacts and topics based on the currently tracked contact information\n                        this._updateTrackedContactsAndTopics();\n                    }\n\n                    callbacks = contactCallbackData\n                        .filter(data => data.contactId === contactId || data.canonicalId === contactId)\n                        .flatMap(({ callbacks }) => callbacks)\n                        .uniq();\n\n                    eventData = { type, contact: freshContact, canonicalContact: freshCanonicalContact };\n\n                    if (callbacks && type && eventData) {\n                        Ember.run.schedule('actions', this, '_invokeCallbacks', callbacks, eventData);\n                        this.trigger(type, eventData);\n                    }\n                }\n            } catch (e) {\n                this.get('logger').error('ACD Relate: Error occurred when handling external contact change event', {\n                    remoteData: {\n                        contactId\n                    }\n                });\n            }\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, observer, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, LoggerMixin, {\n    intl: inject.service(),\n    ajax: inject.service(),\n    chat: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    embedded: inject.service(),\n\n    initialized: false,\n\n    _favorites: null,\n    favoritePromise: Ember.RSVP.defer(),\n\n    init() {\n        this._super(...arguments);\n\n        this.setProperties({\n            _favorites: []\n        });\n\n        this.loadFavoritesForSessionPerson();\n    },\n\n    enabled: computed('session.user.isTrustee', function () {\n        return !this.get('session.user.isTrustee');\n    }),\n\n    apiVersion: computed(function () {\n        return 'v3';\n    }),\n\n    loadFavoritesForSessionPerson: observer(\n        'session.{isAuthenticated,person}',\n        'session.user.{isTrustee,isSuper}',\n        function () {\n            if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n                this.favoritePromise.resolve(this.get('_favorites'));\n                return;\n            }\n\n            if (this.get('session.isAuthenticated') && this.get('session.person')) {\n                if (this.get('initialized')) {\n                    this.favoritePromise.resolve(this.get('_favorites'));\n                } else {\n                    this.initFavorites().then(\n                        () => {\n                            this.favoritePromise.resolve(this.get('_favorites'));\n                        },\n                        () => {\n                            this.favoritePromise.resolve(this.get('_favorites'));\n                        }\n                    );\n                }\n            }\n        }\n    ),\n\n    initFavorites() {\n        return this.getFavorites().then(peopleAndGroups => {\n            if (this.isDestroyed) {\n                return;\n            }\n            this.setFavorites(peopleAndGroups);\n            this.set('initialized', true);\n        });\n    },\n\n    getFavorites() {\n        return this.get('store')\n            .findFavorites()\n            .then(data => {\n                return this._handleHiddenGroups(data);\n            });\n    },\n\n    getLoadedFavorites() {\n        return this.favoritePromise.promise;\n    },\n\n    setFavorites(peopleAndGroups) {\n        const favorites = _.chain([])\n            .concat(peopleAndGroups)\n            .compact()\n            .uniq(false, x => x.get('id'))\n            .value();\n        this.set('_favorites', favorites);\n\n        favorites.forEach(entity => {\n            entity.set('isFavorite', true);\n        });\n    },\n\n    // Handle favorite action performed in Web-Directory.\n    async handleEntityFavoriteAction(event) {\n        if (!event) {\n            return;\n        }\n        if (event.action === 'Favorited') {\n            if (!event.data || !event.data.entityType || !event.entityId) {\n                return;\n            }\n            await this.getLoadedFavorites(); // Wait for favorites to be fully loaded.\n            const entity = await this.get('store').findRecord(event.data.entityType, event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').addObject(entity);\n            entity.set('isFavorite', true);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: true,\n                action: 'Favorited'\n            });\n        } else if (event.action === 'Unfavorited') {\n            if (!event.entityId) {\n                return;\n            }\n            await this.getLoadedFavorites(); // Wait for favorites to be fully loaded.\n            const entity = this.get('_favorites').findBy('id', event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').removeObject(entity);\n            entity.set('isFavorite', false);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: false,\n                action: 'Unfavorited'\n            });\n        }\n    },\n\n    favoriteEntity(entity) {\n        // Trigger a favorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: true\n        });\n    },\n\n    unfavoriteEntity(entity) {\n        // Trigger an unfavorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: false\n        });\n    },\n\n    toggleFavorite(entity) {\n        if (entity.get('isFavorite')) {\n            this.unfavoriteEntity(entity);\n        } else {\n            this.favoriteEntity(entity);\n        }\n    },\n\n    _handleHiddenGroups(models) {\n        const loadedIds = [...models.mapBy('entityId'), ...models.mapBy('guid'), ...models.mapBy('_id')].filter(\n            id => !!id\n        );\n        models._payload\n            .filter(object => object.entityType === 'group')\n            .forEach(object => {\n                const guid = object.entityId;\n                if (!_.includes(loadedIds, guid)) {\n                    // group wasn't loaded due to permissions\n                    const placeholder = this.get('store').push({\n                        data: {\n                            type: 'group',\n                            id: guid,\n                            attributes: {\n                                guid: guid,\n                                general: {\n                                    name: []\n                                }\n                            }\n                        }\n                    });\n\n                    this.logger.info('Favorites: Adding placeholder', { guid });\n\n                    models.pushObject(placeholder);\n                }\n            });\n\n        return models;\n    }\n});\n","define(\"connections-ui/services/feature\", [\"exports\", \"ember-purecloud-components/services/feature\"], function (_exports, _feature) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _feature.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport AjaxService from 'ember-ajax/services/ajax';\n\nexport default AjaxService.extend({\n    application: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    trustedHosts: Ember.computed.alias('ajax.trustedHosts'),\n\n    upload(uri, formData) {\n        return this.raw(uri, {\n            contentType: false,\n            processData: false,\n            data: formData,\n            method: 'POST'\n        });\n    },\n\n    async uploadGreetingWithPreSigned(file, groupId) {\n        const urlPath = `api/v2/groups/${groupId}/greetings/uploads`;\n        const presignedUrl = this.get('application').pcV2Uri(urlPath);\n        try {\n            const presignedUrlResponse = await this.get('ajax').post(presignedUrl, {\n                data: {\n                    tags: {\n                        ownerType: 'group',\n                        ownerId: groupId,\n                        name: 'voicemail',\n                        greetingType: 'voicemail'\n                    },\n                    fileName: file.name,\n                    contentType: file.type\n                }\n            });\n            await this.get('ajax').raw(presignedUrlResponse.url, {\n                contentType: false,\n                processData: false,\n                data: file,\n                method: 'PUT',\n                noAuthorizationHeader: true, // Prevent to use the classic GC Auth header\n                headers: presignedUrlResponse.headers,\n                dataType: 'text' // Upload will have an empty response\n            });\n            Ember.Logger.info(`Successful voicemail greeting upload: \"${file.name}\"`);\n        } catch (err) {\n            Ember.Logger.error('Error uploading voicemail file:', { error: err });\n            throw err;\n        }\n    },\n\n    /**\n     * Fax upload using provided headers. This will use the Darth service for upload.\n     * @param {*} uri\n     * @param {*} formData\n     * @param {*} headers\n     * @returns\n     */\n    faxUploadWithHeaders(uri, formData, headers) {\n        const file = formData.get('file');\n        if (file) {\n            return this.raw(uri, {\n                contentType: false,\n                processData: false,\n                // darth upload doesn't like the form data object for all file types\n                // using the raw file appears to work consistently\n                data: file,\n                method: 'PUT',\n                headers,\n                dataType: 'text' // fax upload will have an empty response\n            });\n        } else {\n            Ember.Logger.error('<file-upload/faxUploadWithHeaders> file is undefined!');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, {\n    session: inject.service(),\n\n    isFullScreen: false,\n\n    handleFullScreenChange: function () {\n        Ember.run(() => {\n            if (!this.get('isDestroyed') && !this.get('isDestroying')) {\n                let fullScreen = document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement;\n                this.set('isFullScreen', !!fullScreen);\n\n                if (!this.get('isFullScreen')) {\n                    this.endFullScreen();\n                }\n            }\n        });\n    },\n\n    init() {\n        this._super(...arguments);\n        Ember.$(document).on('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        Ember.$(document).off('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    startFullScreen(isAcd = false, requestingElem) {\n        //Ensure messengerElement in under orgspan-app element to support toast notification while in fullscreen\n        const messengerElement = Ember.$('ul.messenger');\n        const orgspanApp = Ember.$('.orgspan-app');\n        if (!Ember.$.contains(orgspanApp, messengerElement)) {\n            messengerElement.appendTo(orgspanApp);\n        }\n\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').addClass('hosted-fullscreen');\n        } else {\n            const elem = requestingElem ? $(requestingElem)[0] : $('.orgspan-app')[0];\n            const requestFullscreen =\n                elem.requestFullscreen ||\n                elem.webkitRequestFullscreen ||\n                elem.mozRequestFullScreen ||\n                elem.msRequestFullscreen;\n            requestFullscreen.apply(elem);\n        }\n\n        if (!isAcd) {\n            $('.orgspan-app').removeClass('fullscreen-v1');\n            $('.orgspan-app').addClass('fullscreen-v2');\n        } else {\n            $('.orgspan-app').removeClass('fullscreen-v2');\n            $('.orgspan-app').addClass('fullscreen-v1');\n        }\n\n        this.trigger('startFullscreen');\n    },\n\n    endFullScreen() {\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').removeClass('hosted-fullscreen');\n        } else {\n            const exitFullscreen =\n                document.exitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.mozCancelFullScreen ||\n                window.msExitFullscreen;\n            const ret = exitFullscreen.apply(document);\n            if (ret && ret.catch) {\n                ret.catch(() => {});\n            }\n        }\n\n        this.trigger('endFullscreen');\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport geoUtil from '../utils/geolocation';\nimport uuid from '../utils/uuid';\nimport { task } from 'ember-concurrency';\nimport moment from '../utils/dates';\n\nconst REPORT_FREQUENCY_IN_MINUTES = 60;\n\nexport default Ember.Service.extend(LoggerMixin, {\n    currentPosition: {},\n    store: Ember.inject.service(),\n    session: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    application: Ember.inject.service(),\n    streaming: Ember.inject.service(),\n    geoUtil,\n    uuid: uuid,\n\n    isEnabled: Ember.computed.reads('isSwitchedOn'),\n    isSwitchedOn: false,\n\n    intervalReference: null,\n    isStarted: Ember.computed.and('geoWatchId', 'intervalReference'),\n\n    init() {\n        this._super(...arguments);\n        let context = this.get('application.hostedContext');\n        if (context && context.isHosted()) {\n            this.get('_desktopStart').perform();\n        } else {\n            this.get('start').perform();\n        }\n\n        this.get('geoUtil').setContext(context);\n    },\n\n    _lastReport: null,\n    report: Ember.observer('isSwitchedOn', 'streaming.connected', 'clientId', function () {\n        this.logger.debug(`GEOLOCATION: report observer fired`);\n        if (!this.get('isSwitchedOn') || !this.get('streaming.connected')) {\n            return;\n        }\n        const lastReport = this.get('_lastReport');\n        if (lastReport && moment().diff(lastReport, 'minutes') < REPORT_FREQUENCY_IN_MINUTES) {\n            return;\n        }\n        const clientId = this.get('clientId');\n        if (!clientId) {\n            return;\n        }\n        if (!this.get('geoUtil').isGeolocationAvailable()) {\n            this.logger.debug('GEOLOCATION: Not available');\n            return;\n        }\n        this.logger.debug(`GEOLOCATION: report observer triggering geo report`);\n        this.set('_lastReport', moment());\n        this.get('_reportCurrentPosition').perform(clientId);\n    }),\n\n    _desktopStart: task(function* () {\n        this.logger.debug('GEOLOCATION: Using desktop start');\n        let prefs = yield this.get('application.hostedContext').requestDesktopPromise({\n            cmd: 'getPreferences',\n            prefs: ['permission_geolocation']\n        });\n        if (prefs.permission_geolocation) {\n            this.logger.debug('GEOLOCATION: desktop preference on');\n            this.get('start').perform();\n        } else {\n            this.logger.debug('GEOLOCATION: desktop preference off', prefs);\n            try {\n                let result = yield this.get('store').findRecord('geolocation-settings', '1');\n                this.logger.debug(`GEOLOCATION: Got settings result`, result);\n                if (result.get('enabled')) {\n                    this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n                    this.set('isSwitchedOn', true);\n                }\n            } catch (e) {\n                this.logger.error('failed to get information about geolocation for this client', { error: e });\n            }\n        }\n    }),\n\n    start: task(function* () {\n        if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n            return;\n        }\n\n        try {\n            let result = yield this.get('store').findRecord('geolocation-settings', '1');\n            this.logger.debug(`GEOLOCATION: Got settings result`, result);\n            if (!result.get('enabled')) {\n                return;\n            }\n            this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n\n            let clientId = yield this.get('preferences').getPreference('geolocation.clientId');\n            this.logger.debug(`GEOLOCATION: client id is ${clientId}`);\n            if (!clientId) {\n                clientId = this.get('uuid').generate();\n                try {\n                    yield this.get('preferences').setPreference('geolocation.clientId', clientId, false);\n                    this.logger.debug('GEOLOCATION: client ID saved to preferences, start monitoring');\n                } catch (e) {\n                    this.logger.error(\n                        'GEOLOCATION: client id could not be saved locally.  Not sending geolocation...',\n                        e\n                    );\n                    return;\n                }\n            }\n\n            // will trip observer and report current position\n            this.setProperties({\n                isSwitchedOn: true,\n                clientId\n            });\n        } catch (e) {\n            this.logger.error('failed to get information about geolocation for this client', { error: e });\n        }\n    }),\n\n    _reportCurrentPosition: task(function* (clientId) {\n        let position = yield this.get('geoUtil').fetchCurrentPostion();\n        this.logger.debug('GEOLOCATION: checking if primary');\n        this.logger.debug('GEOLOCATION: session geolocation', this.get('session.publicApiUser.geolocation'));\n        try {\n            if (!this.get('session').get('isAuthenticated')) {\n                //geolocation is requested at session authentication, if we are authenticated we got it\n                yield this.get('session').refreshPublicApiUser('geolocation');\n            }\n            this.logger.debug('GEOLOCATION: refreshed logged in user', this.get('session.publicApiUser'));\n            let primary = this._isPrimary();\n            this.logger.debug('GEOLOCATION: reporting position to server', position, clientId);\n            let resultPosition = this.get('store').push({\n                data: {\n                    type: 'geolocation',\n                    attributes: {\n                        primary,\n                        id: clientId,\n                        latitude: position.coords.latitude,\n                        longitude: position.coords.longitude,\n                        type: 'web'\n                    },\n                    id: clientId\n                }\n            });\n            yield resultPosition.save();\n            this.set('currentPosition', position);\n            this._onPositionSaved(position);\n        } catch (e) {\n            this._onErrorSavingPosition(e);\n        }\n    }),\n\n    _isPrimary() {\n        let isPrimary =\n            !this.get('session.publicApiUser.geolocation.type') ||\n            (this.get('session.publicApiUser.geolocation.type') !== 'ios' &&\n                this.get('session.publicApiUser.geolocation.type') !== 'android');\n        this.logger.debug('GEOLOCATION: is primary: ', isPrimary);\n        return isPrimary;\n    },\n\n    _onPositionSaved(position) {\n        this.logger.debug('GEOLOCATION: position saved', position);\n    },\n\n    _onErrorSavingPosition(e) {\n        // 405 for the geolocation api means its turned off thru admin for this org\n        if (e.code === 405) {\n            this.set('isSwitchedOn', false);\n            this.logger.debug('GEOLOCATION: Geolocation services are disabled for this org');\n        } else {\n            // In the case of another geolocation error, we assume that it is switched on, but unable\n            // to send from the browser.  In this case we want to still see other's and our own.\n            this.set('isSwitchedOn', true);\n            this.logger.error('GEOLOCATION: an error occurred saving current position', { error: e });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\n// service for tracking a group's assigned roles and those roles' associated divisions\nexport default Ember.Service.extend({\n    // key: \"The role id\n    // value: An object containing the following\n    //      id: \"The role id\"\n    //      role: \"The role object\"\n    //      divisions: \"An array of division objects assigned to the role\"\n    _map: {},\n\n    changeCount: 0,\n\n    list: Ember.computed('_map', 'changeCount', function () {\n        return _.map(this.get('_map'), roleWithDivisions => {\n            return roleWithDivisions;\n        });\n    }),\n\n    addRole(roleId, { divisions, id, role }) {\n        this.get('_map')[roleId] = { divisions, id, role };\n        this.incrementChangeCount();\n    },\n\n    removeRole(roleId) {\n        delete this.get('_map')[roleId];\n        this.incrementChangeCount();\n    },\n\n    getRoleWithDivisions(roleId) {\n        return this.get('_map')[roleId];\n    },\n\n    setMap(assignedRolesMap) {\n        this.clear();\n        this.set('_map', assignedRolesMap);\n    },\n\n    incrementChangeCount() {\n        this.set('changeCount', this.get('changeCount') + 1);\n    },\n\n    containsRole(roleId) {\n        return !!this.get('_map')[roleId];\n    },\n\n    clear() {\n        this.incrementChangeCount();\n        this.set('_map', {});\n    }\n});\n","define(\"connections-ui/services/headset\", [\"exports\", \"ember-softphone-integration/services/headset\"], function (_exports, _headset) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _headset.default;\n    }\n  });\n});\n","define(\"connections-ui/services/iframe-state\", [\"exports\", \"ember-purecloud-components/services/iframe-state\"], function (_exports, _iframeState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _iframeState.default;\n    }\n  });\n});\n","import Service from 'smoke-and-mirrors/services/in-viewport';\n\nexport default Service;\n","import Ember from 'ember';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport moment from 'connections-ui/utils/dates';\nimport { batchEntityIds } from './store';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\nconst { computed, inject } = Ember;\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst DEFAULT_PRESENCE_INTERVAL_SEC = 60;\nconst INTEGRATIONS_LOADED_EVENT = 'integrationsLoaded';\nconst PRESENCE_BATCH_SIZE_V2 = 25;\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\nconst USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT = 'gcucc.ui.useIntegrationPresenceSourceDirectorySearch';\nconst REDUCE_PRESENCE_POLLING_FT = 'gcucc-ui-PCUCC-3734';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    apps: inject.service(),\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    phoneIntegrations: inject.service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n    presencePollIntervalSec: DEFAULT_PRESENCE_INTERVAL_SEC,\n    presenceIntervalTimers: {},\n    presenceErrors: null,\n\n    presencePollInterval: computed('presencePollIntervalSec', function () {\n        return this.get('presencePollIntervalSec') * 1000;\n    }),\n\n    reducePresencePolling: computed('session.features', function () {\n        return this.getFeatureToggle(REDUCE_PRESENCE_POLLING_FT);\n    }),\n\n    useIntegrationPresenceDirectorySearch: Ember.computed('session.features', function () {\n        return this.getFeatureToggle(USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT);\n    }),\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    alreadyTriggeredPresenceInterval: false,\n\n    triggerPresenceInterval: Ember.on(\n        'init',\n        // set up an observer to fire when integrations change\n        Ember.observer('phoneIntegrations.integrations.[]', function () {\n            const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n            // only trigger presence interval if we haven't already and we have integrations\n            if (phoneIntegrations.length > 0 && !this.get('alreadyTriggeredPresenceInterval')) {\n                this.toggleProperty('alreadyTriggeredPresenceInterval');\n                this.trigger(INTEGRATIONS_LOADED_EVENT);\n            }\n        })\n    ),\n\n    presenceUpdateInterval: Ember.on(INTEGRATIONS_LOADED_EVENT, function () {\n        const phoneIntegrations = this.get('phoneIntegrations.integrations').filter(\n            integration => integration.pollingEnabled\n        );\n        if (phoneIntegrations.length > 0) {\n            phoneIntegrations.forEach(integration => this._managePolling(integration));\n        }\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('presenceErrors', {});\n\n        // remove intervals if 401 happens\n        this.get('session').on('invalidatingAuthSession', this.removeAllPresenceIntervals.bind(this));\n    },\n\n    _managePolling(integration) {\n        const interval =\n            integration.pollIntervalSec && integration.pollIntervalSec > 0\n                ? integration.pollIntervalSec\n                : DEFAULT_PRESENCE_INTERVAL_SEC;\n        const presenceTimer = Ember.run.later(\n            this,\n            function () {\n                this._handlePresenceInterval(integration);\n                this._managePolling(integration);\n            },\n            interval * 1000\n        );\n        if (!this.get(`presenceIntervalTimers.${integration.key}`)) {\n            this.get('logger').debug(`Starting presence interval for ${integration.key}`, { integration });\n            this.set(`presenceIntervalTimers.${integration.key}`, {\n                timer: presenceTimer,\n                hasSession: false\n            });\n        }\n    },\n\n    removeAllPresenceIntervals() {\n        const timers = this.get('presenceIntervalTimers');\n        this.get('logger').info('Stopping all presence intervals due to 401', {\n            intervals: this.get('presenceIntervalTimers')\n        });\n        Object.keys(timers).forEach(timerKey => {\n            Ember.run.cancel(this.get(`presenceIntervalTimers.${timerKey}`));\n        });\n    },\n    removePresenceInterval(integration) {\n        this.get('logger').info(`Stopping the presence interval for ${integration.key}`, {\n            integration\n        });\n        const timer = this.get(`presenceIntervalTimers.${integration.key}`);\n        Ember.run.cancel(timer);\n    },\n\n    async updateSessionData(integration) {\n        const url = this.get('application').pcV2Uri(\n            `api/v2/integrations/unifiedcommunications/${integration.key}/auth/users/status`\n        );\n        const sessionData = await this.get('ajax').request(url);\n        if (sessionData) {\n            if (sessionData.code === 'session.not.available') {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n            } else {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, true);\n            }\n        }\n        return sessionData;\n    },\n\n    async _handlePresenceInterval(integration) {\n        try {\n            if (this.get('reducePresencePolling')) {\n                const hasSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n                if (!hasSession) {\n                    await this.updateSessionData(integration);\n                    const fetchedSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n                    if (!fetchedSession) {\n                        return;\n                    }\n                }\n            }\n            // try looking at the cache instead of making an api call\n            const users = this.get('store').peekAll('person');\n            const currentDate = moment();\n            const filteredUsers = users.filter(\n                user =>\n                    user.integrationContactInfo(integration.key) !== undefined &&\n                    user.integrationContactInfo(integration.key) !== null\n            );\n\n            // filter users based on presence modified date\n            let integrationUsers = filteredUsers.filter(user => {\n                const modifiedDate = user.get('integrationPresence.modifiedDate');\n                if (!modifiedDate) {\n                    return true;\n                }\n                return modifiedDate && this._isPresenceStale(currentDate, modifiedDate);\n            });\n\n            if (integrationUsers.length > 0) {\n                const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n                let batchSize = PRESENCE_BATCH_SIZE_V2;\n                // batch integration user ids\n                const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n\n                const authError = await this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds);\n                if (authError) {\n                    this._handleAuthError(integration);\n                    if (this.get('reducePresencePolling')) {\n                        this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n                    }\n                }\n            } else {\n                // log no users found\n                this.get('logger').info(\n                    `services/phone-integration: (${integration.key}): Did not find users to refresh presence.`\n                );\n            }\n        } catch (err) {\n            // scary err happened, stop the interval\n            this.removePresenceInterval(integration);\n            this.get('logger').error(`services/phone-integration: error fetching presence in interval`, {\n                err\n            });\n        }\n    },\n\n    /**\n     * Handle batch presence requests\n     * @param {*} integration client app integration\n     * @param {*} batchedIds 2d array, inner array is list of integration user ids\n     * @param {*} authErrors list of client app integration's that errored on auth\n     */\n    async _handleBatchPresenceRequest(integration, integrationUsers, batchedIds, bypassCache = false) {\n        let authError;\n        for (let i = 0; i < batchedIds.length; i++) {\n            const ids = batchedIds[i];\n            const idParams = ids.join(',');\n            const ucIntegrationId = integration.key;\n            const requestLatest = bypassCache ? 'true' : 'false'; // tells api to bypass cache if true\n            const url = this.get('application').pcV2Uri(\n                `api/v2/integrations/unifiedcommunications/${ucIntegrationId}/presences?requestLatest=${requestLatest}&id=${idParams}`\n            );\n            // ucIntegrationId should be the integration.key\n            try {\n                const presenceUserList = await this.get('ajax').request(url);\n\n                // for each presence response, find the user\n                // and update the presence for that user\n                // each user is an Ember model object so should update entire app\n                presenceUserList.forEach(presenceResponse =>\n                    this._handleIndividualPresenceResponse(integrationUsers, presenceResponse)\n                );\n            } catch (err) {\n                if (\n                    err.payload &&\n                    err.payload.message === 'Session not available, new authorization code must be defined!'\n                ) {\n                    authError = err;\n                    this.get('logger').warn(\n                        `services/phone-integration: You are not authenticated with the following 3rd party integration: ${integration.key}`,\n                        {\n                            err\n                        }\n                    );\n                    break;\n                } else {\n                    throw err;\n                }\n            }\n        }\n        return authError;\n    },\n\n    /**\n     * Finds and updates presence for integration user.\n     * @param {*} integrationUsers list of integration users\n     * @param {*} presenceResponse individual presence response\n     */\n    _handleIndividualPresenceResponse(integrationUsers, presenceResponse) {\n        const user = integrationUsers.find(u => u.get('id') === Ember.get(presenceResponse, 'userId'));\n        if (user) {\n            const presence = {\n                source: Ember.get(presenceResponse, 'source'),\n                message: Ember.get(presenceResponse, 'message'),\n                modifiedDate: Ember.get(presenceResponse, 'modifiedDate'),\n                presenceDefinition: Ember.get(presenceResponse, 'presenceDefinition')\n            };\n            Ember.set(user, 'activities.integrationPresence', presence);\n        }\n    },\n\n    _handleAuthError(integration) {\n        const hasShownError = this.get(`presenceErrors.${integration.key}`);\n        if (!hasShownError) {\n            const title = this.get('intl').t('integrationPresence.errors.auth.title');\n            // show specific toast with action handler\n            let message = this.get('intl').t(`integrationPresence.errors.auth.${integration.key}.message`);\n            this.get('notification').show({\n                title: title,\n                message: message,\n                hideAfter: 8,\n                type: 'info',\n                clickHandler: () => {}\n            });\n            this.set(`presenceErrors.${integration.key}`, true);\n        }\n    },\n\n    async alterUsersWithIntegration(users) {\n        const groupedUsers = this._groupUsersByIntegration(users);\n        const presenceSources = Object.keys(groupedUsers);\n        const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n        const promises = presenceSources.map(presenceSource => {\n            const integration = phoneIntegrations.find(\n                phoneIntegration =>\n                    phoneIntegration.integrationPresenceSource.toLowerCase() === presenceSource.toLowerCase()\n            );\n            const integrationUsers = groupedUsers[presenceSource];\n            const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n            let batchSize = PRESENCE_BATCH_SIZE_V2;\n            // batch integration user ids\n            const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n            // ensure that bypassCache is true to get latest presence requests\n            return this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds, true);\n        });\n\n        try {\n            await Promise.all(promises);\n        } catch (err) {\n            this.get('logger').error('services/integrations-presence: error occurred with alterUsersWithIntegration', {\n                err\n            });\n        }\n\n        return users;\n    },\n\n    _groupUsersByIntegration(users) {\n        const usersGroupedByIntegration = {};\n\n        for (const user of users) {\n            let integrationPhone = Ember.get(user, 'integrationPhone');\n            let integrationKey = integrationPhone && integrationPhone.value.integration;\n            const integrationConfig = this.get('phoneIntegrations').getIntegration(integrationKey);\n            if (integrationConfig) {\n                const presenceSource = integrationConfig.integrationPresenceSource;\n                if (!usersGroupedByIntegration[presenceSource]) {\n                    usersGroupedByIntegration[presenceSource] = [];\n                }\n                usersGroupedByIntegration[presenceSource].push(user);\n            }\n        }\n\n        return usersGroupedByIntegration;\n    },\n\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.get('newRelicNamespace'), {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    },\n    _isPresenceStale(currentDate, modifiedDate) {\n        let diffInMS = moment(currentDate).diff(moment(modifiedDate));\n        return diffInMS > this.get('presencePollInterval');\n    },\n    _isGCOffline(user) {\n        const presenceDefinition = user.get('activities.presence.presenceDefinition');\n        return isPresence(this.get('session.presenceMap'), presenceDefinition, 'offline');\n    }\n});\n","import Ember from 'ember';\nexport default Ember.Service.extend({});\n","define(\"connections-ui/services/interval\", [\"exports\", \"ember-purecloud-components/services/interval\"], function (_exports, _interval) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _interval.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport IntlService from 'ember-intl/services/intl';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport config from 'connections-ui/config/environment';\nimport moment from 'connections-ui/utils/dates';\nimport escape from 'connections-ui/utils/escape';\nimport missingMessage from 'connections-ui/utils/intl/missing-message';\nimport { getEnvCookieDomain } from 'connections-ui/utils/net';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { get, inject, computed, RSVP } = Ember;\n\nconst addServerPrefix = function (key) {\n    return `server_translations.${key}`;\n};\n\nconst safeString = function (s) {\n    return Ember.String.htmlSafe(s);\n};\n\nconst rtlLangs = ['he', 'ar'];\n\n// Object [locale String]: languageName String\n// values come directly from each locale's `languageName` key\nconst languages = config.APP.INTL_LANGUAGES;\nconst localeCookie = 'pcAuth-userPrefLangTag';\nconst localeCookieOptions = {\n    path: '/',\n    expires: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000)\n    // expiration is 90 days into the future\n};\n\nexport default IntlService.extend({\n    ajax: inject.service(),\n    cookies: inject.service(),\n    application: inject.service(),\n\n    loaded: false,\n    loadedPromise: null,\n\n    languages,\n    baseLocale: 'en-us',\n    supportedLocales: Object.keys(languages),\n\n    systemLocale: computed('baseLocale', function () {\n        const { languages, language, userLanguage } = window.navigator;\n        const lang = Array.isArray(languages) && languages[0];\n        const navLocale = lang || language || userLanguage;\n        if (navLocale) {\n            return navLocale;\n        }\n        return this.get('baseLocale');\n    }),\n\n    isRTL: computed('isoLocale', function () {\n        const isoLocale = this.get('isoLocale');\n        return rtlLangs.includes(isoLocale);\n    }),\n\n    isoLocale: computed('locale.firstObject', function () {\n        return this.get('locale.firstObject');\n    }),\n\n    iso2LocaleCountry: computed('isoLocale', function () {\n        const isoLocale = this.get('isoLocale');\n        if (isoLocale) {\n            const countryData = window.intlTelInputGlobals.getCountryData();\n            const region = isoLocale.split('-')[1] || isoLocale;\n            if (region) {\n                return _.find(countryData, country => country && country.iso2 === region);\n            }\n        }\n        return null;\n    }),\n\n    isoRegionalLocale: computed('isoLocale', function () {\n        const [locale, region] = this.get('isoLocale').split('-');\n        if (region) {\n            return `${locale}-${region.toUpperCase()}`;\n        }\n        return locale;\n    }),\n\n    t(key, opts, noEscape) {\n        if (!key) {\n            Ember.Logger.warn('There was no key provided to translate.');\n            return '';\n        }\n\n        if (noEscape === true) {\n            return this._super(key, opts);\n        }\n        if (!opts) {\n            return this._super(key);\n        }\n\n        return this._super(key, escape(opts));\n    },\n\n    _initialLocale() {\n        const authLocale = this.get('cookies').read(localeCookie);\n        const systemLocale = this.get('systemLocale');\n        return authLocale || systemLocale;\n    },\n\n    _normalizeLocale(locale, localeRootFallback = true) {\n        locale = locale.toLowerCase().replace('_', '-');\n        if (locale.startsWith('en')) {\n            locale = 'en-us';\n        }\n        if (locale.startsWith('nn') || locale.startsWith('nb')) {\n            // Norwegian: nn-NO; nb-NO in Windows\n            locale = 'no';\n        }\n        const supportedLocales = this.get('supportedLocales');\n        if (!supportedLocales.includes(locale)) {\n            const rootLocale = locale.slice(0, 2);\n            if (supportedLocales.includes(rootLocale)) {\n                return rootLocale;\n            } else if (localeRootFallback) {\n                return supportedLocales.find(lang => {\n                    return lang.slice(0, 2) === rootLocale;\n                });\n            } else {\n                return null;\n            }\n        }\n        return locale;\n    },\n\n    getWithServerKey(key) {\n        return safeString(this.t(addServerPrefix(key)));\n    },\n\n    lookup(key, replacements, suppressError) {\n        if (this.exists(addServerPrefix(key))) {\n            return this.getWithServerKey(key);\n        }\n\n        if (!this.exists(key)) {\n            if (!isTesting && this.get('loaded')) {\n                Ember.Logger.warn('Undefined intl key', { key, locale: this.get('locale') });\n            }\n            return missingMessage(key, [this.get('locale')], suppressError);\n        }\n\n        //Achieves parity with old i18n functionality: all HTML was allowed in all translation strings\n        return safeString(this.t(key, replacements || {}));\n    },\n\n    query(key) {\n        return this.exists(key) || this.exists(addServerPrefix(key));\n    },\n\n    setLocale(locales) {\n        if (!Array.isArray(locales)) {\n            locales = [locales];\n        }\n\n        let validLocales = locales.map(l => this._normalizeLocale(l)).filter(l => l);\n\n        const baseLocale = this.get('baseLocale');\n        if (!validLocales.includes(baseLocale)) {\n            validLocales.push(baseLocale);\n        }\n\n        if (validLocales.length) {\n            // Set the moment locale\n            const lang = moment.locale(validLocales[0]);\n\n            // Set HTML locale (moment.locale returns just the language portion)\n            Ember.$('html').attr('lang', lang);\n        }\n\n        return this._super(validLocales);\n    },\n\n    setPreferredLanguage(locale) {\n        const safeLocale = this._normalizeLocale(locale);\n        if (!safeLocale) {\n            const error = new Error(`\"${locale}\" is not a supported locale.`);\n            return RSVP.reject(error);\n        }\n\n        try {\n            let dynamicCookieOptions = {\n                domain: getEnvCookieDomain()\n            };\n\n            if (window && window.location && window.location.protocol === 'https:') {\n                dynamicCookieOptions.secure = true;\n            }\n\n            if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n                dynamicCookieOptions.sameSite = 'none';\n            }\n\n            const options = Ember.assign(dynamicCookieOptions, localeCookieOptions);\n            this.get('cookies').write(localeCookie, safeLocale, options);\n\n            return RSVP.resolve();\n        } catch (e) {\n            let msg = 'Failed to persist new locale setting.';\n            if (e && e.message) {\n                msg += `  Details: ${e.message}`;\n            }\n            return RSVP.reject(new Error(msg));\n        }\n    },\n\n    isLocale12Hour() {\n        return moment.localeData(this.get('locale')).longDateFormat('LT').indexOf('A') > -1;\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_cache', {});\n        this.setLocale(this._initialLocale());\n\n        const defer = RSVP.defer();\n        this.setProperties({\n            _loadedResolve: defer.resolve,\n            loadedPromise: defer.promise\n        });\n    },\n\n    loadLanguage(locale) {\n        return this.get('ajax')\n            .request(`${this.get('application.urlprefix')}translations/${locale}.json`, { contentType: 'text/plain' })\n            .then(text => {\n                if (!text) {\n                    return RSVP.resolve();\n                }\n\n                try {\n                    // gotta be careful here...\n                    let lang = text;\n                    if (typeof text === 'string') {\n                        lang = JSON.parse(text);\n                    }\n                    if (lang) {\n                        get(this, '_cache')[locale] = lang;\n                        return this.addTranslations(locale, lang);\n                    }\n                } catch (e) {\n                    return RSVP.resolve();\n                }\n            });\n    },\n\n    loadTranslations() {\n        const baseLocale = this.get('baseLocale');\n        const isoLocale = this.get('isoLocale');\n        const locales = [baseLocale];\n        if (isoLocale !== baseLocale) {\n            locales.push(isoLocale);\n        }\n        const translations = locales.map(locale => {\n            let cache = get(this, '_cache');\n            const cached = get(cache, locale);\n            if (cached) {\n                return Ember.RSVP.resolve(cached);\n            }\n            return this.loadLanguage(locale);\n        });\n        return Ember.RSVP.all(translations).then(() => {\n            this.set('loaded', true);\n            this.get('_loadedResolve')();\n        });\n    },\n\n    setupServerTranslations() {\n        // go ahead and kick off local file loading\n        this.loadTranslations();\n\n        const locale = this.get('isoLocale');\n        const url = this.get('application').pcV2Uri('api/v2/languages/translations/organization');\n\n        const defaultRequest = this.get('ajax').request(url, {\n            data: {\n                language: 'en-us'\n            }\n        });\n\n        let localeRequest = Ember.RSVP.resolve({});\n        if (locale !== 'en-us') {\n            localeRequest = this.get('ajax').request(url, {\n                data: {\n                    language: locale\n                }\n            });\n        }\n\n        return Ember.RSVP.allSettled([defaultRequest, localeRequest])\n            .then(([defaultTranslationsResult, localeTranslationsResult]) => {\n                const defaultTranslations = defaultTranslationsResult.value;\n                const localeTranslations = localeTranslationsResult.value;\n\n                if (!defaultTranslations) {\n                    Ember.Logger.warn(\"Couldn't load API translations\", {\n                        remoteData: {\n                            reason: defaultTranslationsResult.reason\n                        }\n                    });\n                    return;\n                }\n\n                if (_.isEmpty(localeTranslations)) {\n                    return this.addTranslations(locale, { server_translations: defaultTranslations });\n                }\n\n                _.forIn(defaultTranslations, (value, key) => {\n                    if (!Object.prototype.hasOwnProperty.call(localeTranslations, key)) {\n                        localeTranslations[key] = value;\n                    }\n                });\n\n                return this.addTranslations(locale, { server_translations: localeTranslations });\n            })\n            .catch(err => {\n                Ember.Logger.warn(\"Couldn't load API translations:\", { err });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { PROVIDER_ID as INTERNAL_VIDEO_PROVIDER_ID } from 'connections-ui/media-providers/purecloud';\nimport LoggerMixin from '../mixins/logger';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n\n    defaultVideoProviders: null,\n\n    activeProvider: null,\n\n    getProvidersForUser(type, user, chatRoom) {\n        if (type === 'video') {\n            return this.getVideoProviders(user, chatRoom);\n        }\n        return [];\n    },\n\n    getProvider(name, user) {\n        return this.lookup(name, user);\n    },\n\n    getVideoProviders(user, chatRoom = null) {\n        if (!user && !chatRoom) {\n            return [];\n        }\n\n        return [\n            this.lookup('purecloud', user, chatRoom),\n            this.lookup('zoom', user, chatRoom),\n            this.lookup('teams', user, chatRoom)\n        ];\n    },\n\n    usingVideoProvider: Ember.computed('activeProvider.type', function () {\n        return this.get('activeProvider.type') === 'video';\n    }),\n\n    enabled: Ember.computed.or('teamsEnabled', 'zoomMeetingsEnabled'),\n    zoomMeetingsEnabled: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    teamsEnabled: Ember.computed.readOnly('permissions.canViewTeamsMeetings'),\n\n    // Internal\n\n    handleLogout(blockLogoutCb) {\n        if (this.get('usingVideoProvider')) {\n            blockLogoutCb('add', this);\n\n            let title = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.title');\n            let message = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.message');\n            this.get('notification').error(title, message);\n        } else {\n            blockLogoutCb('remove', this);\n        }\n    },\n\n    lookup(providerName, user, chatRoom) {\n        const provider = Ember.getOwner(this).lookup(`media-provider:${providerName}`);\n        provider.set('user', user);\n        provider.set('room', chatRoom);\n        provider.set('debug', this.get('debug'));\n        provider.loadData();\n        return provider;\n    },\n\n    userHasVideoMediaProviders(user) {\n        const providers = this.getProvidersForUser('video', user).filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }\n});\n\n/**\n * Returns true if the provided list of providers contains an enabled,\n * supplemental (e.g. teams, zoom) video provider.\n * @param {Ember.Object[]} providers A list of provider Ember instances\n * @returns true if providers contains an enabled, supplemental provider;  false otherwise.\n */\nexport function hasSupplementalVideoProvider(providers) {\n    return providers.some(\n        currProvider =>\n            currProvider.get('type') === 'video' &&\n            currProvider.get('haveAccess') &&\n            currProvider.get('id') &&\n            currProvider.get('id') !== INTERNAL_VIDEO_PROVIDER_ID\n    );\n}\n","import Ember from 'ember';\nimport ENV from '../config/environment';\n\nconst { computed, Service } = Ember;\n\nfunction computedFromConfig(prop) {\n  return computed(function(){\n    return ENV['ember-modal-dialog'] && ENV['ember-modal-dialog'][prop];\n  });\n}\n\nexport default Service.extend({\n  hasEmberTether: computedFromConfig('hasEmberTether'),\n  hasLiquidWormhole: computedFromConfig('hasLiquidWormhole'),\n  hasLiquidTether: computedFromConfig('hasLiquidTether'),\n  destinationElementId: computed(function() {\n    /*\n      everywhere except test, this property will be overwritten\n      by the initializer that appends the modal container div\n      to the DOM. because initializers don't run in unit/integration\n      tests, this is a nice fallback.\n    */\n    if (ENV.environment === 'test') {\n      return 'ember-testing';\n    }\n  })\n});\n","import Ember from 'ember';\nimport MomentService from 'ember-moment/services/moment';\nimport config from '../config/environment';\n\nconst { get } = Ember;\n\nexport default MomentService.extend({\n  defaultFormat: get(config, 'moment.outputFormat')\n});\n","import Ember from 'ember';\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    _getNamePart: function (externalContact, namePart) {\n        const result = externalContact[namePart];\n        return (\n            (typeof result === 'string' ? result : false) || (externalContact.get ? externalContact.get(namePart) : '')\n        );\n    },\n\n    _getNames: function (externalContact) {\n        return {\n            familyName: this._getNamePart(externalContact, 'lastName'),\n            givenName: this._getNamePart(externalContact, 'firstName')\n        };\n    },\n\n    initials: function (externalContact) {\n        // TODO: RELATE-1038 UI - ACD Need to localize the code for harvesting initials for display when transferring a call to a Relate External contact\n        const { familyName, givenName } = this._getNames(externalContact);\n\n        if (givenName) {\n            const givenNameInitial = givenName.charAt(0).toUpperCase();\n            if (familyName) {\n                const familyNameInitial = familyName.charAt(0).toUpperCase();\n                return this.get('intl').t('purecloud.acdInteraction.relate.misc.initials', {\n                    givenNameInitial,\n                    familyNameInitial\n                });\n            }\n            return givenNameInitial;\n        }\n        if (familyName) {\n            return familyName.charAt(0).toUpperCase();\n        }\n        return '';\n    },\n\n    fullName: function (externalContact) {\n        if (!externalContact) {\n            return;\n        }\n\n        const { familyName, givenName } = this._getNames(externalContact);\n        const optionalMiddleName = this._getNamePart(externalContact, 'middleName') || null;\n        if (familyName) {\n            if (givenName) {\n                return this.get('intl').lookup('purecloud.acdInteraction.relate.misc.fullName', {\n                    familyName,\n                    givenName,\n                    optionalMiddleName\n                });\n            } else {\n                return familyName;\n            }\n        }\n        return givenName;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Evented } = Ember;\n\nexport default Ember.Service.extend(Evented, {\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _notificationId: 0,\n    _actionHandles: {},\n    _clickHandlers: [],\n\n    nextNotificationId: Ember.computed('_notificationId', function () {\n        const currentNotificationId = this.get('_notificationId');\n        return (currentNotificationId || 0) + 1;\n    }),\n\n    _cleanUpHandlers(id) {\n        const handles = this.get('_actionHandles');\n        delete handles[id];\n    },\n\n    handleNotificationAction(action, id) {\n        const handles = this.get('_actionHandles');\n        const clickHandlers = this.get('_clickHandlers');\n\n        if (handles[id]) {\n            const handler = _.find(handles[id], v => {\n                return v.actionKey === action;\n            });\n\n            if (handler && typeof handler.action === 'function') {\n                handler.action(handler.target);\n                this._cleanUpHandlers(id);\n            } else if (handler && handler.target && handler.target[handler.actionKey]) {\n                handler.target[handler.actionKey](handler.target);\n                this._cleanUpHandlers(id);\n            } else {\n                this.get('logger').error('Attempted to invoke undefined notification handler.');\n            }\n\n            this.set('_actionHandles', handles);\n        }\n\n        if (action === 'clickHandlerTriggered') {\n            if (typeof clickHandlers[id] === 'function') {\n                clickHandlers[id]();\n            } else {\n                this.get('logger').error(\n                    `Attempted to trigger a click handler that isnt a function or was not registered. Click handler at id: ${id} is ${clickHandlers[\n                        id\n                    ].toString()}\\n`\n                );\n            }\n        }\n    },\n\n    requestNotification(title, message = '', custom = {}, type = 'info') {\n        let options = _.pick(custom, [\n            'id',\n            'hideAfter',\n            'tag',\n            'type',\n            'forceBrowserNotification',\n            'icon',\n            'showCloseButton',\n            'messageStyle',\n            'shouldShowPopup',\n            'shouldPlaySound',\n            'markdownToHtml',\n            'fallbackToInBrowser',\n            'showNotificationEverywhere'\n        ]);\n\n        // Legacy api was tag only. Copy as id for events, etc.\n        if (options.tag && !options.id) {\n            options.id = options.tag;\n        }\n\n        // Escape safe srings\n        if (title && title.string) {\n            title = title.string;\n        }\n\n        // Set notification id\n        if (!options.id) {\n            const nextNotificationId = this.get('nextNotificationId');\n            const generatedIdentifier = `connections-ui-notification-${nextNotificationId}`;\n\n            // Add an ID to the notification so it can be associated with notification actions from the iframe host\n            options.id = generatedIdentifier;\n            options.tag = generatedIdentifier;\n\n            // Messages after this one should have a different gnerated identifier\n            this.incrementProperty('_notificationId');\n        }\n\n        if (custom.clickHandler) {\n            let clickHandlers = this.get('_clickHandlers') || [];\n            let clickHandlerFunction = custom.clickHandler;\n            let id = options.id;\n            if (!clickHandlers[id] && typeof clickHandlerFunction === 'function') {\n                clickHandlers[id] = clickHandlerFunction;\n            }\n            options.clickHandler = true;\n        }\n\n        // Store action handles\n        if (custom.actionHandlers && custom.target) {\n            let handles = this.get('_actionHandles') || [];\n            let id = options.id;\n\n            if (!handles[id]) {\n                handles[id] = {};\n            }\n\n            // Normalize and store handlers\n            _.forEach(custom.actionHandlers, (value, key) => {\n                let action, label;\n                if (value.action) {\n                    action = value.action;\n                    label = value.label;\n                } else {\n                    action = '';\n                    label = value;\n                }\n\n                handles[id][key] = {\n                    actionKey: key,\n                    action: action,\n                    target: custom.target,\n                    label: label\n                };\n            });\n\n            this.set('_actionHandles', handles);\n\n            // Normalize labels before sending to web-dir\n            let handlers = {};\n            _.forEach(custom.actionHandlers, (value, key) => {\n                if (value.action) {\n                    handlers[key] = value.label;\n                } else {\n                    handlers[key] = value;\n                }\n            });\n\n            options.actionHandlers = handlers;\n        }\n\n        options.type = type;\n\n        const notification = {\n            message,\n            custom: options\n        };\n\n        if (title) {\n            notification.title = title;\n        }\n        this.get('embedded').requestNotification(notification);\n        return notification;\n    },\n\n    info(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').info(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'info');\n    },\n\n    error(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').error(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'error');\n    },\n\n    success(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').success(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'success');\n    },\n\n    dismiss(id) {\n        if (!this.get('embedded.isEmbedded')) {\n            this._cleanUpHandlers(id);\n            return this.get('notification').dismissNotification(id);\n        }\n        this.get('embedded').dismissNotification(id);\n    },\n\n    // TODO: we'll need to replumb defined action handlers\n    // on this legacy option for things like answering from toasts\n    show(options) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').show(options);\n        }\n        return this.requestNotification(options.title, options.message, options, options.type);\n    }\n});\n","define(\"connections-ui/services/notification\", [\"exports\", \"ember-purecloud-components/services/notification\"], function (_exports, _notification) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notification.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst {\n    inject: { service },\n    RSVP: { resolve }\n} = Ember;\n\nexport default Ember.Service.extend(LoggerMixin, {\n    ajax: service(),\n    application: service(),\n\n    /**\n     * Fetches organization settings from the API\n     * @returns {Promise} A promise that resolves with the updated preferences\n     */\n    fetchOrgSettings(orgSettings) {\n        const path = 'api/v2/organizations/settings';\n        const url = this.get('application').pcV2Uri(path);\n\n        return this.get('ajax')\n            .ajaxGet(url)\n            .then(response => {\n                // Create or update the orgSettings object\n                if (!orgSettings) {\n                    orgSettings = Ember.Object.create();\n                }\n\n                orgSettings.set('freeSeating', response.freeSeating);\n                orgSettings.set('popoutAuthForIframes', response.popoutAuthForIframes);\n\n                return orgSettings;\n            })\n            .catch(error => {\n                this.logger.error('Failed to fetch org settings:', { error });\n                return resolve({});\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, Service } = Ember;\nconst WILDCARD = '*';\n\nfunction isPermissionInList(item, targetList) {\n    let inList = item === WILDCARD || targetList === WILDCARD;\n\n    if (!inList) {\n        const listItems = targetList.split(',');\n\n        inList = _.includes(listItems, item);\n    }\n\n    return inList;\n}\n\n/**\n * Compare provided permission divisions against a secific division\n *\n * @item the division to look for\n * @targetList comma-delimited string representation of permission divisions\n */\nfunction shouldAllowBasedOnDivision(item, targetList) {\n    // if the wildcard is present in permission list\n    // if no divisions are returned from PAPI\n    // if the requested division is the WILDCARD\n    // if the requested division was an empty string\n    // -- bypass the division check\n    if (targetList.length === 0 || targetList === WILDCARD || item === WILDCARD || item.length === 0) {\n        return true;\n    }\n\n    const divisions = targetList.split(',');\n    return divisions.includes(item);\n}\n\nfunction isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction) {\n    let domainPermissionMap = _.head(_.map(_.filter(allowedOrgPermissions, { domain: targetDomain }), 'permissionMap'));\n\n    domainPermissionMap = _.flatten(_.map(domainPermissionMap, value => value));\n\n    return (\n        domainPermissionMap &&\n        domainPermissionMap.length &&\n        (targetEntity === WILDCARD || _.find(domainPermissionMap, { entityType: targetEntity })) &&\n        (targetAction === WILDCARD || _.find(domainPermissionMap, { action: targetAction }))\n    );\n}\n\nexport function checkDonutPermission(permissions, permissionValue, allowedOrgPermissions, targetDivision) {\n    let isAllowed = false;\n\n    if (!permissions) {\n        permissions = [];\n    }\n\n    //change domain:* -> domain:*:*\n    if (permissionValue.match(/^[a-zA-Z0-9]+:\\*$/)) {\n        permissionValue = permissionValue.replace('*', '*:*');\n    }\n\n    const permissionsToValidate = permissionValue.split(':'),\n        targetDomain = permissionsToValidate[0],\n        targetEntity = permissionsToValidate[1],\n        targetAction = permissionsToValidate[2];\n\n    if (isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction)) {\n        permissions.forEach(function (permission) {\n            const permissions = permission.split(':'),\n                domain = permissions[0],\n                entity = permissions[1],\n                actionSet = permissions[2],\n                divisions = permissions[3] || '';\n\n            if (targetDomain === domain) {\n                const matchesEntity = isPermissionInList(targetEntity, entity);\n                const matchesAction = isPermissionInList(targetAction, actionSet);\n                const matchesDivision = shouldAllowBasedOnDivision(targetDivision, divisions);\n\n                if (matchesEntity && matchesAction && matchesDivision) {\n                    isAllowed = true;\n                }\n            }\n        });\n    }\n\n    return isAllowed;\n}\n\nexport default Service.extend(LoggerMixin, {\n    session: inject.service(),\n\n    permissions: computed.reads('session.permissions'),\n    rolePermissions: computed.reads('session.roleNames'), //Deprecated\n    allowedOrgPermissions: computed.reads('session.allowedOrgPermissions'),\n    trusteeOrg: computed.reads('session.trusteeOrg'),\n\n    hasUnifiedCommunications: computed('session.org.hasUnifiedCommunications', 'trusteeOrg', function () {\n        return !!(\n            this.get('session.org.hasUnifiedCommunications') || this.get('trusteeOrg.features.unifiedCommunications')\n        );\n    }),\n\n    directoryPermissions: computed('permissions.[]', function () {\n        const permissions = this.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, '_');\n        });\n    }),\n\n    donutPermissions: computed('permissions.[]', function () {\n        const permissions = this.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, ':');\n        });\n    }),\n\n    validateDonutPermission: function (permission, division = '*') {\n        const isAuthenticated = this.get('session.isAuthenticated');\n        const logger = this.get('logger');\n\n        if (!isAuthenticated) {\n            logger.debug('attempted to check a permission before authenticated', { permission });\n        }\n\n        if (typeof division !== 'string') {\n            logger.error('Division argument for permission check must be a string.');\n            return false;\n        }\n\n        return checkDonutPermission(\n            this.get('donutPermissions'),\n            permission,\n            this.get('allowedOrgPermissions'),\n            division.trim()\n        );\n    },\n\n    validateAllPermissions: function (permissionsList) {\n        return (permissionsList || []).every(permission => this.validateDonutPermission(permission));\n    },\n\n    validateAnyPermissions: function (permissionsList) {\n        const permissionsSet = permissionsList || [];\n        return permissionsSet.some(permission => this.validateDonutPermission(permission));\n    },\n\n    canCreateGroups: computed('directoryPermissions.[]', 'donutPermissions.[]', function () {\n        const permissions = this.get('directoryPermissions');\n        const hasDirectoryPermissions =\n            _.includes(permissions, 'group_creation') || _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:add');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canDeleteGroups: computed('directoryPermissions.[]', 'donutPermissions', function () {\n        const permissions = this.get('directoryPermissions');\n        const hasDirectoryPermissions = _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:edit');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canInvitePeople: computed('directoryPermissions.[]', function () {\n        const permissions = this.get('directoryPermissions');\n        return _.includes(permissions, 'person_administration');\n    }),\n\n    canViewQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:view');\n    }),\n\n    canViewQueueObservations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:queueObservation:view');\n    }),\n\n    canViewAcdScreenShare: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('acdscreenshare:session:view');\n    }),\n\n    canViewAcdCoBrowseForCall: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:voice:escalate')\n        );\n    }),\n\n    canViewAcdCoBrowseForChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:chat:escalate')\n        );\n    }),\n\n    canViewBusinessChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:chat:access');\n    }),\n\n    canViewCollaborateVideo: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('video:video:access');\n    }),\n\n    hasVoicemailAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('voicemail:*:*');\n    }),\n\n    canViewAnAgentsSchedule: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            (this.validateDonutPermission('wfm:activityCode:administer') ||\n                this.validateDonutPermission('wfm:activityCode:view')) &&\n            (this.validateDonutPermission('wfm:schedule:administer') ||\n                this.validateDonutPermission('wfm:schedule:view')) &&\n            this.get('hasAgentSupervisorAccess')\n        );\n    }),\n\n    hasAgentSupervisorAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('ui:supervisorAgentDetails:view') && this.get('canViewUsers');\n    }),\n\n    hasRelateAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:*:*');\n    }),\n\n    hasExternalContactsViewContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:view');\n    }),\n\n    // Checking against the donut permission: conversation:call:add or unified_communications\n    // Eventually when unified_communications is removed, we can remove the check here\n    phoneEnabled: computed(\n        'hasUnifiedCommunications',\n        'donutPermissions',\n        'directoryPermissions.[]',\n        'allowedOrgPermissions.[]',\n        function () {\n            const hasUnifiedCommunications = this.get('hasUnifiedCommunications');\n            const legacyUnifiedCommunicationsPermission = _.includes(\n                this.get('directoryPermissions'),\n                'unified_communications'\n            );\n            const canCall = this.validateDonutPermission('conversation:call:add');\n\n            const phoneEnabled = hasUnifiedCommunications && (legacyUnifiedCommunicationsPermission || canCall);\n            return phoneEnabled;\n        }\n    ),\n\n    conferenceEnabled: true,\n\n    canCallForward: computed('phoneEnabled', 'donutPermissions', 'allowedOrgPermissions.[]', function () {\n        return this.validateDonutPermission('conversation:callForwarding:edit') && this.get('phoneEnabled');\n    }),\n\n    canRecord: computed('rolePermissions', 'donutPermisions', 'allowedOrgPermissions.[]', function () {\n        const canRecord = this.validateDonutPermission('conversation:call:record');\n        const isBusinessUserOrSupervisor =\n            this.get('rolePermissions').indexOf('businessUser') > -1 ||\n            this.get('rolePermissions').indexOf('supervisor') > -1;\n        return isBusinessUserOrSupervisor || canRecord;\n    }),\n\n    hasEngageAccess: computed('session.org.enabledFeatures.{purecloud,contactCenter}', function () {\n        let hasContactCenter = this.get('session.org').getFieldValue('enabledFeatures.contactCenter');\n        return hasContactCenter && hasContactCenter.value;\n    }),\n\n    canViewUsers: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    canEditProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:edit');\n    }),\n\n    canReadProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    canViewGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:view');\n    }),\n\n    canEditGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:edit');\n    }),\n\n    canDeleteParticipantFromGroup: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:participant:delete');\n    }),\n\n    canViewZoomMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:zoomMeetings:view');\n    }),\n\n    canViewTeamsMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:microsoftTeamsMeetings:view');\n    }),\n\n    canTargetUserSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canTargetQueueSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canViewIntegrationPresence: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('integration:presence:view');\n    }),\n\n    canViewUCIntegrations: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:unifiedCommunications:view');\n    }),\n\n    canViewPresenceDefinition: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('presence:presenceDefinition:view');\n    }),\n\n    canViewSummary: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:summary:view');\n    }),\n\n    canEditGroupTelephonySettings: computed(\n        'donutPermissions',\n        'allowedOrgPermissions',\n        'session.features',\n        function () {\n            return this.validateDonutPermission('telephony:plugin:all');\n        }\n    )\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nconst { computed, inject } = Ember;\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst CONFIG_PAGE_SIZE = 25;\nconst CONFIGS_API_URL_V2 = 'api/v2/integrations/unifiedcommunications/clientapps'; // New integrations config endpoint\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    integrationsPresence: inject.service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n\n    integrations: computed('allApps', 'permissions.donutPermissions', 'permissions.allowedOrgPermissions', function () {\n        const allApps = this.get('allApps');\n        return allApps.filter(this._isValidIntegrationTab.bind(this));\n    }),\n\n    allApps: [],\n    integrationConfigs: [],\n\n    onAuthenticated: Ember.on(\n        'init',\n        Ember.observer('session.isAuthenticated', async function () {\n            // only try to fetch configs if we're authenticated\n            if (this.get('session.isAuthenticated') && !this.get('integrationConfigsInitialized')) {\n                this.toggleProperty('integrationConfigsInitialized');\n\n                this._fetchConfigs()\n                    .then(configs => {\n                        this.set('integrationConfigs', configs);\n\n                        // configs have enough information to gate users\n                        this.set('allApps', configs);\n                    })\n                    .catch(err => {\n                        this.get('logger').error(\n                            `services/phone-integration: Phone Integration Service: error fetching integration configurations`,\n                            { err }\n                        );\n                    });\n            }\n        })\n    ),\n\n    init() {\n        this._super(...arguments);\n\n        // use this to trigger observer to fetch configs\n        this.get('session.isAuthenticated');\n    },\n    getIntegrationTabs() {\n        const integrations = this.get('integrations');\n        const tabs = [\n            GENESYS_SEARCH_TAB,\n            ...integrations.map(integration => {\n                return {\n                    key: integration.key,\n                    integrationPresenceSource: integration.integrationPresenceSource,\n                    icon: integration.icon,\n                    translation: integration.translation\n                };\n            })\n        ];\n        return integrations.length > 0 ? tabs : [];\n    },\n    getIntegration(key) {\n        const integrations = this.getIntegrationTabs();\n        return integrations.find(i => i.key === key);\n    },\n\n    canViewThirdPartyPresence(source) {\n        const integration = this.getIntegrationFromSource(source);\n        return integration && this._isValidIntegrationTab(integration);\n    },\n\n    getIntegrationFromSource(source) {\n        const allApps = this.get('allApps');\n        return allApps.find(integration => {\n            return (\n                integration.integrationPresenceSource &&\n                integration.integrationPresenceSource.toLowerCase() === source.toLowerCase()\n            );\n        });\n    },\n\n    async getIntegrationTransferTarget(person, integrationKey) {\n        if (!person || !person.integrationContactInfo || !integrationKey) {\n            return null;\n        }\n\n        let contact = person.integrationContactInfo(integrationKey);\n        if (contact) {\n            try {\n                // make users api call to get address\n                const url = this.get('application').pcV2Uri(`api/v2/users/${person.get('id')}`);\n                const user = await this.get('ajax').ajaxGet(url, { dataType: 'json' });\n                const addressObj = user.addresses.find(add => add.integration && add.integration === integrationKey);\n                if (addressObj) {\n                    return addressObj.address;\n                }\n            } catch (err) {\n                // if error, we'll fallback to how we were initially attempting with e164 data\n                this.logger.warn(\n                    'PBX Transfer: attempted to fetch user address, but failed. Falling back to e164 data.',\n                    {\n                        err\n                    }\n                );\n            }\n\n            // fallback\n            if (contact.rel && contact.rel.e164) {\n                return contact.rel.e164;\n            } else {\n                this.logger.warn('Attempted transfer to integration user, but e164 data not found:', {\n                    remoteData: {\n                        userId: person.get('id'),\n                        integration: integrationKey\n                    }\n                });\n            }\n        }\n        return null;\n    },\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    _fetchConfigs() {\n        let allConfigsPromise = new Ember.RSVP.Promise((resolve, reject) => {\n            this._accumulateConfigs(\n                configs => {\n                    resolve(configs);\n                },\n                reason => {\n                    reject(reason);\n                },\n                1,\n                CONFIG_PAGE_SIZE,\n                null\n            );\n        });\n        return allConfigsPromise;\n    },\n\n    /**\n     * Recursively get integration configuration objects.\n     * @param {function} resolve resolver function to call with the configurations as the parameter\n     * @param {function} reject rejection function to call with the rejection reason as the parameter\n     * @param {number} pageNumber current page number\n     * @param {number} pageSize current page size\n     * @param {object} configs accumulated configuration objects\n     */\n    _accumulateConfigs(resolve, reject, pageNumber, pageSize, configs) {\n        if (typeof configs === 'undefined' || configs === null) {\n            configs = [];\n        }\n        let configsUrl = this.get('application').pcV2Uri(CONFIGS_API_URL_V2);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        configsUrl += `?${Ember.$.param(queryParams, true)}`;\n        if (!this.get('permissions.canViewUCIntegrations')) {\n            resolve(configs); //empty result because no permission\n            return;\n        }\n        this.get('ajax')\n            .request(configsUrl)\n            .then(result => {\n                if (!result) {\n                    reject('Invalid integration configs return value');\n                    return;\n                }\n                if (Array.isArray(result.entities)) {\n                    let validConfigObjs = _.chain(result.entities)\n                        .filter(config => this._isValidIntegrationConfig(config))\n                        .map(config => this._mapIntegrationConfig(config))\n                        .value();\n\n                    configs.push(...validConfigObjs);\n                }\n                // continue accumulating configs if more pages exist\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateConfigs(resolve, reject, result.pageNumber + 1, pageSize, configs);\n                } else {\n                    resolve(configs);\n                }\n            })\n            .catch(reject);\n    },\n\n    _isValidIntegrationConfig(config) {\n        return (\n            config &&\n            typeof config === 'object' &&\n            Ember.typeOf(Ember.get(config, 'id')) === 'string' &&\n            Ember.typeOf(Ember.get(config, 'ucIntegrationKey.id')) === 'string'\n        );\n    },\n\n    _mapIntegrationConfig(config) {\n        const key = Ember.get(config, 'ucIntegrationKey.id');\n\n        const i10n = Ember.get(config, 'i10n');\n        const systemLocale = this.get('intl.systemLocale').toLowerCase();\n        let translation = key;\n\n        if (i10n !== undefined) {\n            if (i10n[systemLocale] && i10n[systemLocale].name) {\n                translation = i10n[systemLocale].name;\n            }\n        }\n\n        return {\n            id: Ember.get(config, 'id'),\n            key,\n            integrationPresenceSource: Ember.get(config, 'integrationPresenceSource'),\n            icon: Ember.get(config, 'icon.vector'),\n            badgeIcons: {\n                light: Ember.get(config, 'badgeIcons.light.vector'),\n                dark: Ember.get(config, 'badgeIcons.dark.vector')\n            },\n            translation,\n            pbxPermission: Ember.get(config, 'pbxPermission'),\n            pollingEnabled: Ember.get(config, 'polledPresence'),\n            pollIntervalSec: Ember.get(config, 'pollIntervalSec'),\n            includeBadge: Ember.get(config, 'includeBadge')\n        };\n    },\n\n    _isValidIntegrationTab(clientApp) {\n        const key = Ember.get(clientApp, 'key');\n        const hasUcIntegrationKey = key && key !== '';\n        const pbxPermission = Ember.get(clientApp, 'pbxPermission');\n        // gate the integration tab based on pbx permission\n        if (pbxPermission !== undefined) {\n            const permissionService = this.get('permissions');\n            const canViewPbxTab = permissionService.validateDonutPermission(pbxPermission);\n            return hasUcIntegrationKey && canViewPbxTab;\n        }\n        return hasUcIntegrationKey;\n    },\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.get('newRelicNamespace'), {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\n\n// models\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\n\n// mixins\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport AcdUtilitiesMixin from 'connections-ui/mixins/acd-utilities';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport UriBuilderMixin from 'connections-ui/mixins/conversation-uri-builder';\nimport ActiveCallMixin from 'connections-ui/mixins/phone-service/active-call';\nimport CallControlsMixin from 'connections-ui/mixins/phone-service/call-controls';\nimport CallForwardMixin from 'connections-ui/mixins/phone-service/call-forward';\nimport ConversationManagerMixin from 'connections-ui/mixins/phone-service/conversation-manager';\nimport EventsMixin from 'connections-ui/mixins/phone-service/events';\nimport PhoneNotificationsMixin from 'connections-ui/mixins/phone-service/notifications';\nimport StationMixin from 'connections-ui/mixins/phone-service/station';\n\n// utils\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport QueuedProcessingChain from 'connections-ui/utils/queued-processing-chain';\n\nexport function isDefinedAndLengthGreaterThan(obj, n) {\n    if (obj) {\n        if (!obj.length) {\n            return false;\n        } else if (obj.length > n) {\n            return true;\n        }\n        return false;\n    }\n    return false;\n}\nconst { computed, inject, observer, Evented, Logger } = Ember;\n\nconst VOICEMAIL_URL = '@127.0.0.1;user=voicemail';\n\nconst mixins = [\n    AcdUtilitiesMixin,\n    ActiveCallMixin,\n    CallControlsMixin,\n    CallForwardMixin,\n    ConversationMixin,\n    ConversationManagerMixin,\n    EventsMixin,\n    LoggerMixin,\n    PhoneNotificationsMixin,\n    StationMixin,\n    UriBuilderMixin\n];\n\nexport default Ember.Service.extend(Evented, ...mixins, {\n    isDefinedAndLengthGreaterThan: isDefinedAndLengthGreaterThan,\n\n    // services\n    session: inject.service(),\n    application: inject.service(),\n    pigeon: inject.service(),\n    streaming: inject.service(),\n    communication: inject.service(),\n    permissions: inject.service(),\n    webrtc: inject.service(),\n    intl: inject.service(),\n    addressformat: inject.service(),\n    notification: inject.service('notification-proxy'),\n    ajax: inject.service(),\n    preferences: inject.service(),\n    externalContacts: inject.service(),\n    headset: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    applicationController: null, // needed?\n\n    _processingChain: null,\n    _contactObservers: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n        this._initializeProcessingChain();\n        try {\n            this.get('preferences')\n                .getPreference('phone.thisBrowserIsTheOneToAnswerFrom')\n                .then(value => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('thisBrowserIsTheOneToAnswerFrom', value);\n                    }\n                });\n\n            this.get('communication').on('callTransferred', this, this._handleCallTransferred);\n        } catch (err) {\n            if (!isTesting) throw err;\n        }\n    },\n\n    _initializeProcessingChain() {\n        const interactionProcessingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'phone service: interaction processing chain'\n        });\n        this.set('_processingChain', interactionProcessingChain);\n        interactionProcessingChain.setProcessingChain([\n            {\n                label: 'Filtering and Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) return false;\n\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    if (\n                        !interactionType.isCall ||\n                        (interactionType.isCall && interactionType.isCallback) ||\n                        interactionType.isFax\n                    ) {\n                        return false;\n                    }\n\n                    const calls = this.get('conversations');\n                    let interactionModel = calls.findBy('id', payload.id);\n                    const newInteraction = !interactionModel;\n                    const prevRaw = interactionModel && interactionModel.get('__interaction_metadata__');\n                    const currentCallState = interactionModel ? this._getCallState(interactionModel) : null;\n                    const participants = Ember.get(payload, 'participants');\n                    const isAgentCall = participants.any(party => party.purpose && party.purpose === 'agent');\n\n                    const participant = _.last(participants.filterBy('userId', this.get('personGuid')));\n                    const participantCall = this.getParticipantCall(participant);\n                    const participantOnCall = participantCall\n                        ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(\n                              participantCall.state.toLowerCase()\n                          ) > -1\n                        : false;\n                    const participantIsNotVoicemail = (participant.purpose || '').toLowerCase() !== 'voicemail';\n                    const isActiveOnCall = participantCall && participantOnCall && participantIsNotVoicemail;\n                    const newCallState = participantCall.state.toLowerCase();\n\n                    const onCall = interactionModel && interactionModel.get('onCall');\n                    const shouldUpdate = isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated';\n\n                    if (newInteraction) {\n                        interactionModel = ConversationModel.create(payload, Ember.getOwner(this).ownerInjection());\n                        if (isAgentCall && Ember.get(interactionModel, 'callState.initialState') === 'connected') {\n                            // i.e. call was auto answered\n                            this.trigger('autoAnswer', Ember.get(interactionModel, 'id'));\n                        }\n                    }\n\n                    // Log a message for the webrtc timeline if the state changes\n                    if (!currentCallState || currentCallState !== newCallState) {\n                        this.logger.info('Received conversationUpdate with new call state', {\n                            remoteData: { conversationId: payload.id, participantState: newCallState }\n                        });\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        prevRaw,\n                        isAgentCall,\n                        isActiveOnCall,\n                        currentCallState,\n                        interactionModel,\n                        newCallState,\n                        newInteraction,\n                        participantIsNotVoicemail,\n                        shouldUpdate\n                    };\n                }\n            },\n            {\n                label: 'Answer Call',\n                process: ({ payload, currentCallState, newCallState, participantIsNotVoicemail }) => {\n                    if (\n                        currentCallState &&\n                        participantIsNotVoicemail &&\n                        currentCallState !== 'connected' &&\n                        newCallState === 'connected' &&\n                        !this.get('webrtcSdkService.useSdk')\n                    ) {\n                        this.get('headset').answerCall(payload.id, this.get('connectedConversations.length') >= 1);\n                    }\n                }\n            },\n            {\n                label: 'End Call',\n                process: ({ payload, currentCallState, newCallState }) => {\n                    if (!currentCallState) {\n                        return;\n                    }\n\n                    if (this.get('webrtcSdkService.useSdk')) {\n                        return;\n                    }\n\n                    if (currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n                        this.get('headset').endCall(payload.id, this.get('connectedConversations.length') > 1);\n                    }\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ prevRaw, payload, interactionModel }) => {\n                    const modelsToDestroy = [];\n                    const buildModel = rawData => {\n                        const conversationModel = ConversationModel.create(\n                            rawData,\n                            Ember.getOwner(this).ownerInjection()\n                        );\n                        Ember.set(conversationModel, 'type', 'call');\n                        modelsToDestroy.push(conversationModel);\n\n                        const interactionModel = Ember.Object.create({});\n                        return interactionModel;\n                    };\n                    const { id } = payload;\n                    const contactObserver = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, contactObserver);\n                    const externalContacts = this.get('externalContacts');\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            buildModel,\n                            payload,\n                            prevRaw,\n                            contactObserver\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add external contact change listeners on phone interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        externalContacts.removeContactChangeListenersForInteraction(interactionModel, contactObserver);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n\n                    modelsToDestroy.forEach(m => m.destroy());\n                }\n            },\n            {\n                label: 'Update State Step',\n                process: ({\n                    payload,\n                    isAgentCall,\n                    currentCallState,\n                    interactionModel,\n                    newCallState,\n                    newInteraction,\n                    shouldUpdate\n                }) => {\n                    if (shouldUpdate) {\n                        if (!newInteraction) {\n                            interactionModel.setProperties(payload);\n                        }\n\n                        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n                            Ember.set(interactionModel, 'acceptedByClient', false);\n                        }\n                    }\n\n                    // the consultParticipantId needs to be retained even when the call is no longer\n                    // on consult because of use cases identified in SERVOPS-11175\n                    const consultParticipantId = _.last(\n                        interactionModel.participants.filterBy('purpose', 'customer').mapBy('consultParticipantId')\n                    );\n                    if (consultParticipantId) {\n                        Ember.set(interactionModel, 'consultParticipantId', consultParticipantId);\n                    }\n\n                    if (shouldUpdate) {\n                        if (newInteraction) this.get('conversations').pushObject(interactionModel);\n                        this.trigger(`conversations.${interactionModel.get('id')}`);\n                    }\n\n                    if (shouldUpdate || newCallState === 'terminated') {\n                        this.notifyPropertyChange('conversations');\n                        this.notifyPropertyChange('recentDisconnectedAgentCalls');\n                        this._logConversationDetails(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model - External Contact',\n                process: async ({ shouldUpdate, interactionModel, payload }) => {\n                    if (!shouldUpdate) {\n                        return;\n                    }\n\n                    // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                    // not mix server and UI state\n                    try {\n                        await this.get('externalContacts').setExternalContactInfo(interactionModel, payload);\n                    } catch (e) {\n                        this.logger.error('ACD Phone: Failed to set External Contact Model data', {\n                            e,\n                            remoteData: {\n                                interactionId: interactionModel.get('id')\n                            }\n                        });\n                    }\n                }\n            },\n            {\n                label: 'Cleanup Step',\n                process: () => {\n                    // Ideally, we would definitively know when a conversation is inactive\n                    // and only clean up that instance.  However, isInteractionActive is not\n                    // supported on conversation models. Rather than build an interim\n                    // model, we'll just call the throttled cleanup method.\n                    this.get('_throttledRemoveDisconnectedConversations').perform();\n                }\n            }\n        ]);\n    },\n\n    _onMyConversationEvent(conversation) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        if (!conversation || !conversation.id) return;\n        this.get('_processingChain').enqueueEvent(conversation.id, {\n            eventSource: 'realtime',\n            payload: conversation\n        });\n    },\n\n    _onPigeonConnect() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        this.fetchActiveCallConversations()\n            .then(conversations => {\n                conversations.forEach(conversation => {\n                    if (!conversation || !conversation.id) return;\n                    this.get('_processingChain').enqueueEvent(conversation.id, {\n                        eventSource: 'api',\n                        payload: conversation\n                    });\n                });\n            })\n            .catch(err => {\n                this.get('logger').error('ACD Phone Service: Failed to load active conversations', { err });\n            })\n            .finally(() => {\n                this.get('_throttledRemoveDisconnectedConversations').perform();\n            });\n    },\n\n    _getCallState(interaction) {\n        const participant = interaction.get('participants').findBy('userId', this.get('personGuid'));\n        if (!participant) {\n            Logger.error(\n                `Expected to find person {{personGuid}} on conversation {{conversationId}} but person was not found`,\n                { personGuid: this.get('personGuid'), conversationId: interaction.get('id') }\n            );\n            return;\n        }\n        const participantCall = this.getParticipantCall(participant);\n        return participantCall.state ? participantCall.state.toLowerCase() : null;\n    },\n\n    fetchActiveCallConversations() {\n        const url = this.pcUri(`api/${this.get('convAPIVersion')}/conversations`) + '?communicationType=Call';\n        return this.makeRequest(url, { type: 'get' }).then(response => response.entities);\n    },\n\n    // Returns conversation version to use\n    convAPIVersion: 'v2',\n\n    // presence and carrier pigeon stuff\n    presence: computed.reads('session.person.presence'),\n    onQueue: computed.equal('presence', 'on_queue'),\n    carrierPigeonConnected: computed.reads('pigeon.connected'),\n\n    // permissions\n    enabled: computed.reads('permissions.phoneEnabled'),\n    conferenceEnabled: computed.reads('permissions.conferenceEnabled'),\n    canRecord: computed.reads('permissions.canRecord'),\n    canCallForward: computed.reads('permissions.canCallForward'),\n\n    // user info\n    user: computed.reads('session.publicApiUser'),\n    personGuid: computed.reads('session.person.guid'),\n\n    // stations and phone permissions\n    phoneDisabled: computed('webrtc.canUseWebrtcSoftphone', 'station.isWebrtc', function () {\n        return this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone');\n    }),\n\n    phoneDisabledMessage: computed('phoneDisabled', 'webrtc.{hasMicrophone,audioCallCapable}', function () {\n        if (this.get('phoneDisabled') === false) {\n            return '';\n        }\n        const webrtc = this.get('webrtc');\n        const audioCallCapable = webrtc.get('audioCallCapable');\n        const hasMicrophone = webrtc.get('hasMicrophone');\n        let key = 'notification.purecloud.selectPhone.unsupportedPhone';\n        if (audioCallCapable && !hasMicrophone) {\n            key = 'notification.purecloud.selectPhone.noMicrophone';\n        }\n        return this.get('intl').lookup(key).toString();\n    }),\n    phoneAvailable: computed('noStationSelected', 'phoneDisabled', function () {\n        return !(this.get('noStationSelected') || this.get('phoneDisabled'));\n    }),\n    stationHasPersistentConnection: computed.and('station.persistentConnection', 'station.isWebrtc'),\n    persistentConnectionActive: computed(\n        'webrtc.conversations.@each._state',\n        'stationHasPersistentConnection',\n        'webrtcSdkService.{useSdk,isPersistentConnection,hasActiveSoftphoneSession}',\n        function () {\n            if (this.get('webrtcSdkService.useSdk')) {\n                return (\n                    this.get('webrtcSdkService.isPersistentConnection') &&\n                    this.get('webrtcSdkService.hasActiveSoftphoneSession')\n                );\n            }\n\n            if (!this.get('stationHasPersistentConnection')) {\n                return false;\n            }\n            const conversations = this.get('webrtc.conversations');\n            return conversations && !!conversations.findBy('conversationType', webrtcConversationTypes.SOFTPHONE);\n        }\n    ),\n\n    // Toggle to enable answering of calls from this browser session.\n    thisBrowserIsTheOneToAnswerFrom: false,\n    toggleBrowserAnswer() {\n        this.toggleProperty('thisBrowserIsTheOneToAnswerFrom');\n        this.get('preferences').setPreference(\n            'phone.thisBrowserIsTheOneToAnswerFrom',\n            this.get('thisBrowserIsTheOneToAnswerFrom')\n        );\n    },\n\n    // debounce timers and timeout values\n    timeOutToRemove: 8000,\n\n    lastConversationError: null,\n    callsWithErrors: [],\n\n    loaded: false,\n    loading: {\n        muted: false,\n        held: false\n    },\n\n    dtmf: true, // HACK: enable/disable calling pub api for sending dtmf\n\n    // utils\n    guidFromUri(uri) {\n        return uri.substring(uri.lastIndexOf('/') + 1);\n    },\n    generateConversationsUrl(callId, participantId, action, query) {\n        const origin = `api/v2/conversations/calls`;\n        let parts = [origin, callId, 'participants', participantId];\n        if (action) {\n            parts.push(action);\n        }\n        if (query) {\n            parts.push(query);\n        }\n        return this.pcUri(parts);\n    },\n    generateCommunicationUrl(conversationId, participantId, communicationId) {\n        return this.get('application').pcV2Uri(\n            `api/v2/conversations/calls/${conversationId}/participants/${participantId}/communications/${communicationId}`\n        );\n    },\n    generateConversationUrl(conversationId) {\n        return this.get('application').pcV2Uri(`api/v2/conversations/calls/${conversationId}`);\n    },\n    _findPendingSessionsByConversationId(id) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService.pendingSessions').findBy('conversationId', id);\n        } else {\n            return this.get('webrtc.pendingSessions').findBy('callInfo.conversationId', id);\n        }\n    },\n    _logConversationDetails(conversation) {\n        if (conversation != null) {\n            let logObject = {};\n            Ember.get(conversation, 'participants').forEach(party => {\n                const communication = this.getParticipantCall(party) || Ember.get(party, 'callbacks.firstObject');\n                if (communication) {\n                    const { id, userId, name, address, purpose } = party;\n                    const { state, confined, muted, held } = communication;\n                    return (logObject[id] = { userId, name, address, state, confined, muted, held, purpose });\n                }\n            });\n            if (console.table) {\n                return console.table(logObject);\n            }\n            return console.log(logObject);\n        }\n    },\n    isDisconnected(conversation) {\n        if (!conversation) {\n            return false;\n        }\n        const callState = Ember.get(conversation, 'callState');\n        if (!callState) {\n            return false;\n        }\n        return callState.state ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1 : false;\n    },\n    // helper to get participant.calls[0] and return false if any of it is undefined\n    getParticipantCall(participant) {\n        if (!participant) {\n            return false;\n        }\n        if (participant.calls) {\n            if (participant.calls.length) {\n                return participant.calls[0];\n            }\n        }\n        return false;\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('callVolume', deviceVolumes.callVolume);\n        this.set('ringerVolume', deviceVolumes.ringerVolume);\n    },\n    // end utils\n\n    // UI state helpers\n    isInteractionViewOpen: false,\n    isShowCallControlsViewOpen: false,\n    showFloatingCalls: false,\n\n    showNavbarAlert: computed(\n        'activeAcdCalls.[]',\n        'activeCall',\n        'incomingNonAcdConversations.[]',\n        'isShowCallControlsViewOpen',\n        'isInteractionViewOpen',\n        function () {\n            const activeAcdCallState = this.get('activeAcdCalls.firstObject.callState.state');\n            const state = typeof activeAcdCallState === 'string' ? activeAcdCallState.toLowerCase() : null;\n            if (\n                this.get('isShowCallControlsViewOpen') ||\n                (this.get('isInteractionViewOpen') && state === 'connected')\n            ) {\n                return false;\n            }\n\n            const hasIncomingNonAcdCalls = this.get('incomingNonAcdConversations.length') > 0;\n            const alertingCall =\n                !this.get('activeCall.isIncoming') && hasIncomingNonAcdCalls\n                    ? this.get('incomingNonAcdConversations.firstObject')\n                    : this.get('activeCall');\n\n            const isAlertingCallACD =\n                alertingCall &&\n                Ember.get(alertingCall, 'isAgentCall') &&\n                !Ember.get(alertingCall, 'myselfIsMonitor') &&\n                !Ember.get(alertingCall, 'myselfIsCoach') &&\n                !Ember.get(alertingCall, 'myselfIsBarged')\n                    ? true\n                    : false;\n            return !isAlertingCallACD && hasIncomingNonAcdCalls;\n        }\n    ),\n    // end UI state helpers\n\n    activeRoom: null,\n\n    bootstrapPurecloudApiOnAuth: observer('session.isAuthenticated', 'enabled', 'canCallForward', function () {\n        if (!this.get('enabled')) {\n            return;\n        }\n        if (this.get('session.isAuthenticated')) {\n            if (this.get('canCallForward')) {\n                this.fetchCallForwarding();\n            }\n            if (!isTesting && !this.get('loaded')) {\n                this.set('loaded', true);\n                this.doLoginAssociationLogic();\n                return this.get('delayedNotification').perform();\n            }\n        } else {\n            this.set('loaded', false);\n        }\n    }),\n\n    delayedNotification: task(function* (delay = 5000) {\n        yield timeout(delay);\n\n        if (this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone')) {\n            const message = this.get('phoneDisabledMessage');\n            const title = this.get('intl').t('notification.purecloud.selectPhone.selectPhone');\n            return this.get('notification').error(title, message);\n        }\n    }),\n\n    refreshPublicApiUser() {\n        return this.get('session').refreshPublicApiUser();\n    },\n\n    handleMuteParticipants: observer('activeConversations.@each.isMuted', function () {\n        this.get('activeConversations').forEach(conversation => {\n            if (conversation.get('webrtcSession')) {\n                let webrtcConversation = this.get('webrtc').getConversation({\n                    conversationId: conversation.get('id'),\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                if (webrtcConversation) {\n                    if (conversation.get('isMuted')) {\n                        webrtcConversation.muteAudio();\n                    } else {\n                        webrtcConversation.unmuteAudio();\n                    }\n                }\n            }\n        });\n    }),\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    },\n\n    transferToVoicemail(selectedUserUserId, participantId, conversationId) {\n        const voicemailPolicy = this.get('application').pcV2Uri('api/v2/voicemail/userpolicies/' + selectedUserUserId);\n        return this.makeRequest(voicemailPolicy)\n            .then(policy => {\n                if (!policy.enabled) {\n                    throw new Error('voicemail not enabled');\n                }\n                const data = {};\n                const vmAdressString = selectedUserUserId + VOICEMAIL_URL;\n                data.address = vmAdressString;\n                data.transferType = 'Unattended';\n                const options = { data };\n                const url = this.replaceUri(conversationId, participantId, null, 'calls');\n                return this.makeRequest(url, options, 'post').then(() => {\n                    this._handleCallTransferred();\n                });\n            })\n            .catch(error => {\n                const title = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.error');\n                const message = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.transferToVoicemail');\n                this.get('notification').error(title, message);\n                this.get('logger').error('Error while tranferring to voicemail', { error });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { assert } from '@ember/debug';\nimport { get, observer } from '@ember/object';\nimport { copy } from 'ember-copy';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, Evented, inject, run, computed } = Ember;\n\nconst topicPriority = {\n    presence: 1,\n    routingStatus: 2,\n    conversationsummary: 3,\n    other: 4,\n    outofoffice: 5,\n    geolocation: 6\n};\n\nexport function eventFromTopic(topic) {\n    if (topic.indexOf('v2.system.no_longer_subscribed') > -1) {\n        return 'no_longer_subscribed';\n    }\n    return [].concat(topic.split('.')).pop();\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    connected: false,\n    topics: A(),\n    priorityTopics: A(),\n    customTopicNames: {},\n    registerTopicsDebouncePeriod: 1000,\n    embedded: inject.service(),\n\n    prioritizedTopics: computed('topics.length', function () {\n        const sortedTopics = this.get('topics').slice(0);\n\n        const sortFunction = (topicA, topicB) => {\n            return this.getTopicPriority(topicA) - this.getTopicPriority(topicB);\n        };\n\n        sortedTopics.sort(sortFunction);\n\n        return sortedTopics;\n    }),\n\n    getTopicPriority(topic) {\n        const priorities = topicPriority;\n        return priorities[topic.split('.').pop()] || priorities.other;\n    },\n\n    // eslint-disable-next-line no-unused-vars\n    initialize({ features, subscribeUrl, publicApiUser, accessToken }) {\n        if (this.get('initialized')) {\n            return;\n        }\n\n        if (publicApiUser) {\n            this.logger.info('CXNUI-CP: Initializing', {\n                userId: get(publicApiUser, 'id'),\n                features\n            });\n        } else {\n            this.logger.warn('CXNUI-CP: pigeon service not provided with api user');\n        }\n\n        this.set('initialized', true);\n    },\n\n    registerPriorityTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a priority topic for subscription.', topic !== null);\n        this.get('priorityTopics').addObject(topic);\n\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterPriorityTopic(topic) {\n        this.get('priorityTopics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    registerTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a topic for subscription.', topic !== null);\n        this.get('topics').unshiftObject(topic);\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterTopic(topic) {\n        this.get('topics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    _observeTopics: observer('priorityTopics.[]', 'topics.[]', 'connected', 'initialized', function () {\n        if (this.get('connected') && this.get('initialized')) {\n            this.set(\n                'registerDebounce',\n                run.debounce(this, this._registerTopics, this.get('registerTopicsDebouncePeriod'))\n            );\n        }\n    }),\n\n    willDestroy() {\n        this._super(...arguments);\n        run.cancel(this.get('topicKeepAlive'));\n        run.cancel(this.get('registerDebounce'));\n    },\n\n    _registerTopics() {\n        run.cancel(this.get('topicKeepAlive'));\n        const topicKeepAlive = run.later(\n            this,\n            function () {\n                this.logger.info('CXNUI-CP: _register: topicKeepAlive triggered');\n                this._registerTopics();\n            },\n            23 * 60 * 60 * 1000 // 23h\n        );\n        this.set('topicKeepAlive', topicKeepAlive);\n\n        const prioritizedTopics = this.get('prioritizedTopics');\n        const priorityTopics = this.get('priorityTopics');\n        const topics = [...priorityTopics, ...prioritizedTopics];\n\n        if (!this.get('connected')) {\n            this.set('connected', true);\n            this.trigger('connect');\n        }\n\n        topics.forEach(topic => this.get('embedded').streamingTopicSubscribe(topic));\n        this.trigger('topicsRegistered', topics);\n    },\n\n    triggerTopicEvent(topic, eventName, eventBody, data, source) {\n        this.logger.debug('CXNUI-CP: topic triggered', {\n            source,\n            carrierPigeonTopic: eventName,\n            update: eventBody\n        });\n        this.trigger(eventName, copy(eventBody), copy(data));\n    },\n\n    onMessage(source, data) {\n        if (!data) {\n            return;\n        }\n\n        const topic = data.topicName;\n        const eventBody = data.eventBody;\n        const eventName = this.get('customTopicNames')[topic] || eventFromTopic(topic);\n\n        if (topic !== 'channel.metadata') {\n            this.triggerTopicEvent(topic, eventName, eventBody, data, source);\n        }\n\n        if (topic !== eventName) {\n            this.triggerTopicEvent(topic, topic, eventBody, data, source);\n        }\n    },\n\n    onSubscriptionError(error) {\n        this.trigger('hawkSubscriptionError', error);\n    }\n});\n","import Ember from 'ember';\nimport localforage from 'localforage';\nimport _ from 'lodash';\n\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport safeSet from 'connections-ui/utils/safeSet';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { on, get, set, run, inject, computed, RSVP, Service } = Ember;\n\nconst PREFERENCE_LOAD_TIME_ALLOWANCE = 5000;\n\nexport default Service.extend(LoggerMixin, {\n    logger: inject.service('stash-logger'),\n    session: inject.service(),\n    feature: inject.service(),\n    ajax: inject.service(),\n    application: inject.service(),\n\n    namespaces: [\n        'chat',\n        'geolocation',\n        'notifications',\n        'webrtc',\n        'test',\n        'widgets',\n        'meta',\n        'meetings',\n        'phone',\n        'scripts',\n        'deviceVolumes',\n        'panelManager',\n        'panelManagerLayoutTemplateV1',\n        'agentUiMainstage',\n        'interactions',\n        'relateSparkification'\n    ],\n\n    error: false,\n\n    syncEnabled: false,\n\n    deferredPersistRequests: null,\n    settingsPath: 'api/v2/settings',\n\n    registerNamespaces: on('init', function () {\n        localforage.config({\n            name: 'orgspan',\n            version: 1.0,\n            storeName: 'preferences',\n            description: 'Storing local preferences for the web client'\n        });\n\n        //need to wrap in a run since there is a lot of non-ember asynchonicity in this code path\n        const promises = this.get('namespaces').map(namespace => {\n            return localforage.getItem(namespace).then(data => {\n                run(() => this._initializeNamespace(namespace, data));\n            });\n        });\n\n        const ready = timeoutPromise(\n            RSVP.all(promises),\n            PREFERENCE_LOAD_TIME_ALLOWANCE,\n            'preferences#registerNamespaces'\n        )\n            .then(() => this._waitForAccessToken())\n            .then(() => this._enableService())\n            .catch(error => {\n                this._disableService(error);\n            });\n\n        this.set('ready', ready);\n        this.set('deferredPersistRequests', []);\n\n        // used to resolve races in setPreference('namespace.property');\n        this.set('pendingSets', Ember.Object.create());\n    }),\n\n    getPreference(path) {\n        const ready = this.get('ready');\n        return ready.then(() => {\n            return this._getPreference(path);\n        });\n    },\n\n    setPreference(path, value, persist = true) {\n        const ready = this.get('ready');\n        return ready.then(() => this._setPreference(path, value, persist));\n    },\n\n    _getPreference(path) {\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            return localforage.getItem(path);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        return previousSet\n            .then(() => {\n                return localforage.getItem(namespace);\n            })\n            .then(settings => {\n                if (!settings) {\n                    return;\n                }\n                let setting = get(settings, keyPath);\n                return setting;\n            })\n            .catch(err => {\n                if (!isTesting) throw err;\n                // swallow the error in tests\n                return RSVP.Promise.resolve();\n            });\n    },\n\n    _setPreference(path, value) {\n        if (this.isDestroyed) {\n            return RSVP.resolve({});\n        }\n\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            if (value && !Array.isArray(value) && typeof value === 'object') {\n                this.set(path, Ember.Object.create(value));\n            } else {\n                this.set(path, value);\n            }\n\n            return localforage.setItem(path, value);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        let currentNamespaceObject = this.get(namespace);\n        if (!currentNamespaceObject) {\n            this.set(namespace, Ember.Object.create());\n            currentNamespaceObject = this.get(namespace);\n        }\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        const pendingSet = previousSet\n            .then(() => {\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                set(data, keyPath, value);\n\n                return localforage.setItem(namespace, data);\n            })\n            .finally(() => {\n                this.set(`pendingSets.${namespace}`, null);\n            });\n        this.set(`pendingSets.${namespace}`, pendingSet);\n\n        // after localforage\n        return pendingSet\n            .then(() => {\n                // get the namespace again in case there were multiple sets on the namespace\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                safeSet(data, keyPath, value);\n                currentNamespaceObject.set(keyPath, value);\n                return setting;\n            })\n            .catch(error => {\n                if (isTesting) return RSVP.resolve();\n                this.logger.warn('Error saving preferences', { path, error });\n                return RSVP.reject(error);\n            });\n    },\n\n    async _waitForAccessToken() {\n        if (this.get('session.accessToken') || isTesting) {\n            return RSVP.Promise.resolve();\n        }\n\n        return new RSVP.Promise(resolve => {\n            this.logger.info('Preferences: waiting for access token');\n\n            const handler = () => {\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    _enableService() {\n        let enableServicePromise = RSVP.resolve();\n\n        if (this._isNotDead() && this.get('session.accessToken')) {\n            this.logger.info('Enabling preference API sync');\n            return this._enableSync()\n                .then(() => {\n                    this.logger.info('Initial preferences loaded successfully');\n                })\n                .catch(error => {\n                    this.logger.info('There was an issue enabling sync:', error);\n                    this.set('profileSyncSupport', false);\n                });\n        }\n\n        return enableServicePromise;\n    },\n\n    _disableService(error) {\n        if (this._isNotDead()) {\n            this.logger.error('Error loading preferences', { error });\n            this.set('error', true);\n        }\n    },\n\n    _initializeNamespace(namespace, data) {\n        if (this._isNotDead()) {\n            if (!data) {\n                data = {};\n                localforage.setItem(namespace, data);\n            }\n            this.set(namespace, Ember.Object.create(data));\n        }\n    },\n\n    _isNotDead() {\n        return !this.get('isDestroyed') && !this.get('isDestroying');\n    },\n\n    _enableSync() {\n        const logger = this.get('logger');\n        const settingsPath = this.get('settingsPath');\n        const settingsUrl = this.get('application').pcV2Uri(settingsPath);\n        const ajax = this.get('ajax');\n\n        if (this.get('syncEnabled')) {\n            return RSVP.reject('Preference sync can only be enabled once.');\n        }\n\n        this.set('syncEnabled', true);\n        return ajax\n            .ajaxGet(settingsUrl)\n            .then(preferencesToSync => this._saveSettingsFromServer(preferencesToSync))\n            .then(() => {\n                logger.info('Loaded preferences from server');\n                return RSVP.resolve();\n            })\n            .catch(err => {\n                logger.error('Error getting preferences from server', { err });\n                return RSVP.reject(err);\n            });\n    },\n\n    _saveSettingsFromServer(settings) {\n        const promises = [];\n\n        _.forIn(settings, (data, namespace) => {\n            if (this.namespaces.includes(namespace)) {\n                promises.push(this._setPreference(namespace, data, false));\n            }\n        });\n\n        return RSVP.all(promises).then(() => {\n            return Ember.RSVP.resolve();\n        });\n    },\n\n    profileSyncSupport: computed('session.person.fieldConfig.preferences.preferences', function () {\n        const field = this.get('session.person.fieldConfig.preferences.preferences');\n        return !_.isEmpty(field);\n    }),\n\n    userPreferences: computed('session.person.preferences.preferences.[]', function () {\n        let entry = this.get('session.person').getFieldValue('preferences.preferences');\n        if (entry && typeof entry.value === 'string') {\n            return JSON.parse(entry.value);\n        } else if (entry && entry.value && typeof entry.value === 'object') {\n            return entry.value;\n        }\n        return {};\n    }),\n\n    allLocalPreferences: computed('namespaces.[]', function () {\n        return this.getProperties(this.get('namespaces'));\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport StreamingService from 'ember-purecloud-components/services/streaming';\nimport moment from '../utils/dates';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\n\nconst { inject, observer, run, Service } = Ember;\n\nexport default Service.extend(LoggerMixin, {\n    eventMap: {\n        presence: 'primaryPresenceEvent',\n        outofoffice: 'outOfOfficeEvent',\n        conversationsummary: 'conversationSummaryEvent',\n        routingStatus: 'routingStatusEvent',\n        geolocation: 'geolocationEvent'\n    },\n\n    trackedGuids: null,\n\n    intl: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    pigeon: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    batchDataRequests: inject.service(),\n    presenceService: inject.service('presence'),\n    permissions: inject.service(),\n\n    phoneIntegrations: inject.service(),\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('permissions.canViewIntegrationPresence')) {\n            this.eventMap.integrationpresence = 'integrationpresence';\n            delete this.eventMap.presence;\n            this.set('eventMap', this.eventMap);\n        }\n\n        _.forIn(this.eventMap, (value, key) => this.get('pigeon').on(key, this, this.events[value]));\n\n        this.set('trackedGuids', Ember.Object.create());\n        this.subscribeToMyself();\n        this.get('streaming').subscribeToConnection(this);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forIn(this.eventMap, (value, key) => this.get('pigeon').off(key, this, this.events[value]));\n    },\n\n    _getPresenceDefinition(presence) {\n        if (typeof presence === 'string') {\n            return this.get('session').getPresence(presence);\n        } else {\n            return this.get('presenceService').getPresenceDefinition(presence);\n        }\n    },\n\n    isPresence(presence, testValue) {\n        const definition = this._getPresenceDefinition(presence);\n        return isPresence(this.get('session.presenceMap'), definition, testValue);\n    },\n\n    subscribeToMyself() {\n        const guid = this.get('session.person.guid');\n        const id = this.get('session.person.id');\n\n        if (guid && id) {\n            const pigeon = this.get('pigeon');\n            this.logger.debug('subscribing to myself');\n\n            this.set(`trackedGuids.${guid}`, true);\n            this._getTopicsForUser(guid).forEach(topic => pigeon.registerPriorityTopic(topic));\n        }\n    },\n\n    _getTopicsForUser(guid) {\n        if (!guid) {\n            return [];\n        }\n\n        return [`v2.users.${guid}?${Object.keys(this.eventMap).join('&')}`];\n    },\n\n    _guidFromTopicName(topic) {\n        const guidPattern = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/gi;\n        const guids = topic.match(guidPattern);\n\n        if (guids && guids.length > 0) {\n            return guids[0];\n        }\n        return '';\n    },\n\n    connect: StreamingService.streamingEvent(function () {\n        run.debounce(this, this.refreshPeopleActivityState, 1000);\n    }),\n\n    refreshPeopleActivityState() {\n        const personId = this.get('session.person.guid');\n        const ids = Object.keys(this.get('trackedGuids'));\n\n        if (personId) {\n            ids.push(personId);\n        }\n\n        if (!_.isEmpty(ids)) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: Reloading activity state for people: ', ids.length);\n            this.get('store').findMany('person', ids, FL.person);\n        }\n    },\n\n    watchAuthForSubscribe: observer('session.isAuthenticated', 'session.person.guid', function () {\n        this.subscribeToMyself();\n    }),\n\n    subscribeToPresence(person) {\n        const pigeon = this.get('pigeon');\n\n        const id = person.get('id');\n        const guid = person.get('guid');\n        const jid = person.get('jid');\n\n        this.set(`trackedGuids.${guid}`, true);\n        let callback = function () {};\n\n        if (this.get('streaming.connection') && jid && jid !== this.get('session.person.jid')) {\n            if (0 === person.get('presenceSubscriptionCounter')) {\n                this._getTopicsForUser(guid).forEach(topic => pigeon.registerTopic(topic));\n                Ember.run.once(this, this.refreshUser, id);\n            }\n\n            person.incrementProperty('presenceSubscriptionCounter');\n\n            callback = () => {\n                if (0 < person.get('presenceSubscriptionCounter')) {\n                    person.decrementProperty('presenceSubscriptionCounter');\n                }\n\n                if (0 === person.get('presenceSubscriptionCounter')) {\n                    this._getTopicsForUser(guid).forEach(topic => pigeon.unRegisterTopic(topic));\n                    this.set(`trackedGuids.${guid}`, undefined);\n                }\n            };\n        }\n\n        return callback;\n    },\n\n    refreshUser(id) {\n        this.get('batchDataRequests').refreshUser(id);\n    },\n\n    bulkSubscribeToPresence(people) {\n        let callbacks = people.map(p => this.subscribeToPresence(p));\n        return () => {\n            callbacks.forEach(cb => cb());\n        };\n    },\n\n    autoSubscribe(people, context, type = '') {\n        let callbackKey = `${type}PresenceSubscriptionCallback`;\n        let previousCallback = context.get(callbackKey);\n        let newCallback = null;\n\n        if (people) {\n            newCallback = this.bulkSubscribeToPresence(people);\n        }\n\n        if (typeof previousCallback === 'function') {\n            previousCallback();\n        }\n\n        try {\n            context.set(callbackKey, newCallback);\n        } catch (e) {\n            // sometimes we are trying to clear out subscription callbacks after an object was destroyed by ember\n            // we dont want to run the function, but we can't use `set`, so clear it out forcefully\n            if (!newCallback) {\n                context[callbackKey] = newCallback;\n            }\n        }\n    },\n\n    _alertDeletedPresence(presence) {\n        const intl = this.get('intl');\n        const title = intl.t('chat.presence.errorSettingDeletedPresence.title');\n        const message = intl.t('chat.presence.errorSettingDeletedPresence.message');\n        this.get('notification').error(title, message);\n\n        this.get('presenceService').removeDeletedPresence(presence);\n    },\n\n    changeRoutingStatus(status) {\n        const id = this.get('session.person.guid');\n        const url = this.get('application').pcV2Uri(`api/v2/users/${id}/routingStatus`);\n        const data = {\n            userId: id,\n            status: status,\n            startTime: new Date(moment.now()).toISOString()\n        };\n\n        this.get('ajax')\n            .put(url, { data })\n            .catch(error => {\n                this.logger.error('PRESENCE-SUBSCRIPTION: Error when changing routing status', {\n                    error\n                });\n            });\n    },\n\n    doUserPresenceStatusChanged(person, statusUpdate) {\n        const { source } = statusUpdate;\n        const phoneIntegrations = this.get('phoneIntegrations');\n\n        const isSourceOnUsableList = phoneIntegrations.canViewThirdPartyPresence(source);\n        if (isSourceOnUsableList) {\n            // set the integration presence value\n            // using Ember.set as person is an object by this point\n            Ember.set(person, 'activities.integrationPresence', statusUpdate);\n        } else {\n            let existingPresenceIndex = null;\n            let existingPresenceObj = null;\n            if (person.get('presenceList')) {\n                existingPresenceObj = person.get('presenceList').find(function (presence, index) {\n                    if (presence.source.toLowerCase() === source.toLowerCase()) {\n                        existingPresenceIndex = index;\n                        return true;\n                    }\n                });\n            }\n\n            if (existingPresenceObj && existingPresenceIndex > -1) {\n                const presenceListStored = person.get('presenceList');\n                presenceListStored[existingPresenceIndex] = Ember.Object.create(statusUpdate);\n                person.notifyPropertyChange('presenceList');\n            } else {\n                person.get('presenceList').pushObject(Ember.Object.create(statusUpdate));\n            }\n        }\n    },\n\n    doUserPrimaryPresenceSourceChanged(person, statusUpdate) {\n        let newSource = statusUpdate.source;\n        const phoneIntegrations = this.get('phoneIntegrations');\n        const isThirdPartySource = !!phoneIntegrations.getIntegrationFromSource(newSource);\n        if (!isThirdPartySource) {\n            // convert PURECLOUD -> default\n            if (isPurecloudSource(newSource)) {\n                newSource = 'default';\n            }\n            person.set('currentPresenceSource', newSource);\n        }\n    },\n\n    handleIntegrationPresenceEvent(presenceEvent) {\n        Ember.run.join(() => {\n            this.get('batchDataRequests')\n                .getUser(presenceEvent.userId)\n                .then(person => {\n                    const { eventType } = presenceEvent;\n                    if (eventType === 'UserPresenceStatusChanged') {\n                        this.doUserPresenceStatusChanged(person, presenceEvent);\n                    } else if (eventType === 'UserPrimaryPresenceSourceChanged') {\n                        this.doUserPrimaryPresenceSourceChanged(person, presenceEvent);\n                    }\n                });\n        });\n    },\n\n    startOfTime: () => '1970-01-01T12:00:00.000Z',\n    endOfTime: () => '9999-12-31T00:00:00.000Z',\n    rightAboutMeow: () => moment().subtract(1, 'year').toISOString(),\n    handleRoutingStatusError(errorCode) {\n        if (typeof errorCode === 'string' && errorCode.toLowerCase() === 'user.noskills') {\n            const intl = this.get('intl');\n            const title = intl.t('notification.purecloud.errorSkillsRouting.title');\n            const message = intl.t('notification.purecloud.errorSkillsRouting.message');\n            this.get('notification').error(title, message);\n        }\n    },\n\n    events: {\n        conversationSummaryEvent(conversationSummary, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.conversationSummary', conversationSummary);\n                    });\n            });\n        },\n\n        outOfOfficeEvent(outOfOfficeDef, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => person.set('activities.outOfOffice', outOfOfficeDef));\n            });\n        },\n\n        routingStatusEvent({ errorInfo, id, routingStatus }) {\n            if (errorInfo && errorInfo.errorCode) {\n                this.handleRoutingStatusError(errorInfo.errorCode);\n            }\n\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(id)\n                    .then(person => person.set('activities.routingStatus', routingStatus));\n            });\n        },\n\n        integrationpresence(event) {\n            if (this.get('permissions.canViewIntegrationPresence')) {\n                this.handleIntegrationPresenceEvent(event);\n            }\n        },\n\n        primaryPresenceEvent(primaryPresence, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.presence', primaryPresence);\n                    });\n            });\n        },\n\n        geolocationEvent(geolocation, { topicName }) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: geolocationEvent', arguments);\n            const guid = this._guidFromTopicName(topicName);\n            if (geolocation && (geolocation.city || geolocation.region || geolocation.country)) {\n                this.logger.debug(\n                    'PRESENCE-SUBSCRIPTION: gelocationEvent user/self',\n                    guid,\n                    this.get('session.person.guid')\n                );\n                if (guid && guid === this.get('session.person.guid')) {\n                    this.logger.debug('PRESENCE-SUBSCRIPTION: adding geolocation to self');\n                    this.set('session.person.activities.geolocation', geolocation);\n                }\n                Ember.run.join(() => {\n                    this.get('batchDataRequests')\n                        .getUser(guid)\n                        .then(person => {\n                            person.set('activities.geolocation', geolocation);\n                        });\n                });\n            }\n        }\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { computed, get, set } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport Presence from 'ember-purecloud-components/models/presence';\nimport { formatPresenceLanguageLabelLocale } from 'ember-purecloud-components/utils/intl';\nimport TimeoutPromise from 'ember-purecloud-components/utils/timeout-promise';\nimport groupBy from 'lodash.groupby';\nimport isEmpty from 'lodash.isempty';\nimport RSVP from 'rsvp';\n\nlet _mapping;\n\nconst getPresenceMappings = function (lookup) {\n    // This is a function because the lookups need to happen after the app is boostrapped.\n    // Attempts made to refactor that have ended in failure: 2.5\n    // last attempt date: 01/05/2015 - eric lifka\n    // most recent attempt: 06/02/2015 - sam wenke\n    // Ability to lookup via entity.presence, entity.presence, presence code, or guid.\n    if (!_mapping) {\n        _mapping = {\n            available: lookup('chat.presence.available').toString(),\n            online: lookup('chat.presence.available').toString(),\n            busy: lookup('chat.presence.busy').toString(),\n            idle: lookup('chat.presence.away').toString(),\n            away: lookup('chat.presence.away').toString(),\n            on_queue: lookup('chat.presence.onQueue').toString(),\n            out_of_office: lookup('chat.presence.outOfOffice.title').toString(),\n            offline: lookup('chat.presence.offline').toString(),\n            not_responding: lookup('chat.presence.notResponding').toString(),\n            meal: lookup('chat.presence.meal').toString(),\n            training: lookup('chat.presence.training').toString(),\n            break: lookup('chat.presence.break').toString(),\n            meeting: lookup('chat.presence.meeting').toString()\n        };\n    }\n\n    return _mapping;\n};\n\nexport default Service.extend(LoggerMixin, {\n    ajax: service(),\n    intl: service(),\n    notification: service(),\n\n    presenceDefinitions: null,\n\n    // Dynamically injected services\n    session: null,\n    application: null,\n    presenceSubscription: null,\n\n    acdDivisionPresenceProfileToggle: computed.readOnly('session.features.acdDivisionPresenceProfileToggle'),\n\n    init() {\n        this._super(...arguments);\n\n        const owner = getOwner(this);\n        const session = owner.lookup('service:session');\n        const application = owner.lookup('service:application');\n        const presenceSubscription = owner.lookup('service:presenceSubscription');\n        if (!application || !session || !presenceSubscription) {\n            this.logger.error('Application, session, and presence subscriptions services are required, but not found');\n            return;\n        }\n\n        this.setProperties({\n            session,\n            application,\n            presenceSubscription,\n            presenceDefinitions: A([]),\n            outOfBandPresenceDefinitions: A([])\n        });\n    },\n\n    allPresences: computed('primaryPresences.[]', 'allSecondaryPresences', function () {\n        const secondary = Object.values(this.get('allSecondaryPresences') || {}).flat();\n        return [].concat(this.get('primaryPresences'), secondary);\n    }),\n\n    allActivePresences: computed('primaryPresences.[]', 'allSecondaryPresences', function () {\n        const secondary = Object.values(this.get('allSecondaryPresences') || {}).flat();\n        return [].concat(this.get('primaryPresences'), secondary).reject(presence => presence.get('deactivated'));\n    }),\n\n    primaryPresences: computed('presenceDefinitions.[]', function () {\n        return this.get('presenceDefinitions')\n            .filter(presence => {\n                if (Object.prototype.hasOwnProperty.call(presence, 'type')) {\n                    return presence.type.toLowerCase() === 'system';\n                }\n            })\n            .map(presence => {\n                return Presence.create(\n                    {\n                        presence\n                    },\n                    getOwner(this).ownerInjection()\n                );\n            });\n    }),\n\n    secondaryPresences: computed('allSecondaryPresences.[]', function () {\n        const presences = this.get('allSecondaryPresences') || {};\n        const keys = Object.keys(presences);\n        keys.forEach(key => {\n            if (presences[key]) {\n                presences[key] = A(presences[key]).reject(presence => presence.get('deactivated'));\n            }\n        });\n        return presences;\n    }),\n\n    allSecondaryPresences: computed('presenceDefinitions.[]', function () {\n        const secondaryPresenceDefinitions = (this.get('presenceDefinitions') || [])\n            .filter(presence => {\n                return Object.prototype.hasOwnProperty.call(presence, 'type') && presence.type.toLowerCase() === 'user';\n            })\n            .map(presence => {\n                return Presence.create({ presence }, getOwner(this).ownerInjection());\n            });\n\n        return groupBy(secondaryPresenceDefinitions, presence => presence.get('key'));\n    }),\n\n    loadPresences() {\n        const definitions = this.loadAllPresenceDefinitions();\n\n        const promise = RSVP.resolve(definitions);\n\n        promise\n            .then((definitions = []) => {\n                this.set('presenceDefinitions', A(definitions));\n\n                const definitionIds = this.get('presenceDefinitions').mapBy('id');\n                const currentId = this.get('session.person.presenceDefinition.id');\n                if (currentId && definitionIds.indexOf(currentId) === -1) {\n                    return this.findPresence(currentId).catch(error => {\n                        this.get('logger').error('Presence: Could not fetch out-of-band presence.', {\n                            error,\n                            remoteData: {\n                                currentId\n                            }\n                        });\n                    });\n                }\n            })\n            .catch(error => {\n                this.get('logger').error('Presence: Could not get presence definitions:', {\n                    error\n                });\n\n                this.set('presenceDefinitions', []);\n\n                Ember.Logger.error('presenceDefinitionsFetchFailure');\n                return;\n            });\n\n        return promise;\n    },\n\n    loadAllPresenceDefinitions() {\n        const deferred = RSVP.defer();\n\n        this.loadPresenceDefinitions().then(data => {\n            this.handlePresenceData(data, deferred);\n        });\n        let presenceTimeout = Ember.testing ? 2000 : 20000;\n        return TimeoutPromise(deferred.promise, presenceTimeout, 'presence#loadAllPresenceDefinitions');\n    },\n    loadPresenceDefinitions() {\n        const url = this.get('application').pcV2Uri('api/v2/presence/definitions');\n        return this.get('ajax').request(url, {\n            method: 'GET',\n            contentType: 'application/json; charset=UTF-8'\n        });\n    },\n\n    handlePresenceData(data, deferred) {\n        const presences = data.entities.map(value => {\n            if (value.systemPresence.toLowerCase() === 'onqueue') {\n                value.systemPresence = 'ON_QUEUE';\n            }\n            return value;\n        });\n        return deferred.resolve(presences);\n    },\n\n    localizePresenceString(presence) {\n        const intl = this.get('intl');\n        const lookup = intl.t.bind(intl);\n        const mapping = getPresenceMappings(lookup);\n        return mapping[presence] || mapping.offline;\n    },\n\n    getPresence(presenceString) {\n        const primary = this.get('primaryPresences');\n        const secondary = this.get('secondaryPresences')[presenceString.toLowerCase()];\n\n        let collection = primary;\n        if (!isEmpty(secondary)) {\n            collection = A(secondary).sortBy('presence.createdDate');\n        }\n\n        return A(collection).find(mapPresence => {\n            const rawPresence = mapPresence.get('presence');\n            const mapHasPresence = rawPresence.id === presenceString.toString();\n            const systemPresence = rawPresence.systemPresence;\n            const mapHasSystemPresence =\n                systemPresence &&\n                (systemPresence.toLowerCase() === presenceString.toLowerCase() ||\n                    systemPresence.toLowerCase() === presenceString.toLowerCase().replace(/-|\\s/g, '_'));\n            if (mapHasPresence || mapHasSystemPresence) {\n                return rawPresence;\n            }\n        });\n    },\n\n    getPresenceDefinition(presence) {\n        const presenceMap = this.get('presenceDefinitions');\n        return presenceMap.find(mapPresence => {\n            return mapPresence.id === presence.id;\n        });\n    },\n\n    getPresenceFallback(presence) {\n        if (presence) {\n            return presence.toLowerCase().replace(/-|\\s/g, '_');\n        }\n    },\n\n    localizePresence(presence, fallback) {\n        if (typeof fallback === 'string' && fallback.toLowerCase() === 'out_of_office') {\n            return this.localizePresenceString(fallback);\n        }\n\n        if (typeof presence === 'string' && !fallback) {\n            return this.localizePresenceString(presence);\n        }\n\n        if (presence) {\n            if (typeof presence === 'object') {\n                presence = this.getPresenceDefinition(presence);\n            }\n\n            if (presence && presence.languageLabels && presence.systemPresence !== 'IDLE') {\n                // en-us => en_US\n                let locale = formatPresenceLanguageLabelLocale(this.get('intl.locale.0'));\n                let languageLabel = get(presence.languageLabels, locale);\n                if (this.get('acdDivisionPresenceProfileToggle') && !languageLabel) {\n                    languageLabel = get(presence.languageLabels, locale.toLowerCase());\n                }\n                if (fallback === undefined) {\n                    fallback = this.getPresenceFallback(presence.systemPresence);\n                }\n                return languageLabel || this.localizePresenceString(fallback);\n            }\n        }\n\n        return this.localizePresenceString(fallback);\n    },\n\n    removeDeletedPresence(presence) {\n        this.get('presenceDefinitions').removeObject(presence);\n    },\n\n    findPresence(id, presenceDef = false) {\n        if (!id) {\n            return RSVP.resolve({});\n        }\n\n        const currentPresence = this.get('presenceDefinitions').find(presence => presence.id === id);\n        if (currentPresence) {\n            const instance = Presence.create(\n                {\n                    presence: currentPresence\n                },\n                getOwner(this).ownerInjection()\n            );\n            return RSVP.resolve(instance);\n        }\n\n        const url = this.get('application').pcV2Uri(['api/v2/presence/definitions', id]);\n        return this.get('ajax')\n            .request(url)\n            .then(presence => {\n                const model = Presence.create(\n                    {\n                        presence\n                    },\n                    getOwner(this).ownerInjection()\n                );\n\n                this.get('presenceDefinitions').addObject(presence);\n\n                return model;\n            })\n            .catch(error => {\n                if (this.get('session.features.acdDivisionPresenceProfileToggle')) {\n                    if (id && presenceDef && presenceDef.systemPresence) {\n                        // We need to map the out of band presence to a primary presence for translation sake.\n                        return this.get('primaryPresences').find(presence => {\n                            const matchingPrimaryPresence =\n                                presence.get('presence.systemPresence').toLowerCase() ===\n                                presenceDef.systemPresence.toLowerCase();\n                            if (matchingPrimaryPresence) {\n                                const newPresence = presence.get('presence');\n                                // Replace the id of the actual def instead of the primary presences id\n                                set(newPresence, 'id', presenceDef.id);\n                                const instance = Presence.create(\n                                    {\n                                        presence: newPresence\n                                    },\n                                    getOwner(this).ownerInjection()\n                                );\n                                this.get('outOfBandPresenceDefinitions').addObject(instance);\n                                return instance;\n                            }\n                            return false;\n                        });\n                    }\n                }\n                this.get('logger').error('Presence: Couldnt find given presence', {\n                    error,\n                    remoteData: {\n                        presenceId: id\n                    }\n                });\n            });\n    },\n\n    setUsersStatus(entity, status) {\n        const url = this.get('application').pcV2Uri(['api/v2/users', get(entity, 'id'), 'presences/PURECLOUD']);\n        return this.get('ajax').patch(url, {\n            contentType: 'application/json',\n            data: {\n                message: status\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport moment from '../utils/dates';\n\nconst LOGOUT_BOUNCE_COOKIE_NAME = 'lastLogoutTimestamp';\nconst LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS = 5000;\nconst LOGOUT_BOUNCE_THREASHOLD_MILLIS = 5000;\n\nconst { inject, typeOf, Logger, Service } = Ember;\n\n/**\n *  Service containing utility methods and metadata used in the PureCloud OAuth flows\n *\n *  service:purecloud-oauth - utilities and state for the oauth flow\n *  authenticator:directory - Handles direct interface with the auth endpoints\n *  service:session - holds state for the current user authentication/authorization context\n *  authorizer:directory - Handles future request authorization\n */\nexport default Service.extend({\n    cookies: inject.service(),\n    session: inject.service(),\n\n    _restoreState: null,\n\n    // Flag to indicate if we're in the logout/login bounce used to re-prime the oauth flow to Collaborate upon logout\n    inLogoutBounce: false,\n\n    init() {\n        this._super(...arguments);\n        if (this._isInLogoutBounce()) {\n            this.set('inLogoutBounce', true);\n            this._clearLogoutTime();\n        }\n    },\n\n    /**\n     * Generates a string value that can be passed via the state parameter\n     * to restore the current state post authentication\n     */\n    serializeRestoreState(baseLocation = window.location) {\n        let result = null;\n\n        const searchString = baseLocation.search;\n        const internalRoute = this.get('session.attemptedTransition.intent.url');\n\n        if (searchString && _.trim(searchString).length > 0) {\n            result = (result || '') + searchString;\n        }\n\n        if (internalRoute && _.trim(internalRoute).length > 0) {\n            result = (result || '') + `#${internalRoute}`;\n        }\n\n        // Make sure we don't redirect to login-oauth; should never be the case though\n        return result && result.indexOf('login-oauth') === -1 ? result : null;\n    },\n\n    /**\n     * Parse and store the state param for later use to restore the app to\n     * pre-auth state.\n     */\n    deserializeRestoreState(stateParamValue, baseLocation = window.location) {\n        let redirectUrl = null;\n        let prunedStateParamValue = typeOf(stateParamValue) === 'string' ? stateParamValue.trim() : undefined;\n\n        if (prunedStateParamValue) {\n            let firstChar = prunedStateParamValue.charAt(0);\n            if (firstChar === '?' || firstChar === '#') {\n                // Rebuild pre-redirect state\n                try {\n                    // ensure pathname ends with .html or / for s3 redirect\n                    let s3SafePathname = baseLocation.pathname;\n                    if (!s3SafePathname.endsWith('.html') && !s3SafePathname.endsWith('/')) {\n                        s3SafePathname += '/';\n                    }\n\n                    let parsedStateParam = new URL(prunedStateParamValue, 'https://example.com');\n                    // if no search was provided via state, use the current\n                    // FUTURE: We could merge the query params if we wanted, but not currently applicable and probably overkill\n                    let finalSearch = parsedStateParam.search || baseLocation.search;\n                    // if no hash was provided via state, use the current\n                    let finalHash = parsedStateParam.hash || baseLocation.hash;\n\n                    redirectUrl = new URL(\n                        `${s3SafePathname}${finalSearch}${finalHash}`,\n                        baseLocation.origin || `${baseLocation.protocol}//${baseLocation.host}`\n                    ).toString();\n                } catch (e) {\n                    if (baseLocation) {\n                        // prunedStateParamValue or final url is invalid\n                        Logger.error('Failed to restore URL state after authentication', { error: e });\n                    }\n\n                    redirectUrl = null;\n                }\n            }\n        }\n\n        if (redirectUrl) {\n            this.set('_restoreState', { url: redirectUrl });\n        } else {\n            this.set('_restoreState', null);\n        }\n    },\n\n    /**\n     * Pop the restore state object {url: 'url'}\n     * to restore the app to pre-auth state\n     */\n    popRestoreState() {\n        const result = this.get('_restoreState');\n        this.set('_restoreState', null);\n        return result;\n    },\n\n    /**\n     * Persist the logout time in browser storage for logout bounce detection on\n     * the next application load\n     */\n    recordLogoutTime() {\n        let now = moment();\n\n        let cookieOptions = {\n            expires: moment(now).add(LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS, 'milliseconds').toDate()\n        };\n\n        if (window && window.location && window.location.protocol === 'https:') {\n            cookieOptions.secure = true;\n        }\n\n        if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n            cookieOptions.sameSite = 'none';\n        }\n\n        this.get('cookies').write(LOGOUT_BOUNCE_COOKIE_NAME, '' + now.valueOf(), cookieOptions);\n    },\n\n    _clearLogoutTime() {\n        this.get('cookies').clear(LOGOUT_BOUNCE_COOKIE_NAME);\n    },\n\n    _isInLogoutBounce() {\n        let result = false;\n\n        let now = moment();\n        let lastLogout = Number(this.get('cookies').read(LOGOUT_BOUNCE_COOKIE_NAME));\n\n        if (lastLogout) {\n            result = now.diff(moment(lastLogout)) <= LOGOUT_BOUNCE_THREASHOLD_MILLIS;\n        }\n\n        return result;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport const RELATE_FRAME_ID = '#relateFrame';\n\nconst DEFAULT_ROUTE_MAP = {\n    'relate-engine': {\n        list: {\n            contacts: 'contacts',\n            organizations: 'organizations'\n        },\n        contact: {\n            edit: 'contacts/profile/edit',\n            show: 'contacts/profile',\n            new: 'contacts/add'\n        },\n        organization: {\n            edit: 'organizations/profile/edit',\n            show: 'organizations/profile',\n            new: 'organizations/add'\n        },\n        upload: 'csv'\n    }\n};\n\nexport const VERIFICATION_RELEVANT_DATA_MESSAGE = {\n    command: 'verificationRelevantData'\n};\n\nexport const CONTACTS_ENDPOINT = 'api/v2/externalcontacts/contacts/';\nexport const CONVERSATIONS_ENDPOINT = 'api/v2/externalcontacts/conversations/';\n\nconst STRICT = true;\nconst NO_OP = 'noop';\n\nconst PROFILE_VERIFICATION_EVENT_NAME = 'profileVerified';\nconst SHOW_PROFILE_EVENT_NAME = 'showProfile';\n\nexport const EXTERNAL_CONTACT = 'externalcontacts/contact';\n\nconst ADAPTER_CACHE_TIMEOUT = 3 * 1000;\n\nexport const CHANNEL_MODEL_TYPE = 'externalcontacts/channel-record';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, RelateFeaturesMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    addressformat: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    names: Ember.inject.service(),\n\n    adapterCache: {},\n\n    isRelateActive: false,\n    route: NO_OP,\n    navigationRoute: null,\n    redirectRoute: null,\n    externalContactProfiles: [],\n    navTree: null,\n    helpURL: Ember.computed.alias('route'),\n    relateFrameOrigin: null,\n    profileVerificationEventName: PROFILE_VERIFICATION_EVENT_NAME,\n    showProfileEventName: SHOW_PROFILE_EVENT_NAME,\n\n    /**\n     * The list of contacts associated with an interaction\n     *\n     * Contacts with 'wasAutoverified' were automatically associated\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactAssociationMap: {},\n\n    /**\n     * The list of contacts that have been manually disassociated with an interaction\n     *   Will remove this when conversation service keeps track of the dissassociation list\n     *   For now, users will have to manually disassociate contacts again if the app is refreshed\n     *\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactDisassociationMap: {},\n\n    findMatchingExternalContacts(searchTerm, pageOffset, pageSize, expandField, originator) {\n        if (!searchTerm) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        let url = this.get('application').pcUri(CONTACTS_ENDPOINT);\n\n        if (this.get('addressformat').isValidNumber(searchTerm, null, STRICT)) {\n            searchTerm = this.get('addressformat').formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageOffset) {\n            data.pageNumber = pageOffset;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n\n        return this.get('ajax').ajaxGet(url + `?${Ember.$.param(data)}`, {\n            timeout: 2000 //msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n        });\n    },\n\n    registerSidebarState() {},\n\n    getEngineHelp(currentRouteName) {\n        const contextHelpUrls = this.get('contextHelpUrls') || {};\n        const path = Ember.get(_.merge(DEFAULT_ROUTE_MAP, contextHelpUrls), currentRouteName);\n        return path ? `relate.${path}` : currentRouteName;\n    },\n\n    handleNavigation(navEvent) {\n        this.set('navigationRoute', navEvent);\n    },\n\n    handleRedirect(navEvent) {\n        this.propertyWillChange('redirectRoute');\n        this.set('redirectRoute', navEvent);\n        this.propertyDidChange('redirectRoute');\n    },\n\n    registerNavEntries(navEntries) {\n        this.set('navTree', navEntries);\n    },\n\n    /**\n     * Binds a non-agent participant to an external contact the given external contact between the conversation, communication, and the media type\n     *  Note: Currently we only support a 1:1 relationship between interaction and contact. In the future we plan to adjust this\n     *          to be a 1:n relationship between interaction and its associated contacts\n     *\n     * @param conversationId - the conversation ID to which the external contact should be bound.\n     * @param externalContactId - (optional) if the external contact ID is missing the association is removed.\n     * @param communicationId - (optional) the communication ID for the conversation.\n     * @param mediaType - (optional)  Should be one of 'call', 'email', 'chat',\n     * @returns An Ember RSVP promise\n     */\n    associateConversationWithInteraction(conversationId, communicationId, externalContactId, mediaType) {\n        const url = this.get('application').pcUri(CONVERSATIONS_ENDPOINT + conversationId);\n        const data = {\n            communicationId: communicationId,\n            mediaType: mediaType,\n            conversationId: conversationId\n        };\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        return this.get('ajax').put(url, { data: data, dataType: 'text' });\n    },\n\n    profileVerified(verificationInteractionData, displayNotification) {\n        if (displayNotification) {\n            verificationInteractionData.shouldNotify = true;\n        }\n        this.trigger(this.get('profileVerificationEventName'), verificationInteractionData);\n        this.processFrameVerificationEvent(verificationInteractionData);\n    },\n\n    closeRelateFrame(isClosedInteraction) {\n        if (!isClosedInteraction) {\n            this.trigger(this.get('showProfileEventName'), true);\n        }\n    },\n\n    postMessage(message) {\n        try {\n            const relateIframe = $(RELATE_FRAME_ID).get(0);\n            if (!relateIframe) {\n                return;\n            }\n\n            relateIframe.contentWindow.postMessage(message, this.get('relateFrameOrigin'));\n        } catch (e) {\n            this.logger.error('Could not postMessage', { error: e, message });\n        }\n    },\n\n    postVerificationRelevantDataV2(conversationId, communicationId, mediaType, contactId) {\n        let message = Object.assign({}, VERIFICATION_RELEVANT_DATA_MESSAGE);\n\n        const contactAssociationMap = this.get('contactAssociationMap');\n        const associatedContacts = contactAssociationMap[conversationId] || [];\n        const hasActiveAssociation = associatedContacts.length;\n\n        const verified =\n            hasActiveAssociation &&\n            associatedContacts.find(contact => {\n                return contact.get('id') === contactId;\n            });\n\n        const wasAutoVerified = verified && verified.get('wasAutoverified');\n\n        message.verificationRelevantData = {\n            mediaType: mediaType,\n            contactId,\n            conversationId,\n            communicationId,\n            wasAutoVerified,\n            isVerified: !!hasActiveAssociation,\n            activeProfileIsVerified: !!verified\n        };\n        this.postMessage(message);\n    },\n\n    getCachedAdapter(queryData, context, timeout) {\n        if (!context.ajax) {\n            this.logger.error(`Relate Service: Relate Service: adapter not valid`);\n            return Ember.RSVP.reject({});\n        }\n        const { url, data, TIME_OUT } = queryData;\n        const adapterCache = this.get('adapterCache');\n\n        const q = data.lookupVal || data.q;\n        const exp = data.expand || '';\n        const num = data.pageNumber || 0;\n        const siz = data.pageSize || 0;\n        const ord = data.sortOrder || 0;\n\n        const key = `${url}_${q}_${exp}_${num}_${siz}_${ord}`;\n\n        let { promise, timer } = adapterCache[key] || {};\n\n        if (!promise) {\n            promise = context.ajax(url, 'GET', { data, timeout: TIME_OUT }).catch(error => {\n                this.clearCachedAdapter(key);\n                const errorType = data.lookupVal ? 'reverse whitePage lookup' : 'search';\n\n                this.logger.error(`Relate Service: error getting data`, {\n                    remoteData: {\n                        error,\n                        errorType,\n                        sensitive: {\n                            data\n                        }\n                    }\n                });\n                return error;\n            });\n        }\n        if (timer) {\n            Ember.run.cancel(timer);\n        }\n        timer = Ember.run.later(this, 'clearCachedAdapter', key, timeout || ADAPTER_CACHE_TIMEOUT);\n        adapterCache[key] = { promise, timer };\n        return promise;\n    },\n\n    clearCachedAdapter(key) {\n        if (!key) {\n            return this.set('adapterCache', {});\n        }\n        const adapterCache = this.get('adapterCache');\n        const { timer } = adapterCache[key] || {};\n        if (timer) {\n            Ember.run.cancel(timer);\n        }\n        delete adapterCache[key];\n    },\n\n    interactionEnded(interactionId) {\n        const clear = map => {\n            interactionId &&\n                map[interactionId] &&\n                map[interactionId].clear() &&\n                map[interactionId].length === 0 &&\n                delete map[interactionId];\n        };\n        clear(this.contactAssociationMap);\n        clear(this.contactDisassociationMap);\n    }\n});\n","define(\"connections-ui/services/resize-detector\", [\"exports\", \"ember-element-resize-detector/services/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Service, { inject } from '@ember/service';\n\nexport interface IMediaMetadata {\n    trackId: string;\n    screenId: string;\n    originX: number;\n    originY: number;\n    resolutionX: number;\n    resolutionY: number;\n    primary: boolean;\n    main?: boolean;\n}\n\nexport interface IShareableScreenInfo {\n    shareid: string;\n    width: number;\n    height: number;\n    isPrimary: boolean;\n    isMain: boolean;\n    x: number;\n    y: number;\n}\n\nexport class BrowserScreenRecordingError extends Error {}\n\nexport default class ScreenMediaService extends Service {\n    application = inject('application');\n    session = inject('session');\n    logger = inject('stash-logger');\n\n    // set this through Orgpsan for testing\n    allowScreenRecordingInBrowser!: false;\n    debugScreenSelectionOpen = false;\n\n    _getHostedContext() {\n        return (this.get as any)('application.hostedContext');\n    }\n\n    _isHosted(): boolean {\n        return this._getHostedContext().isHosted();\n    }\n\n    canDoScreenRecording(): boolean {\n        return this._isHosted() || this.get('allowScreenRecordingInBrowser');\n    }\n\n    async _debugScreenRecordingInBrowser(): Promise<MediaStream> {\n        this.set('debugScreenSelectionOpen', true);\n        const stream = await navigator.mediaDevices.getDisplayMedia();\n        this.set('debugScreenSelectionOpen', false);\n\n        return stream;\n    }\n\n    async getMediaStreamWithAllMonitors(\n        conversationId: string\n    ): Promise<{ stream: MediaStream; metadatas: IMediaMetadata[] }> {\n        if (!this._isHosted()) {\n            this.get('logger').warn('screenMedia was requested in non-hosted env', { remoteData: { conversationId } });\n        }\n\n        if (this.get('allowScreenRecordingInBrowser')) {\n            const stream = await this._debugScreenRecordingInBrowser();\n            const track = stream.getTracks()[0];\n            const { height, width, deviceId } = track.getSettings();\n            const metadata: IMediaMetadata = {\n                trackId: track.id,\n                screenId: deviceId!, // some applications give you a deviceId on the track which is uniquely tied to a specific monitor\n                originX: 0,\n                originY: 0,\n                resolutionX: width!,\n                resolutionY: height!,\n                primary: true\n            };\n\n            return { stream, metadatas: [metadata] };\n        } else if (!this._isHosted()) {\n            throw new BrowserScreenRecordingError('Cannot do screen recording in browser env');\n        }\n\n        // get a list of monitors so we can gather media for each one\n        const screens = await this._getHostedContext().getShareableScreens();\n\n        const stream = this.createMediaStream();\n        const metadatas = [];\n\n        for (const screen of screens) {\n            const track = await this.getVideoTrackForScreenId(screen.shareid, conversationId);\n\n            // if we have a track, create the metadata to go with it\n            if (track) {\n                stream.addTrack(track);\n                metadatas.push(this.createTrackMetadata(screen, track));\n            }\n        }\n\n        return { stream, metadatas };\n    }\n\n    createMediaStream() {\n        return new MediaStream();\n    }\n\n    // tries 3 times to add a screen to the media stream\n    async getVideoTrackForScreenId(\n        screenId: string,\n        conversationId: string,\n        attemptsRemaining = 3\n    ): Promise<MediaStreamTrack | undefined> {\n        try {\n            const stream = await this.getHostedScreenMedia(screenId);\n\n            if (stream && stream.getVideoTracks().length) {\n                return stream.getVideoTracks()[0];\n            }\n\n            return;\n        } catch (err) {\n            if (!attemptsRemaining) {\n                this.get('logger').error(new Error('Failed to initialize screen recording for screen') as any, {\n                    remoteData: { screenId, conversationId, error: err }\n                });\n                return;\n            }\n\n            return this.getVideoTrackForScreenId(screenId, conversationId, attemptsRemaining - 1);\n        }\n    }\n\n    getHostedScreenMedia(screenId: string, maxFrameRate = 3): Promise<MediaStream> {\n        return window.navigator.mediaDevices.getUserMedia({\n            audio: false,\n            video: {\n                mandatory: {\n                    chromeMediaSource: 'desktop',\n                    chromeMediaSourceId: screenId,\n                    maxFrameRate\n                }\n            } as any\n        });\n    }\n\n    createTrackMetadata(screenInfo: IShareableScreenInfo, track: MediaStreamTrack): IMediaMetadata {\n        const isWindows = navigator.appVersion.indexOf('Win') > -1;\n        // purecloud-mac uses the bottom-left corner of the screen as its origin, with positive numbers representing higher origins\n        // purecloud-directory-window uses the top-left corner of the screen as its origin, with positive numbers representing lower origins\n        return {\n            trackId: track.id,\n            screenId: screenInfo.shareid,\n            originX: screenInfo.x,\n            originY: isWindows ? screenInfo.y : -1 * screenInfo.y,\n            resolutionX: screenInfo.width,\n            resolutionY: screenInfo.height,\n            primary: !!screenInfo.isPrimary,\n            main: !!screenInfo.isMain\n        };\n    }\n}\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        screenMedia: ScreenMediaService;\n        'screen-media': ScreenMediaService;\n    }\n}\n","define(\"connections-ui/services/scroll-activity\", [\"exports\", \"ember-user-activity/services/scroll-activity\"], function (_exports, _scrollActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _scrollActivity.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { isAbortError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport EsaSessionService from 'ember-simple-auth/services/session';\nimport _ from 'lodash';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport FieldConfig from '../field-config/field-config';\nimport moment from '../utils/dates';\nimport featureToggles from '../utils/feature-toggles';\nimport { addPageAction, setCustomAttribute } from '../utils/newrelic';\nimport { getLoggableRequestFailureDetails } from '../utils/request';\nimport { executeChain, isChainStepFailure } from '../utils/serial-processing-chain';\nimport { loadTheme, setThemeCookie } from '../utils/theme-loader';\nimport { buildCommonTelemetryContext } from './analytics';\n\n// TECHDEBT: Make this a proper type/error and part of the method signature when moving to TS\nexport const SESSION_BOOTSTRAP_ERROR_TYPE = 'sessionBootstrapError';\n\nexport default EsaSessionService.extend(LoggerMixin, {\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    clock: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    cookies: Ember.inject.service(),\n    application: Ember.inject.service(),\n    featureService: Ember.inject.service('feature'),\n    presence: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n    // Store conflicts with ESA Session Service property\n    dataStore: Ember.inject.service('store'),\n    permissionService: Ember.inject.service('permissions'),\n    orgSettings: Ember.inject.service('orgSettings'),\n\n    accessToken: null,\n\n    person: null,\n    presenceMap: Ember.computed.reads('presence.presenceDefinitions'),\n\n    user: null, // Legacy - Directory session user - Move to permissions where possible.\n    namedPermissions: Ember.computed.reads('permissions'), // Backwards compatibility - Directory namedPermissions now point to public-api permissions\n\n    permissions: Ember.computed.reads('publicApiUser.authorization.permissions'),\n    roleNames: Ember.computed.map('publicApiUser.authorization.roles', role => role.name),\n\n    readWritePermissionsDeferred: null,\n\n    allowedOrgPermissions: null,\n    features: null,\n    enabledFeatures: [],\n\n    products: [],\n\n    authInProgress: false,\n    /**\n     * Marker boolean to indicate that the current session is being torn down\n     */\n    logoutInProgress: false,\n    /**\n     * Marker boolean to indicate that a hard logout has been requested\n     */\n    singleSignOutInProgress: false,\n\n    offset: 0,\n\n    blockers: [],\n\n    _timeAuthenticated: null,\n\n    init() {\n        this._super(...arguments);\n\n        let deferred = this.get('readWritePermissionsDeferred');\n        if (!deferred) {\n            deferred = Ember.RSVP.defer();\n            this.set('readWritePermissionsDeferred', deferred);\n        }\n    },\n\n    // isAuthenticated conflicts with ESA Session Service property\n    isAuthenticated: Ember.computed('session.isAuthenticated', 'user', 'person', function () {\n        return this.get('session.isAuthenticated') && !_.isEmpty(this.get('user'));\n    }),\n\n    hasAppAccess: Ember.computed('namedPermissions', 'user.isSuper', 'user.isTrustee', function () {\n        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n            return true;\n        }\n\n        var permissions = this.get('namedPermissions');\n\n        const hasDirectoryUserViewPermission = (permissions || []).some(perm => {\n            return perm.indexOf('directory:user:view') > -1;\n        });\n\n        return (\n            _.includes(permissions, 'employee') ||\n            _.includes(permissions, 'external') ||\n            _.includes(permissions, 'associate') ||\n            hasDirectoryUserViewPermission\n        );\n    }),\n\n    hasTrusteeAccess: Ember.computed('user.isTrustee', function () {\n        return this.get('user.isTrustee');\n    }),\n\n    // Has permission that is division aware.\n    hasPermissionAndDivision: function (permission, division) {\n        const result = {\n            hasPermission: false,\n            divisions: [],\n            hasDivision: false,\n            hasDivisions: false\n        };\n\n        if (!permission) {\n            return result;\n        }\n\n        const permissions = this.get('namedPermissions');\n        const expression = '^'.concat(permission, ':', '([0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12},|)+');\n        const regEx = new RegExp(expression);\n        let isPermission = false;\n        let isPermissionWithDivisions = false;\n        let permissionDivisions = [];\n\n        const foundPermission = _.find(permissions, p => {\n            isPermission = p === permission;\n            isPermissionWithDivisions = regEx.test(p);\n            if (isPermissionWithDivisions) {\n                permissionDivisions = _.last(p.split(':'));\n            }\n            return isPermission || isPermissionWithDivisions;\n        });\n\n        if (foundPermission) {\n            result.hasPermission = true;\n            if (isPermissionWithDivisions) {\n                result.hasDivisions = true;\n                if (permissionDivisions && permissionDivisions.length > 0) {\n                    result.divisions = permissionDivisions.split(',');\n                    if (division && _.includes(permissionDivisions, division)) {\n                        result.hasDivision = true;\n                    }\n                }\n            }\n            return result;\n        }\n        return result;\n    },\n\n    readWritePermissions: Ember.computed(function () {\n        const deferred = this.get('readWritePermissionsDeferred');\n        if (!deferred) {\n            // return dummy on the off chance that the laws of physics no longer apply\n            if (this.logger) {\n                this.logger.warn('readWritePermissionsDeferred never instantiated in Session `init` call');\n            }\n            return Ember.RSVP.defer().promise;\n        }\n        return deferred.promise;\n    }),\n\n    useEmailDraftEvent: true,\n\n    popoutAuthForIframes: Ember.computed('org.orgSettings.popoutAuthForIframes', function () {\n        return !!this.get('org.orgSettings.popoutAuthForIframes');\n    }),\n\n    /**\n     * Determines if the app should try to detect API requests to the UI hosting domain and\n     * rewrite them to our API domain. This is to help with the transition to our new\n     * hosting where API calls are not available on the same domain.\n     */\n    rewriteRootAPIRequests: Ember.computed('features.comui-disable-legacy-api-url', function () {\n        // Only do this we are on the new hosting and the feature toggle is enabled.\n        return window.location.hostname.startsWith('app.') && this.get('features.comui-disable-legacy-api-url');\n    }),\n\n    createFieldConfigs: function (fieldConfigs) {\n        for (const value of Object.values(fieldConfigs)) {\n            this.createFieldConfig(value);\n        }\n    },\n\n    createFieldConfig: function (fieldConfig) {\n        FieldConfig.createFieldConfig(fieldConfig, Ember.getOwner(this));\n    },\n\n    createPresences: function () {\n        return this.get('presence').loadPresences();\n    },\n\n    loadAllowedOrgPermissions: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/permissions?pageSize=99999');\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                this.set('allowedOrgPermissions', data.entities);\n            })\n            .catch(error => {\n                this.set('allowedOrgPermissions', null);\n                this.logger.error('Could not get org permissions:', { error });\n                return Ember.RSVP.reject('orgPermissionsFetchFailure');\n            });\n    },\n\n    loadOrgProducts: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/products');\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                this.set('products', data.entities);\n            })\n            .catch(error => {\n                this.set('products', []);\n                this.logger.error('Could not get org products:', { error });\n                return Ember.RSVP.reject('orgProductsFetchFailure');\n            });\n    },\n\n    async getOrganizationTranscriptSettings() {\n        const ajax = this.get('ajax');\n        const application = this.get('application');\n        const hasPermission = (this.get('permissions') || []).includes('routing:transcriptionSettings:view');\n\n        if (!hasPermission) {\n            return {};\n        }\n\n        let transcriptSettings = {};\n\n        try {\n            const settingsUri = application.pcV2Uri('api/v2/routing/settings/transcription');\n            const response = await ajax.request(settingsUri);\n\n            transcriptSettings = response || {};\n        } catch (error) {\n            this.logger.error('directory failed to retrieve org transcript settings', { error });\n        }\n\n        this.set('transcriptSettings', transcriptSettings);\n        return transcriptSettings;\n    },\n\n    getPresence(presence) {\n        return this.get('presence').getPresence(presence);\n    },\n\n    authenticateWithSession(forceDirectory = false) {\n        if (this.get('isAuthenticated')) {\n            return Ember.RSVP.resolve();\n        }\n\n        this.set('authInProgress', true);\n\n        const bootstrapStartTime = performance.now();\n\n        return executeChain(\n            [\n                {\n                    stepDesc: 'loadFeatureToggles',\n                    process: () => this.getFeatures()\n                },\n                {\n                    stepDesc: 'loadOrgPermissions',\n                    process: () => this.loadAllowedOrgPermissions()\n                },\n                {\n                    stepDesc: 'setupTheme',\n                    processSync: () => setThemeCookie(loadTheme(this))\n                },\n                {\n                    stepDesc: 'setupUserAndTrustee',\n                    process: () => {\n                        if (!forceDirectory) {\n                            return this.trusteeBootstrap();\n                        }\n\n                        return Ember.RSVP.resolve();\n                    }\n                },\n                {\n                    stepDesc: 'establishDirectorySession',\n                    process: () => {\n                        // Don't call directory session for login when we have trustee features on\n                        if (this.get('user.isTrustee')) {\n                            return Ember.RSVP.resolve();\n                        }\n\n                        const path = 'api/v2/apps/legacy/session';\n                        const url = this.get('application').pcV2Uri(path);\n                        const data = { lang: this.get('intl.isoLocale') };\n                        return this.get('ajax')\n                            .post(url, { data })\n                            .then(data => this.establishSession(data));\n                    }\n                },\n                {\n                    stepDesc: 'initServerTranslations',\n                    process: () => this.get('intl').setupServerTranslations()\n                },\n                {\n                    stepDesc: 'loadPresences',\n                    process: () => this.createPresences()\n                },\n                {\n                    stepDesc: 'loadUserDetails',\n                    process: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return Ember.RSVP.resolve([]);\n                        }\n                        return this.refreshPublicApiUser();\n                    }\n                },\n                {\n                    stepDesc: 'loadUserFavorites',\n                    processSync: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return;\n                        }\n\n                        return this.get('person.favorites');\n                    }\n                },\n                {\n                    stepDesc: 'setupCarrierPigeon',\n                    process: () => this.setupCarrierPigeon()\n                },\n                {\n                    stepDesc: 'initAppSession',\n                    process: () => this.updateAppSession()\n                },\n                {\n                    stepDesc: 'loadOrgProducts',\n                    process: () => {\n                        const hasAssistantsQueueViewPermission = (this.get('namedPermissions') || []).some(perm => {\n                            return perm.indexOf('assistants:queue:view') > -1;\n                        });\n                        if (hasAssistantsQueueViewPermission) {\n                            return this.loadOrgProducts();\n                        }\n                    }\n                },\n                {\n                    stepDesc: 'loadOrgTranscriptSettings',\n                    process: () => this.getOrganizationTranscriptSettings()\n                },\n                {\n                    stepDesc: 'loadPerson',\n                    processSync: () => this.get('person')\n                }\n                // DO NOT add additional processing blocks here unless it is REQUIRED for app bootstrap\n            ],\n            {\n                loggingConfig: {\n                    logger: this.get('stashLogger'),\n                    logMsgPrefix: 'Session Bootstrap Chain: '\n                }\n            }\n        )\n            .then(() => {\n                this.set('authInProgress', false);\n                const bootstrapDuration = performance.now() - bootstrapStartTime;\n                addPageAction('sessionBootstrapSuccess', {\n                    duration: bootstrapDuration\n                });\n            })\n            .catch(reason => {\n                this.set('authInProgress', false);\n\n                let error = reason;\n                let failedStep;\n\n                // Theoretically, reason should always be a ChainStepFailure, but .. promise rejection typings\n                if (isChainStepFailure(reason)) {\n                    error = reason.origReason;\n                    failedStep = reason.stepDesc;\n                }\n\n                /* Legacy Checks */\n                let legacyInvalidSessionToken = false;\n                let legacyErrorCode = null;\n                if (error && error.status === 200) {\n                    legacyErrorCode = 'directorySessionParseFailure';\n                }\n\n                if (error && error.status === 403) {\n                    legacyInvalidSessionToken = true;\n                    legacyErrorCode = 'invalidSessionToken';\n                }\n                /* End Legacy Checks */\n\n                const telemetryContext = buildCommonTelemetryContext({\n                    applicationService: this.get('application'),\n                    sessionService: this,\n                    intlService: this.get('intl')\n                });\n                const loggableRequestFailureDetails = getLoggableRequestFailureDetails(error);\n\n                this.get('stashLogger').error('Session bootstrap failed', {\n                    error,\n                    remoteData: Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode,\n                            requestFailureDetails: loggableRequestFailureDetails\n                        },\n                        telemetryContext\n                    )\n                });\n\n                addPageAction(\n                    'sessionBootstrapFailure',\n                    Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode\n                        },\n                        loggableRequestFailureDetails,\n                        telemetryContext\n                    )\n                );\n\n                return Ember.RSVP.reject({\n                    type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                    failedStep,\n                    status: loggableRequestFailureDetails ? loggableRequestFailureDetails.status : undefined,\n                    legacyInvalidSessionToken\n                });\n            });\n    },\n\n    trusteeBootstrap() {\n        const expands = ['fieldconfigs', 'organization'];\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.refreshPublicApiUser(expands)\n                .then(data => {\n                    this.setServerTimeOffset();\n                    moment.now = () => {\n                        const offset = this.get('offset');\n                        return +new Date() + offset;\n                    };\n\n                    this.set('_timeAuthenticated', moment.now());\n\n                    this.createFieldConfigs(data.fieldConfigs);\n\n                    const user = this.setupStoreData('public-api-user', data);\n                    this.set('user', user);\n                    this.set('trusteeOrg', data.organization);\n\n                    // See if the person exists, if not, trustee user.\n                    // This will be changed to an directory session call when they support\n                    // trustees...soon...\n                    this.get('dataStore')\n                        .find('person', user.get('id'))\n                        .then(person => {\n                            this.set('person', person);\n\n                            // the profile load was triggerred by refreshPublicApiUser(expands) above\n\n                            resolve(person);\n                        })\n                        .catch(error => {\n                            const serverError = Ember.get(error, 'errors.0');\n                            if (serverError && serverError.status === 404) {\n                                this.set('user.isTrustee', true);\n\n                                const person = this.get('dataStore').createRecord('person', {\n                                    id: 'trustee',\n                                    general: {\n                                        name: [{ value: user.get('name') }],\n                                        department: [{ value: user.get('department') }],\n                                        title: [{ value: user.get('title') }]\n                                    }\n                                });\n                                this.set('person', person);\n\n                                resolve();\n                            } else {\n                                reject(error);\n                            }\n                        });\n                })\n                .catch(error => {\n                    if (error.status === 404 || _.includes(error.message, 'not found')) {\n                        resolve(this.authenticateWithSession(true));\n                    } else {\n                        this.get('logger').error('trusteeBootstrap failed', {\n                            error,\n                            remoteData: {\n                                error: error\n                            }\n                        });\n                        reject(error);\n                    }\n                });\n        });\n    },\n\n    /**\n     * Initiates logout if the user is deleted outside of a logout request\n     */\n    onLegacySessionInvalidation: Ember.observer('user', function () {\n        if (_.isEmpty(this.get('user')) && !this.get('logoutInProgress')) {\n            this.invalidate();\n        }\n    }),\n\n    /**\n     * If no critical work is in progress, invalidates the session with both ESA\n     * and any local cleanup triggering the 'invalidationSucceeded' event when complete.\n     * This method should be used to invalidate the current session as opposed to\n     * logging out of PureCloud.  For a full, single-sign-out logout, call logout.\n     *\n     * This method triggers 'invalidatingAuthSession' to allow any listeners to\n     * register critical functionality that cannot be currently aborted.\n     *\n     * Note: This method is multi-call, burst tolerant to handle multiple\n     * 401 responses from the ajaxError handler and bubbling logout events.\n     *\n     * @returns A rejected promise if any listeners have registered critical functionality\n     * in progress; Otherwise, a logout promise that will be the same instance for the duration\n     * of the logout attempt.  It will only be reattempted if the logout attempt\n     * fails.\n     */\n    invalidate(options) {\n        options = options || {};\n        const LOGOUT_PROMISE_PROP_NAME = '_logoutPromise';\n        let logoutPromise = this.get(LOGOUT_PROMISE_PROP_NAME);\n\n        //workaround for an odd bug that is causing the call to super below to hit the wrong super class.\n        //the context of `this` does not change, but _super does.\n        let _super = this._super.bind(this);\n\n        // notify services that we're attempting to logout.\n        this.trigger('invalidatingAuthSession', this.addRemoveBlockers.bind(this));\n\n        if (this.get('blockers.length') > 0) {\n            this.set('shouldPreventLogout', true);\n            const unauthorized = !!(options.unauthorized || options.notified);\n            // Force a boolean value\n            this.set('logoutSinceUnauthorized', unauthorized);\n            return Ember.RSVP.reject('prevent this logout');\n\n            // if we got blocked due to webrtc sessions, we want to bypass this because it means they've already seen a notification\n        } else if (!this.get('logoutSinceUnauthorized')) {\n            this.set('shouldPreventLogout', false);\n            this.set('logoutSinceUnauthorized', false);\n        }\n        if (!logoutPromise) {\n            logoutPromise = new Ember.RSVP.Promise((resolve, reject) => {\n                this.set('logoutInProgress', true);\n\n                Ember.RSVP.resolve().finally(() => {\n                    if (this.get('session.isAuthenticated')) {\n                        _super(...arguments)\n                            .then(resolve)\n                            .catch(() => {\n                                // Currently, this will only happen if ESA fails to remove the auth creds\n\n                                this.set('logoutInProgress', false);\n\n                                // kill user to force isAuthenticated computed to false\n                                // Note: user observer fires immediately and gets same rejected promise; no duplicate call risk\n                                this.set('user', null);\n\n                                // Reset the promise so they can attempt to logout again\n                                this.set(LOGOUT_PROMISE_PROP_NAME, null);\n\n                                // ESA will fire a failure event\n                                reject();\n                            });\n                    } else {\n                        /* ESA is already unauth'd (Ex: no-access route).\n                         * Simply do some local cleanup and redirect to the login screen\n                         * Note: This op could have no effect and result in the user landing back on the same page.\n                         * For Example: The no-access page\n                         */\n\n                        const authenticator = Ember.getOwner(this).lookup('authenticator:directory');\n                        if (authenticator) {\n                            authenticator.cleanCustomBrowserStorage();\n                        }\n                        this.trigger('invalidationSucceeded');\n\n                        resolve();\n                    }\n                });\n            }); // end logoutPromise\n\n            this.set(LOGOUT_PROMISE_PROP_NAME, logoutPromise);\n        } // end if (!logoutPromise)\n\n        return logoutPromise;\n    },\n\n    addRemoveBlockers(action, blocker) {\n        let arr = this.get('blockers');\n        if (action === 'add') {\n            arr.pushObject(blocker);\n        }\n        if (action === 'remove') {\n            arr.removeObject(blocker);\n        }\n        this.get('blockers').setObjects(arr.uniq());\n    },\n\n    proxyLogin(orgId, hash) {\n        this.set('proxyLoginInfo', { org: orgId, hash: hash });\n        return this.invalidate({ notified: true }).catch(() => {\n            this.set('proxyLoginInfo', null);\n        });\n    },\n\n    retrieveProxyLoginInfo() {\n        return this.get('proxyLoginInfo');\n    },\n\n    /**\n     * If no critical work is in progress, log out of entire PureCloud suite.\n     *\n     * Kills currently issued auth token and all other tokens issued within the\n     * current auth session.  Also kills RememberMe context (if applicable).\n     *\n     * @returns A rejected promise if critical work is in progress; otherwise, a\n     * \"singleton\" promise that will reject or resolve on eventual completion. The\n     * promise allows burst calls of logout to be debounced until the promise\n     * resolves.\n     *\n     * @see #invalidate() for burst and critical work details\n     */\n    logout() {\n        this.set('singleSignOutInProgress', true);\n        return this.invalidate({ notified: true }).catch(reason => {\n            // Invalidate failed due to active call, interal issue, etc.\n\n            // Clear the SSO boolean for recoverable failure cases\n            this.set('singleSignOutInProgress', false);\n            return Ember.RSVP.reject(reason);\n        });\n    },\n\n    setupStoreData(type, data) {\n        let store = this.get('dataStore');\n        let model = store.modelFor(type);\n        let serializer = store.serializerFor(type);\n        data = serializer.normalizeSingleResponse(store, model, data, data.guid);\n        return store.push(data);\n    },\n\n    /**\n     * Safely checks if a feature flag is enabled, ensuring features are loaded first\n     * @param {string} featureName - The name of the feature flag to check\n     * @returns {boolean} - Whether the feature is enabled\n     */\n    isFeatureEnabled(featureName) {\n        if (!this.get('features')) {\n            return false;\n        }\n        return !!this.get(`features.${featureName}`);\n    },\n\n    establishSession(data, redirect) {\n        let response = data.res;\n\n        if (!_.isEmpty(redirect)) {\n            Ember.run.later(\n                this,\n                function () {\n                    window.location = redirect;\n                },\n                100\n            );\n\n            return;\n        }\n\n        this.setServerTimeOffset();\n        moment.now = () => {\n            const offset = this.get('offset');\n            return +new Date() + offset;\n        };\n\n        this.createFieldConfigs(response.fieldConfigs);\n\n        let person = null;\n        if (response.person && response.person.guid) {\n            person = this.setupStoreData('person', response.person);\n            this.set('person', person);\n        }\n\n        let user = this.setupStoreData('user', response.user);\n\n        this.set('app', response.app);\n        this.set('_rawResponse', response);\n\n        if (response.org && response.org._id) {\n            let org = this.setupStoreData('org', response.org);\n            this.set('org', org);\n            this.get('orgSettings')\n                .fetchOrgSettings(this.get('org.orgSettings'))\n                .then(orgSettings => {\n                    this.set('org.orgSettings', orgSettings);\n                })\n                .catch(error => {\n                    this.logger.error('Error fetching org settings:', error);\n                });\n        }\n\n        const cookieProxyPerson = this.get('cookies').read('proxyPerson');\n        const personId = cookieProxyPerson || user.get('personGuid');\n\n        if (personId && !person) {\n            let store = this.get('dataStore');\n            let shouldReload = store.hasRecordForId('person', personId);\n            let promise = store\n                .find('person', personId)\n                .then(person => {\n                    if (shouldReload) {\n                        person.reload();\n                    }\n\n                    this.set('user', user);\n                    this.set('person', person);\n\n                    // Notify read-write perm handlers\n                    const deferred = this.get('readWritePermissionsDeferred');\n                    if (deferred) {\n                        deferred.resolve(person.get('readWritePermissions'));\n                    }\n\n                    return person;\n                })\n                .finally(() => {\n                    this.set('authInProgress', false);\n                });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n\n        return new Ember.RSVP.Promise(resolve => {\n            this.set('authInProgress', false);\n            if (!Ember.get(user, 'isSuper')) {\n                return resolve(person);\n            }\n            let superPerson = this.get('dataStore').createRecord('person', { id: 'super' });\n\n            this.set('user', user);\n            this.set('person', superPerson);\n\n            return resolve(person);\n        });\n    },\n\n    _reloadApplication: function () {\n        this.get('cookies').clear(this.get('application.cookies.session'));\n\n        var href = window.location.href;\n        var hashIndex = href.indexOf('#');\n        if (hashIndex > -1) {\n            href = href.substring(0, hashIndex);\n        }\n        window.location.replace(href);\n    },\n\n    getFeatures: function (forceUpdate = false) {\n        const featureService = this.get('featureService');\n\n        const localFeatures = [];\n        // filters out the feature toggles that are locally set to `false`\n        Object.entries(featureToggles).forEach(([key, value]) => (value ? localFeatures.push(key) : null));\n\n        return featureService\n            .getFeatureToggles(...localFeatures, forceUpdate)\n            .then(features => {\n                // Sometimes it's nicer to just have a list of all of the enabled features\n                this.set('features', features);\n\n                this.set(\n                    'enabledFeatures',\n                    Object.keys(features).filter(feature => {\n                        return features[feature];\n                    })\n                );\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    this.logger.error('Could not fetch feature toggles:', {\n                        error,\n                        remoteData: {\n                            error: error\n                        }\n                    });\n                }\n                return Ember.RSVP.reject(error);\n            });\n    },\n\n    setServerTimeOffset: Ember.observer('isAuthenticated', 'clock.day', function () {\n        const BASE_URI = 'api/v2/date';\n        const CLIENT_REQUEST_TIME_DIFF = 30000; //30 sec in milliseconds; Represents the acceptable time gap on the client between t3 and t0\n\n        this.get('clock.day'); //force consumption\n\n        if (this.get('isAuthenticated')) {\n            const t0 = moment(new Date());\n            const url = this.get('application').pcV2Uri(BASE_URI);\n            this.get('ajax')\n                .raw(url)\n                .then(response => {\n                    const serverDate = response.response;\n                    const t1 = moment(serverDate.currentDate);\n                    let correlationId = null;\n                    if (response.jqXHR) {\n                        correlationId = response.jqXHR.getResponseHeader('ININ-Correlation-id');\n                    }\n                    // TODO: Pull DATE header from response to get better measure of when the\n                    // response was sent.\n                    const t2 = t1;\n                    const t3 = moment(new Date());\n                    const clientSystemTimeSuspect = t3.diff(t0) >= CLIENT_REQUEST_TIME_DIFF;\n\n                    if (clientSystemTimeSuspect) {\n                        this.set('offset', t2.diff(t3));\n                    } else {\n                        this.set('offset', (t1.diff(t0) + t2.diff(t3)) / 2); //Offset algorithm:  http://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_synchronization_algorithm\n                    }\n\n                    this.logger.debug(\n                        `Session timer offset: Server time offset is ${this.get('offset') / 1000} seconds`\n                    );\n                    this.set('sessionTimers', {\n                        serverTimet1: t1.format(),\n                        clientTimet3: t3.format(),\n                        clientTimet0: t0.format(),\n                        offsetCalculated: this.get('offset'),\n                        clientSystemTimeSuspect,\n                        correlationId\n                    });\n                })\n                .catch(err => {\n                    this.logger.debug(\n                        'Session timer offset: An error occured when getting the server time to calculate offset. Using offset 0.',\n                        err\n                    );\n                    this.set('offset', 0);\n                });\n        } else {\n            this.set('offset', 0);\n        }\n    }),\n\n    setupCarrierPigeon() {\n        const subscription = this.get('presenceSubscription');\n        const pigeon = this.get('pigeon');\n        const channelId = this.get('accessToken');\n        const subscribeUrl = this.get('application').pcUri(`api/v2/notifications/channels/${channelId}/subscriptions`);\n        pigeon.initialize({\n            // Use public-api v2 and the access token as the channel id until realtime can use real channels\n            subscribeUrl,\n            features: this.get('features'),\n            publicApiUser: this.get('publicApiUser'),\n            accessToken: channelId\n        });\n\n        // application service will tell pigeon to register topics after streaming service is connected\n\n        if (isTesting) return Ember.RSVP.resolve();\n        subscription.subscribeToMyself();\n    },\n\n    /**\n     * Updates the session with public api used for things such as Download.\n     * A valid session establishment will set a cookie used for auth on certain routes.\n     */\n    updateAppSession() {\n        const url = this.get('application').pcV2Uri(['api/v2/apps/session']);\n        return this.get('ajax')\n            .post(url, {\n                xhrFields: {\n                    withCredentials: true\n                },\n                headers: {\n                    Authorization: `bearer ${this.get('accessToken')}`\n                }\n            })\n            .catch(reason => {\n                this.logger.error('Failed to obtain Apps Session', { error: reason });\n\n                // This request is allowed to fail since its only required for embeds\n                // We shouldnt break the app for that...\n                return Ember.RSVP.resolve();\n            });\n    },\n\n    refreshPublicApiUser(expand) {\n        const url = this.get('application').pcV2Uri('api/v2/users/me');\n        const options = {};\n\n        let baseExpands = [\n            'authorization',\n            'conversationSummary',\n            //'date'\n            'fieldconfigs',\n            'geolocation',\n            //'geolocationsettings'\n            //'locations'\n            'dateLastLogin',\n            'organization',\n            'outOfOffice',\n            'presence',\n            //'presencedefinitions'\n            //'profileSkills'\n            'routingStatus',\n            'station',\n            'token'\n        ];\n\n        //make a unique request during session initialization\n        if (!this.get('isAuthenticated')) {\n            if (this.get('publicApiUser')) {\n                return this.get('publicApiUser');\n            } else {\n                options.data = {\n                    expand: baseExpands.join(',')\n                };\n            }\n        } else {\n            if (expand) {\n                options.data = {\n                    expand: _.uniq(baseExpands.concat(expand)).join(',')\n                };\n            } else {\n                options.data = {\n                    expand: baseExpands.join(',')\n                };\n            }\n        }\n\n        return this.get('ajax')\n            .request(url, options)\n            .then(data => {\n                this.set('publicApiUser', data);\n                return data;\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    Ember.Logger.warn('Failed to fetch purecloud user in session:', { error });\n                }\n                return Ember.RSVP.reject(error);\n            });\n    },\n\n    resetPassword(type, email, newPassword, resetToken, currentPassword) {\n        Ember.assert('Please specify `set` or `change` as reset type', type);\n\n        if (type === 'set') {\n            Ember.assert('Please specify reset token to set password', resetToken);\n        }\n\n        let url;\n        let data;\n\n        if (type === 'change') {\n            Ember.assert('Please provide the current password', currentPassword);\n\n            url = this.get('application').pcV2Uri('api/v2/users/me/password');\n            data = {\n                oldPassword: currentPassword,\n                newPassword: newPassword\n            };\n        } else if (type === 'set') {\n            url = this.get('application').uri('api/v1/setPassword');\n            data = {\n                email: email,\n                password: newPassword,\n                verifyPassword: newPassword,\n                resetToken: resetToken\n            };\n        }\n\n        return this.get('ajax').post(url, { data });\n    },\n\n    publicApiUserObserver: Ember.observer('publicApiUser', function () {\n        const user = this.get('publicApiUser');\n        const version = this.get('application.semver');\n\n        if (user && user.id) {\n            setCustomAttribute('User Id', user.id);\n        }\n        if (user && user.organization && user.organization.id) {\n            setCustomAttribute('Organization Id', user.organization.id);\n        }\n        if (user && user.organization && user.organization.name) {\n            setCustomAttribute('Organization', user.organization.name);\n        }\n        if (version) {\n            setCustomAttribute('App Version', version);\n        }\n    }),\n\n    // Forward ESA Events from internal session to this session service\n    _setupSessionInvalidationFailed: Ember.on('init', function () {\n        const session = this.get('session');\n        if (session) {\n            session.on('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    }),\n\n    _forwardSessionInvalidationFailedEvent() {\n        this.trigger('sessionInvalidationFailed', ...arguments);\n    },\n\n    _teardownSessionInvalidationFailed: Ember.on('willDestroy', function () {\n        const session = this.get('session');\n        if (session) {\n            session.off('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    })\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getThemeList } from '../utils/theme-loader';\n\nconst { computed, inject, run, Service, Evented } = Ember;\n\nexport default Service.extend(Evented, LoggerMixin, {\n    intl: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    permissions: inject.service(),\n    ajax: inject.service(),\n\n    _isDesktop: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        return context && context.isHosted();\n    }),\n\n    _isDesktopUnifiedPreferences: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        if (context) {\n            return context.isHosted() && context.supportsUnifiedPreferences();\n        }\n\n        return false;\n    }),\n\n    canShowChatPreference: computed.not('session.user.isTrustee'),\n    canShowAgentGreeting: computed.bool('session.features.ACT-1205'),\n    canShowGeneralPreference: computed.alias('_isDesktop'),\n    canShowPasswordPreference: computed('session.isAuthenticated', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return false;\n        }\n\n        return this.get('session.isAuthenticated');\n    }),\n\n    canShowNotificationsPreference: computed('_isDesktop', '_isDesktopUnifiedPreferences', function () {\n        if (BrowserUtils.isIE) {\n            return false;\n        }\n\n        const isDesktop = this.get('_isDesktop');\n        const isUnified = this.get('_isDesktopUnifiedPreferences');\n        return !(isDesktop && !isUnified);\n    }),\n\n    canShowVoiceMailPinPreference: computed.and('permissions.hasVoicemailAccess', 'permissions.phoneEnabled'),\n\n    canShowDirectRoutingPreference: computed.alias('directRouting.canViewOwnSettings'),\n\n    _commonPreferenceComponents: computed('_isDesktopUnifiedPreferences', function () {\n        const isUnified = this.get('_isDesktopUnifiedPreferences');\n\n        return {\n            chat: 'preferences-chat',\n            general: 'preferences-general',\n            language: 'preferences-language',\n            notifications: isUnified ? 'preferences-notifications-desktop' : 'preferences-notifications',\n            password: 'change-password',\n            pin: 'change-pin',\n            sound: 'application-preferences/preferences-sound',\n            theme: 'application-preferences/theme-picker',\n            video: 'preferences-video',\n            direct_routing: 'preferences-direct-routing',\n            agent_greeting: 'agent-greeting'\n        };\n    }),\n\n    commonPreferences: computed(\n        'intl.isoLocale',\n        'canShowChatPreference',\n        'canShowGeneralPreference',\n        'canShowNotificationsPreference',\n        'canShowPasswordPreference',\n        'canShowSoundPreference',\n        'canShowVoiceMailPinPreference',\n        '_commonPreferenceComponents',\n        'session.features.webUiDarkTheme',\n        'canShowAgentGreeting',\n        function () {\n            const intl = this.get('intl');\n            const components = this.get('_commonPreferenceComponents');\n            return [\n                {\n                    key: 'chat',\n                    name: intl.lookup('preferences.tabs.chat'),\n                    canShow: this.get('canShowChatPreference'),\n                    component: components.chat\n                },\n                {\n                    key: 'general',\n                    name: intl.lookup('preferences.tabs.general'),\n                    canShow: this.get('canShowGeneralPreference'),\n                    component: components.general\n                },\n                {\n                    key: 'language',\n                    name: intl.lookup('preferences.tabs.language'),\n                    canShow: true,\n                    component: components.language\n                },\n                {\n                    key: 'notifications',\n                    name: intl.lookup('preferences.tabs.notifications'),\n                    canShow: this.get('canShowNotificationsPreference'),\n                    component: components.notifications\n                },\n                {\n                    key: 'password',\n                    name: intl.lookup('preferences.tabs.password'),\n                    canShow: this.get('canShowPasswordPreference'),\n                    component: components.password\n                },\n                {\n                    key: 'pin',\n                    name: intl.lookup('preferences.tabs.pin'),\n                    canShow: this.get('canShowVoiceMailPinPreference'),\n                    component: components.pin\n                },\n                {\n                    key: 'sound',\n                    name: intl.lookup('preferences.tabs.sound'),\n                    canShow: true,\n                    component: components.sound\n                },\n                {\n                    key: 'theme',\n                    name: intl.lookup('preferences.tabs.theme'),\n                    canShow: getThemeList(this.get('session')).length > 1,\n                    component: components.theme\n                },\n                {\n                    key: 'video',\n                    name: intl.lookup('preferences.tabs.video'),\n                    canShow: true,\n                    component: components.video\n                },\n                {\n                    key: 'direct_routing',\n                    name: intl.lookup('preferences.tabs.direct-routing'),\n                    canShow: this.get('canShowDirectRoutingPreference'),\n                    component: components.direct_routing\n                },\n                {\n                    key: 'agent_greeting',\n                    name: intl.lookup('preferences.tabs.agent-greeting'),\n                    canShow: this.get('canShowAgentGreeting'),\n                    component: components.agent_greeting\n                }\n            ];\n        }\n    ),\n\n    commonPreferencesSortOrder: computed(function () {\n        return [\n            'notifications',\n            'general',\n            'theme',\n            'chat',\n            'password',\n            'pin',\n            'language',\n            'sound',\n            'video',\n            'direct_routing',\n            'agent_greeting'\n        ];\n    }),\n\n    customPreferences: [],\n\n    preferences: computed('commonPreferences', 'customPreferences', function () {\n        const commonPreferences = this.get('commonPreferences');\n        const customPreferences = this.get('customPreferences');\n        return [...commonPreferences, ...customPreferences];\n    }),\n\n    // <Custom Preference API>\n    addPreference(key, options) {\n        const { name, component } = options;\n        if (!(key && name && component)) {\n            throw new Error('Custom preferences require a key, name, and component name');\n        }\n        const existingPreference = this.get('preferences').find(preference => preference.key === key);\n        if (existingPreference) {\n            throw new Error(`Preference with key \"${key}\" already exists`);\n        }\n        const canShow = true; // otherwise remove the preference\n        const newPreference = { key, name, component, canShow };\n        this.set('customPreferences', this.get('customPreferences').concat(newPreference));\n    },\n\n    removePreference(key) {\n        const customPreferences = this.get('customPreferences');\n        const otherPreferences = customPreferences.filter(preference => preference.key !== key);\n        this.set('customPreferences', otherPreferences);\n    },\n    // </Custom Preference API>\n\n    // <Global Preferences API>\n    isOpen: false,\n\n    open() {\n        this.set('isOpen', true);\n    },\n\n    close() {\n        this.set('isOpen', false);\n    },\n\n    canOpenPreference(preferenceKey) {\n        const preferences = this.get('preferences');\n        const preference = preferences.find(preference => preference.key === preferenceKey);\n        return preference && preference.canShow;\n    },\n\n    openPreference(preferenceKey) {\n        return new Ember.RSVP.Promise(resolve => {\n            const preferences = this.get('preferences');\n            const preference = preferences.find(preference => preference.key === preferenceKey);\n            if (!preference) {\n                throw new Error(`\"${preference}\" is not a valid preference name`);\n            }\n            if (!preference.canShow) {\n                throw new Error(`Preference \"${preference}\" cannot be shown`);\n            }\n            this.open();\n            run.later(() => {\n                // this delay lets the listening components open first\n                this.trigger('openPreference', preferenceKey);\n                resolve();\n            }, 100);\n        });\n    },\n\n    // common preferences access\n    openChatPreference() {\n        this.openPreference('chat');\n    },\n\n    openGeneralPreference() {\n        this.openPreference('general');\n    },\n\n    openLanguagePreference() {\n        this.openPreference('language');\n    },\n\n    openNotificationsPreference() {\n        this.openPreference('notifications');\n    },\n\n    openPasswordPreference() {\n        this.openPreference('password');\n    },\n\n    openSoundPreference() {\n        this.openPreference('sound');\n    },\n    openVideoPreference() {\n        this.openPreference('video');\n    },\n\n    openVoiceMailPinPreference() {\n        this.openPreference('pin');\n    },\n    // </Global Preferences API>\n\n    /**\n     * Gets the current value for the user's send email notifications\n     * @returns sendEmailNotifications @boolean\n     */\n    async getUserVoicemailEmailNotification() {\n        const url = this.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        try {\n            const { sendEmailNotifications } = await this.get('ajax').ajaxGet(url, { dataType: 'json' });\n            return sendEmailNotifications;\n        } catch (err) {\n            this.get('logger').error(`services/settings: error fetching user's voicemail policy`, {\n                err\n            });\n        }\n        return false;\n    },\n    /**\n     * Sets the user's send email notification value in the voicemail policy.\n     * @param {boolean} sendEmailNotifications\n     * @returns Promise\n     */\n    async setUserVoicemailEmailNotification(sendEmailNotifications) {\n        const url = this.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        return this.get('ajax').patch(url, {\n            data: {\n                sendEmailNotifications\n            },\n            timeout: 5000\n        });\n    }\n});\n","define(\"connections-ui/services/sound\", [\"exports\", \"ember-purecloud-components/services/sound\"], function (_exports, _sound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sound.default;\n    }\n  });\n});\n","/* eslint no-console: \"off\" */\n\n/**\n * Welcome to the stash-logger service. This service is responsible for logging data locally to your console as well\n * as gathering logs to send to Sumo. There are a couple rules, though.\n *\n * In order to ensure that customer data does not flow into Sumo, all logging that is intended to leave\n * a customer's machine is opt-in. We will not send any object information up to Sumo unless you wrap it\n * in a specific key.\n *\n * If you tend to log data in the usual manner:\n * [\n *  \"Bunch of descriptive information\",\n *  { ... some data in an object ... }\n * ]\n * What will be sent to Sumo will only be: \"Bunch of descriptive information\"\n *\n * If you wish to send an object of information, you need to use a specific key, \"remoteData\":\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *     data: \"Data\"\n *   }\n *  }\n * ]\n * The data that will be sent will be the string AND everything in the remoteData object.\n *\n * Do you need to send customer data? Really? If so, PLEASE mark it as sensitive. You do this by including that data\n * under the \"sensitive\" key. For example:\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *    data: \"Data\",\n *    sensitive: {\n *     data: \"Data\"\n *    }\n *   }\n *  }\n * ]\n * The sensitive data will be wrapped with GCPII[] in order to be hashed by Sumo hashing rules. Any questions? Reach\n * out to the Web UI team.\n */\n\nimport Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport { LOG_LEVELS } from 'ember-purecloud-components/utils/logger';\nimport { v4 as uuid } from 'uuid';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport config from '../config/environment';\nimport moment from '../utils/dates';\nimport ExponentialIntervalGenerator from '../utils/exponential-interval-generator';\nimport { extractRawData } from '../utils/objects';\n\nconst DEBUG = true;\n\nconst TRUNCATED_TRACE_MESSAGE = 'TRUNCATED LOG: ';\nexport const APP_NAME = 'connections-ui-webui';\nconst LOG_INTERVAL = 2000;\nconst MAX_LOG_INTERVAL = 30000;\nconst MAX_LOG_SIZE = 14500;\nconst SERVER_LOG_LEVEL = 'warn';\nconst GLOBAL_ERROR = /Global Error Caught/;\n// strings equality regex by item (string), item.message (item is object) or JSON.stringify(item) (item is object)\n// or by matcher function\n// i.e.,\n// 'someLog' will filter 'someLog' or { message: 'someLog' }. Will not filter 'someLog with more info'.\n// /someLog.*/ will filter 'someLog', 'someLog with more info', or { message: 'someLog with info' }\n// (item) => item && item.status === 0 && item.statusText === 'error' will filter { status: \"0\", statusText: 'error' } regardless of property order\n// DO NOT USE STATEFUL REGEXES - no /g flag\nconst SILENCED_ERRORS = [\n    /TransitionAborted/,\n    /Request Cancelled/,\n    /Request cancelled/, // PCUI-132\n    /Undefined intl key/,\n    /Error encountered while ensuring trace data is clean/, // PCM-1574\n    /ResizeObserver loop limit exceeded/,\n\n    /safeScroll/,\n    /_scrollToBottom called before DOM insertion/,\n    /The ajax operation was aborted/, // PCUI-131\n    /SEARCHPANE: Search Failed:/, // PCUI-132\n    /Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node./, // https://github.com/yapplabs/ember-tether/issues/35\n    /Uncaught Error: only one instance of babel-polyfill is allowed/,\n    /Error getting timeOffRequests/, // PCUI-135\n    /Failed to fetch time off requests:/, // PCUI-135\n    /Script error\\./, // PCUI-138\n    /^TimeoutPromise.*/, // PCUI-133\n    /You do not belong to any management unit/,\n    /supervisorassistance/, // PCUI-134\n    /Request was rejected because user is not permitted to perform/, // PCUI-137\n    item => item && item.status === '0' && (item.statusText === 'error' || item.statusText === 'abort'), // PCUI-136\n    item => isAbortError(item), // PCUI-136\n    (item, all, isLocal) => all.length > 1 && all[0] === 'Failed to obtain Apps Session' && isLocal\n];\n\n// http://stackoverflow.com/questions/5515869/string-length-in-bytes-in-javascript\nconst lengthInUtf8Bytes = function (str) {\n    // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.\n    const m = encodeURIComponent(str).match(/%[89ABab]/g);\n    return str.length + (m ? m.length : 0);\n};\n\nexport default Ember.Service.extend({\n    MAX_INTERNAL_LOG_ITEMS: 1000,\n    internalLogs: [],\n\n    logCounts: null,\n    failureCount: 0,\n\n    _originalLogger: Ember.Logger,\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    conversation: Ember.inject.service(),\n\n    init() {\n        this._super(...arguments);\n        this.set('exponentialBackoff', new ExponentialIntervalGenerator(LOG_INTERVAL, MAX_LOG_INTERVAL));\n        this.set('logs', []);\n        this.set('logCounts', {});\n        this.set('clientSessionId', uuid());\n        LOG_LEVELS.forEach(level => this.set(`logCounts.${level}`, 0));\n        this.bindLogMethods();\n        this.resetLogLimit();\n    },\n\n    loggingOptions: Ember.computed('session.org.orgPreferences.loggerOptions', function () {\n        let items = [\n            {\n                topic: 'service:webrtc',\n                serverLevel: 'info',\n                localLevel: 'debug'\n            },\n            {\n                topic: 'webrtc',\n                serverLevel: 'info',\n                localLevel: 'debug'\n            },\n            {\n                regex: 'RtcSession Log', // OPTIONAL if topic is provided.\n                propertyToMatch: 'kind', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n                localLevel: 'debug'\n            },\n            {\n                regex: 'webrtc',\n                localLevel: 'debug'\n            },\n            {\n                regex: /^Running\\sin\\smedia\\shelper\\smode$/,\n                serverLevel: 'info',\n                localLevel: 'info'\n            },\n            {\n                regex: /^SERVOPS-33410/,\n                serverLevel: 'debug',\n                localLevel: 'debug'\n            }\n\n            // EXAMPLE:\n            // {\n            //     topic: 'service:webrtc',    // OPTIONAL\n            //     regex: 'RECORDINGS',   // OPTIONAL if topic is provided. If adding through orgPrefs, use a simple string without the surrounding slashes.\n            //     propertyToMatch: 'message', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n            //     serverLevel: 'info',\n            //     localLevel: 'debug'\n            // }\n        ];\n\n        const options = this.get('session.org.orgPreferences.loggerOptions');\n        if (options && options.length) {\n            items = items.concat(options);\n        }\n\n        items.forEach(item => {\n            if (typeof item.regex === 'string') {\n                item.regex = new RegExp(item.regex);\n            }\n        });\n\n        return items;\n    }),\n\n    bindLogMethods() {\n        LOG_LEVELS.forEach(level => {\n            this[level] = this.bufferLog.bind(this, level, 'logger:general');\n        });\n    },\n\n    getOriginalLogger() {\n        return this._originalLogger;\n    },\n\n    // Scope is the object that JSON.stringify is turning into a string.\n    restrictedTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (isAjaxError(item)) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else if (item instanceof Error) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    fullTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (item instanceof Error) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                errors: item.errors,\n                payload: item.payload,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    createTrace(level, topic, logItem) {\n        if (logItem === null || logItem === undefined) {\n            throw new Error('You must log a value and/or context; attempted to log null or undefined');\n        }\n\n        // try default json stringify, if it fails, log the error\n        let itemToLog = logItem;\n        try {\n            JSON.stringify(logItem);\n        } catch (err) {\n            itemToLog = err;\n        }\n\n        const type = typeof itemToLog;\n        const isError = type === 'object' && itemToLog instanceof Error;\n        if (!isError && (type === 'array' || type === 'object')) {\n            try {\n                itemToLog = this._restrictTraceData(itemToLog);\n\n                // After stripped, we want readable client logs so when they are exported\n                // by the customer, we can accurately read them\n                this._originalLogger[level].call(\n                    this._originalLogger,\n                    JSON.stringify(logItem, this.fullTypeConverter.bind(this))\n                );\n            } catch (error) {\n                this._originalLogger[level].call(this._originalLogger, 'Error parsing log item', {\n                    error,\n                    itemToLog\n                });\n                itemToLog = ['Error encountered while ensuring trace data is clean', error.message];\n            }\n        } else if (!isError) {\n            this._originalLogger[level].call(this._originalLogger, 'Log item in bad format', {\n                itemToLog\n            });\n            itemToLog = ['Log item was not in the expected data format'];\n        } else {\n            // Errors should be parsed out by the typeConverter later\n            itemToLog = { error: logItem };\n        }\n\n        const clientTime = moment().toISOString();\n        let message;\n        try {\n            message = JSON.stringify(\n                {\n                    clientTime,\n                    log: itemToLog,\n                    clientSessionId: this.get('clientSessionId')\n                },\n                this.restrictedTypeConverter.bind(this)\n            );\n        } catch (err) {\n            message = `Error serializing log data: ${err.message}`;\n            level = 'error';\n        }\n\n        return {\n            topic: `${APP_NAME}.${topic}`,\n            level: level.toUpperCase(),\n            time: clientTime,\n            message\n        };\n    },\n\n    /**\n     * Restrict log data to format that will ensure customer data is only sent when the\n     * consumer has opted-in\n     * @param {Array} itemToLog - an array with a string description as the first element and an object of data as the second\n     * @throws\n     * @returns a restricted version of itemToLog array\n     */\n    _restrictTraceData(itemToLog) {\n        const remoteDataKey = 'remoteData';\n        if (\n            typeof itemToLog === 'string' ||\n            typeof itemToLog === 'number' ||\n            (Array.isArray(itemToLog) && itemToLog.length === 0)\n        ) {\n            return itemToLog;\n        }\n        if (!Array.isArray(itemToLog) || typeof itemToLog[0] !== 'string') {\n            throw new Error('Log data was in an unexpected format');\n        }\n        try {\n            // First we remove everything except for our blessed data\n            let allowedKeys = [remoteDataKey, 'activeConversations'];\n            let [message, data, conversationIds] = itemToLog;\n\n            // Just a plain message, e.g. logger.error(\"Got an error\")\n            if (!data) {\n                return [message];\n            }\n\n            // The usual message, e.g. logger.error(\"Got an error\", { ... data ... })\n            // Filter out everything that is not under the remoteDataKey\n            let keyFilter = (path, key) => {\n                return allowedKeys.includes(key) || allowedKeys.includes(path[0]);\n            };\n\n            data = extractRawData(data, {\n                maxDepth: 5,\n                keyFilter\n            });\n\n            if (typeof conversationIds !== 'object' || Array.isArray(conversationIds)) {\n                conversationIds = {};\n            }\n\n            // Check the rest of the data, it might contain conversation ids\n            // but we filter out EVERYTHING else\n            conversationIds = extractRawData(conversationIds, {\n                maxDepth: 2,\n                keyFilter\n            });\n\n            if (data[remoteDataKey]) {\n                data[remoteDataKey] = this._augmentSensitiveData(data[remoteDataKey]);\n            }\n\n            let finalLogItem = [message, data, conversationIds].filter(elem => {\n                // Strings, arrays\n                if (Object.prototype.hasOwnProperty.call(elem, 'length')) {\n                    return elem.length > 0;\n                }\n                return Object.keys(elem).length > 0;\n            });\n\n            return finalLogItem;\n        } catch (error) {\n            throw error;\n        }\n    },\n\n    _augmentSensitiveData(remoteData) {\n        if (!remoteData) {\n            return;\n        }\n        if (!remoteData.sensitive) {\n            return remoteData;\n        }\n        let sensitive = remoteData.sensitive;\n        let wrappedSensitive;\n        if (typeof sensitive !== 'object') {\n            wrappedSensitive = `GCPII[${sensitive.toString()}]`;\n        } else {\n            wrappedSensitive = Object.keys(sensitive).reduce((data, key) => {\n                let value = { [key]: `GCPII[${sensitive[key]}]` };\n                return Object.assign(data, value);\n            }, {});\n        }\n        return Object.assign({}, remoteData, {\n            sensitive: wrappedSensitive\n        });\n    },\n\n    checkItemsAgainstOptions(logOption, level, topic, itemsToLog) {\n        const defaultAnswer = {\n            server: false,\n            local: false\n        };\n\n        if (logOption.topic && topic && logOption.topic !== topic) {\n            return defaultAnswer;\n        }\n\n        if (logOption.regex) {\n            let matches;\n            if (logOption.propertyToMatch) {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        typeof item[logOption.propertyToMatch] === 'string' &&\n                        item[logOption.propertyToMatch].match(logOption.regex)\n                );\n            } else {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        ((typeof item === 'string' && item.match(logOption.regex)) ||\n                            (typeof item.message === 'string' && item.message.match(logOption.regex)))\n                );\n            }\n\n            if (!matches) {\n                return defaultAnswer;\n            }\n        }\n\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        return {\n            server: logOption.serverLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.serverLevel.toLowerCase()),\n            local: logOption.localLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.localLevel.toLowerCase())\n        };\n    },\n\n    bufferLog(level, topic, ...itemsToLog) {\n        let logResult = { server: false, local: false };\n        const isLocal = this.get('application.runtime.local');\n\n        if (itemsToLog && itemsToLog.length > 0) {\n            for (let j = 0; j < itemsToLog.length; j++) {\n                const item = itemsToLog[j];\n                if (typeof item === 'undefined' || item === null || item === '') {\n                    if (isLocal && DEBUG) {\n                        console.debug(\n                            new Error('Local Only Error: Undefined error reported to stash logger'),\n                            itemsToLog\n                        );\n                    }\n                    return;\n                }\n\n                let checkForSilence;\n                if (typeof item === 'string') {\n                    checkForSilence = item;\n                }\n                if (!checkForSilence) {\n                    try {\n                        checkForSilence = JSON.stringify(item);\n                    } catch (err) {\n                        checkForSilence = `Error serializing log data: ${err.message}`;\n                    }\n                }\n\n                // expose global errors\n                if (GLOBAL_ERROR.test(checkForSilence)) {\n                    console.error(item);\n                    return;\n                }\n\n                if (!DEBUG && (level === 'debug' || level === 'info')) {\n                    return;\n                }\n\n                for (let i = 0; i < SILENCED_ERRORS.length; i++) {\n                    const SILENCED = SILENCED_ERRORS[i];\n                    const silencedByStringMatch = typeof SILENCED === 'string' && checkForSilence === SILENCED;\n                    const silencedByRegex = typeof SILENCED.test === 'function' && SILENCED.test(checkForSilence);\n                    let silencedByMatcher;\n                    try {\n                        silencedByMatcher = typeof SILENCED === 'function' && SILENCED(item, itemsToLog, isLocal);\n                    } catch (e) {\n                        silencedByMatcher = false;\n                    }\n                    if (silencedByStringMatch || silencedByRegex || silencedByMatcher) {\n                        if (isLocal && DEBUG) {\n                            console.debug('local-only error', itemsToLog[j]);\n                        }\n                        return logResult;\n                    }\n                }\n            }\n        }\n        const serverLogLevelIndex = LOG_LEVELS.indexOf(SERVER_LOG_LEVEL.toLowerCase());\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        const options = this.get('loggingOptions');\n        let logServer = itemLogIndex >= serverLogLevelIndex;\n        let logLocal = false;\n        for (let i = 0; i < options.length; i++) {\n            logResult = this.checkItemsAgainstOptions(options[i], level, topic, itemsToLog);\n\n            logServer = logServer || logResult.server;\n            logLocal = logLocal || logResult.local;\n\n            if (logServer && logLocal) {\n                break;\n            }\n        }\n\n        let skipSumoSend;\n\n        if (level === 'error') {\n            skipSumoSend = false;\n            const activeConversations = this.get('conversation.activeConversations') || [];\n            itemsToLog.push({ activeConversations: activeConversations.map(c => c.get('id')) });\n        }\n\n        if (logServer && !skipSumoSend) {\n            const trace = this.createTrace.call(this, level, topic, itemsToLog);\n            this.get('logs').pushObject(trace);\n        }\n\n        if (logLocal || level.toLowerCase() === 'error') {\n            this.get('internalLogs').pushObject({ topic, level, itemsToLog: itemsToLog, time: moment().toISOString() });\n\n            if (this.get('internalLogs.length') > this.MAX_INTERNAL_LOG_ITEMS) {\n                this.get('internalLogs').shiftObject();\n            }\n        }\n\n        this.get('logCounts')[level]++;\n        this._originalLogger[level].apply(this._originalLogger, itemsToLog);\n\n        return { local: logLocal, server: logServer };\n    },\n\n    decreaseLogLimit(currentLimit) {\n        this.maxTracesByteLength = currentLimit - 500;\n    },\n\n    resetLogLimit() {\n        this.maxTracesByteLength = MAX_LOG_SIZE;\n    },\n\n    getTracesToLog(logs) {\n        let toLog = [];\n        let totalLogSize = 0;\n        for (let i = 0; i < logs.length; i++) {\n            const log = logs[i];\n            let logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            if (toLog.length === 0 && logSize > this.maxTracesByteLength) {\n                // single log is too big to log\n                // slice it to 90% of the max (allow room for json chars)\n                log.message = (TRUNCATED_TRACE_MESSAGE + log.message).slice(\n                    0,\n                    Math.floor(0.9 * (this.maxTracesByteLength - TRUNCATED_TRACE_MESSAGE.length))\n                );\n                logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            }\n            if (totalLogSize + logSize < this.maxTracesByteLength) {\n                toLog.push(log);\n                totalLogSize += logSize;\n            } else {\n                break; // break out, log the rest on next run\n            }\n        }\n        return toLog;\n    },\n\n    saveLogs: Ember.observer('logs.[]', 'backOffTask.isRunning', 'session.isAuthenticated', function () {\n        this.get('_saveLogsTask').perform();\n    }),\n\n    _saveLogsTask: task(function* () {\n        const logs = this.get('logs');\n        if (logs.length <= 0 || this.get('backOffTask.isRunning') || !this.get('session.isAuthenticated')) {\n            return;\n        }\n        const toSend = this.getTracesToLog.call(this, logs);\n        logs.removeObjects(toSend);\n        yield timeout(LOG_INTERVAL);\n        this.sendLogTraces(toSend)\n            .then(() => {\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                logs.addObjects(toSend);\n                if (error.status === 413) {\n                    this.decreaseLogLimit(toSend.length);\n                    this._originalLogger.error(\n                        `# of logs to send limited due to server size limit. Last sent size of <= ${this.maxTracesByteLength}.`\n                    );\n                } else if (error.status === 400) {\n                    this._originalLogger.error('Failed to log traces', error);\n                    if (this.get('failureCount') === 0) {\n                        logs.removeObjects(toSend);\n                        this.incrementProperty('failureCount');\n                    } else {\n                        logs.clear();\n                    }\n                } else {\n                    this._originalLogger.error('Failed to log traces', error);\n                    this.get('exponentialBackoff').fail();\n\n                    // ACE-1903: Dump logs if we fail to send on expo. backup to avoid them\n                    // potentially backing up continuously.\n                    logs.clear();\n                }\n            })\n            .finally(() => {\n                this.get('backOffTask').perform();\n            });\n    })\n        .keepLatest()\n        .maxConcurrency(1), // comment below\n    // if this gets called more than once while its currently executing,\n    // it will cancel earlier calls that haven't started yet and just keep the latest\n\n    backOffTask: task(function* () {\n        yield timeout(this.get('exponentialBackoff').getInterval());\n    }),\n\n    immediateSaveLogs() {\n        const logs = this.get('logs');\n        const toSend = this.getTracesToLog.call(this, logs);\n        return this.sendLogTraces(toSend)\n            .then(() => {\n                logs.removeObjects(toSend);\n\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                // If the immediate send doesn't work, we do not remove the logs and they will\n                // be processed by the usual task\n                this._originalLogger.warn('STASH-LOGGER: immediateSaveLogs error', {\n                    error\n                });\n            });\n    },\n\n    sendLogTraces(traces) {\n        if (isTesting) return Ember.RSVP.resolve();\n\n        // this._originalLogger.log('STASH-LOGGER: sendLogTraces', traces, this);\n        const data = JSON.stringify({\n            app: {\n                appId: 'connections-ui-webui',\n                appVersion: config.APP.semver\n            },\n            traces: traces\n        });\n\n        //Do not log traces when running locally\n        if (this.get('application.runtime.local')) {\n            return Ember.RSVP.resolve();\n        }\n\n        const request = {\n            url: this.get('session.application').pcV2Uri('api/v2/diagnostics/trace'),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'text',\n            data,\n            cache: false,\n            context: this\n        };\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendLogTraces');\n    },\n\n    _resetLogsOnSuccessfulSave() {\n        this.set('failureCount', 0);\n        this.resetLogLimit();\n        this.get('exponentialBackoff').reset();\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\n\nimport ApplicationAdapter from '../adapters/application';\nimport PromiseArray from '../utils/promise-array';\n\nimport GroupStoreMixin from '../group/store-mixin';\nimport SearchStoreMixin from '../search/store-mixin';\n\nimport { FL } from '../utils/entity-fields';\n\n/* Batch entity ids into lists of 50. */\nexport function batchEntityIds(ids, size = 50) {\n    ids = _.clone(ids);\n\n    const guids = ids.filter(id => id.indexOf('@') === -1);\n    const jids = ids.filter(id => id.indexOf('@') > -1);\n\n    var batches = [];\n\n    while (guids.length > 0) {\n        batches.push(guids.splice(0, size));\n    }\n    while (jids.length > 0) {\n        batches.push(jids.splice(0, size));\n    }\n\n    return batches;\n}\n\nfunction updateGroup(group, data) {\n    const updateKeys = ['contactInfo', 'general', 'privacy'];\n    if (data.attributes) {\n        updateKeys.forEach(key => {\n            if (data.attributes[key] !== undefined) {\n                group.set(key, data.attributes[key], { overwrite: true });\n            }\n        });\n    }\n}\n\nvar ApplicationStore = DS.Store.extend(GroupStoreMixin, SearchStoreMixin, {\n    session: Ember.inject.service(),\n\n    adapter: ApplicationAdapter,\n\n    applicationAdapter() {\n        return Ember.getOwner(this).lookup('adapter:application');\n    },\n\n    findQuery(type, query) {\n        var store = this;\n        var promiseLabel = 'ApplicationStore#_findQuery for: ' + type;\n        var adapter = this.adapterFor(type);\n\n        Ember.assert('You tried to load a query but you have no adapter (for ' + type + ')', adapter);\n        Ember.assert(\n            'You tried to load a query but your adapter does not implement `findQuery`',\n            typeof adapter.findQuery === 'function'\n        );\n\n        var result = adapter.query(store, type, query);\n\n        var promise = Ember.RSVP.Promise.cast(result, promiseLabel).then(\n            function (payload) {\n                var collection = [];\n                if (payload.res) {\n                    _.forEach(payload.res, function (entity) {\n                        const id = entity.guid || entity._id;\n                        if (id) {\n                            entity.id = id;\n                            collection.push(store.push(type, entity, true));\n                        }\n                    });\n                } else {\n                    // if no payload.res then we are not dealing with the application adapter,\n                    // but we still want to keep the result in case we are using a fixture adapter\n                    _.forEach(payload, function (item) {\n                        collection.push(store.push(type, item, true));\n                    });\n                }\n                return {\n                    collection: collection,\n                    payload: payload\n                };\n            },\n            null,\n            'ApplicationStore#_findQuery: Extract payload from findQuery'\n        );\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findMultiEntity(params, requestType) {\n        let store = this;\n        let promiseLabel = 'ApplicationStore#findMultiEntity';\n        let adapter = this.applicationAdapter();\n        let serializer = this.serializerFor('application');\n\n        let result = adapter.findMultiEntity(store, params, requestType);\n\n        let promise = Ember.RSVP.Promise.cast(result, promiseLabel).then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(store, null, payload, null, requestType || 'query');\n                if (!payload.data && payload.included) {\n                    payload.data = payload.included;\n                    payload.included = [];\n                }\n\n                let records = store.push(payload);\n                Ember.set(records, 'meta', payload.meta);\n                return records;\n            },\n            null,\n            'ApplicationStore#findMultiEntity: Extract payload from multi-entity search'\n        );\n\n        return DS.PromiseArray.create({\n            promise: promise,\n            meta: Ember.computed.reads('content.meta')\n        });\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2().then(result => {\n            addPageAction('conn-ui-fav-load', {\n                'conn-ui-fav-nb': result ? result.length : 0\n            });\n            return result;\n        });\n    },\n\n    findFavoritesPublicApiV2() {\n        const promiseLabel = 'Store: Application#findFavoritesPublicApiV2';\n        const adapter = this.adapterFor('application');\n        const result = adapter.findFavorites(this);\n        const promise = Ember.RSVP.Promise.resolve(result, promiseLabel).then(res => {\n            const promises = [];\n            const personResult = res.filter(item => item.entityType === 'person');\n            if (personResult.length) {\n                promises.push(this.findMany('person', Ember.A(personResult).mapBy('entityId'), FL['person']));\n            }\n            const groupResult = res.filter(item => item.entityType === 'group');\n            if (groupResult.length) {\n                promises.push(this.findMany('group', Ember.A(groupResult).mapBy('entityId'), FL['group']));\n            }\n            if (promises.length) {\n                return Ember.RSVP.Promise.all(promises).then(function (favorites) {\n                    return {\n                        payload: res,\n                        collection: favorites.flat()\n                    };\n                });\n            } else {\n                return {\n                    payload: res,\n                    collection: []\n                };\n            }\n        });\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    forwardVoicemail(voicemail, recipient, type) {\n        const adapter = this.adapterFor(voicemail.type);\n        return adapter.forwardVoicemail(voicemail.id, recipient.get('guid'), type);\n    },\n\n    findSuperiors(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const promise = Ember.RSVP.cast(adapter.findSuperiors(type, id, params)).then(payload => {\n            payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n            const records = store.push(payload);\n            return records || [];\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findDirectReports(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        return new Ember.RSVP.Promise(resolve => {\n            adapter.findDirectReports(type, id, params).then(payload => {\n                payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n                const records = store.push(payload);\n                resolve(records);\n            });\n        });\n    },\n\n    findLatestCalls(type, ids) {\n        return this.query(type, {\n            latestCalls: true,\n            ids: ids\n        });\n    },\n\n    findMany(type, ids, params) {\n        if (Array.isArray(type)) {\n            return this._super(...arguments);\n        }\n\n        const store = this;\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const modelClass = this.modelFor(type);\n        const batches = batchEntityIds(ids, 25);\n        const batchLimit = 3;\n\n        if (type === 'person' && this.get('session.features.enableUIAjaxRetryHeader')) {\n            return new Ember.RSVP.Promise((resolve, reject) => {\n                let promises = batches.map(batch => {\n                    return adapter.findMany(store, modelClass, batch, params).then(payload => {\n                        payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n                        const records = store.push(payload);\n                        return records;\n                    });\n                });\n                Ember.RSVP.allSettled(promises).then(results => {\n                    let successfulRequests = results.filter(r => r.state === 'fulfilled').map(r => r.value);\n                    let failedRequests = results.filter(r => r.state === 'rejected').map(r => r.value);\n                    if (failedRequests.length > 0) {\n                        reject('store:application#findMany request failed:', {\n                            failedRequests\n                        });\n                        return;\n                    }\n                    resolve(_.flatten(successfulRequests));\n                });\n            });\n        }\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            window.async.mapLimit(\n                batches,\n                batchLimit,\n                function (batch, callback) {\n                    Ember.run.join(() => {\n                        adapter\n                            .findMany(store, modelClass, batch, params)\n                            .then(function (payload) {\n                                payload = serializer.normalizeArrayResponse(\n                                    store,\n                                    modelClass,\n                                    payload,\n                                    null,\n                                    'findMany'\n                                );\n                                const records = store.push(payload);\n                                callback(null, records);\n                            })\n                            .catch(function (err) {\n                                callback(err);\n                            });\n                    });\n                },\n                function (err, bulkResults) {\n                    Ember.run.join(() => {\n                        if (err) {\n                            return reject('store:application#findMany(): async.mapLimit failed' + err);\n                        }\n                        resolve(_.flatten(bulkResults));\n                    });\n                }\n            );\n        }, 'store:application#findMany(): async.mapLimit');\n    },\n\n    /**\n     * Overrides adapterFor to support type being passed into 'find' as a string.\n     */\n    adapterFor(type) {\n        if (type.modelName) {\n            return this._super(type.modelName);\n        }\n        return this._super(type);\n    },\n\n    didSaveRecord(internalModel, data) {\n        // The api returns data instead of an empty object, so we do not want to update\n        // our deleted record, otherwise an error is thrown\n        let recordInfo = data;\n        if (data && data.data) {\n            recordInfo = data.data;\n        }\n\n        if (!internalModel.currentState.isDeleted && recordInfo && recordInfo.id) {\n            if (internalModel.currentState.isSaving && recordInfo.attributes.version) {\n                const record = internalModel.record || internalModel.getRecord();\n\n                if (record) {\n                    record.set('version', recordInfo.attributes.version);\n\n                    if (record.get('type') === 'group') {\n                        updateGroup(record, recordInfo);\n                    }\n                }\n            }\n        }\n\n        return this._super(internalModel, data);\n    }\n});\n\nexport default ApplicationStore;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service } = Ember;\n\nconst StreamingService = Service.extend(LoggerMixin, {\n    connection: {},\n    connected: false,\n    connectedV2: false,\n    v2Deferred: null,\n    v2Promise: null,\n\n    init() {\n        this._super(...arguments);\n        const deferred = Ember.RSVP.defer();\n        this.set('v2Deferred', deferred);\n        this.set('v2Promise', deferred.promise);\n    },\n\n    connect() {\n        return this.get('connectionPromise') || Ember.RSVP.resolve();\n    },\n\n    subscribeToConnection() {},\n\n    setStatus() {\n        return Ember.RSVP.reject(new Error('Entity is required'));\n    },\n\n    setRoomInactive() {},\n\n    inviteToRoom() {},\n\n    setupConnection() {\n        if (this.get('connectionPromise')) {\n            return this.get('connectionPromise');\n        }\n\n        const connectionPromise = Ember.RSVP.resolve();\n        this.set('connectionPromise', connectionPromise);\n        return connectionPromise;\n    }\n});\n\nexport default StreamingService;\n","define(\"connections-ui/services/text-measurer\", [\"exports\", \"ember-text-measurer/services/text-measurer\"], function (_exports, _textMeasurer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _textMeasurer.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-activity\", [\"exports\", \"ember-user-activity/services/user-activity\"], function (_exports, _userActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userActivity.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-idle\", [\"exports\", \"ember-user-activity/services/user-idle\"], function (_exports, _userIdle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userIdle.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar set = Ember.set;\n\nexport default Ember.Service.extend({\n  init: function() {\n    set(this, 'cache', {});\n  }\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-chrome\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-chrome\"], function (_exports, _jabraChrome) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraChrome.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-native\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-native\"], function (_exports, _jabraNative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraNative.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/plantronics\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/plantronics\"], function (_exports, _plantronics) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronics.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/sennheiser\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/sennheiser\"], function (_exports, _sennheiser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.default;\n    }\n  });\n  Object.defineProperty(_exports, \"eventTypes\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.eventTypes;\n    }\n  });\n  Object.defineProperty(_exports, \"events\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.events;\n    }\n  });\n});\n","import UserIdleService from 'ember-user-activity/services/user-activity';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 seconds\n    activeEvents: [] // no listeners by default\n});\n","// app/services/user-idle.js\nimport UserIdleService from 'ember-user-activity/services/user-idle';\nimport Ember from 'ember';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 second\n\n    userActivity: Ember.inject.service('videoActivity'),\n\n    setListening(value) {\n        if (value) {\n            this.get('userActivity').enableEvent('mousemove');\n        } else {\n            this.get('userActivity').disableEvent('mousemove');\n        }\n    }\n});\n","import Ember from 'ember';\n\nimport { Promise } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\nimport Evented from '@ember/object/evented';\n\nimport Service from '@ember/service';\nimport {\n    ApplicationService,\n    IntlService,\n    PhoneService,\n    SessionService,\n    StashLoggerService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { WebrtcSettingsService } from './webrtc-settings';\nimport {\n    IExtendedMediaSession,\n    ISdkMediaState,\n    IPendingSession,\n    IStation,\n    ISdkConversationUpdateEvent,\n    IStartSoftphoneSessionParams,\n    SessionTypes,\n    IEndSessionRequest,\n    ISessionMuteRequest,\n    IConversationHeldRequest,\n    GenesysCloudWebrtcSdk,\n    IPendingSessionActionParams\n} from 'genesys-cloud-webrtc-sdk';\nimport { ExpandedDeviceConnectionStatus } from 'genesys-cloud-webrtc-sdk/dist/es/headsets/headset-types';\nimport { IWebrtcSettings } from '../types/webrtc-settings.type';\nimport ComputedProperty from '@ember/object/computed';\nimport EmberObject from '@ember/object';\nimport { addPageAction } from '../utils/newrelic';\n\nexport interface MediaDevices {\n    camera?: { deviceId: string };\n    microphone?: { deviceId: string };\n    outputDevice?: { deviceId: string };\n}\n\nexport type WebrtcEvents = {\n    deviceAnsweredCall: undefined;\n    deviceEndedCall: undefined;\n    deviceMuteStatusChanged: boolean;\n    deviceRejectedCall: string; // conversationId\n    autoAnswer: string; // conversationId\n    mediaStateChange: ISdkMediaState;\n};\n\nexport interface BasicConversationLegacy extends EmberObject {\n    id: string;\n    shouldAutoProceedWebrtc: boolean;\n    acceptedByClient: boolean;\n    isOutbound: boolean;\n    participants: [\n        {\n            bargedParticipantId?: string;\n            monitoredParticipantId?: string;\n            coachedParticipantId?: string;\n            userId: string;\n        }\n    ];\n}\n\nexport interface IPendingSessionEmber extends IPendingSession, EmberObject {}\n\nexport interface WebrtcSdkService extends EmberObject {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof WebrtcEvents>(name: K, args: WebrtcEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    session: SessionService;\n    application: ApplicationService;\n    phone: PhoneService;\n    webrtcSettings: WebrtcSettingsService;\n    ajax: AjaxServiceClass;\n    intl: IntlService;\n\n    logger: StashLoggerService;\n    sdk: GenesysCloudWebrtcSdk;\n\n    pendingSessions: Ember.MutableArray<IPendingSessionEmber>;\n    station: IStation;\n    headsetState: ExpandedDeviceConnectionStatus;\n    mediaState: ISdkMediaState;\n    showPermissionsModal: boolean;\n    previousAutoAnswerProps: {\n        pendingSessions: { id: string; sessionType: SessionTypes }[];\n        conversationsToAutoAnswer: { id: string }[];\n    };\n    lastConversationUpdate: ISdkConversationUpdateEvent;\n    userId: ComputedProperty<string>;\n    hasActiveSoftphoneConversation: boolean;\n    hasActiveSoftphoneSession: boolean;\n    _instrumentSdkUsage(sdkFunction: string): void;\n    isPersistentConnection: ComputedProperty<boolean>;\n    useSdk: ComputedProperty<boolean>;\n    useHeadsets: ComputedProperty<boolean>;\n    settingsPromise: ComputedProperty<IWebrtcSettings>;\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(startParams: IStartSoftphoneSessionParams): Promise<{ id: string; selfUri: string }>;\n    setDevices(devices: MediaDevices): void;\n    setCallVolume(volume: number): void;\n    ensureVideoPermissions(): Promise<void>;\n    ensureAudioPermissions(): Promise<void>;\n    acceptPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    rejectPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    findRemainingSessionsBasedOnParams(\n        conversationId: string,\n        sessionType?: SessionTypes\n    ): Ember.MutableArray<IPendingSessionEmber>;\n    endSession(endSessionParams: IEndSessionRequest): Promise<void>;\n    setMute(muteOptions: ISessionMuteRequest): Promise<void>;\n    setHold(heldOptions: IConversationHeldRequest): Promise<void>;\n    endAllSoftphoneSessions(): void;\n    getAllActiveSessions(): IExtendedMediaSession[];\n}\n\nexport default Service.extend(LoggerMixin, Evented, {\n    init(this: WebrtcSdkService) {\n        (this as any)._super(...arguments);\n\n        this.set('session', {} as SessionService);\n        this.set('application', {} as ApplicationService);\n        this.set('phone', {} as PhoneService);\n        this.set('webrtcSettings', {} as WebrtcSettingsService);\n        this.set('ajax', {} as AjaxServiceClass);\n        this.set('intl', {} as IntlService);\n        this.set('pendingSessions', Ember.A());\n        this.set('headsetState', 'noVendor');\n        this.set('showPermissionsModal', false);\n        this.set('sdk', {} as GenesysCloudWebrtcSdk);\n        this.set('station', {} as IStation);\n        this.set('mediaState', {} as ISdkMediaState);\n        this.set('previousAutoAnswerProps', { pendingSessions: [], conversationsToAutoAnswer: [] });\n        this.set('lastConversationUpdate', {} as ISdkConversationUpdateEvent);\n        this.set('hasActiveSoftphoneConversation', false);\n        this.set('hasActiveSoftphoneSession', false);\n        this.set('userId', '');\n        this.set('isPersistentConnection', false);\n        this.set('useSdk', false);\n        this.set('useHeadsets', false);\n        this.set('settingsPromise', {} as IWebrtcSettings);\n    },\n\n    _instrumentSdkUsage(sdkFunction: string) {\n        const pageActionName = `used-webrtc-sdk-${sdkFunction}`;\n        addPageAction(pageActionName);\n    },\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(this: WebrtcSdkService, _startParams: IStartSoftphoneSessionParams) {\n        this._instrumentSdkUsage('startSoftphoneSession');\n    },\n\n    setDevices(this: WebrtcSdkService, _devices: MediaDevices) {\n        this._instrumentSdkUsage('setDevices');\n    },\n\n    setCallVolume(this: WebrtcSdkService, _volume: number) {\n        this._instrumentSdkUsage('setCallVolume');\n    },\n\n    ensureVideoPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureVideoPermissions');\n    },\n\n    ensureAudioPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureAudioPermissions');\n    },\n\n    acceptPendingSession(this: WebrtcSdkService, _params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('acceptPendingSession');\n    },\n\n    rejectPendingSession(this: WebrtcSdkService, _params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('rejectPendingSession');\n    },\n\n    findRemainingSessionsBasedOnParams(this: WebrtcSdkService, _conversationId: string, _sessionType?: SessionTypes) {\n        this._instrumentSdkUsage('findRemainingSessionsBasedOnParams');\n        return null;\n    },\n\n    endSession(this: WebrtcSdkService, _endSessionParams: IEndSessionRequest) {\n        this._instrumentSdkUsage('endSession');\n    },\n\n    setMute(this: WebrtcSdkService, _muteOptions: ISessionMuteRequest) {\n        this._instrumentSdkUsage('setMute');\n    },\n\n    setHold(this: WebrtcSdkService, _heldOptions: IConversationHeldRequest) {\n        this._instrumentSdkUsage('setHold');\n    },\n\n    endAllSoftphoneSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('endAllSoftphoneSessions');\n    },\n\n    getAllActiveSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('getAllActiveSessions');\n        return [];\n    }\n});\n\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSdk: WebrtcSdkService;\n        'webrtc-sdk': WebrtcSdkService;\n    }\n}\n","import Ember from 'ember';\n\nimport Evented from '@ember/object/evented';\nimport { Promise, resolve } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\n\nimport { computed } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport {\n    IntlService,\n    NotificationService,\n    PreferencesService,\n    SessionService,\n    StashLoggerService,\n    ApplicationService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport { IDirectorySettings, IGeneralSettings, IWebrtcSettings } from '../types/webrtc-settings.type';\n\nconst SETTINGS_PATH = 'api/v2/settings/webrtc/users';\n\nexport type SettingsEvents = {\n    sdkSettingsUpdate: IWebrtcSettings;\n};\n\nexport const defaultGeneralSettings: IGeneralSettings = {\n    ringtoneSelection: 'phone',\n    advancedMicSettings: {\n        autoGain: true,\n        echoCancellation: true,\n        noiseSuppression: true\n    }\n};\n\nexport const defaultDirectorySettings: IDirectorySettings = {\n    alwaysPopoutVideo: false,\n    selectedProfile: '',\n    profiles: [],\n    defaultProfileId: ''\n};\n\nexport interface WebrtcSettingsService {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof SettingsEvents>(name: K, args: SettingsEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    get<K extends keyof WebrtcSettingsService>(name: K | string): WebrtcSettingsService[K];\n    set<K extends keyof WebrtcSettingsService>(\n        name: K | string,\n        value: WebrtcSettingsService[K]\n    ): WebrtcSettingsService[K];\n    removeObserver(depName: string, target: any, handler: Function): void;\n    addObserver(depName: string, target: any, handler: Function): void;\n\n    ajax: AjaxServiceClass;\n    preferences: PreferencesService;\n    session: SessionService;\n    logger: StashLoggerService;\n    notification: NotificationService;\n    intl: IntlService;\n    application: ApplicationService;\n\n    _ready: Promise<any>;\n    settings: IWebrtcSettings | null;\n    failedSettingsFetch: boolean;\n    reallyWaitForToken?: boolean;\n    _fetchSettingsPromise: Promise<IWebrtcSettings> | null;\n    _updatePromise: Promise<any> | null;\n\n    _super(...args: any[]): void;\n    _handleSettingsChanged(settings: IWebrtcSettings): void;\n    _waitForAccessToken(): Promise<any>;\n    _fetchSettings(): Promise<IWebrtcSettings>;\n    _checkAndFixSettings(settings: IWebrtcSettings): boolean;\n    _updateSettings(settings: IWebrtcSettings): void;\n\n    getSettings(forceRefresh?: boolean, retryOnFail?: boolean): Promise<IWebrtcSettings>;\n    updateSettings(settings: IWebrtcSettings): Promise<void>;\n    updateSetting<K extends keyof IWebrtcSettings>(settingPath: K | string, value: IWebrtcSettings[K]): Promise<void>;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    preferences: inject('preferences'),\n    session: inject('session'),\n    ajax: inject('ajax'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n    application: inject('application'),\n\n    error: false,\n    syncEnabled: false,\n    deferredPersistRequests: null,\n\n    settings: null,\n    // Wait for the service to be initialized and have settings.\n    userSettingsPromise: computed('_ready', 'settings', async function () {\n        try {\n            await this.get('_ready');\n            return this.get('settings');\n        } catch (err) {\n            this.logger.error('Failed to fetch settings - userSettingsPromise', err);\n            // Even if we get an error, we will still set some non-persisting defaults and should return those.\n            return this.get('settings');\n        }\n    }),\n    failedSettingsFetch: false,\n    _fetchSettingsPromise: null,\n    _updatePromise: null,\n\n    init(this: WebrtcSettingsService) {\n        this._super(...arguments);\n        // Wait until we have a token to grab settings and only resolve ready once we have/set settings.\n        const ready = this._waitForAccessToken()\n            .then(async () => {\n                this.logger.debug('Ready to fetch WebRTC settings');\n                const settings = (await this._fetchSettings()) || {};\n                // Check if we are missing some/all settings.\n                if (this._checkAndFixSettings(settings)) {\n                    // Persist adjusted settings.\n                    await this._updateSettings(settings);\n                }\n            })\n            .catch(err => {\n                this.set('failedSettingsFetch', true);\n                this._checkAndFixSettings({});\n                return Promise.reject(err);\n            });\n        this.set('_ready', ready);\n    },\n\n    async _waitForAccessToken(this: WebrtcSettingsService) {\n        if (this.get('session.accessToken') || (isTesting && !this.reallyWaitForToken)) {\n            return;\n        }\n\n        return new Promise(resolve => {\n            const handler = () => {\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    async getSettings(this: WebrtcSettingsService, forceRefresh?: boolean, retryOnFail = true) {\n        if (!forceRefresh && this.get('settings')) {\n            return this.get('settings');\n        }\n\n        try {\n            await this.get('_ready');\n            const settings = await this._fetchSettings();\n            this.set('settings', settings);\n            this.set('failedSettingsFetch', false);\n            return settings;\n        } catch (err) {\n            this.logger.error('Failed to fetch settings:', { err });\n            this.set('failedSettingsFetch', true);\n            // If we fail to fetch settings, retry one time.\n            if (retryOnFail) {\n                return this.getSettings(forceRefresh, false);\n            }\n            this._checkAndFixSettings({});\n            return Promise.reject(err);\n        }\n    },\n\n    _fetchSettings(this: WebrtcSettingsService) {\n        if (this.get('_fetchSettingsPromise')) {\n            return this.get('_fetchSettingsPromise');\n        }\n\n        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n        const promise = this.get('ajax')\n            .request(settingsUrl)\n            .then(settings => Ember.Object.create(settings))\n            .catch(e => this.logger.error('Failed to fetch webrtc settings', { err: e }))\n            .finally(() => this.set('_fetchSettingsPromise', null));\n\n        this.set('_fetchSettingsPromise', promise as Promise<IWebrtcSettings>);\n        return promise;\n    },\n\n    // Trigger PATCH request on webrtc user settings. Used only internally in this service.\n    async _updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // Always make settings changes immediate\n        const cached = Object.assign({}, this.get('settings') || {}, settings);\n        this.set('settings', cached);\n\n        const existingPromise = this.get('_updatePromise') || resolve();\n        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n\n        const promise = existingPromise\n            .then(() => {\n                this.get('ajax').request(settingsUrl, {\n                    method: 'PATCH',\n                    dataType: 'text',\n                    data: settings\n                });\n            })\n            .catch(e => this.logger.error('Failed to update webrtc settings', { err: e }))\n            .finally(() => {\n                this.trigger('sdkSettingsUpdate', this.get('settings') ?? {});\n                if (this.get('_updatePromise') === promise) {\n                    this.set('_updatePromise', null);\n                }\n            });\n\n        this.set('_updatePromise', promise);\n    },\n\n    _checkAndFixSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // If some important settings are missing, set some defaults.\n        if (!settings.directorySettings || !settings.generalSettings || !settings.generalSettings.advancedMicSettings) {\n            if (!settings.directorySettings) {\n                settings.directorySettings = defaultDirectorySettings;\n            }\n            if (!settings.generalSettings) {\n                settings.generalSettings = defaultGeneralSettings;\n            }\n            if (!settings.generalSettings.advancedMicSettings) {\n                settings.generalSettings.advancedMicSettings = defaultGeneralSettings.advancedMicSettings;\n            }\n            this.logger.warn('Some WebRTC settings were missing, setting defaults.', settings);\n            // Set the settings locally if fixes were applied and return true.\n            // These do NOT persist automatically.\n            this.set('settings', settings);\n            return true;\n        }\n        this.set('settings', settings);\n        return false;\n    },\n\n    async updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        try {\n            // If we have no access token, we don't want to try updating settings.\n            await this.get('_ready');\n        } catch (error) {\n            this.logger.error('Failed to fetch WebRTC settings, cannot update WebRTC settings.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n\n        // If we failed to fetch settings, we don't want a user to update them because they could override their saved settings.\n        if (this.get('failedSettingsFetch')) {\n            this.logger.warn('Cannot update settings because they failed to fetch.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n\n        await this._updateSettings(settings);\n    },\n\n    /**\n     * This fn can take a dot-delimited path and update that single setting\n     */\n    async updateSetting<K extends keyof IWebrtcSettings>(settingPath: K | string, value: IWebrtcSettings[K]) {\n        const pieces = settingPath.split('.');\n        const settings = Object.assign({}, this.get('settings'));\n\n        let ref = settings;\n\n        pieces.forEach((piece, index) => {\n            if (index === pieces.length - 1) {\n                Ember.set(ref, piece, value);\n            } else {\n                Ember.set(ref, piece, ref[piece] || {});\n            }\n\n            ref = ref[piece];\n        });\n\n        // only update the top-level object\n        const topLevelKey = pieces[0];\n        return this.updateSettings({ [topLevelKey]: settings[topLevelKey] });\n    },\n\n    // If we get an update from another client, sync settings to latest update.\n    _handleSettingsChanged(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        const updatedSettings = Object.assign({}, this.get('settings'), settings);\n        // Immediately set new webrtc settings\n        this.set('settings', updatedSettings);\n        // Trigger settings event so SDK can update if being used.\n        this.trigger('sdkSettingsUpdate', updatedSettings);\n    }\n});\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSettings: WebrtcSettingsService;\n        'webrtc-settings': WebrtcSettingsService;\n    }\n}\n","define(\"connections-ui/services/webrtc\", [\"exports\", \"ember-webrtc-components/services/webrtc\"], function (_exports, _webrtc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtc.default;\n    }\n  });\n});\n","import config from '../config/environment';\nimport LocalStorageStore from 'ember-simple-auth/session-stores/local-storage';\nimport netUtils from '../utils/net';\n\nconst DEFAULT_STORAGE_KEY = 'connections_ui_auth';\n\nconst CURRENT_PROP = 'authenticated';\n\nlet BaseStore = LocalStorageStore;\nlet storageKey = DEFAULT_STORAGE_KEY;\n\nif (config.environment === 'development') {\n    try {\n        let currEnvDetails = netUtils.getEnvDetails();\n        if (currEnvDetails && currEnvDetails.local) {\n            storageKey = `${DEFAULT_STORAGE_KEY}-localhost-${currEnvDetails.env}`;\n        }\n    } catch (e) {\n        // Unknown env, prob testing ... just use base storage key\n    }\n}\n\nexport default BaseStore.extend({\n    init() {\n        let storeProps = {\n            key: storageKey\n        };\n        this.setProperties(storeProps);\n        this._super(...arguments);\n    },\n\n    restore() {\n        return this._super(...arguments).then(data => {\n            let payload = data[CURRENT_PROP] || {};\n            // Force our ESA authenticator to get a token from the host.\n            payload.authenticator = 'authenticator:directory';\n            return {\n                [CURRENT_PROP]: payload\n            };\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kKl62LJd\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/agent-ui.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"y+Bia1zY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canSelectDevices\\\"]],[33,[\\\"not\\\"],[[28,[\\\"webrtc\\\",\\\"canUseWebrtcSoftphone\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"webrtc-issues\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"callForwardingActive\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEnableCallForwarding\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"forward-calls \\\",[33,[\\\"if\\\"],[[28,[\\\"webrtcStation\\\"]],\\\"webrtc-station\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-sm btn-link-bordered btn-block begin-forwarding\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"callForwarding\\\"],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.enableCallForwarding\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"call-forwarding-v2\\\"],null,[[\\\"configuringCallForwarding\\\"],[[28,[\\\"configuringCallForwarding\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/call-forwarding-partial.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"59cslhog\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.cardView\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner-nav\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"currentPerson\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-view-icon-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\",\\\"setCurrentPerson\\\"],[[28,[\\\"model\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setCurrentPerson\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"aFUOXhwO\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"card-tree\\\"],null,[[\\\"model\\\"],[[28,[\\\"model\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/tree.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"jBs6fTqh\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"canViewBusinessChat\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-access\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"strong\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessErrorTitle\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessError\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/chat-room.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"0kkMWKWy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"hidden\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showSeparatorBefore\\\"]]],null,{\\\"statements\\\":[[1,[28,[\\\"previous\\\",\\\"separator\\\"]],false]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"template\\\"]]],null,{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[1,[26,[\\\"title\\\"]],false]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"showSeparatorAfter\\\"]]],null,{\\\"statements\\\":[[1,[26,[\\\"separator\\\"]],false]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/document-title.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"FHUG/v5v\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"media-item webhooks collapsible \\\",[33,[\\\"unless\\\"],[[28,[\\\"expanded\\\"]],\\\"collapsed\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"collapse-toggle btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpanded\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"expanded\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksTitle\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-details\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[13],[0,\\\" \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksDetails\\\"]]],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks-collapsible.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"iy8S2P5P\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-item webhooks collapsed\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"status \\\",[26,[\\\"webhooksStatus\\\"]]]]],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks.hbs\"}});","define(\"connections-ui/templates/components/x-select\", [\"exports\", \"emberx-select/templates/components/x-select\"], function (_exports, _xSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xSelect.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"KKBGetCl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"group-profile\\\"],null,[[\\\"model\\\",\\\"isEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/group/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"55yjh1Xz\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.index\\\"],null],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/index.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Bgiz6Huu\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"login-oauth\\\"],null,[[\\\"offerMobileApp\\\",\\\"mobileOfferDeclined\\\",\\\"authenticate\\\"],[[28,[\\\"model\\\",\\\"offerMobileApp\\\"]],[33,[\\\"route-action\\\"],[\\\"mobileOfferDeclined\\\"],null],[33,[\\\"route-action\\\"],[\\\"authenticate\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/login-oauth.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"09fWonJq\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"title text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"titleKey\\\"],null]],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasDesc\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"desc text-center\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"descKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"action-container text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"actionKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reloadApp\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"unrecoverableAppFailure.reloadApp\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/maintenance.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"nv+hrZq0\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissionsHeader\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissions\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"logout\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.logout\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/no-access.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"t3+KfQhb\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-station-notification\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-phone-off\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.noPhoneSelected\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link action-open-station-picker-v2\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openStationPicker\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"select-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.change\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-angle-right\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/partials/-no-station-notification.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"XmYZvT94\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-profile\\\"],null,[[\\\"entity\\\",\\\"user\\\",\\\"editing\\\",\\\"editEmergencyLocation\\\",\\\"setEditingSection\\\"],[[28,[\\\"model\\\",\\\"person\\\"]],[28,[\\\"model\\\",\\\"user\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setEditingSection\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/person/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"moJeOwBU\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dialpadShouldSendDtmf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"dtmf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"show-dtmf-dialpad\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openDtmfDialPad\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.openDialpad\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRecord\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"record\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"record\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRecording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"add-participant\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAddParticipants\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.addParticipant\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"conversation\\\",\\\"onConference\\\"]],[28,[\\\"isMonitoring\\\"]],[28,[\\\"isCoaching\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"conversation\\\",\\\"onConsult\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"transfer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"transfer\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.transfer.default\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"eligibleCallsToMerge\\\"]],[28,[\\\"isConnected\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"merge\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"merge\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.merge\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"flagInteraction\\\",\\\"isRunning\\\"]],[28,[\\\"unflagInteraction\\\",\\\"isRunning\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFlagged\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"unflag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.unflagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"flag\\\"],[15,\\\"class\\\",\\\"flag-icon\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/purecloud/partials/conversation-controls-menu.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Wq9VakQB\",\"block\":\"{\\\"statements\\\":[[19,\\\"partials/signup-reset\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/templates/reset-password.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"HGIIpodG\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"search-page\\\"],null,[[\\\"entity\\\",\\\"query\\\",\\\"queryFacets\\\",\\\"saveHistory\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"query\\\"]],[28,[\\\"queryFacets\\\"]],[28,[\\\"saveHistory\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/search.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"NjP1jyRV\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/third-party/app-embed.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"z5f7z+A1\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"time-machine-confirmation\\\"],null,[[\\\"buildTag\\\",\\\"confirm\\\",\\\"cancel\\\"],[[28,[\\\"model\\\",\\\"buildTag\\\"]],[33,[\\\"route-action\\\"],[\\\"confirm\\\"],null],[33,[\\\"route-action\\\"],[\\\"cancel\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/time-machine.hbs\"}});","import Transform from 'ember-data/transform';\n\nexport default Transform.extend({\n    deserialize(serialized) {\n        return new Date(serialized);\n    },\n\n    serialize(deserialized) {\n        return deserialized.toISOString();\n    }\n});\n","define(\"connections-ui/transforms/json\", [\"exports\", \"ember-data-change-tracker/transforms/json\"], function (_exports, _json) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _json.default;\n    }\n  });\n});\n","define(\"connections-ui/transforms/object\", [\"exports\", \"ember-data-change-tracker/transforms/object\"], function (_exports, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _object.default;\n    }\n  });\n});\n","define(\"connections-ui/types/agent-assist.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/conversation.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","export * from './maybe.type';\nexport * from './conversation.type';\nexport * from './pigeon.type';\n","define(\"connections-ui/types/maybe.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/pigeon.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/webrtc-settings.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","import { CommunicationType } from '@genesys/genesys-cloud-conversation-utils';\nimport { UnionFromTuple, assertNever } from 'connections-ui/utils/types';\nimport { AppContext } from './apps';\n\nexport const COMMUNICATION_TYPE_SINGULAR = ['call', 'email', 'message', 'chat', 'callback'] as const;\ntype CommunicationTypeSingular = UnionFromTuple<typeof COMMUNICATION_TYPE_SINGULAR>;\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName: string, args: any = {}): any {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    console.warn(message, { arguments: args });\n}\n\nexport function singularizeMediaType(type: CommunicationType): CommunicationTypeSingular {\n    return type.substring(0, type.length - 1) as CommunicationTypeSingular;\n}\n\n/**\n * Retrieves the queue ID from the given app context.\n *\n * This function extracts the queue ID based on the type of the app context.\n * For 'conversation' type, it attempts to retrieve the queue ID from the participant payload.\n * For 'workitem' type, it retrieves the queue ID directly from the workitem payload.\n * If the type is not recognized, it asserts an error.\n */\nexport function getQueueIdFromAppContext({ type, payload }: AppContext): string | undefined {\n    switch (type) {\n        case 'conversation': {\n            return payload.get('participantForCurrentUser.queueId') || payload.get('participantForQueue.queueId');\n        }\n        default: {\n            assertNever(type);\n        }\n    }\n}\n","export const replaceHtmlSpecialChars = (str: string): string =>\n    str\n        ?.replace(/&quot;/g, '\"')\n        .replace(/&#39;/g, \"'\")\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&')\n        .replace(/&#8217;/g, \"'\");\n","import _ from 'lodash';\nimport Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\nimport moment from 'connections-ui/utils/dates';\n\nconst { typeOf, get } = Ember;\n\nconst MEDIA_TYPES = ['callbacks', 'calls', 'chats', 'emails', 'messages'];\n\nfunction participantHasMedia(participants, media) {\n    return !!participants.find(participant => !!participant[media]);\n}\n\n// Assigns the interaction data sent from carrier pigeon or REST API response\n// to a property on the model that can be used to retrieve an interaction's \"raw\" data\nexport function setInteractionModelMetadata(model, interactionMetadata) {\n    try {\n        let metadataClone = _.cloneDeep(interactionMetadata);\n\n        if (typeOf(model) === 'instance') {\n            model.set('__interaction_metadata__', metadataClone);\n        } else {\n            model.__interaction_metadata__ = metadataClone;\n        }\n    } catch (err) {\n        Ember.Logger.error('Unable to clone and set the interaction metadata for interaction', {\n            err,\n            remoteData: {\n                interactionId: Ember.get(model, 'id')\n            }\n        });\n    }\n}\n\nexport function getCommunicationType(interactionModel) {\n    if (!interactionModel) return null;\n    return interactionModel.get('subMessageType') || interactionModel.get('type');\n}\n\nexport function getInteractionTypeFromCP(interaction, myGuid) {\n    if (!interaction || !myGuid || !interaction.participants) {\n        return {};\n    }\n\n    const myParticipants = interaction.participants.filter(participant => {\n        return participant.userId === myGuid;\n    });\n\n    const active = {};\n    MEDIA_TYPES.forEach(type => {\n        active[type] = participantHasMedia(myParticipants, type);\n    });\n\n    return active;\n}\n\nexport function interactionHasSipErrors(interaction) {\n    if (!interaction) {\n        return false;\n    }\n\n    let callsError = false;\n    const calls = interaction.get('participantForCurrentUser.calls');\n\n    if (calls) {\n        callsError = Ember.A(calls).some(call => {\n            const code = Ember.get(call, 'disconnectReasons.firstObject.code');\n\n            // 487 is Voicemail Not Available, which is not treated as an error\n            // 410 is a queue call that gets transfered to an agent for some reason\n            return code && code >= 300 && code !== 487 && code !== 410;\n        });\n    }\n\n    return callsError;\n}\n\n/**\n * Gets the true customer participant - whether it is the consultParticipant true customer or the last connected customer\n * @param interaction\n * @returns {*}\n */\nexport function getTrueCustomerIfMultipleCustomersExist(interaction) {\n    if (interaction) {\n        const participants = get(interaction, 'participants') || [];\n        const type = get(interaction, 'type');\n        const customerParticipants =\n            participants.filter(({ purpose }) => purpose === 'customer' || purpose === 'external') || Ember.A([]);\n\n        const hasMultipleCustomers = customerParticipants.length > 1;\n\n        if (hasMultipleCustomers) {\n            const consultParticipantId =\n                get(interaction, 'consultParticipantId') || customerParticipants.mapBy('consultParticipantId').pop();\n            const isCallOrCallback = interaction.get('isCall') || interaction.get('isCallback');\n\n            if (isCallOrCallback) {\n                if (consultParticipantId) {\n                    return customerParticipants.findBy('id', consultParticipantId);\n                } else {\n                    // SERVOPS-13490  when there are multiple customers on a blind transfer call from a previous consult\n                    // call there can be more than one customer participant in the list so deriving the correct communication\n                    // ID for the true customer can be wrong.  Since the blind transfer happened - there is no longer information\n                    // about what user is the consultParticipant so we will take the most recently connected\n                    // customer as the inferred true customer\n                    let participant;\n                    for (let i = 0; i < customerParticipants.length; i++) {\n                        let customer = customerParticipants[i];\n\n                        const communicationType = pluralize(type).camelize();\n                        const communications = customer[communicationType] || [];\n                        const { state } = communications[0] || {};\n                        if (!get(customer, 'endTime') || state === 'connected') {\n                            return customer;\n                        }\n                        const customerEndTime = moment(get(customer, 'endTime'));\n                        const lastParticipantEndTime = participant ? moment(get(participant, 'endTime')) : null;\n\n                        if (!participant || customerEndTime.isAfter(lastParticipantEndTime)) {\n                            participant = customer;\n                        }\n                    }\n                    return participant;\n                }\n            }\n        }\n    }\n}\n\nexport function isOutboundEmailInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'emails.firstObject.direction') === 'outbound';\n}\n\nexport function isOutboundMessagingInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'messages.firstObject.direction') === 'outbound';\n}\n\n/**\n * Util for creating an immutable pojo for a given contact\n * @param contact\n * @returns {*}\n */\nexport function createContactPojo(contact) {\n    if (!contact) return;\n    const derivedProperties = ['name', 'canonicalId', 'isCanonical'];\n    const contactJSON = typeof contact.toJSON === 'function' ? contact.toJSON({ includeId: true }) : {};\n    const derived = derivedProperties.reduce((accumulator, property) => {\n        const value = get(contact, property);\n        if (value) {\n            accumulator[property] = value;\n        }\n        return accumulator;\n    }, {});\n    return Object.assign(contactJSON, derived);\n}\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName, args) {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    Ember.Logger.warn(message, { arguments: args });\n}\n","const participantStatuses = {\n    ALERTING: 'ALERTING',\n    CONNECTING: 'CONNECTING',\n    CONNECTED: 'CONNECTED',\n    CONTACTING: 'CONTACTING',\n    DIALING: 'DIALING',\n    DISCONNECTED: 'DISCONNECTED',\n    PARKED: 'PARKED',\n    OFFERING: 'OFFERING',\n    TERMINATED: 'TERMINATED',\n    TRANSMITTING: 'TRANSMITTING'\n};\n\nexport default participantStatuses;\n","export const MEDIA_TYPES = {\n    CHAT: 'chat',\n    EMAIL: 'email',\n    VOICE: 'voice'\n};\n\nexport const STAT_KEYS = {\n    ABANDONED: 'tAbandon',\n    ACW: 'tAcw',\n    ANSWERED: 'tAnswered',\n    CUSTOMERS_WAITING: 'oWaiting',\n    HANDLE: 'tHandle',\n    HELD: 'tHeld',\n    INTERACTING: 'oInteracting',\n    IVR: 'tIvr',\n    OFFERED: 'nOffered',\n    OVERSLA: 'nOverSla',\n    SERVICE_LEVEL: 'serviceLevel',\n    SERVICE_TARGET: 'serviceTarget',\n    TALK: 'tTalk',\n    TIME_IN_STATUS: 'tIS', // tIS.<Status ID> ms  The time in status for the given status id. At status change time.\n    TRANSFERRED: 'nTransferred',\n    WAIT_TIME: 'tWait',\n    ACTIVE_MEMBERS: 'nActive', // Number of active members\n    MEMBERS: 'nMembers' // Active members\n};\n","/**\n * Params from the URL in the router. Pattern could be any of the following.\n *   - engage/admin/interactions/:interactionId/\n *   - engage/admin/interactions/:interactionId/*interactionDetailPath\n *   - engage/agent/interactions/:interactionId/\n *   - engage/agent/interactions/:interactionId/*interactionDetailPath\n */\ninterface InteractionDetailRedirectUrlParams {\n    /** GUID for the interaction. */\n    interactionId: string;\n\n    /** Sub-path within the interaction detail view like /details or /transcript. May not be present if the path ends with the interaction ID like engage/agent/interactions/:interactionId/ */\n    interactionDetailPath?: string;\n}\n\nexport interface InteractionDetailRedirectArgs {\n    /** Params from the URL in the router. */\n    urlParams: InteractionDetailRedirectUrlParams;\n\n    /** Query params from the URL. */\n    queryParams?: Record<string, string | undefined>;\n\n    /** URL segment for routing to either the admin or agent interaction detail path. */\n    adminAgentSegment: 'admin' | 'agent';\n}\n\n/** Builds a path to the analytics-ui iframe coordinator route for the interaction detail view given parameters from the old /engage/admin/interactions/ path. */\nexport function buildInteractionDetailRedirectPath(args: InteractionDetailRedirectArgs): string {\n    const queryParams = args.queryParams || {};\n    const queryParamSegments: Array<string> = [];\n\n    Object.entries(queryParams).forEach(keyValuePair => queryParamSegments.push(keyValuePair.join('=')));\n\n    const queryParamString = queryParamSegments.join('&');\n    const interactionId = args.urlParams.interactionId;\n    const interactionDetailPath = args.urlParams.interactionDetailPath;\n    const adminAgentSegment = args.adminAgentSegment;\n\n    let url = `/analytics/interactions/${interactionId}/${adminAgentSegment}/`;\n\n    if (interactionDetailPath) {\n        url += interactionDetailPath;\n    }\n\n    if (queryParamString) {\n        url += `?${queryParamString}`;\n    }\n\n    return url;\n}\n","import { getEvaluator, parse } from 'boon-js';\nimport { buildSymbolMap } from 'connections-ui/utils/boolean-expressions';\nimport { computed } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport const _buildAppProviderComputed = function (providerConfig) {\n    let dependencies = ['permissions.donutPermissions.[]', 'session.features'];\n    let keys = Object.keys(providerConfig);\n    keys.forEach(currKey => {\n        if (providerConfig[currKey].dependencies) {\n            dependencies = [...dependencies, ...providerConfig[currKey].dependencies];\n        }\n    });\n    dependencies = [...new Set(dependencies)];\n    let evaluateProviderExpression = function (expr, features, permissions) {\n        return buildSymbolMap(expr, {\n            ft: keyName => {\n                return features[keyName];\n            },\n            perm: keyName => {\n                return permissions.validateDonutPermission(keyName);\n            },\n            bool: keyName => {\n                return keyName === 'true';\n            }\n        });\n    };\n    return computed(...dependencies, function () {\n        let validProviders = [];\n        const permissions = this.get('permissions');\n        const features = this.get('session.features');\n        keys.forEach(currKey => {\n            const boolExpr = providerConfig[currKey].boolExpr;\n            const oldProvider = providerConfig[currKey].providerInstance;\n            let validProvider;\n            if (boolExpr) {\n                try {\n                    validProvider = providerConfig[currKey].evaluator(\n                        evaluateProviderExpression(boolExpr, features, permissions)\n                    );\n                } catch (error) {\n                    validProvider = false;\n                }\n            } else {\n                validProvider = true;\n                this.logger.warn('There are no feature toggle or permission restrictions for provider: ', {\n                    key: currKey\n                });\n            }\n            if (validProvider) {\n                if (!oldProvider) {\n                    providerConfig[currKey].providerInstance = getOwner(this).lookup('app-provider:' + currKey);\n                }\n                validProviders.push(providerConfig[currKey].providerInstance);\n            } else {\n                if (oldProvider) {\n                    oldProvider.destroy();\n                    providerConfig[currKey].providerInstance = null;\n                }\n            }\n        });\n        return validProviders;\n    });\n};\n\nexport const _buildProviderConfig = function (providerConfigMap, logger) {\n    if (!providerConfigMap) {\n        return {};\n    }\n    let keys = Object.keys(providerConfigMap);\n    let providerConfig = {};\n    keys.forEach(currKey => {\n        const boolExpr = providerConfigMap[currKey];\n        providerConfig[currKey] = { providerInstance: null, boolExpr };\n        try {\n            if (boolExpr) {\n                providerConfig[currKey].evaluator = getEvaluator(boolExpr);\n\n                let currDependencies = parse(boolExpr)\n                    .filter(curr => {\n                        return curr.name === 'IDENTIFIER';\n                    })\n                    .map(curr => {\n                        const [valueTag, value] = curr.value.split(':');\n                        if (!value || value === '') {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                        if (valueTag === 'ft') {\n                            return 'session.features.' + value;\n                        } else if (\n                            valueTag === 'perm' ||\n                            (valueTag === 'bool' && (value === 'true' || value === 'false'))\n                        ) {\n                            return '';\n                        } else {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                    })\n                    .filter(curr => {\n                        return curr !== '';\n                    });\n                providerConfig[currKey].dependencies = currDependencies;\n            }\n        } catch (err) {\n            delete providerConfig[currKey];\n            logger.warn('Invalid feature toggle and permission restrictions expression for provider: ', {\n                key: currKey\n            });\n        }\n    });\n    return providerConfig;\n};\n\nexport const validatePortNumber = function (portToValidate, defaultPort) {\n    const portInt = +portToValidate;\n    if (isNaN(portInt) || portInt <= 0 || portInt >= 65535) {\n        return defaultPort;\n    }\n    return portInt;\n};\n\nexport default { _buildProviderConfig, _buildAppProviderComputed };\n","import { assertNever } from 'connections-ui/utils/types';\nimport { RenderedInstanceState } from '@genesys/apps-v2-host';\nimport { isKnown } from '@genesys/service-discovery-web-internal';\n\nexport const isTrusted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internal types are trusted and allowed\n            break;\n        case 'iframe':\n            if (!appDef.trustedDataPassing) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\nexport const isActive = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING';\n};\n\nexport const isVisible = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING' && renderedInstance.userVisible;\n};\n\nexport const isInternallyHosted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internallyHosted types are trusted and allowed\n            break;\n        case 'iframe':\n            // isKnown throws is the url is invalid, so we catch it and return false\n            try {\n                if (!isKnown(appDef.src.href, {})) {\n                    return false;\n                }\n            } catch (error) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\n//exported for testing\nexport const validationChecks = {\n    isTrusted: {\n        check: isTrusted,\n        invalidReason: 'appDefNotTrusted'\n    },\n    isActive: {\n        check: isActive,\n        invalidReason: 'instanceNotActive'\n    },\n    isVisible: {\n        check: isVisible,\n        invalidReason: 'instanceNotVisible'\n    }\n};\n\nexport type ValidationKey = keyof typeof validationChecks;\ntype InvalidReason = (typeof validationChecks)[ValidationKey]['invalidReason'];\n\ntype ValidateRenderedInstanceResult =\n    | {\n          type: 'valid';\n      }\n    | { type: 'invalid'; reasons: InvalidReason[] };\n\nexport const validateRenderedInstance = (\n    renderedInstance: RenderedInstanceState,\n    ...validations: ValidationKey[]\n): ValidateRenderedInstanceResult => {\n    const invalidReasons: InvalidReason[] = [];\n\n    for (const validation of validations) {\n        const validationConfig = validationChecks[validation];\n        const result = validationConfig.check(renderedInstance);\n        if (!result) invalidReasons.push(validationConfig.invalidReason);\n    }\n    if (invalidReasons.length > 0) {\n        return { type: 'invalid', reasons: invalidReasons };\n    }\n    return { type: 'valid' };\n};\n","import { typeOf, isPresent } from '@ember/utils';\nimport { assertNever, hasKey } from './types';\nimport { AppDef, AppLogDetails, Asset } from '@genesys/apps-v2-host';\nimport { StashLoggerLogPayload } from '@connections-ui/services';\n\n// General Constants\nexport const SDK_REPO_URL = 'https://github.com/MyPureCloud/client-app-sdk';\n\n// Namespaces for logging, metrics, etc\nexport const LOG_ROOT_NAMESPACE = 'PureCloud Client Apps';\nexport const LOG_STANDALONE_APP_NAMESPACE = 'Standalone App';\nexport const LOG_API_NAMESPACE = 'API';\nexport const LOG_INTERAPPTIONS_NAMESPACE = 'Interapptions';\nconst LOG_SEPARATOR = ' - ';\n\nexport * as AppsV2 from '@genesys/apps-v2-host';\n\ntype ConversationAppContext = {\n    type: 'conversation';\n    // TODO: The actual type is an ember model, InteractionModel; use when this type is available.\n    payload: any;\n    id: string;\n};\n\nexport type AppContext = ConversationAppContext;\n\ntype AppDefV1VectorAsset = { vector: string };\ntype AppDefV1GuxAsset = { guxIcon: { name: string; decorative: boolean } };\ntype AppDefV1AssetSrcSet = { raster: Record<`x${number}`, string> };\nexport type AppDefV1Asset = Partial<AppDefV1GuxAsset & AppDefV1VectorAsset & AppDefV1AssetSrcSet>;\n\ntype AppLogDetailsObject = ReturnType<AppLogDetails['getLogs']>;\n\nexport default {\n    SDK_REPO_URL,\n    LOG_ROOT_NAMESPACE,\n    LOG_STANDALONE_APP_NAMESPACE,\n    LOG_API_NAMESPACE,\n    LOG_INTERAPPTIONS_NAMESPACE,\n\n    buildLogMsg(msg: string, ...subNamespaces: string[]) {\n        let tokens = [LOG_ROOT_NAMESPACE];\n\n        if (subNamespaces.length > 0) {\n            subNamespaces.forEach(currNamespace => {\n                if (typeOf(currNamespace) !== 'string' || !isPresent(currNamespace)) {\n                    throw new Error('invalidNamespaceValue');\n                } else {\n                    tokens.push(currNamespace);\n                }\n            });\n        }\n\n        if (typeOf(msg) !== 'string' || !isPresent(msg)) {\n            throw new Error('invalidMessage');\n        } else {\n            tokens.push(msg);\n        }\n\n        return tokens.join(LOG_SEPARATOR);\n    },\n\n    buildApiLogMsg(msg: string) {\n        return this.buildLogMsg(msg, LOG_API_NAMESPACE);\n    },\n\n    buildStandaloneAppLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_STANDALONE_APP_NAMESPACE, ...subNamespaces);\n    },\n\n    buildInterapptionsLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_INTERAPPTIONS_NAMESPACE, ...subNamespaces);\n    },\n\n    buildStashLoggerDetails(logDetails: Partial<AppLogDetailsObject> = {}): StashLoggerLogPayload {\n        const details: StashLoggerLogPayload = { ...logDetails.data };\n        details.remoteData = { ...logDetails.remote };\n        if (logDetails.mask) {\n            details.remoteData.sensitive = { ...logDetails.mask };\n        }\n        return details;\n    },\n\n    buildViewId(id: string) {\n        return `app_${id.replaceAll('&', '_')}`;\n    },\n\n    isAppDefV2(toCheck: unknown): toCheck is AppDef {\n        if (!toCheck || typeof toCheck !== 'object' || !hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n            return false;\n        }\n        return (\n            ['iframe', 'elementSingletonAppDef', 'elementFactoryAppDef', 'dynaWebComp'] as ReadonlyArray<string>\n        ).includes(toCheck.type);\n    },\n\n    isAppContext(toCheck: unknown): toCheck is AppContext {\n        if (!toCheck || typeof toCheck !== 'object') {\n            return false;\n        }\n\n        if (\n            !hasKey(toCheck, 'type') ||\n            typeof toCheck.type !== 'string' ||\n            !['conversation'].includes(toCheck.type)\n        ) {\n            return false;\n        }\n\n        if (!hasKey(toCheck, 'id') || typeof toCheck.id !== 'string') {\n            return false;\n        }\n\n        if (!hasKey(toCheck, 'payload') || typeof toCheck.payload !== 'object' || !toCheck.payload) {\n            return false;\n        }\n\n        return true;\n    },\n\n    buildV1IconAsset(asset: Asset): AppDefV1Asset {\n        const { type } = asset;\n        switch (type) {\n            case 'remoteVectorImage':\n                return {\n                    vector: asset.url.href\n                };\n            case 'remoteRasterImage':\n                if (asset.width !== asset.height) {\n                    return {};\n                }\n                return {\n                    raster: {\n                        [`x${asset.width}`]: asset.url.href\n                    }\n                };\n            case 'remoteRasterImageSet':\n                const raster = Object.fromEntries(\n                    asset.images\n                        .filter(curr => curr.width === curr.height)\n                        .map<[string, string]>(curr => {\n                            return [`x${curr.width}`, curr.url.href];\n                        })\n                );\n\n                if (Object.keys(raster).length === 0) {\n                    return {};\n                }\n\n                return {\n                    raster\n                };\n            case 'sparkV3SvgSprite':\n                return {\n                    guxIcon: {\n                        name: asset.classNames.join(' '),\n                        decorative: true\n                    }\n                };\n            default:\n                assertNever(type);\n        }\n    },\n\n    buildV2IconAsset(asset: AppDefV1Asset): Asset | undefined {\n        if (!asset || typeof asset !== 'object') {\n            return undefined;\n        }\n        if (asset.guxIcon && typeof asset.guxIcon.name === 'string') {\n            return {\n                type: 'sparkV3SvgSprite',\n                classNames: [asset.guxIcon.name]\n            };\n        } else if (typeof asset.vector === 'string') {\n            try {\n                return {\n                    type: 'remoteVectorImage',\n                    url: new URL(asset.vector)\n                };\n            } catch (_) {\n                return undefined;\n            }\n        } else if (asset.raster && typeof asset.raster === 'object') {\n            // Look though raster props and validate the url\n            const RASTER_PROP_PATTERN = /^x(\\d+)$/;\n            const rasterEntries = Object.entries(asset.raster)\n                .filter(([currProp]) => RASTER_PROP_PATTERN.test(currProp))\n                .filter((toCheck): toCheck is [string, string] => typeof toCheck[1] === 'string');\n            const images = rasterEntries.reduce<Array<{ width: number; height: number; url: URL }>>(\n                (result, [currRasterProp, currRasterValue]) => {\n                    let url;\n                    try {\n                        url = new URL(currRasterValue);\n                    } catch (_) {\n                        // TODO: Log invalid asset url\n                        return result;\n                    }\n\n                    const match = RASTER_PROP_PATTERN.exec(currRasterProp);\n                    if (!match) {\n                        return result;\n                    }\n\n                    const size = parseInt(match[1], 10);\n                    if (isNaN(size)) {\n                        return result;\n                    }\n\n                    result.push({\n                        width: size,\n                        height: size,\n                        url\n                    });\n\n                    return result;\n                },\n                []\n            );\n\n            if (images.length === 1) {\n                const { url, width, height } = images[0];\n                return {\n                    type: 'remoteRasterImage',\n                    url,\n                    width,\n                    height\n                };\n            }\n\n            if (images.length > 1) {\n                return {\n                    type: 'remoteRasterImageSet',\n                    images\n                };\n            }\n        }\n        return undefined;\n    }\n};\n","import { noop } from 'lodash';\n\nexport type PromiseResolve<T> = NonNullable<Parameters<Promise<T>['then']>[0]>;\nexport type PromiseReject<T> = NonNullable<Parameters<Promise<T>['catch']>[0]>;\n\nexport type DeferredPromise<T> = {\n    promise: Promise<T>;\n    resolve: PromiseResolve<T>;\n    reject: PromiseReject<T>;\n};\n\nexport const deferPromise = <T>(): DeferredPromise<T> => {\n    let resolve: PromiseResolve<T> = noop;\n    let reject: PromiseReject<T> = noop;\n\n    const promise = new Promise<T>((res, rej) => {\n        resolve = res;\n        reject = rej;\n    });\n    return { promise, resolve, reject };\n};\n","import { parse } from 'boon-js';\n\nexport function buildSymbolMap(expression, symbolEvaluator) {\n    if (typeof expression !== 'string' || expression === '') {\n        throw new Error('Missing/invalid expression');\n    }\n    if (typeof symbolEvaluator !== 'object' || symbolEvaluator === null || Object.keys(symbolEvaluator).length === 0) {\n        throw new Error('Missing/invalid symbol evaluator');\n    }\n\n    const symbolMap = {};\n\n    const identifiers = parse(expression)\n        .filter(curr => {\n            return curr.name == 'IDENTIFIER';\n        })\n        .map(curr => {\n            return curr.value;\n        });\n\n    if (identifiers.length === 0) {\n        throw new Error('No Identifiers Found');\n    }\n\n    identifiers.forEach(currIdentifier => {\n        const ns = currIdentifier.split(':')[0];\n        let variable = currIdentifier.substring(ns.length + 1);\n        if (!ns || !variable || ns === '' || variable === '') {\n            throw new Error('Invalid identifier');\n        }\n        const nsSymbolEvaluator = symbolEvaluator[ns];\n        if (typeof nsSymbolEvaluator !== 'function') {\n            throw new Error('Missing/Invalid namespace symbol evaluator');\n        }\n        try {\n            symbolMap[`${ns}:${variable}`] = nsSymbolEvaluator(variable);\n        } catch (error) {\n            throw new Error('Namespace symbol evaluator threw');\n        }\n    });\n\n    return symbolMap;\n}\n\nconst expressionBuilder = (operator, conditions) => {\n    return `(${conditions.join(` ${operator} `)})`;\n};\n\nexport const and = function (...conditions) {\n    return expressionBuilder('AND', conditions);\n};\n\nexport const or = function (...conditions) {\n    return expressionBuilder('OR', conditions);\n};\n\nexport const not = condition => `(NOT (${condition}))`;\n\nexport const ft = name => `ft:${name}`;\n\nexport const perm = name => `perm:${name}`;\n\nexport const bool = name => `bool:${name}`;\n","define(\"connections-ui/utils/browser\", [\"exports\", \"ember-purecloud-components/utils/browser\"], function (_exports, _browser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _browser.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/code-utils\", [\"exports\", \"ember-purecloud-components/utils/code-utils\"], function (_exports, _codeUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _codeUtils.default;\n    }\n  });\n});\n","export function isGuid(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isAppleURN(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^urn:mbid:/);\n}\n/**\n * Get userId\n * @param user participant.\n * @returns {string or undefined} the userId\n */\nexport const userGuidFromParticipant = (user: any) => {\n    if (!user) {\n        return;\n    }\n\n    const { userId, userUri } = user;\n\n    if (userId) {\n        return userId;\n    }\n    if (userUri) {\n        return userUri.substring(userUri.lastIndexOf('/') + 1);\n    }\n};\n\n/**\n * Convert size in bytes to KB, MB, GB or GB.\n * @param contentLength file size in bytes to be converted against.\n * @returns {string} the converted value with the correct unit.\n */\nexport function formatSize(contentLength: number): string {\n    const units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(contentLength) / Math.log(1000));\n\n    if (!+contentLength) return '0bytes';\n    return `${parseFloat((contentLength / Math.pow(1000, i)).toFixed(1))}${units[i]}`;\n}\n","/*\n  DEPRECATION NOTICE:  this file has been moved to `ember-purecloud-components`\n  and will be removed.  Please use './node_modules/ember-purecloud-components/addon/utils/dates.js'\n  instead.\n*/\n\nimport moment from 'ember-purecloud-components/utils/dates';\nimport {\n    displayDateRelativeToToday,\n    generateCurrentInterval,\n    splitIntervalString,\n    timeInMillis\n} from 'ember-purecloud-components/utils/dates';\n\nexport default moment;\n\nexport { displayDateRelativeToToday, generateCurrentInterval, splitIntervalString, timeInMillis };\n","define(\"connections-ui/utils/debug-backburner\", [\"exports\", \"ember-purecloud-components/utils/debug-backburner\"], function (_exports, _debugBackburner) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugBackburner.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/debug-rsvp\", [\"exports\", \"ember-purecloud-components/utils/debug-rsvp\"], function (_exports, _debugRsvp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugRsvp.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/display-geolocation\", [\"exports\", \"ember-purecloud-components/utils/display-geolocation\"], function (_exports, _displayGeolocation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _displayGeolocation.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/email-types/draft-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email-types/email-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email\", [\"exports\", \"ember-purecloud-components/utils/email\"], function (_exports, _email) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _email.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/ember-types\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","const API_ERROR_MESSAGES = {\n    userNotAssignedNumber: 'USER_NOT_ASSIGNED_TO_NUMBER',\n    e911Support: 'NUMBER_DOES_NOT_SUPPORT_ENHANCED_911',\n    invalidCity: 'INVALID_CITY',\n    notValidNumber: 'PHONE_NUMBER_NOT_US_OR_CA'\n};\n\nconst getErrorString = function (err, defaultMessage) {\n    let errorMessage = defaultMessage || 'emergencyLocation.errors.e911LocationSet';\n\n    if (err.payload && err.payload.message) {\n        const messageType = err.payload.message;\n        switch (messageType) {\n            case API_ERROR_MESSAGES.userNotAssignedNumber:\n                errorMessage = 'emergencyLocation.errors.userNotAssignedNum';\n                break;\n            case API_ERROR_MESSAGES.e911Support:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n            case API_ERROR_MESSAGES.invalidCity:\n                errorMessage = 'emergencyLocation.errors.invalidAddressProvided';\n                break;\n            case API_ERROR_MESSAGES.notValidNumber:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n        }\n    }\n    return errorMessage;\n};\n\nexport default {\n    getErrorString\n};\n","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😆',\n        '😂',\n        '😉',\n        '😏',\n        '😊',\n        '😍',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😝',\n        '😜',\n        '😢',\n        '😭',\n        '😨',\n        '😰',\n        '😱',\n        '😠',\n        '😕',\n        '🙁',\n        '😮',\n        '😦',\n        '😧',\n        '😑',\n        '😶',\n        '😒',\n        '😬',\n        '😳',\n        '😞',\n        '😓',\n        '😅',\n        '😇',\n        '😔',\n        '😪',\n        '🥳',\n        '😷',\n        '😺',\n        '😹',\n        '😻',\n        '😼',\n        '🙀',\n        '😿',\n        '😾',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '🙌',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '🙌🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '🙌🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '🙌🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '🙌🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '🙌🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📢',\n        '📣',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    people: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊',\n        '👶',\n        '👦',\n        '👧',\n        '👨',\n        '👩',\n        '👴',\n        '👵',\n        '👨‍🎓',\n        '👩‍🎓',\n        '👨‍🏫',\n        '👩‍🏫',\n        '👨‍🌾',\n        '👩‍🌾',\n        '👨‍🍳',\n        '👩‍🍳',\n        '👨‍🔧',\n        '👩‍🔧',\n        '👨‍🏭',\n        '👩‍🏭',\n        '👨‍💼',\n        '👩‍💼',\n        '👨‍🔬',\n        '👩‍🔬',\n        '👨‍💻',\n        '👩‍💻',\n        '👨‍🎤',\n        '👩‍🎤',\n        '👨‍🎨',\n        '👩‍🎨',\n        '👨‍✈️',\n        '👩‍✈️',\n        '👨‍🚀',\n        '👩‍🚀',\n        '👨‍🚒',\n        '👩‍🚒',\n        '👮',\n        '🕵',\n        '💂',\n        '👷',\n        '💇🏼',\n        '🚶',\n        '🏃',\n        '🛌',\n        '🏇',\n        '🏂',\n        '🏌',\n        '🏄',\n        '🚣',\n        '🏊',\n        '⛹',\n        '🏋',\n        '🚴',\n        '🚵',\n        '👪',\n        '👨‍👩‍👦',\n        '👨‍👩‍👧',\n        '👨‍👩‍👧‍👦',\n        '👨‍👩‍👦‍👦',\n        '👨‍👩‍👧‍👧',\n        '👨‍👨‍👦',\n        '👨‍👨‍👧',\n        '👨‍👨‍👧‍👦',\n        '👨‍👨‍👦‍👦',\n        '👨‍👨‍👧‍👧',\n        '👩‍👩‍👦',\n        '👩‍👩‍👧',\n        '👩‍👩‍👧‍👦',\n        '👩‍👩‍👦‍👦',\n        '👩‍👩‍👧‍👧',\n        '💪',\n        '👈',\n        '👉',\n        '☝',\n        '👇',\n        '✌',\n        '🖐',\n        '✋',\n        '👌',\n        '👍',\n        '👎',\n        '👊',\n        '👋',\n        '✍',\n        '👏'\n    ],\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","define(\"connections-ui/utils/emoji\", [\"exports\", \"ember-purecloud-components/utils/emoji\"], function (_exports, _emoji) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emoji.default;\n    }\n  });\n});\n","import _ from 'lodash';\n\nimport { BASE_GROUP_FIELDS, BASE_GROUP } from '../models/group';\nimport { BASE_LOCATION_FIELDS, BASE_LOCATION } from '../models/location';\nimport { BASE_PERSON_FIELDS, BASE_PERSON } from '../models/person';\n\nexport const MULTI_ENTITY_FIELDS = _.uniq(\n    [].concat(BASE_GROUP_FIELDS).concat(BASE_LOCATION_FIELDS).concat(BASE_PERSON_FIELDS)\n);\n\nexport const FL = {\n    all: {\n        fl: MULTI_ENTITY_FIELDS.join(',')\n    },\n    group: {\n        fl: BASE_GROUP\n    },\n    person: BASE_PERSON,\n    location: BASE_LOCATION\n};\n","export default ['error.ininedgecontrol.sesion.inactive'];\n","import Ember from 'ember';\n\nconst HTMLChars = [\n    {\n        char: '&',\n        escaped: '&amp;'\n    },\n    {\n        char: '<',\n        escaped: '&lt;'\n    },\n    {\n        char: '>',\n        escaped: '&gt;'\n    },\n    {\n        char: '\"',\n        escaped: '&quot;'\n    },\n    {\n        char: \"'\",\n        escaped: '&apos;'\n    }\n];\n\nfunction regExpEscape(literal_string) {\n    return literal_string.replace(/[-[\\]{}()*+!<=:?.\\/\\\\^$|#\\s,]/g, '\\\\$&');\n}\n\nexport default function escape(obj) {\n    if (obj === null || typeof obj === 'function') {\n        return null;\n    }\n    if (typeof obj === 'string') {\n        const escapedString = Ember.Handlebars.Utils.escapeExpression(obj);\n        // [RELATE-2592] allow single quotes to make it through the escape pass\n        return escapedString.replace(/&#x27;/g, `'`);\n    }\n    if (typeof obj !== 'object') {\n        return obj;\n    }\n    const clone = JSON.parse(JSON.stringify(obj));\n    Object.keys(clone).forEach(k => {\n        clone[k] = escape(clone[k]);\n    });\n    // maintain keys with value of undefined (these get lost in the clone)\n    Object.keys(obj).forEach(k => {\n        // fixup SafeString items that looked like objects\n        if (Ember.String.isHTMLSafe(obj[k])) {\n            clone[k] = obj[k].toString();\n        }\n        if (Object.prototype.hasOwnProperty.call(obj, k) && typeof obj[k] === 'undefined') {\n            clone[k] = undefined;\n        }\n    });\n    return clone;\n}\n\nexport function unescape(obj) {\n    if (typeof obj === 'string') {\n        let theString = obj;\n        HTMLChars.forEach(char => {\n            // replaceAll isn't available until Chrome 85, so unit tests failed\n            // This regex method works, just not as clean\n            theString = theString.replace(new RegExp(regExpEscape(char.escaped), 'g'), char.char);\n        });\n\n        return theString;\n    } else {\n        return obj;\n    }\n}\n","class ExponentialIntervalGenerator {\n    constructor(maxInterval, baselineInterval = 0) {\n        this._failures = 0;\n        this._baselineInterval = baselineInterval;\n        this._maxAdditionalInterval = maxInterval - baselineInterval;\n    }\n\n    fail() {\n        this._failures++;\n    }\n\n    reset() {\n        this._failures = 0;\n    }\n\n    getInterval() {\n        /*\n         The max interval is determined by the following equation:\n\n         2^k - 1\n\n         We then multiple it by 1000 to convert it to milliseconds.\n         */\n        var expInterval = (Math.pow(2, this._failures) - 1) * 1000;\n        var generatedMaxInterval = Math.min(expInterval, this._maxAdditionalInterval);\n\n        // Get a random interval amount so that we don't flood the server with reconnect\n        // requests from every single user at the same time.\n        var interval = this._baselineInterval + Math.random() * generatedMaxInterval;\n        return interval;\n    }\n}\n\nexport default ExponentialIntervalGenerator;\n","import { messagingChannelTypes, getDisplayOrScreenName, messagingChannelTypeFor } from './message-channels';\nimport Ember from 'ember';\nimport { CHANNEL_MODEL_TYPE } from 'connections-ui/services/relate';\n\nexport const I18N_INFO = {\n    updateChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPrompt',\n    updateChannelInfoPromptPlural: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPromptPlural',\n    updateAllChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateAllChannelInfoPrompt',\n    newChannelPrompt: 'purecloud.acdInteraction.relate.displayProfile.newChannelPrompt',\n    pleaseWaitForFullContactInfo: 'purecloud.acdInteraction.relate.displayProfile.pleaseWaitForFullContactInfo',\n    propertyChanged: 'purecloud.acdInteraction.relate.channelTypes'\n};\n\nexport const ID = 'id';\nexport const IDS = 'ids';\nexport const USER_ID = 'userId';\nconst CHANNEL_ID_PROPERTY = 'channelIdProperty';\nconst CHANNEL_TYPE = 'type';\nconst IS_NEW_CHANNEL = 'isNewChannel';\nconst AGENT_RESPONDED_TO_PROMPT = 'agentRespondedToPrompt';\nconst CHANGES_IGNORED_BY_AGENT = 'changesIgnoredByAgent';\n\nexport const CHANNEL_RECORD_PROPERTIES = [\n    CHANNEL_TYPE,\n    CHANNEL_ID_PROPERTY,\n    IS_NEW_CHANNEL,\n    CHANGES_IGNORED_BY_AGENT,\n    AGENT_RESPONDED_TO_PROMPT,\n    USER_ID,\n    IDS,\n    ID\n];\n\n// Refer to the message-interaction.js MESSENGER_TYPE const for these values.  Could use DRYing\nexport const KNOWN_INBOUND_MESSAGE_SUBTYPES = [\n    ...messagingChannelTypes.map(messagingChannelType => messagingChannelType.type)\n];\n\n/**\n * Used to return the \"class\" of an Ember component `call`ing this function; e.g.\n * `componentClassName.call(this)`\n *\n * Used primarily to include a query parameter in a REST endpoint call to identify a component responsible for making the call.\n */\nexport function componentClassName() {\n    try {\n        return encodeURIComponent(this.toString());\n    } catch (e) {\n        return 'COMPONENT_UNKNOWN';\n    }\n}\n\nexport function isInboundMessageType(interaction) {\n    return interaction && KNOWN_INBOUND_MESSAGE_SUBTYPES.includes(getMessengerType(interaction));\n}\n\nexport function getMessengerType(interaction) {\n    return interaction && interaction.get('subMessageType');\n}\n\nexport function getIdentifier(interaction) {\n    if (!interaction) {\n        return null;\n    }\n\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && messagingChannelType.getReverseWhitepagesLookupValue(interaction);\n}\n\nexport function getDisplayableName(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressDisplayable');\n}\n\nexport function isNewId(id, messengerType, externalContact) {\n    if (!externalContact) {\n        return true; // If the caller supplies no externalContact instance, then consider the id as being new\n    }\n    const messagingChannelType = messagingChannelTypes.find(mct => {\n        return mct.type === messengerType;\n    });\n    if (!messagingChannelType) {\n        return false; // An unrecognized messenger type, so can't determine if the ID is new or not, so return\n    }\n\n    return messagingChannelType.isNewId(messagingChannelType.getIdsFromExternalContact(externalContact), id);\n}\n\nexport function getMessageChannelType(messengerType) {\n    return messagingChannelTypes.find(messagingChannelType => {\n        return messagingChannelType.type === messengerType;\n    });\n}\n\n// Returns an external contact channel object that's specific to the interaction's `subMessageType` type,\n// populated with properties mapping to Relate's Java message channel type models (e.g. FacebookId, LineId, TwitterId, and WhatsappId).\nexport function getInteractionChannel(interaction, logger = null) {\n    if (!interaction) {\n        return null;\n    }\n    const interactionId = interaction.get('id');\n    const interactionType = interaction.get('type');\n    const messengerType = getMessengerType(interaction);\n    const messagingChannelType = messagingChannelTypeFor(messengerType);\n\n    if (!messagingChannelType) {\n        if (logger) {\n            logger.error(\n                `ACD Relate: Could not determine the messenger channel type for interaction id \"${interactionId}\" where messenger type is \"${messengerType}\" and the interaction type is \"${interactionType}\"`\n            );\n        }\n        return null;\n    }\n    const id = getIdentifier(interaction);\n    const displayOrScreenName = getDisplayOrScreenName(interaction);\n    const handle = getDisplayableName(interaction); // Returns undefined if not a Twitter interaction and that's OK because the other modelProperties functions will just ognore it\n\n    return messagingChannelType.modelProperties(id, displayOrScreenName, handle);\n}\n\nexport function notExcluded(key) {\n    return !CHANNEL_RECORD_PROPERTIES.includes(key);\n}\n\n/**\n * Sets new values into the channel record for purposes of change detection\n * @param interactionChannelProperties An object with properties and values based on a channel-record; e.g. for Facebook:\n * { displayName: 'Don Herkimer', ids: [ { scopedId: '23456' } ] }.  The source of \"new\" values for the channel gotten\n * from an interaction.\n * @param isNewChannel true if this is a new channel for the contact\n * @param contact An external contact that may (or may not) already have a channel for this interaction.  The source of\n * \"old\" values for the channel.\n * @param channelIdProperty E.g. 'id', 'ids', 'phoneNumber' etc. (see the message-channels util for details)\n * @param idPropertyName E.g. 'userId' or 'scopedId', if the channel is capable of having an array of ID objects\n * whose every key is the given property name.  Null otherwise.\n * @param channelRecord A channel-record model instance that will track changed attributes (ref. Ember DS.Model's changedAttributes method)\n */\nexport function setNewValuesInChannelRecord(\n    interactionChannelProperties,\n    isNewChannel,\n    contact,\n    channelIdProperty,\n    idPropertyName,\n    channelRecord\n) {\n    const messagingChannelType = messagingChannelTypeFor(channelRecord.get('type'));\n    // Iterate over the interaction's channel-related properties to get potentially new values\n    Object.keys(interactionChannelProperties).forEach(key => {\n        const modelKey = `${messagingChannelType.modelKey}`;\n        const contactChannelIds = !isNewChannel && IDS === key && contact.get(`${modelKey}.${key}`);\n        if (key === IDS && (contactChannelIds || isNewChannel)) {\n            addOrReplaceIdsInChannelRecord(\n                idPropertyName,\n                channelRecord,\n                interactionChannelProperties,\n                contactChannelIds\n            );\n        } else {\n            if ('id' === key) {\n                // We don't use an 'id' key in the channel record, since Ember DS will consider that to be the ID of the record.\n                // We use 'userId' to hold the value of the inbound message's (user) 'id' property.\n                channelRecord.set(USER_ID, interactionChannelProperties[key]);\n            } else if (deepNotEqual(channelRecord.get(`${key}`), interactionChannelProperties[key])) {\n                // Set this legit new value in the record\n                channelRecord.set(`${key}`, interactionChannelProperties[key]);\n            }\n        }\n    });\n}\n\nfunction getChannelRecordInfo(type, freshContactSnapshot, channelIdProperty, interaction, logger) {\n    const interactionChannel = getInteractionChannel(interaction, logger);\n    if (!interactionChannel) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return {};\n    }\n\n    const messagingChannelType = getMessageChannelType(type);\n    let attributes = {};\n    if (freshContactSnapshot) {\n        Object.assign(attributes, freshContactSnapshot.get(messagingChannelType.modelKey)); // The source for old (WRT the Ember DS channel record) values\n    }\n    const interactionChannelProperties = interactionChannel[messagingChannelType.modelKey]; // The source for new (WRT the Ember DS channelRecord) values\n    const isNewChannel = !attributes || !attributes[messagingChannelType.channelId]; // The channel's new if either there is no lineId, or twitterId, or ... property, *or* said property has no channel ID\n    if (isNewChannel) {\n        attributes = interactionChannel;\n    }\n    attributes.type = type;\n    attributes.channelIdProperty = channelIdProperty;\n    attributes.isNewChannel = isNewChannel;\n    attributes.changesIgnoredByAgent = false;\n    attributes.agentRespondedToPrompt = false;\n    const messengerType = messagingChannelType.type;\n    const idAttribute = messagingChannelType.channelId;\n    const idOrIDs =\n        freshContactSnapshot.get(`${messengerType}Id.${idAttribute}`) ||\n        interactionChannelProperties[interactionChannel.channelId];\n    if (idAttribute === IDS) {\n        attributes.userId = idOrIDs;\n    } else {\n        attributes.userId = idOrIDs;\n    }\n    // The ids, name, displayName, screenName, and phoneNumber properties for the channel record under-construction\n    // (see the channel-record model)\n    return { attributes, isNewChannel, interactionChannelProperties };\n}\n\n// Returns an Ember DS channel-record; see the model for more info.\n// The ID of the returned record is that of the interaction\nexport function push(store, interaction, freshContactSnapshot, type, channelIdProperty, logger) {\n    const { attributes, isNewChannel, interactionChannelProperties } = getChannelRecordInfo(\n        type,\n        freshContactSnapshot,\n        channelIdProperty,\n        interaction,\n        logger\n    );\n    if (!attributes) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return null;\n    }\n\n    // The channelRecord's changedAttributes function will return an object\n    // with properties storing arrayed pairs denoting an oldValue and\n    // a newValue: [oldValue, newValue], plus the numberOfChanges method that helps\n    // to determine if the inbound message introduces changes that need to be applied\n    // to the freshContactSnapshot's channel.\n    //\n    // We leverage that capability by setting values below.\n    let channelRecord;\n    Ember.run(() => {\n        // A run is required here for a successful run of the interaction-relate-profile-v2's \"should display a confirmation prompt if...\" integration test\n        channelRecord = store.push({\n            data: {\n                id: interaction.get('id'), // Use the interaction's ID as the ID for the record to allow peeks (see the peekForChannelRecord method)\n                type: CHANNEL_MODEL_TYPE,\n                attributes: attributes // The set of \"old\" values that may be updated by the forEach iterator below\n            }\n        });\n        // Add a numberOfChanges function to the channelRecord object so the confirmation prompt component can use it to\n        // determine what sort of prompt to offer the user\n        channelRecord.numberOfChanges = () => {\n            return Object.keys(channelRecord.changedAttributes()).length;\n        };\n\n        // See if the channel identifies users with an _array_ of IDs\n        const ids = interactionChannelProperties.ids;\n        // If so, grab the property of the first of those IDs to use as a property name if IDs are being added (below)\n        const idPropertyName = ids ? Object.keys(ids[0])[0] : null;\n        setNewValuesInChannelRecord(\n            interactionChannelProperties,\n            isNewChannel,\n            freshContactSnapshot,\n            channelIdProperty,\n            idPropertyName,\n            channelRecord\n        );\n    });\n    return channelRecord;\n}\n\n/**\n * Updates the contact with changes recorded by the channel Ember DS record\n * @param channelRecord\n * @param contact\n */\nexport function updateContactWithChannelChanges(channelRecord, contact) {\n    if (!channelRecord) {\n        return;\n    }\n\n    const channelRecordData = channelRecord.data;\n    const changedAttributes = channelRecord.changedAttributes();\n    const messagingChannelType = messagingChannelTypeFor(channelRecordData.type);\n    const modelKey = `${messagingChannelType.modelKey}`;\n    const modelProperties = Object.keys(messagingChannelType.modelProperties()[modelKey]);\n    Ember.run.join(() => {\n        if (channelRecordData.isNewChannel) {\n            // Set up the new channel and its id(s)\n            contact.set(`${modelKey}`, channelRecordData[`${modelKey}`]);\n        } else {\n            // Copy the updated channel's data into the contact\n            Object.keys(changedAttributes).forEach(key => {\n                if (key === USER_ID) {\n                    const channelIdProperty = `${messagingChannelType.modelKey}.${messagingChannelType.channelId}`;\n                    // We don't use an 'id' key in the record because Ember DS will consider that to be the ID of the record.\n                    // We use 'channelId' to hold the value of the inbound message's 'id' property.\n                    if (messagingChannelType.idPropertyName) {\n                        // If the there's an idPropertyName, that means the channel uses an array of objects to denote IDs\n                        const id = messagingChannelType.getIdFrom(changedAttributes[key][1]);\n                        const contactChannelIds = contact.get(`${channelIdProperty}`);\n                        contact.set(`${channelIdProperty}`, [id].concat(contactChannelIds));\n                    } else {\n                        contact.set(`${channelIdProperty}`, messagingChannelType.getIdFrom(changedAttributes[key][1]));\n                    }\n                } else if (notExcluded(key) && modelProperties.includes(key)) {\n                    contact.set(`${modelKey}.${key}`, changedAttributes[key][1]);\n                }\n            });\n        }\n\n        // Delete irrelevant, channel-record-specific properties\n        CHANNEL_RECORD_PROPERTIES.forEach(property => {\n            delete contact.get(`${modelKey}.${property}`);\n        });\n    });\n}\n\nfunction deepNotEqual(a, b) {\n    return JSON.stringify(a) !== JSON.stringify(b);\n}\n\nfunction addOrReplaceIdsInChannelRecord(idPropertyName, channelRecord, interactionChannel, contactChannelIds) {\n    // Currently, FacebookId and LineId (contacts-service Java model class names) objects\n    // (facebook-id and line-id Ember DS models) use a property named 'ids' that has an array of\n    // objects whose key/value pairs are an ID name ('scopedId' and 'userId' respectively)\n    // paired with an ID string value.\n    //\n    // E.g. a facebook-id model object will have a property named 'ids', and its value could be\n    // [ { scopedId: '1234' }, { scopedId: '5678' } ]\n    const contactChannelIdValues = contactChannelIds ? contactChannelIds.map(id => id[idPropertyName]) : [];\n    const interactionIdValues = interactionChannel.ids.map(id => {\n        return id[idPropertyName];\n    });\n    let addedIds = false;\n    const newIdValues = interactionIdValues.map(interactionId => {\n        if (!contactChannelIdValues.includes(interactionId)) {\n            addedIds = true;\n            return interactionId;\n        }\n    });\n    if (addedIds) {\n        // As of this writing (31AUG2018), there is only one element in any contact's ids array.\n        //\n        // The uncommented statement map invocation below works under this assumption.  To relax that assumption at\n        // some point in the future, use the commented-out map line below instead.\n        const ids = newIdValues.map(idVal => {\n            // const ids = contactChannelIdValues.concat(newIdValues).map(idVal => {\n            const id = {};\n            id[idPropertyName] = idVal;\n            return id;\n        });\n        // Invoking the setter on the record engages the Ember DS changed attribute logic for models\n        channelRecord.set(IDS, ids);\n    }\n}\n","export default {\n    acdDivisionPresenceProfileToggle: true, // Secondary translation fix for regions | ACE-3661\n    acdHybridToastNoActiveQueue: true, // Partially Enabled | ACE-1440\n    acdNormalizedMessages: true, // ACE-2199\n    acdOutboundWhatsApp: true, // PURE-2802 | ACE-2511\n    acdSecurePause: true, // ACE-2443\n    acdTransferPermissions: true, //PURE-4261\n    'ACT-1205': true, // ACT-1205 Adding Agent Greeting from Agent UI Settings to Preferences\n    'AGORA-137_connections-ui-contentsquare': true,\n    'ATLAS-536_EnableContentSquare': true,\n    auraACWGadgets: true, //AURA-88\n    'comui-disable-legacy-api-url': true,\n    conversationSummary3256: true, // ATEAM-1229\n    digitalFirstPURE2942: true,\n    'EC-760': true,\n    emergencyLocation: true,\n    enableUIAjaxRetryHeader: true,\n    epcDecompPresenceLabel: true,\n    'gcucc-ui-PCUCC-3734': true, // PCUCC-3734\n    'gcucc.ui.useIntegrationPresenceSourceDirectorySearch': true, // PCUCC-1007\n    groupProileNoIndividualsSave: true, // PLUG-188\n    hawkClientScreenShare: true,\n    interactionNameQueueCallingQueue: true, // ACE-1872\n    notificationOutputPicker: true,\n    'PAUI-80.PeopleUiDecomposition': true, // AGORA-446\n    playRecordingFromSelectedOutput: true,\n    'PURE-3256_useConversationDetails': true, // // ATEAM-1229\n    'PURE-5421_CannedResponse_Gadget': true, // PURE-5421\n    'PURE-6186_Scripter_Gadget_GCUI': true, // CC-4815\n    'PURE-7064_search_favorites': true,\n    'PURE3301-dynamicGroups': true,\n    'qm.release.evaluation.assignee': true, // WEM-742\n    'qm.release.evaluation.disputes': true, // WEM-689\n    relateDynamicSchema: true,\n    showVideoInThumbnail: true, // Show video on thumbnail if there is a screen stream, and participant is major, and video is not muted\n    userRecordingDownload: true, // CM-5713: feature toggle for new API to download user recordings for Calls.\n    webrtcClientNetworkProbeAutoAdjust: true,\n    webrtcDefaultDeviceProfile: true, //PURE-5609\n    webrtcDisableDeviceProfileNotifications: true, // PURE-5609\n    webrtcMMSDnsCheck: true,\n    webrtcRelayOnly: true,\n    webrtcTrackBasedActions: true,\n    webUiDarkTheme: true\n} as const;\n","export const imageTypes = [\n    'apng',\n    'avif',\n    'bmp',\n    'cur',\n    'eps',\n    'gif',\n    'ico',\n    'jpeg',\n    'jpg',\n    'png',\n    'svg',\n    'svg+xml',\n    'tif',\n    'tiff',\n    'webp'\n] as const;\nexport type ImageType = (typeof imageTypes)[number];\n\nexport const audioTypes = [\n    'aac',\n    'aif',\n    'aifc',\n    'aiff',\n    'caf',\n    'flac',\n    'm4a',\n    'm4r',\n    'mogg',\n    'mp3',\n    'oga',\n    'ogg',\n    'pcm',\n    'wav',\n    'wave',\n    'wma',\n    'wmf'\n] as const;\nexport type AudioType = (typeof audioTypes)[number];\n\nexport const videoTypes = [\n    '3g2',\n    '3gp',\n    'amv',\n    'asf',\n    'avi',\n    'f4a',\n    'f4b',\n    'f4p',\n    'f4v',\n    'flv',\n    'gifv',\n    'm4p',\n    'm4v',\n    'mkv',\n    'mng',\n    'mod',\n    'mov',\n    'mp2',\n    'mp4',\n    'mpe',\n    'mpeg',\n    'mpg',\n    'mpv',\n    'mxf',\n    'nsv',\n    'ogv',\n    'qt',\n    'rm',\n    'roq',\n    'rrc',\n    'svi',\n    'vob',\n    'webm',\n    'wmv',\n    'yuv'\n] as const;\nexport type VideoType = (typeof videoTypes)[number];\n\nexport const textDocTypes = ['doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'odt', 'txt'] as const;\nexport type TextDocType = (typeof textDocTypes)[number];\n\nexport const pdfTypes = ['pdf'] as const;\nexport type PdfType = (typeof pdfTypes)[number];\n\nexport const powerPointTypes = ['key', 'pptx', 'pptm', 'ppt'] as const;\nexport type PowerPointType = (typeof powerPointTypes)[number];\n\nexport const excelTypes = ['xlsx', 'xls'] as const;\nexport type ExcelType = (typeof excelTypes)[number];\n","import Ember from 'ember';\n\nfunction _isSafeToFocus(selector) {\n    const currentSelectedElement = Ember.$(window.document.activeElement);\n\n    switch (selector) {\n        case '#roster-action-answer-button button':\n            // interaction roster\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.incoming-controls button.answer-call':\n            // active-call-entry\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.answer-call-action-bar button.answer-call':\n            // call toast\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        default:\n            return false;\n    }\n}\n\nexport function doFocus(component, selector) {\n    Ember.run.scheduleOnce('afterRender', component, function () {\n        const target = component.$(selector);\n        if (target) {\n            target.focus();\n        }\n    });\n}\n\nexport function requestFocus(scope = Ember, selector) {\n    let isSafe;\n    try {\n        isSafe = _isSafeToFocus(selector);\n    } catch (e) {\n        isSafe = false;\n    }\n\n    if (isSafe) {\n        Ember.run.next(() => {\n            doFocus(scope, selector);\n        });\n    }\n}\n","import Ember from 'ember';\nconst geolocation = navigator.geolocation;\n\nconst GeolocationUtil = Ember.Object.create({\n    hostedContext: null,\n\n    setContext(context) {\n        this.hostedContext = context;\n    },\n    fetchCurrentPostion() {\n        let context = this.get('hostedContext');\n        if (context !== null && context.isHosted() && context.requiresNativeGeolocation()) {\n            return context.requestDesktopPromise({ cmd: 'getGeolocationPosition' });\n        } else {\n            return new Ember.RSVP.Promise(function (resolve, reject) {\n                geolocation.getCurrentPosition(\n                    position => resolve(position),\n                    error => reject(error)\n                );\n            });\n        }\n    },\n\n    watchPosition(onPositionChangedFn, onErrorFn, options) {\n        return geolocation.watchPosition(onPositionChangedFn, onErrorFn, options);\n    },\n\n    clearWatch(watcher) {\n        geolocation.clearWatch(watcher);\n    },\n\n    isGeolocationAvailable() {\n        return 'geolocation' in navigator;\n    },\n\n    getCurrentPosition(success, failure) {\n        return geolocation.getCurrentPosition(success, failure);\n    }\n});\n\nexport default GeolocationUtil;\n","import request from 'ember-ajax';\n\n// see https://github.com/Giphy/GiphyAPI\n\nclass Giphy {\n    constructor(options) {\n        options = options || {};\n        this.baseUrl = 'https://api.giphy.com/v1/gifs';\n        this.apiKey = options.apiKey || 'fsibTNreYj3Co';\n    }\n\n    search(query, limit, offset) {\n        const url = `${this.baseUrl}/search`;\n        const data = {\n            q: query,\n            api_key: this.apiKey,\n            rating: 'pg',\n            fmt: 'json',\n            limit,\n            offset\n        };\n        return request(url, { data }).then(res => (Array.isArray(res.data) ? res.data : []));\n    }\n\n    random(query) {\n        const url = `${this.baseUrl}/random`;\n        const data = {\n            tag: query,\n            api_key: this.apiKey\n        };\n        return request(url, { data }).then(res => res && res.data);\n    }\n}\n\nexport default new Giphy({});\n","const gsm7Chars = [\n    '@',\n    '£',\n    '$',\n    '¥',\n    'è',\n    'é',\n    'ù',\n    'ì',\n    'ò',\n    'Ç',\n    '\\n',\n    'Ø',\n    'ø',\n    '\\r',\n    'Å',\n    'å',\n    'Δ',\n    '_',\n    'Φ',\n    'Γ',\n    'Λ',\n    'Ω',\n    'Π',\n    'Ψ',\n    'Σ',\n    'Θ',\n    'Ξ',\n    'Æ',\n    'æ',\n    'ß',\n    'É',\n    ' ',\n    '!',\n    '\"',\n    '#',\n    '¤',\n    '%',\n    '&',\n    \"'\",\n    '(',\n    ')',\n    '*',\n    '+',\n    ',',\n    '-',\n    '.',\n    '/',\n    '0',\n    '1',\n    '2',\n    '3',\n    '4',\n    '5',\n    '6',\n    '7',\n    '8',\n    '9',\n    ':',\n    ';',\n    '<',\n    '=',\n    '>',\n    '?',\n    '¡',\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n    'M',\n    'N',\n    'O',\n    'P',\n    'Q',\n    'R',\n    'S',\n    'T',\n    'U',\n    'V',\n    'W',\n    'X',\n    'Y',\n    'Z',\n    'Ä',\n    'Ö',\n    'Ñ',\n    'Ü',\n    '§',\n    '¿',\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n    'p',\n    'q',\n    'r',\n    's',\n    't',\n    'u',\n    'v',\n    'w',\n    'x',\n    'y',\n    'z',\n    'ä',\n    'ö',\n    'ñ',\n    'ü',\n    'à'\n];\nconst gsm7CharsExt = ['\\f', '^', '{', '}', '\\\\', '[', '~', ']', '|', '€'];\n\nexport default { gsm7Chars, gsm7CharsExt };\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { PUBLIC_ENVS } from './net';\n\n//For CEF:\n//_HostedContextFunctions functions:\n// - register(initData)\n// - showNotification(messageData)\n// - setUnreadMessageCount(count)\n// - doTerminateNow()\n\n//The app is considered hosted if it's running in an iframe, -or-. This class helps facilitate communication between\n//the app and its parent.\nvar HostedContext = Ember.Object.extend(Ember.Evented, {\n    applicationService: Ember.inject.service('application'),\n    logger: Ember.inject.service('stash-logger'),\n    applicationController: null,\n\n    _applicationHasFocus: true,\n    _hostType: null, //This determines whether we are actually hosted or not. Possible values: 'CEF', or null\n    _operatingSystem: '', //Mac or Windows\n    _version: '(unknown)', //Desktop application version\n\n    _hostRegion: null,\n    _supportsRegions: false,\n    _supportsUnifiedPreferences: false,\n    _supportsJabra: true,\n    _additionalPreferences: [],\n    _requiresNativeGeolocation: false,\n    runAsMediaHelper: false,\n    previousPresence: null,\n    isScreenLockedOrSleep: false,\n    hasUserAlreadyReturn: false,\n    desktopSleptAt: null,\n\n    init: function () {\n        this._super(...arguments);\n\n        const owner = Ember.getOwner(this);\n        this.set('applicationController', owner.lookup('controller:application'));\n    },\n\n    isHosted: function () {\n        return this._hostType !== null;\n    },\n\n    isHostedProp: Ember.computed(function () {\n        return this.isHosted();\n    }),\n\n    requiresNativeGeolocation: function () {\n        return this._requiresNativeGeolocation;\n    },\n\n    getRegion: function () {\n        return this._hostRegion;\n    },\n\n    supportsRegions: function () {\n        return this._supportsRegions;\n    },\n\n    supportsUnifiedPreferences: function () {\n        return this._supportsUnifiedPreferences;\n    },\n\n    supportsJabra: function () {\n        return this._supportsJabra;\n    },\n\n    isMac: function () {\n        return this._operatingSystem === 'Mac';\n    },\n\n    isWindows: function () {\n        return this._operatingSystem === 'Windows';\n    },\n\n    getAdditionalPreferences: function () {\n        return this._additionalPreferences;\n    },\n\n    doTerminateApplication: function (completion) {\n        this.get('logger').log('in doTerminationApplication with completion: ' + completion);\n        setTimeout(function () {\n            if (completion) {\n                completion();\n            }\n        }, 2000);\n    },\n\n    applicationHasFocus: function () {\n        return window._HostedContextFunctions && window._HostedContextFunctions.doesAppHaveFocus();\n    },\n\n    showNativeNotification: function (data) {\n        window._HostedContextFunctions.showNativeNotification(data);\n    },\n\n    setUnreadMessageCount: function (count) {\n        try {\n            if (this.isHosted()) {\n                window._HostedContextFunctions.setUnreadMessageCount(count);\n            }\n        } catch (e) {\n            this.get('logger').error('Error setting unread message count', { error: e });\n        }\n    },\n\n    //Send a Jabra event to the desktop.\n    //deviceID - ID of the device\n    //event - 'offhook', 'hold', 'mute', ringer'\n    //value - true or false\n    sendJabraEventToDesktop: function (deviceID, event, value) {\n        this.sendEventToDesktop(EVENTS.JABRA_EVENT, {\n            deviceID: deviceID,\n            event: event,\n            value: value\n        });\n    },\n\n    requestJabraDevices: function () {\n        return this.requestDesktopPromise({ cmd: 'requestJabraDevices' });\n    },\n\n    sendEventToDesktop: function (event, data) {\n        try {\n            if (this.isHosted()) {\n                window._HostedContextFunctions.sendEventToDesktop(event, data);\n            }\n        } catch (e) {\n            this.get('logger').error('Error sending event to desktop', { error: e });\n        }\n    },\n\n    getScreenMedia: function (callback) {\n        this.requestDesktopPromise({\n            cmd: 'getUserSelectedScreenMedia'\n        })\n            .then(function (obj) {\n                callback(obj.id);\n            })\n            .catch(function (/*reason*/) {\n                callback(null);\n            });\n    },\n\n    sendRegionToDesktop: function (region) {\n        this._hostRegion = region;\n\n        try {\n            if (this.isHosted()) {\n                let matchedRegion = _.find(PUBLIC_ENVS, { desktopId: region });\n                if (matchedRegion) {\n                    let url = `https://apps.${matchedRegion.envTld}/directory`;\n                    this.get('logger').log('Region: ' + region + ' URL: ' + url);\n                    window._HostedContextFunctions.sendRegionToDesktop(region, url);\n                } else {\n                    this.get('logger').error(`Unable to send region to desktop.  Unknown Region '${region}'`);\n                }\n            }\n        } catch (e) {\n            this.get('logger').error('Error sending region to desktop', { error: e });\n        }\n    },\n\n    getShareableScreens() {\n        return this.requestDesktopPromise({\n            cmd: 'getShareableScreens'\n        });\n    },\n\n    requestDesktopPromise: function (cmd) {\n        return new Ember.RSVP.Promise(function (resolve, reject) {\n            try {\n                var sCmd = JSON.stringify(cmd);\n                window.cefQuery({\n                    request: sCmd,\n                    persistent: false,\n                    onSuccess: function (response) {\n                        try {\n                            var obj = JSON.parse(response);\n                            resolve(obj);\n                        } catch (e) {\n                            resolve({});\n                        }\n                    },\n                    onFailure: function (response) {\n                        reject(response);\n                    }\n                });\n            } catch (e) {\n                this.get('logger').error('Error requesting desktop promise', {\n                    error: e\n                });\n                reject();\n            }\n        });\n    }\n});\n\nexport var EVENTS = {\n    INCOMING_CALL: 'incomingCall',\n    TERMINATED_CALL: 'terminatedCall',\n    MISSED_CALL: 'missedCall',\n    STOPPED_RINGING: 'stoppedRinging',\n    PHONE_CONNECTED: 'phoneConnected',\n    WEBRTC_CONNECTION_INCOMING: 'webrtcConnectionIncoming',\n    WEBRTC_CONNECTION_ANSWERED: 'webrtcConnectionAnswered',\n    WEBRTC_CONNECTION_DECLINED: 'webrtcConnectionDeclined',\n    WEBRTC_CONNECTION_STARTED: 'webrtcConnectionStarted',\n    WEBRTC_CONNECTION_ENDED: 'webrtcConnectionEnded',\n    JABRA_EVENT: 'jabraEvent'\n};\n\nexport default HostedContext;\n","const INSTAGRAM_PROP = {\n    FILE_SIZE: 8,\n    MESSAGE_TYPE: 'instagram',\n    CHARACTER_LIMIT: 1000\n};\n\nexport default INSTAGRAM_PROP;\n","const serverPrefix = 'server_translations';\n\nexport default function missingMessage(key, locales, suppressError) {\n    if (typeof suppressError === 'string') {\n        return suppressError;\n    } else if (!key) {\n        return '';\n    } else if (key.indexOf(serverPrefix) !== -1) {\n        // When a labelKey is typed in, it is user specified and typed in manually.\n        // Show this value rather than the full key if no translation was found.\n        return key.split('_').pop();\n    } else {\n        return key;\n    }\n}\n","export * from 'ember-purecloud-components/utils/jid-helpers';\n","const WHITE_SPACE_KEYCODES = {\n    TAB: 9,\n    ENTER: 13,\n    SPACE: 32\n};\n\nconst WHITE_SPACE_KEYS = {\n    TAB: 'Tab'\n};\n\nconst CAP_ALPHA_KEYCODES = {\n    A: 65,\n    B: 66,\n    C: 67,\n    D: 68,\n    E: 69,\n    F: 70,\n    G: 71,\n    H: 72,\n    I: 73,\n    J: 74,\n    K: 75,\n    L: 76,\n    M: 77,\n    N: 78,\n    O: 79,\n    P: 80,\n    Q: 81,\n    R: 82,\n    S: 83,\n    T: 84,\n    U: 85,\n    V: 86,\n    W: 87,\n    X: 88,\n    Y: 89,\n    Z: 90\n};\n\nconst LOW_ALPHA_KEYCODES = {\n    A: 97,\n    B: 98,\n    C: 99,\n    D: 100,\n    E: 101,\n    F: 102,\n    G: 103,\n    H: 104,\n    I: 105,\n    J: 106,\n    K: 107,\n    L: 108,\n    M: 109,\n    N: 110,\n    O: 111,\n    P: 112,\n    Q: 113,\n    R: 114,\n    S: 115,\n    T: 116,\n    U: 117,\n    V: 118,\n    W: 119,\n    X: 120,\n    Y: 121,\n    Z: 122\n};\n\nconst NUM_KEYCODES = {\n    0: 48,\n    1: 49,\n    2: 50,\n    3: 51,\n    4: 52,\n    5: 53,\n    6: 54,\n    7: 55,\n    8: 56,\n    9: 57\n};\n\nconst NAV_KEYCODES = {\n    LEFT_ARROW: 37,\n    UP_ARROW: 38,\n    RIGHT_ARROW: 39,\n    DOWN_ARROW: 40\n};\n\nconst ESCAPE_KEYCODE = 27;\n\ntype KeyCodeSet = { [x: string]: number };\n\nexport function keyForKeyCode(keyCode: number, object: KeyCodeSet) {\n    let key: string;\n    for (key in object) {\n        if (object.hasOwnProperty(key) && object[key] === keyCode) {\n            return key;\n        }\n    }\n    return null;\n}\n\nexport function isNumber(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NUM_KEYCODES[0] && keyCode <= NUM_KEYCODES[9];\n}\n\nexport function isAlphabet(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        (keyCode >= CAP_ALPHA_KEYCODES.A && keyCode <= CAP_ALPHA_KEYCODES.Z) ||\n        (keyCode >= LOW_ALPHA_KEYCODES.A && keyCode <= LOW_ALPHA_KEYCODES.Z)\n    );\n}\n\nexport function isNavigation(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NAV_KEYCODES.LEFT_ARROW && keyCode <= NAV_KEYCODES.DOWN_ARROW;\n}\n\nexport function isWhitespace(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        keyCode === WHITE_SPACE_KEYCODES.SPACE ||\n        keyCode === WHITE_SPACE_KEYCODES.ENTER ||\n        keyCode === WHITE_SPACE_KEYCODES.TAB\n    );\n}\n\nexport function isEscape(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode === ESCAPE_KEYCODE;\n}\n\nexport function isTab(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    const key = evt.key;\n    return keyCode === WHITE_SPACE_KEYCODES.TAB || key === WHITE_SPACE_KEYS.TAB;\n}\n\nexport function eventToString(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    if (isAlphabet(evt) || isNumber(evt)) {\n        return String.fromCharCode(keyCode);\n    } else if (isNavigation(evt)) {\n        return keyForKeyCode(keyCode, NAV_KEYCODES);\n    } else if (isWhitespace(evt)) {\n        return keyForKeyCode(keyCode, WHITE_SPACE_KEYCODES);\n    } else if (isEscape(evt)) {\n        return 'ESCAPE';\n    }\n\n    return '' + keyCode;\n}\n\nexport default {\n    isAlphabet,\n    isEscape,\n    isNavigation,\n    isNumber,\n    isTab,\n    isWhitespace,\n    eventToString\n};\n","define(\"connections-ui/utils/logger\", [\"exports\", \"ember-purecloud-components/utils/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst hljs = window.hljs;\nhljs.configure({\n    languages: [\n        'bash',\n        'clojure',\n        'coffeescript',\n        'cpp',\n        'cs',\n        'css',\n        'elm',\n        'go',\n        'xml',\n        'handlebars',\n        'http',\n        'ini',\n        'java',\n        'javascript',\n        'json',\n        'makefile',\n        'objectivec',\n        'python',\n        'ruby',\n        'rust',\n        'sql',\n        'swift',\n        'typescript'\n    ]\n});\n\nconst markdown = window.markdownit;\n\nconst md = markdown({\n    html: false,\n    linkify: true,\n    typographer: false,\n    highlight(code, lang) {\n        if (lang === 'no-highlight') {\n            return Ember.Handlebars.Utils.escapeExpression(code);\n        } else if (lang) {\n            try {\n                return hljs.highlight(lang, code).value;\n            } catch (e) {\n                return Ember.Handlebars.Utils.escapeExpression(code);\n            }\n        } else {\n            return hljs.highlightAuto(code).value;\n        }\n    }\n});\n\nfunction isMailTo(href) {\n    return href.indexOf('mailto:') === 0;\n}\n\nfunction initializeMarkdownRendering(isApplicationRoute) {\n    const defaultRender =\n        md.renderer.rules.link_open ||\n        function (tokens, idx, options, env, self) {\n            return self.renderToken(tokens, idx, options);\n        };\n\n    md.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n        const token = tokens[idx];\n        const targetIndex = token.attrIndex('href');\n        if (targetIndex !== -1) {\n            let href = token.attrGet('href');\n            if (!isApplicationRoute(href) && !isMailTo(href)) {\n                token.attrPush(['target', '_blank']);\n                token.attrPush(['rel', 'noopener noreferrer']);\n\n                const pattern = /:\\/\\//i;\n                if (!pattern.test(href)) {\n                    token.attrSet('href', `http://${href}`);\n                }\n            }\n        }\n\n        // pass token to default renderer.\n        return defaultRender(tokens, idx, options, env, self);\n    };\n}\n\nfunction markdownToHtml(markdown) {\n    return markdown ? md.render(markdown) : '';\n}\n\nexport { markdownToHtml, initializeMarkdownRendering };\n","import _ from 'lodash';\n\nconst LAYOUTS = {};\n\nfunction registerLayout(layoutId, layout) {\n    deregisterLayout(layoutId);\n    LAYOUTS[layoutId] = layout;\n}\n\nfunction deregisterLayout(layoutId) {\n    LAYOUTS[layoutId] = null;\n    delete LAYOUTS[layoutId];\n}\n\nfunction rerunLayouts() {\n    _.forOwn(LAYOUTS, layout => {\n        if (layout && layout.rerun) {\n            layout.rerun();\n        }\n    });\n}\n\nexport { registerLayout, deregisterLayout, rerunLayouts };\n","/* global intlTelInputUtils */\n\nimport { getMessengerType, getDisplayableName, getIdentifier } from './external-contact-messaging';\n\n/**\n * A list of all the available messaging channel types in the external contact model\n */\n\nfunction getNameFrom(interaction) {\n    return interaction.get('participantForCustomer.messages.firstObject.fromAddress.name');\n}\n\nfunction getTwitterDisplayNameFrom(interaction) {\n    return (\n        getDisplayableName(interaction) ||\n        interaction.get('participantForCustomer.messages.firstObject.fromAddress.name')\n    );\n}\n\nfunction getRawAddress(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressRaw');\n}\n\nexport function getDisplayOrScreenName(interaction) {\n    if (!interaction) {\n        return null;\n    }\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && getNameFrom(interaction);\n}\n\n// Returns an object representing a channel property of an Ember DS contact model instance.\n// E.g. messagingChannelTypes[0].modelProperties(...)\nfunction getModelProperties(channelId, idProperties) {\n    const properties = {};\n    properties[channelId] = idProperties;\n    return properties;\n}\n\nexport function messagingChannelTypeFor(messageType) {\n    return messagingChannelTypes.find(messagingChannelType => messagingChannelType.type === messageType);\n}\n\nexport function modelKeyFor(messageType) {\n    const messagingChannelType = messagingChannelTypeFor(messageType);\n    return messagingChannelType ? messagingChannelType.modelKey : null;\n}\n\n// New message channel types must expose a `modelProperties` method that\n// creates an object whose structure is the same as that for that message channel's identifier\n// field in a contact model object.\n//\n// For example, a contact model instance with a Twitter channel looks like this:\n//      {\n//          id: 'df445345abdc',\n//          firstName: 'Elon',\n//          lastName: 'Musk',\n//          address: {\n//                      ...\n//                   }\n//          ...\n//          twitterId: {\n//              id: 'df445345abdc',\n//              name: 'Elon Musk'\n//              screenName: '@elonmusk\n//          }\n//          ...\n//      }\n//\n//     Thus,\n//          messagingChannelTypes.modelProperties('df445345abdc', 'Elon Musk', '@elonmusk')\n//     for a Twitter channel will return\n//          {\n//              twitterId: {\n//                  id: 'df445345abdc',\n//                  name: 'Elon Musk'\n//                  screenName: '@elonmusk\n//             }\n//          }\n//\n\n// The contacts-service returns a displayable phone number, while Smooch may send\n// an e164.  Use this to hopefully match them up.\nexport function getDisplayablePhoneNumberFrom(phoneNumber) {\n    // Assume a US country code;\n    // obviously a short-term kludge that will be unnecessary when the real bug is (hopefully quickly) fixed!\n    return intlTelInputUtils.formatNumber(phoneNumber, 'US', intlTelInputUtils.numberFormat.INTERNATIONAL);\n}\n\nfunction _getChannelPropertiesFromInteraction(interaction, channelType) {\n    const messagingChannelType = messagingChannelTypeFor(channelType);\n\n    const id = getIdentifier(interaction);\n    const displayableName = getDisplayableName(interaction);\n    const name = getDisplayableName(interaction);\n    return messagingChannelType.modelProperties(id, name, displayableName);\n}\n\n// The array of objects below represent the various inbound messaging channels.\n// The properties and functions exposed by message channel types are used for display purposes and other things.\n//\n//\n// For the hasCrucialChannelInfo functions: they should return true iff their condition holds, in service of\n// https://inindca.atlassian.net/browse/RELATE-2536: WhatsApp ACD: Allow the ACD UI to tolerate missing inbound message channel information\n//\n// \"The ACD UI should be aware of and behave tolerably in response to Smooch's updating their messaging protocol and payload, and the consequential\n// implication for possibly missing channel property values (e.g. a missing Twitter ID or handle).\"\n//\n// Although missing information should happen very rarely, the UI still needs to cope. The coping strategy is the same for any message type.\n// There are two cases:\n//\n// 1) The agent is creating a new external contact for an inbound message. The UI should not automatically populate any messaging fields.\n// Whatever info the agent supplies for the contact should be accepted and saved.\n//\n// 2) The agent has an existing contact to associate with the message. Because the message may be missing crucial information, the contact\n// is not automatically updated with the new/incomplete message channel information.\nexport const messagingChannelTypes = [\n    {\n        modelKey: 'twitterId', // The Ember DS externalcontacts/contact model's\n        channelId: 'id',\n        type: 'twitter',\n        idPropertyName: null,\n        modelProperties: function (id, name, twitterHandle) {\n            return getModelProperties(this.modelKey, {\n                id: id,\n                name: name,\n                screenName: twitterHandle\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('twitterId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'twitter'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('twitterId.id')],\n        getIdFrom: id => id,\n        display: channelId => (channelId ? (channelId.screenName ? channelId.screenName : '') : ''),\n        present: channelId => !!(channelId && channelId.screenName),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.id && channelId.screenName),\n        displayNameFrom: interaction => getTwitterDisplayNameFrom(interaction),\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null or a single-element string array with a Twitter ID\n        svgIconKey: '#icon-twitter-white-on-blue'\n    },\n    {\n        modelKey: 'lineId',\n        channelId: 'ids',\n        type: 'line',\n        idPropertyName: 'userId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ userId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('lineId')],\n        getChannelPropertiesFromInteraction: interaction => _getChannelPropertiesFromInteraction(interaction, 'line'),\n        getIdsFromExternalContact: externalContact => externalContact.get('lineId.ids'),\n        getIdFrom: userId => {\n            return {\n                userId: userId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.userId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(lineId => lineId.userId !== id),\n        svgIconKey: '#icon-line-messenger'\n    },\n    {\n        modelKey: 'facebookId',\n        channelId: 'ids',\n        type: 'facebook',\n        idPropertyName: 'scopedId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ scopedId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('facebookId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'facebook'),\n        getIdsFromExternalContact: externalContact => externalContact.get('facebookId.ids'),\n        getIdFrom: scopedId => {\n            return {\n                scopedId: scopedId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.scopedId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(facebookId => facebookId.scopedId !== id),\n        svgIconKey: '#icon-facebook-messenger'\n    },\n    {\n        modelKey: 'whatsAppId',\n        channelId: 'phoneNumber',\n        nestedIdProperty: 'display',\n        type: 'whatsapp',\n        idPropertyName: null,\n        modelProperties: function (phoneNumber, displayName) {\n            return getModelProperties(this.modelKey, {\n                displayName: displayName,\n                phoneNumber: {\n                    display: getDisplayablePhoneNumberFrom(phoneNumber)\n                }\n            });\n        },\n        getReverseWhitepagesLookupValue: interaction => {\n            const address = getRawAddress(interaction);\n            if (address && /^\\+?[\\d]+$/.test(address)) {\n                return /^\\+/gi.test(address) ? address : `+${address}`;\n            }\n            return address;\n        },\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('whatsAppId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'whatsapp'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('whatsAppId.phoneNumber')],\n        getIdFrom: phoneNumber => {\n            return {\n                display: getDisplayablePhoneNumberFrom(phoneNumber)\n            };\n        },\n        display: channelId =>\n            channelId.displayName\n                ? channelId.displayName\n                : channelId.phoneNumber.display\n                ? channelId.phoneNumber.display\n                : channelId.phoneNumber.e164\n                ? channelId.phoneNumber.e164\n                : '',\n        present: channelId => !!(channelId && channelId.phoneNumber),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.phoneNumber && channelId.phoneNumber.display),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n\n        // These two value getters are used by the confirmation-prompt component to\n        // get changes to a whatpsapp channel's displayed phone number in order to prompt\n        // the agent properly.\n        oldIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][0].display,\n        newIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][1].display,\n\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null, or a single-element string array containing an e164 phone number; id is an e164 number\n        svgIconKey: '#icon-whatsapp'\n    }\n];\n","// eslint-disable-next-line no-control-regex\nconst OnlyLatinChars = /^[\\u0000-\\u024F\\s]+$/i;\n\n/**\n * Determines if the provided name can have initials generated from it. Not all languages support\n * the ability to reduce a name to initials, such as Latin.\n *\n * @note\n * The currently unsupported characters are:\n * - Latin\n *\n * @param name the name to test with\n * @returns boolean value depicting if initials can be generated\n */\nexport function initialsSupported(name: string) {\n    return OnlyLatinChars.test(name);\n}\n\n/**\n * Generates the initials from a given name. If initials are not supported based on the characters of\n * the name provided then `null` will be returned.\n *\n * @note\n * This will adhere to a name string that has been formatted by a comma such as \"Last, First\" and will give\n * the correct initials of \"FL\" (for that instance).\n *\n * @param name the name of the initials in which to generate from\n * @returns the generated initials from the provided name, if none could be generated then `null` is returned\n */\nexport function getInitials(name: string) {\n    if (!initialsSupported(name)) return null;\n\n    const commaIndex = name.indexOf(',') > -1;\n    const spaceIndex = name.indexOf(' ') > -1;\n    const left = name[0].toUpperCase();\n    const right = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n    if (commaIndex) {\n        return right + left;\n    } else if (!spaceIndex) {\n        return left;\n    }\n    return left + right;\n}\n","import serviceDiscovery from '@genesys/service-discovery-web-internal';\n\nconst VALID_LOCAL_HOSTNAMES = ['localhost', 'localhost.mypurecloud.com'];\n\n// Change me if you want to proxy locally to a higher environment.\nconst TARGET_ENV = 'dev';\n\nconst ENV_TRANSITIONS = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'pca'\n    // DO NOT ADD NEW ENVS HERE\n    // New envs will be defaulted to their true value in service-discovery-web\n};\n\nconst DEPLOYMENT_ID_MAP = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'us',\n    'prod-apne1': 'jp',\n    'prod-apne2': 'apne2',\n    'prod-aps1': 'aps1',\n    'prod-apse2': 'au',\n    'prod-cac1': 'cac1',\n    'prod-euc1': 'de',\n    'prod-euw1': 'ie',\n    'prod-euw2': 'euw2',\n    'prod-usw2': 'usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to their name in service-discovery-web\n};\n\nconst REGION_TRANSLATION_KEY_MAP = {\n    prod: 'components.region.global',\n    'prod-apne1': 'components.region.japan',\n    'prod-apne2': 'components.region.apne2',\n    'prod-aps1': 'components.region.aps1',\n    'prod-apse2': 'components.region.australia',\n    'prod-cac1': 'components.region.cac1',\n    'prod-euc1': 'components.region.germany',\n    'prod-euw1': 'components.region.ireland',\n    'prod-euw2': 'components.region.euw2',\n    'prod-usw2': 'components.region.usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to 'name': `components.region.${name}`\n};\n\nconst getPcApplicationsSubdomain = (_window = window) => {\n    // window passed in for testing\n    const subdomain = _window.location.hostname.split('.')[0];\n    return subdomain.toLowerCase() === 'app' ? 'app' : 'apps';\n};\n\nconst getEnv = ({ env }) => ENV_TRANSITIONS[env] || env;\nconst getRegion = ({ name, region }) => DEPLOYMENT_ID_MAP[name] || region;\nconst getDeploymentId = ({ name }) => DEPLOYMENT_ID_MAP[name] || name;\nconst getRegionTranslationKey = ({ name }) => REGION_TRANSLATION_KEY_MAP[name] || `components.region.${name}`;\nconst getDesktopId = environment => {\n    const deploymentId = getDeploymentId(environment);\n    return deploymentId === 'us' ? 'global' : deploymentId;\n};\n\nconst publicEnvFilter = { env: ['prod', 'fedramp'], status: ['beta', 'stable'] };\nexport const PUBLIC_ENVS = serviceDiscovery.getEnvironments(publicEnvFilter).map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName,\n    envStatus: environment.status\n}));\n\nexport const STABLE_PUBLIC_ENVS = serviceDiscovery.getEnvironments().map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName\n}));\n\nexport const parseRuntimeCustom = (url = window.location.href) => {\n    url = url.replace(/connections-ui/, TARGET_ENV);\n    return (\n        serviceDiscovery.parseRuntimeFromLocalPath(VALID_LOCAL_HOSTNAMES)(url) ||\n        serviceDiscovery.parseDeployedRuntime(url)\n    );\n};\n\nexport const getEnvDetails = (url = window.location.href) => {\n    if (!url || typeof url !== 'string') throw new Error('url must be a non-empty string');\n    const runtime = parseRuntimeCustom(url);\n    if (!runtime) throw new Error(`'${url}' is not a valid, known Genesys Cloud app location`);\n    return {\n        runtime, // Attach the service-discovery-web runtime\n        local: runtime.local,\n        envTld: runtime.local ? new URL(url).hostname : runtime.currentDomainName,\n        env: getEnv(runtime),\n        region: ['prod', 'fedramp'].includes(runtime.env) ? getRegion(runtime) : null\n    };\n};\n\nexport const getEnvCookieDomain = (hostname = window.location.hostname) => {\n    if (!hostname || typeof hostname !== 'string') {\n        throw new Error('hostname must be a non-empty string');\n    }\n    // Handle the local special cases\n    if (hostname === 'localhost') return '';\n    if (hostname === 'localhost.mypurecloud.com') return `.localhost.mypurecloud.com`;\n\n    const result = serviceDiscovery.parseDeployedRuntime(`https://${hostname}`);\n    if (!result) throw new Error(`'${hostname}' is not a valid, known Genesys Cloud app location`);\n    return `.${result.currentDomainName}`;\n};\n\nexport const isExternalDomain = url => !serviceDiscovery.isKnown(url, {});\n\nexport const getCurrentWindowOrigin = () => window.location.origin;\n\nexport default {\n    PUBLIC_ENVS,\n    STABLE_PUBLIC_ENVS,\n    getPcApplicationsSubdomain,\n    getEnvDetails,\n    getEnvCookieDomain,\n    isExternalDomain,\n    getCurrentWindowOrigin\n};\n","define(\"connections-ui/utils/newrelic-legacy\", [\"exports\", \"ember-purecloud-components/utils/newrelic-legacy\"], function (_exports, _newrelicLegacy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _newrelicLegacy.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\n/*\n * This is a simple wrapper for New Relic's browser agent.  The goal is to no-op\n * when the browser agent is not available on the page (due to adblockers,\n * unit-tests, etc).\n */\n\nfunction addPageAction(actionName: string, attributes?: null | Record<string, any>) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'addPageAction' in window.newrelic &&\n        typeof window.newrelic.addPageAction === 'function'\n    ) {\n        if (typeof actionName !== 'string' || !actionName.trim()) {\n            //actionName cannot be an empty string\n            Ember.Logger.error('Invalid actionName for addPageAction ->', {\n                remoteData: {\n                    actionName,\n                    actionNameType: typeof actionName\n                }\n            });\n            return;\n        }\n        if (attributes !== undefined && attributes !== null) {\n            // if not null and not undefined, attributes can be null/undefined\n            if (typeof attributes !== 'object' || Array.isArray(attributes)) {\n                Ember.Logger.error('Invalid attributes for addPageAction ->', {\n                    remoteData: {\n                        actionName,\n                        attrType: typeof attributes\n                    }\n                });\n                return;\n            } else {\n                const reservedKeys = ['accountId', 'timestamp', 'appId'];\n                attributes = Object.fromEntries(\n                    Object.entries(attributes)\n                        .map<[string, any] | null>(([key, value]) => {\n                            if (reservedKeys.includes(key)) {\n                                Ember.Logger.warn('Invalid reserved keys for addPageAction ->', {\n                                    remoteData: {\n                                        actionName,\n                                        attrKey: key\n                                    }\n                                });\n                                return null;\n                            }\n                            return [key, value];\n                        })\n                        .filter((curr): curr is [string, any] => {\n                            return !!curr;\n                        })\n                );\n            }\n        }\n        window.newrelic.addPageAction(actionName, attributes);\n    }\n}\n\nfunction setCustomAttribute(key: string, value: string | number | null | boolean, persist?: boolean) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'setCustomAttribute' in window.newrelic &&\n        typeof window.newrelic.setCustomAttribute === 'function'\n    ) {\n        if (typeof key !== 'string') {\n            Ember.Logger.error('Invalid key for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    keyType: typeof key\n                }\n            });\n            return;\n        }\n        if (value !== null && !['string', 'number', 'boolean'].includes(typeof value)) {\n            Ember.Logger.error('Invalid value for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    valueType: typeof value\n                }\n            });\n            return;\n        }\n        if (typeof persist !== 'undefined' && typeof persist !== 'boolean') {\n            Ember.Logger.error('Invalid persist for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    persistType: typeof persist\n                }\n            });\n            return;\n        }\n        window.newrelic.setCustomAttribute(key, value, persist);\n    }\n}\n\nexport { addPageAction, setCustomAttribute };\n","import Ember from 'ember';\nimport moment from './dates';\n\nconst { typeOf, Service, Application, get } = Ember;\n\n/**\n * @callback extractRawDataKeyFilter\n * @param {Array.<string>} path - An array of the ancesteral keys of this key. Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be empty for root props/indices.\n * @param {string} key The current key to evaluate; Array indices will be converted to strings\n * @returns {boolean} true if the key and its associated value should be included; false to exclude.\n *\n * @callback extractRawDataValueFilter\n * @param {Array.<string>} path - An array of the keys down to the current value.  Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be of length 1 for root values.\n * @param {*} value The current value to evaluate\n * @returns {boolean} true if the value and it's associated key should be included; false to exclude.\n */\n\nconst ALLOWED_VALUE_TYPES = [\n    'null',\n    'undefined',\n    'regexp',\n    'date',\n    'moment',\n    'boolean',\n    'number',\n    'string',\n    'array',\n    'object',\n    'instance'\n];\n\n/**\n * Extract raw data from the provided input. Practically, this can be\n * used for extracting the raw data from Ember Object instances with some gotchas:\n *\n * * Non-string keys are NOT included\n * * All non-enumerable properties are NOT included\n *   * This implicitly excludes prototype properties\n * * Certain value types are NOT included\n *   * symbol, filelist, class, error\n *   * function (computeds, observers, etc.)\n *\n * Other important items to note:\n *\n * * If any object (other than Date or moment instances) in the hierarchy implements toJSON, it will be called with the current key and the result will then be processed through the depth check, key filters, and value filters.\n * * Cycles are replaced with [Cycle] and are more likely if services or the container are referenced (Best Practice: Use the defaults to filter underscore keys and Ember Services)\n * * Depth of objects will affect efficiency (Best Practice: Remove unnecessary keys/values with filters and built-in options)\n * * Objects and arrays will be truncated with '[Object]' and '[Array(<length>)]' if the maxDepth is exceeded.\n *\n * @param {null|undefined|Array|object} input - The object to extract\n * @param {Object} options - Options for parsing the object\n * @param {number?} options.maxDepth - An integer indicating the max allowed traversal depth.  Once reached, Objects and Arrays will be replaced with '[Object]' and '[Array(<length>)]' respectively. Root properties considered at depth 1.  Defaults to no max depth.\n * @param {boolean?} options.excludeUnderscoreKeys [true] - if keys starting with _ should be excluded; defaults to true\n * @param {boolean?} options.excludeEmberServices [true] - if Ember Service values should be excluded; defaults to true\n * @param {extractRawDataKeyFilter?} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {extractRawDataValueFilter?} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @throws Error if the provided input is not undefined, null, a custom object, an Ember instance, or an array\n * @throws Error if the provided input cannot be extracted.  This could occur because of excessive depth, invalid input parameter or object structure, a faulty toJSON nested implementation, etc.\n * @throws Error if any options are invalid\n * @returns {null|undefined|Array|object} output\n */\nexport function extractRawData(input, options = {}) {\n    let safeOptions = {\n        maxDepth: Number.MAX_SAFE_INTEGER,\n        excludeUnderscoreKeys: true,\n        excludeEmberServices: true,\n        excludeEmberApplications: true\n    };\n\n    if (typeOf(options) !== 'object') {\n        throw new Error('options can only be an object if specified');\n    } else {\n        if (Object.prototype.hasOwnProperty.call(options, 'maxDepth')) {\n            if (typeOf(options.maxDepth) === 'number' && options.maxDepth < Number.MAX_SAFE_INTEGER) {\n                safeOptions.maxDepth = Math.floor(options.maxDepth);\n            } else {\n                throw new Error('maxDepth must be a number less than Number.MAX_SAFE_INTEGER if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'keyFilter')) {\n            if (typeof options.keyFilter === 'function') {\n                safeOptions.keyFilter = options.keyFilter;\n            } else {\n                throw new Error('keyFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'valueFilter')) {\n            if (typeof options.valueFilter === 'function') {\n                safeOptions.valueFilter = options.valueFilter;\n            } else {\n                throw new Error('valueFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeUnderscoreKeys')) {\n            if (typeOf(options.excludeUnderscoreKeys) === 'boolean') {\n                safeOptions.excludeUnderscoreKeys = options.excludeUnderscoreKeys.valueOf();\n            } else {\n                throw new Error('excludeUnderscoreKeys must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberServices')) {\n            if (typeOf(options.excludeEmberServices) === 'boolean') {\n                safeOptions.excludeEmberServices = options.excludeEmberServices.valueOf();\n            } else {\n                throw new Error('excludeEmberServices must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberApplications')) {\n            if (typeOf(options.excludeEmberApplications) === 'boolean') {\n                safeOptions.excludeEmberApplications = options.excludeEmberApplications;\n            } else {\n                throw new Error('excludeEmberApplications must be a boolean if specified');\n            }\n        }\n    }\n\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined'].indexOf(inputType) >= 0) {\n        return input;\n    } else if (['array', 'object', 'instance'].indexOf(inputType) >= 0) {\n        return _extractRawDataHelper(null, input, safeOptions);\n    } else {\n        throw new Error(\n            'Input must be undefined, null, a custom object (not date, moment, regexp, filelist, error, etc), an Ember Instance, or an array'\n        );\n    }\n}\n\n/**\n * Recursive raw data extraction util.\n *\n * An item of the stack used to track history in traversing a nested array/object.\n * @typedef {Object} ContextStackItem\n * @property {array|object} scope - The parent object or array of the specified property\n * @property {string} propertyName - The name of the property (or index for arrays)\n *\n * A stack used track history while traversing a nested array/object.\n * @typedef {Array.<ContextStackItem>} ContextStack\n *\n * @param {ContextStack} contextStack The stack representing the lineage of the input parameter.  If null, input is considered the root input to extract.\n * @param {*} input The current object to extract\n * @param {*} options Type-safe and valid extraction options\n * @returns {Object|string|null} raw data representation of input\n */\nfunction _extractRawDataHelper(contextStack, input, options) {\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined', 'regexp', 'date', 'moment'].indexOf(inputType) >= 0) {\n        return input;\n    }\n\n    if (['boolean', 'number', 'string'].indexOf(inputType) >= 0) {\n        if (typeof input.valueOf === 'function') {\n            return input.valueOf();\n        }\n\n        return input;\n    }\n\n    // Return null for all other cases: 'function', 'symbol', 'filelist', 'class', 'error'\n    if (['array', 'object', 'instance'].indexOf(inputType) < 0) {\n        return null;\n    }\n\n    // Found an array, object, or instance that may need to be recursed\n\n    // Check for cycles before decending\n    if (contextStack) {\n        let found = contextStack.find(currStackItem => currStackItem.scope === input);\n        if (found) {\n            return '[Cycle]';\n        }\n    }\n\n    // Check maxDepth before decending\n    let currLevel = contextStack ? contextStack.length : 0;\n\n    if (currLevel + 1 > options.maxDepth) {\n        if (inputType === 'array') {\n            return `[Array(${input.length})]`;\n        } else {\n            return '[Object]';\n        }\n    }\n\n    // Safe to recurse sub-object or array\n\n    if (inputType === 'array') {\n        return input.reduce((result, currItem, currIndex) => {\n            let currStack = buildNewContextStack(contextStack, input, currIndex.toString());\n            if (isAllowed(currStack, currItem, options)) {\n                result.push(_extractRawDataHelper(currStack, currItem, options));\n            }\n\n            return result;\n        }, []);\n    } else {\n        if (typeof input.toJSON === 'function') {\n            try {\n                let customJsonValue = input.toJSON(\n                    (contextStack && contextStack[contextStack.length - 1].propertyName) || ''\n                );\n\n                // Process the custom json value back through the _extractRawDataHelper to process filters, rules, and depth checks (max depth, fitlers, etc.)\n                // The original stack should be kept\n                return _extractRawDataHelper(contextStack, customJsonValue, options);\n            } catch (e) {\n                let wrappedJsonError = new Error('Failed to marshal nested toJSON representation');\n                wrappedJsonError.baseError = e;\n                throw wrappedJsonError;\n            }\n        }\n\n        // iterate on props\n        return Object.keys(input).reduce((acc, currKey) => {\n            let currValue = input[currKey];\n\n            let currStack = buildNewContextStack(contextStack, input, currKey);\n            if (!isAllowed(currStack, currValue, options)) {\n                return acc;\n            }\n\n            acc[currKey] = _extractRawDataHelper(currStack, input[currKey], options);\n\n            return acc;\n        }, {});\n    }\n}\n\n/**\n * Assesses if provided stack (containing the implicit curr key) and value pass various filters to be\n * included in the extracted object.\n *\n * @param {ContextStack} contextStack The historical stack from the root down to the current key\n * @param {*} value The value to check\n * @param {object} options The configurable filtering options (assumed to be valid)\n * @param {?boolean} options.excludeUnderscoreKeys [false] - if keys starting with _ should be excluded\n * @param {?boolean} options.excludeEmberServices [false] - if Ember Service values should be excluded\n * @param {?extractRawDataKeyFilter} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {?extractRawDataValueFilter} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will includ the key/value pair, false will exclude\n */\nfunction isAllowed(contextStack, value, options) {\n    let key = contextStack[contextStack.length - 1].propertyName;\n    let path = contextStack.slice(0, -1).map(curr => curr.propertyName);\n\n    // Check Filters\n    if (key) {\n        if (myTypeOf(key) !== 'string') {\n            return false;\n        }\n\n        if (options.excludeUnderscoreKeys && key.charAt(0) === '_') {\n            return false;\n        }\n\n        let keyFilter = options.keyFilter || null;\n        if (keyFilter && !keyFilter(path, key)) {\n            return false;\n        }\n    }\n\n    let valueType = myTypeOf(value);\n    if (ALLOWED_VALUE_TYPES.indexOf(valueType) < 0) {\n        return false;\n    }\n\n    if (options.excludeEmberServices && valueType === 'instance' && value instanceof Service) {\n        return false;\n    }\n\n    if (options.excludeEmberApplications && valueType === 'instance' && value instanceof Application) {\n        return false;\n    }\n\n    let valueFilter = options.valueFilter || null;\n    if (valueFilter && !valueFilter([...path, key], value)) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction buildNewContextStack(currStack, scope, propertyName) {\n    let newStackItem = {\n        scope,\n        propertyName\n    };\n\n    if (currStack) {\n        return [...currStack, newStackItem];\n    } else {\n        return [newStackItem];\n    }\n}\n\nfunction myTypeOf(value) {\n    if (typeof value === 'symbol') {\n        return 'symbol';\n    }\n\n    if (value instanceof moment) {\n        return 'moment';\n    }\n\n    return typeOf(value);\n}\n\n/**\n * Utility to determine if object is destroyed\n * or being destroyed.\n * @param obj - Ember object to check\n * @returns boolean\n */\nexport function isDestroyed(obj) {\n    return get(obj, 'isDestroyed') || get(obj, 'isDestroying');\n}\n\nexport default {\n    extractRawData\n};\n","/**\n * A common regex for many different number formats. Includes the following and more:\n *\n * 18005551234\n * 1 800 555 1234\n * +1 800 555-1234\n * +86 800 555 1234\n * 1-800-555-1234\n * 1 (800) 555-1234\n * (800)555-1234\n * (800) 555-1234\n * (800)5551234\n * 800-555-1234\n * 800.555.1234\n * 800 555 1234x5678\n * 8005551234 x5678\n * 1    800    555-1234\n * 1----800----555-1234\n */\nconst PHONE_NUMBER_REGEX = /^\\s*(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})[-. )]*(\\d{3})[-. ]*(\\d{4})(?: *x(\\d+))?\\s*$/;\n\n/**\n * Tests the value provided against a phone number regex to determine if the number is valid.\n * @param value phone number to test against\n * @returns boolean depicting whether or not the number provided is valid\n */\nexport function isValidPhoneNumber(value: string): boolean {\n    return value ? PHONE_NUMBER_REGEX.test(value.trim()) : false;\n}\n","import type { Models } from 'purecloud-platform-client-internal-v2';\n\nexport function activityCounter(\n    contactCenter: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number,\n    enterprise: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number\n): number {\n    let contactCenterCount = 0;\n    let enterpriseCount = 0;\n\n    if (typeof contactCenter === 'number') {\n        contactCenterCount = contactCenter;\n    } else if (contactCenter && contactCenter.active) {\n        contactCenterCount = contactCenter.active;\n    }\n\n    if (typeof enterprise === 'number') {\n        enterpriseCount = enterprise;\n    } else if(enterprise && enterprise.active){\n        enterpriseCount = enterprise.active;\n    }\n\n    return contactCenterCount + enterpriseCount;\n}\n","/**\n * Checks if the presence source is a default presence source.\n * @param {string} source the presence source to check\n * @param {boolean} useDefaultName should we use 'default' as a presence source\n * @returns\n */\nexport function isDefaultPresence(source) {\n    // we will want to switch completely to 'default'\n    // as the only default presence source but will be blocked until\n    // the Presence Service is only returning 'default'.\n    return isPurecloudSource(source) || source === 'default';\n}\n/**\n * Checks if the presence source is PURECLOUD.\n * @param {string} source the presence source to check\n * @returns\n */\nexport function isPurecloudSource(source) {\n    return source && source.toLowerCase() === 'purecloud';\n}\n","export * from 'ember-purecloud-components/utils/presence';\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nfunction tap(proxy, promise) {\n    Ember.set(proxy, 'isFulfilled', false);\n    Ember.set(proxy, 'isRejected', false);\n\n    return promise.then(\n        function (result) {\n            var payload;\n            var content = result;\n            if (result && typeof result === 'object') {\n                content = result.collection;\n                payload = result.payload;\n            }\n\n            Ember.set(proxy, 'isFulfilled', true);\n            Ember.set(proxy, 'content', content);\n\n            Ember.set(proxy, 'content._payload', payload);\n            Ember.set(proxy, '_payload', payload);\n\n            return content;\n        },\n        function (reason) {\n            Ember.set(proxy, 'isRejected', true);\n            Ember.set(proxy, 'reason', reason);\n            throw reason;\n        },\n        'Ember: PromiseProxy'\n    );\n}\n\nexport default DS.PromiseArray.extend({\n    _payload: null,\n\n    promise: Ember.computed({\n        get() {\n            throw Ember.Logger.error(\"PromiseProxy's promise must be set\");\n        },\n\n        set(key, promise) {\n            return tap(this, promise);\n        }\n    })\n});\n","import _ from 'lodash';\n\nexport function parseQueryParams() {\n    var obj = {};\n    var params = window.location.search.slice(1).split('&');\n\n    _.each(params, function (param) {\n        const split = param.split('=');\n        const key = decodeURIComponent(split[0]);\n        const value = split.length > 1 ? decodeURIComponent(split[1]) : '';\n        obj[key] = value;\n    });\n\n    return obj;\n}\n","import Ember from 'ember';\nimport { v4 as uuid } from 'uuid';\n\nconst { computed, typeOf } = Ember;\nconst MSG_NAMESPACE = 'QueuedProcessingChain';\n\n/**\n * Queues events by queueId and processes said events serially through a processor chain.\n * Events across queues will be processed \"concurrently\" via javascript's event loop.\n *\n * Chain:\n * A sequence of 1 or more processors which run serially for an event.\n *\n * Processors:\n * A synchronous or async function that performs work.  Regardless of whether a\n * processor is sync or async, each processor within a queue will be run serially.  While\n * processors could perform side-effects, it is preferable to mutate the data\n * in the context or the context itself.\n *\n * Processor Return Values:\n * false - Stops the event from progressing further in the chain\n * undefined (explicit or implicit) - Passes the current context, as is, into the next processor\n * object - Passes the returned object to the next processor as it's context\n *\n * Processor Errors:\n * If a processor throws or rejects, an error will be logged and the event will stop\n * propogating through the chain.  It is advised that processor blocks handle\n * their own errors internally and either recover or explicitly stop the chain by returning false.\n *\n * Lifecycle:\n * Both the QueuedProcessingChain instance and an optional lifecycleContainer can be used to manage events\n * and processors.  If either this instance or the optional lifecycleContainer is\n * destroying/destroyed, all active event processing will be haulted, any queued\n * work will be dropped, and any future attempt to enqueue new work will noop.\n */\nconst QueuedProcessingChain = Ember.Object.extend({\n    // An ember object (instance) whose lifecycle should bind this chain's event processing\n    lifecycleContainer: undefined,\n    label: null,\n    _defaultLabel: null,\n    _chain: null,\n    _processingQueueMap: null,\n\n    init() {\n        this._super(...arguments);\n        this._defaultLabel = `processingChain-${uuid()}`;\n        this._chain = [];\n        this._processingQueueMap = {};\n\n        if (!['undefined', 'instance'].includes(typeOf(this.lifecycleContainer))) {\n            throw new Error('if specified, the lifecycleContainer must be an Ember instance');\n        }\n    },\n\n    setProcessingChain(chain) {\n        if (!chain || !Array.isArray(chain)) {\n            throw new Error(this._buildErrorMessage('Only an array can be used as a processing chain.'));\n        }\n\n        chain.forEach((p, index) => {\n            if (!isValidProcessor(p)) {\n                throw new Error(this._buildErrorMessage(`Invalid Processor Provided at ${index}`));\n            }\n        });\n\n        this._chain = chain;\n    },\n\n    appendToChain(processor) {\n        if (!isValidProcessor(processor)) {\n            throw new Error(this._buildErrorMessage('Invalid Processor Provided'));\n        }\n        this._chain.push(processor);\n\n        return this._chain;\n    },\n\n    enqueueEvent(queueId, event) {\n        // NICETOHAVE/FUTURE: Optimize the chain by rejecting duplicate events\n        if (!this._isLifecycleValid()) {\n            // Do not enqueue more events if the chain or container are shutting down\n            return;\n        }\n\n        if (this._processingQueueMap[queueId]) {\n            this._processingQueueMap[queueId].workQueue.unshift(event);\n        } else {\n            this._processingQueueMap[queueId] = {\n                workQueue: [event]\n            };\n        }\n        this._checkForWork();\n    },\n\n    _checkForWork() {\n        let emptyQueueIds = [];\n        for (let currQueueId in this._processingQueueMap) {\n            const currQueue = this._processingQueueMap[currQueueId];\n            if (!currQueue.activeWorkItem) {\n                if (currQueue.workQueue.length > 0) {\n                    // start work\n                    let event = currQueue.workQueue.pop();\n                    currQueue.activeWorkItem = (async () => {\n                        try {\n                            await this._processEventThroughChain(event);\n                        } catch (error) {\n                            Ember.Logger.error(this._buildLoggerMessage('Exception thrown in process chain'), {\n                                event,\n                                error,\n                                remoteData: {\n                                    chainLabel: this.get('_safeLabel')\n                                }\n                            });\n                        }\n                        currQueue.activeWorkItem = null;\n                        this._checkForWork();\n                    })();\n                } else {\n                    emptyQueueIds.push(currQueueId);\n                }\n            }\n        }\n\n        emptyQueueIds.forEach(c => {\n            this._processingQueueMap[c] = undefined;\n            delete this._processingQueueMap[c];\n        });\n    },\n\n    async _processEventThroughChain(event) {\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and skip processing this event.\n            Ember.Logger.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Event will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    event,\n                    remoteData: {\n                        chainLabel: this.get('_safeLabel'),\n                        chainIndex: 0\n                    }\n                }\n            );\n\n            return;\n        }\n\n        const chain = this._chain;\n        if (chain && chain.length > 0) {\n            Ember.Logger.debug(this._buildLoggerMessage('Processing Event through chain'), {\n                event,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel')\n                }\n            });\n            await this._chainHelper(chain, 0, event);\n        }\n    },\n\n    async _chainHelper(chain, chainIndex, context) {\n        let processor = chain[chainIndex];\n        let { label, process } = processor;\n\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and end this processing chain.\n            Ember.Logger.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Processor will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    remoteData: {\n                        chainLabel: this.get('_safeLabel'),\n                        chainIndex,\n                        processorLabel: label\n                    }\n                }\n            );\n\n            return;\n        }\n\n        let processorResult;\n        try {\n            Ember.Logger.debug(this._buildLoggerMessage('Running Processor'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            processorResult = await process(context);\n        } catch (e) {\n            Ember.Logger.error(this._buildLoggerMessage('Processor threw or rejected'), {\n                context,\n                e,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        let processorResultType = typeOf(processorResult);\n        if (\n            !['undefined', 'boolean', 'object'].includes(processorResultType) ||\n            (processorResultType === 'boolean' && processorResult !== false)\n        ) {\n            Ember.Logger.error(this._buildLoggerMessage('Processor returned unallowed value'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label,\n                    processorResultType\n                }\n            });\n            return;\n        }\n\n        if (processorResult === false) {\n            Ember.Logger.info(this._buildLoggerMessage('Processor haulted chain'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        if (chainIndex + 1 < chain.length) {\n            // Call the next processor in the chain with the existing or mutated context\n            await this._chainHelper(chain, chainIndex + 1, !processorResult ? context : processorResult);\n        }\n    },\n\n    _buildLoggerMessage(msg) {\n        return [MSG_NAMESPACE, msg].join(' - ');\n    },\n\n    _buildErrorMessage(msg) {\n        return [MSG_NAMESPACE, this.get('_safeLabel'), msg].join(' - ');\n    },\n\n    _safeLabel: computed('label', '_defaultLabel', function () {\n        const { label, _defaultLabel } = this.getProperties('label', '_defaultLabel');\n        return label || _defaultLabel;\n    }),\n\n    _isLifecycleValid() {\n        const lifecycleContainer = this.get('lifecycleContainer');\n\n        return !(\n            this.get('isDestroying') ||\n            this.get('isDestroyed') ||\n            (lifecycleContainer && (lifecycleContainer.get('isDestroying') || lifecycleContainer.get('isDestroyed')))\n        );\n    }\n});\n\nfunction isValidProcessor(processor) {\n    if (!processor || !processor.process) {\n        return false;\n    }\n    return typeof processor === 'object' && typeof processor.process === 'function';\n}\n\nexport default QueuedProcessingChain;\n","import { isAjaxError, AjaxError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport { RawErrorResponse } from 'ember-ajax/-private/types';\nimport { hasKey } from './types';\n\nexport type RequestFailureLoggableDetails = {\n    status?: number;\n    correlationId?: string;\n};\n\nexport function getLoggableRequestFailureDetails(errorResponse: unknown): undefined | RequestFailureLoggableDetails {\n    if (!errorResponse || typeof errorResponse !== 'object') {\n        return undefined;\n    }\n\n    try {\n        if (errorResponse instanceof DS.AdapterError) {\n            return getAdapterErrorLoggableDetails(errorResponse);\n        } else if (isAjaxError(errorResponse)) {\n            return getAjaxErrorLoggableDetails(errorResponse);\n        } else if (isRawErrorResponse(errorResponse)) {\n            return getRawAjaxErrorLoggableDetails(errorResponse);\n        }\n    } catch (_) {}\n\n    return undefined;\n}\n\nfunction getAdapterErrorLoggableDetails(adapterError: DS.AdapterError): undefined | RequestFailureLoggableDetails {\n    if (hasKey(adapterError, 'errors') && Array.isArray(adapterError.errors) && adapterError.errors.length > 0) {\n        const error = adapterError.errors[0];\n        if (error && typeof error === 'object') {\n            // Tragically, all the various adapters in this baseline are inconsistent\n            // So, we need to check the root error as well as error.detail and error.details for the server payload\n            return Object.assign(\n                {},\n                ...[error, error.detail, error.details].map<undefined | RequestFailureLoggableDetails>(curr => {\n                    const payloadDetails = getLoggableRequestFailureDetailsPartial(curr);\n\n                    if (!payloadDetails) {\n                        return undefined;\n                    }\n\n                    // Prune out undefined values so they won't override previous, non-undefined values in Object.assign\n                    return Object.fromEntries(\n                        Object.entries(payloadDetails).filter(([, value]) => value !== undefined)\n                    );\n                })\n            );\n        }\n    }\n\n    return undefined;\n}\n\nfunction getAjaxErrorLoggableDetails({ status, payload }: AjaxError): undefined | RequestFailureLoggableDetails {\n    const result: RequestFailureLoggableDetails = {\n        status: status\n    };\n\n    if (\n        payload &&\n        typeof payload === 'object' &&\n        hasKey(payload, 'contextId') &&\n        typeof payload.contextId === 'string' &&\n        isUuid(payload.contextId)\n    ) {\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nfunction getRawAjaxErrorLoggableDetails(rawErrorResponse: RawErrorResponse): RequestFailureLoggableDetails {\n    return {\n        status: rawErrorResponse.jqXHR.status,\n        correlationId: rawErrorResponse.jqXHR.getResponseHeader('inin-correlation-id') || undefined\n    };\n}\n\nfunction getLoggableRequestFailureDetailsPartial(payload: unknown): undefined | RequestFailureLoggableDetails {\n    if (!payload || typeof payload !== 'object') {\n        return undefined;\n    }\n\n    let result: undefined | RequestFailureLoggableDetails = undefined;\n\n    if (hasKey(payload, 'status')) {\n        if (typeof payload.status === 'number' && Number.isInteger(payload.status)) {\n            result = result || {};\n            result.status = payload.status;\n        } else if (typeof payload.status === 'string') {\n            const statusInt = parseInt(payload.status, 10);\n            if (Number.isInteger(statusInt) && payload.status === statusInt + '') {\n                result = result || {};\n                result.status = statusInt;\n            }\n        }\n    }\n\n    if (hasKey(payload, 'contextId') && typeof payload.contextId === 'string' && isUuid(payload.contextId)) {\n        result = result || {};\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nconst UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;\nfunction isUuid(toCheck: string) {\n    return UUID_REGEXP.test(toCheck);\n}\n\nfunction isRawErrorResponse(toCheck: unknown): toCheck is RawErrorResponse {\n    if (!toCheck || typeof toCheck !== 'object') return false;\n\n    // We can reasonably assume this is a ember-ajax RawErrorResponse\n    return ['payload', 'textStatus', 'jqXHR', 'errorThrown', 'response'].every(currProp =>\n        Object.prototype.hasOwnProperty.call(toCheck, currProp)\n    );\n}\n","define(\"connections-ui/utils/routing-status\", [\"exports\", \"ember-purecloud-components/utils/routing-status\"], function (_exports, _routingStatus) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routingStatus.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default function (object, property, value) {\n    const { set } = Ember;\n    if (property && isSafe(object)) {\n        return set(object, property, value);\n    }\n}\n\nexport function isSafe(object) {\n    const { get } = Ember;\n    return object && !(get(object, 'isDestroyed') || get(object, 'isDestroying'));\n}\n","import { Promise, resolve, reject } from 'rsvp';\nimport type { StashLoggerLogPayload, StashLoggerService } from '@connections-ui/services';\nimport { hasKey } from './types';\n\nexport type AsyncPromiseChainStep = {\n    stepDesc: string;\n    process: () => Promise<any>;\n};\nexport type SyncPromiseChainStep = {\n    stepDesc: string;\n    processSync: () => any;\n};\n\nexport type PromiseChainStep = AsyncPromiseChainStep | SyncPromiseChainStep;\nfunction isSyncPromiseChainStep(toCheck: PromiseChainStep): toCheck is SyncPromiseChainStep {\n    return 'processSync' in toCheck;\n}\n\nexport type LoggingConfig = {\n    logger: StashLoggerService;\n    logMsgPrefix?: string;\n};\n\nexport type ChainOptions = {\n    loggingConfig?: LoggingConfig;\n};\n\nexport type ChainStepFailure = {\n    origReason: any;\n    stepDesc: string;\n};\n\nexport function isChainStepFailure(toCheck: unknown): toCheck is ChainStepFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    return hasKey(toCheck, 'origReason') && hasKey(toCheck, 'stepDesc') && typeof toCheck.stepDesc === 'string';\n}\n\n/**\n * Serially executes a chain of synchronous and/or asynchronous steps utilizing RSVP promises\n * to work correctly with the Ember runloop.\n *\n * Work will not be started (no promise creation) until the previous step completes successfully\n * The chain will hault and reject with a ChainStepFailure upon the first encountered step rejection or thrown error\n */\nexport function executeChain(chain: PromiseChainStep[], { loggingConfig }: ChainOptions = {}): Promise<void> {\n    loggingConfig?.logger.debug(buildLogMsg('Chain begin', loggingConfig), {\n        remoteData: { chainLength: chain.length }\n    });\n\n    return chain\n        .reduce((acc, currChainStep, stepIndex) => {\n            const { stepDesc } = currChainStep;\n            const stepProgress = `${stepIndex + 1} of ${chain.length}`;\n            return acc.then(() => {\n                return resolve()\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step begin', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        if (isSyncPromiseChainStep(currChainStep)) {\n                            return currChainStep.processSync();\n                        } else {\n                            return currChainStep.process();\n                        }\n                    })\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step success', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return;\n                    })\n                    .catch(reason => {\n                        loggingConfig?.logger.warn(buildLogMsg('Step failure', loggingConfig), {\n                            reason,\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return reject({\n                            origReason: reason,\n                            stepDesc\n                        } as ChainStepFailure);\n                    });\n            });\n        }, resolve())\n        .then(() => {\n            loggingConfig?.logger.debug(buildLogMsg('Chain success', loggingConfig), {\n                remoteData: { chainLength: chain.length }\n            });\n        })\n        .catch(reason => {\n            const logPayload: StashLoggerLogPayload = {\n                remoteData: {\n                    chainLength: chain.length\n                }\n            };\n\n            // Theoretically, we ensure reason will always be a ChainStepFailure, but .. promise rejection typings\n            if (isChainStepFailure(reason)) {\n                logPayload.origReason = reason.origReason;\n                logPayload.remoteData!.failedStep = reason.stepDesc;\n            }\n\n            loggingConfig?.logger.warn(buildLogMsg('Chain failure', loggingConfig), logPayload);\n\n            return reject(reason);\n        });\n}\n\nfunction buildLogMsg(msg: string, loggingConfig: undefined | LoggingConfig) {\n    return `${loggingConfig?.logMsgPrefix ? loggingConfig.logMsgPrefix : ''}${msg}`;\n}\n","interface CacheItem<T> {\n    value: T;\n    timestamp: number;\n}\n\nexport default class SimpleCache {\n    private cache: Map<string, CacheItem<any>> = new Map();\n\n    set(id: string, value: any, ttlMinutes = 60): void {\n        const expirationTime = Date.now() + ttlMinutes * 60 * 1000;\n        this.cache.set(id, { value, timestamp: expirationTime });\n    }\n\n    get<T>(id: string): T | undefined {\n        const cachedItem = this.cache.get(id);\n\n        if (cachedItem && Date.now() < cachedItem.timestamp) {\n            return cachedItem.value;\n        }\n\n        this.cache.delete(id);\n        return undefined;\n    }\n\n    delete(id: string): void {\n        this.cache.delete(id);\n    }\n\n    clear(): void {\n        this.cache.clear();\n    }\n}\n","const SMS_PROP = {\n    FILE_SIZE: 5\n};\n\nexport default SMS_PROP;\n","import Ember from 'ember';\nimport computed from 'ember-computed';\nimport Howler from 'howler-but-with-updates';\nimport { isTesting } from './testing';\n\nconst Howl = Howler.Howl;\n\n// Recorder from: https://github.com/chris-rudmin/Recorderjs\nconst { MediaRecorder } = window;\n\nexport default Ember.Object.extend(Ember.Evented, {\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    recording: false,\n\n    blob: null,\n    recorder: null,\n\n    deferred: null,\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) return;\n        this.setupRecorder();\n    },\n\n    destroy() {\n        this._super(...arguments);\n        if (this.recorder) {\n            this.recorder.clearStream();\n            this.recorder.audioContext.suspend();\n        }\n    },\n\n    mimeType: computed(function () {\n        const mimeTypes = ['audio/mp3', 'audio/ogg', 'audio/wav', 'audio/webm'];\n        return mimeTypes.find(mimeType => MediaRecorder.isTypeSupported(mimeType));\n    }),\n\n    format: computed('mimeType', function () {\n        // Forcing OGG for now\n        // return _.last(this.get('mimeType').split('/'));\n        return 'ogg';\n    }),\n\n    blobURL: computed('blob', function () {\n        const blob = this.get('blob');\n        if (blob) {\n            return this.getBlobUrl(blob);\n        }\n\n        return null;\n    }),\n\n    setupRecorder() {\n        this.deferred = Ember.RSVP.defer();\n        this.loadEncoder()\n            .then(encoderPath => {\n                this.recorder = new window.Recorder({\n                    encoderPath\n                });\n\n                const context = this.recorder.audioContext;\n                if (context && context.state === 'suspended') {\n                    return context.resume();\n                }\n            })\n            .then(() => {\n                this.recorder.addEventListener('streamReady', this._streamReady.bind(this));\n                this.recorder.addEventListener('stop', this._stoppedRecording.bind(this));\n                this.recorder.addEventListener('dataAvailable', this._onDataAvailable.bind(this));\n\n                this.deferred.resolve();\n            });\n    },\n\n    reset() {\n        this.set('blob', null);\n    },\n\n    startRecording() {\n        this.deferred.promise.then(() => {\n            this.recorder.initStream();\n\n            this.set('blob', null);\n            this.set('chunks', []);\n        });\n    },\n\n    resumeRecording() {\n        this.recorder.resume();\n    },\n\n    pauseRecording() {\n        this.recorder.pause();\n    },\n\n    stopRecording() {\n        this.recorder.stop();\n    },\n\n    createHowlFromBlob(blob) {\n        const blobUrl = URL.createObjectURL(blob);\n        return new Howl({\n            src: [blobUrl],\n            loop: false,\n            format: [this.get('format')],\n            html5: true\n        });\n    },\n\n    getBlobUrl(blob) {\n        return URL.createObjectURL(blob);\n    },\n\n    loadEncoder() {\n        return this._loadSoundRecorder().then(() => this._loadWorker());\n    },\n\n    _onDataAvailable(event) {\n        const blob = new Blob([event.detail], { type: 'audio/ogg' });\n        this.set('blob', blob);\n\n        this.trigger('blobready');\n    },\n\n    _streamReady() {\n        this.set('recording', true);\n        this.recorder.start();\n    },\n\n    _stoppedRecording() {\n        this.set('recording', false);\n    },\n\n    _loadSoundRecorder() {\n        if (window.Recorder) {\n            return Ember.RSVP.resolve();\n        }\n\n        const path = 'assets/recorder.min.js';\n        return new Ember.RSVP.Promise(resolve => {\n            Ember.$.getScript(path, function success() {\n                resolve();\n            });\n        });\n    },\n\n    _loadWorker() {\n        const path = 'assets/workers/encoderWorker.min.js';\n        return Ember.$.get(path).then(contents => {\n            const blob = new Blob([contents]);\n            return window.URL.createObjectURL(blob);\n        });\n    }\n});\n","export const MESSAGING_SUBTYPES = [\n    'apple',\n    'facebook',\n    'instagram',\n    'line',\n    'open',\n    'sms',\n    'twitter',\n    'wechat',\n    'whatsapp',\n    'webmessaging'\n] as const;\n","import ENV from 'connections-ui/config/environment';\n\n/**\n * Determines if the app is currently running in a testing mode or not based on the ENV config used\n * at build time.\n *\n * @returns boolean detailing if the environment is in testing mode or not\n */\nexport const isTesting = ENV.environment === 'test';\n","import { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport { getEnvCookieDomain } from './net';\n\n/**\n * The current theme that the user has saved based on cookie value\n */\nlet currentTheme = null;\n\n/**\n * The name of the cookie being set.\n */\nexport const THEME_COOKIE = 'pureCloudTheme';\n/**\n * The time in seconds that the cookie will expire\n */\nexport const TEN_YEARS = 315360000; // in seconds\n\n/**\n * List of all possible themes that could be supported based on feature toggles and base classes. Key/value pair\n * to make sure values don't differ throughout the logic.\n * Please add a note next to the theme key/value detailing the ticket and feature toggle associated with it.\n *\n * Future Todo: We should move away from tacking on `-theme` to the end of the classes.\n */\nexport const THEME_CLASSES = {\n    LIGHT: 'light-theme', // default theme, always supported\n    DARK: 'dark-theme', // FT - webUiDarkTheme\n    BASE: 'purecloud-theme' // Legacy theme needed for app styling / TODO: Remove upon theme rework\n};\n/**\n * This is the theme that the app defaults to if a theme is not saved or selected yet.\n */\nexport const DEFAULT_THEME = THEME_CLASSES.LIGHT;\n/**\n * This is an array of the base themes that are always supported no matter what. Other themes may need to be hidden behind a feature toggle.\n */\nexport const BASE_THEME_LIST = [THEME_CLASSES.LIGHT];\n\n/**\n * This is the current theme list to select from. This function calculates all supported themes\n * based on feature toggles and returns a value of all themes that can be supported.\n * DEV NOTE: Add all new theme logic to this function to determine what themes to return.\n */\nexport function getThemeList(session) {\n    let extraThemes = [];\n\n    // Only check feature toggle based themes if session with features object is provided\n    if (session && session.features) {\n        if (session.features.webUiDarkTheme) {\n            extraThemes.push(THEME_CLASSES.DARK);\n        }\n    }\n\n    return [...BASE_THEME_LIST, ...extraThemes].sort((a, b) => {\n        if (a > b) {\n            return 1;\n        } else if (b > a) {\n            return -1;\n        } else {\n            return 0;\n        }\n    });\n}\n\n/**\n * Loads in the theme from the browsers cookies if there was a theme already set.\n * @param {string} cookies a long string of cookies that are character separated\n * @returns A new theming object used to set the applications theme\n */\nexport function loadTheme(session, cookies = document.cookie) {\n    const cookie = cookies\n        .split(/;[ \\t]?/)\n        .map(cookie => {\n            const [name, theme] = cookie.split('=');\n            return { name, theme };\n        })\n        .find(({ name }) => name === THEME_COOKIE);\n\n    if (cookie && getThemeList(session).find(theme => theme === cookie.theme)) {\n        return cookie;\n    } else {\n        return { theme: DEFAULT_THEME };\n    }\n}\n\n/**\n * Returns the current theme value being applied to the app\n * @returns the current theme value\n */\nexport function getThemeClass() {\n    return currentTheme;\n}\n\n/**\n * Sets the class of the provided element with the provided theme. Also removes the old theme class from the same element (if found), and sets the\n * `currentTheme` to the new value.\n * @param {{theme: THEME_CLASSES, element: HTMLELement}} param0 any object that contains at least the new theme and element to apply the class to.\n */\nexport function setThemeClass({ theme = THEME_CLASSES.LIGHT, element = document.body } = {}) {\n    if (currentTheme) {\n        element.classList.remove(currentTheme);\n    }\n\n    if (!element.classList.contains(THEME_CLASSES.BASE)) {\n        element.classList.add(THEME_CLASSES.BASE);\n    }\n\n    if (!element.classList.contains(theme)) {\n        element.classList.add(theme);\n    }\n\n    currentTheme = theme;\n}\n\n/**\n * Sets the theme cookie on the application to determine how the application should be styled when loaded in. Will alter the cookie values based on conditional values\n * such as the current locations protocol as well as the current browser being viewed on.\n * @param {{theme: THEME_CLASSES, duration: number, path: string, protocol: string, domain: string, setCookie: function, userAgent: string}} param0 an object used to set the new cookie value regarding the application theme\n */\nexport function setThemeCookie({\n    theme = THEME_CLASSES.LIGHT,\n    duration = TEN_YEARS,\n    path = '/',\n    protocol = _getCurrProtocol(),\n    domain = getEnvCookieDomain(),\n    setCookie = _setCookie, // mainly used for testing\n    userAgent = _getCurrUserAgent()\n} = {}) {\n    let cookieStmt = `${THEME_COOKIE}=${theme};path=${path};domain=${domain};max-age=${duration}`;\n\n    if (protocol === 'https:') {\n        cookieStmt += `;Secure`;\n    }\n\n    if (userAgent && typeof userAgent === 'string' && isSameSiteNoneCompatible(userAgent)) {\n        cookieStmt += `;SameSite=None`;\n    }\n\n    setCookie(cookieStmt);\n    setThemeClass({ theme });\n}\n\n/**\n * Resets the current theme back to undefined\n * Mainly used for testing purposes\n */\nexport function resetTheme() {\n    currentTheme = null;\n}\n\n/**\n * Private function to set the provided cookie on the document\n * @param {any} cookie the cookie w/ value to set\n */\nfunction _setCookie(cookie) {\n    document.cookie = cookie;\n}\n\n/**\n * Returns the windows current protocol. Expected `https:`\n * @returns the windows protocol\n */\nfunction _getCurrProtocol() {\n    if (window && window.location) {\n        return window.location.protocol;\n    }\n\n    return undefined;\n}\n\n/**\n * Returns the users current browser agent\n * @returns the users current browser agent\n */\nfunction _getCurrUserAgent() {\n    if (navigator && navigator.userAgent) {\n        return navigator.userAgent;\n    }\n\n    return undefined;\n}\n","define(\"connections-ui/utils/timeout-promise\", [\"exports\", \"ember-purecloud-components/utils/timeout-promise\"], function (_exports, _timeoutPromise) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _timeoutPromise.default;\n    }\n  });\n});\n","// Native Panels will eventually be replaced by providers and gadgets\nconst NATIVE_PANELS = ['details', 'scripts', 'responses', 'notes', 'scheduleCallback', 'wrapup'] as const;\ntype NativePanel = (typeof NATIVE_PANELS)[number];\n\nconst SCRIPTS_GADGET_PANEL_ID = 'scripts&scriptsProvider';\nconst deprecatedConversationSummaryPanelIds = ['interaction-details', 'agent-conversation-summary'].map(\n    currPanelId => `${currPanelId}&conversationSummaryInterapptionsProvider`\n);\nconst CONVERSATION_DETAILS_GADGET_PANEL_ID = 'conversation-details&conversationDetailsInterapptionsProvider';\nconst CANNED_RESPONSES_GADGET_PANEL_ID = 'responses&cannedResponsesProvider';\n// Assuming the provider and app id for Schedule Callbacks\nconst SCHEDULE_CALLBACK_GADGET_PANEL_ID = 'scheduleCallback&scheduleCallbackProvider';\nconst NOTES_GADGET_PANEL_ID = 'notesGadget&notesGadgetProvider';\nconst WRAPUP_GADGET_PANEL_ID = 'wrapupCodesGadget&wrapupCodesGadgetProvider';\n\nexport interface PanelSetting {\n    type: 'BuiltIn' | 'BuiltInInterapption' | 'Integration';\n    panelId: string;\n}\n\ninterface TransformationMap {\n    [key: string]: {\n        dependentFeatureToggles?: string[];\n        active: (features: Record<string, boolean>) => boolean;\n        shouldTransformPanelSetting: (panelSetting: PanelSetting) => boolean;\n        transformPanelSetting: () => PanelSetting;\n        // Supports both single and multipanel\n        shouldTransformAppDefId: (appDefId: string) => boolean;\n        transformAppDefId: () => string;\n    };\n}\n\nconst transformationMaps: TransformationMap = {\n    // Note: Conversation Summary will be replaced by Conversation Details before going GA\n    // CS options were never shipped to AUiB and CS used two different panel ids which complicates the transform\n    // As such, we're only supporting between details and conversation-details\n    details: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'details' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CONVERSATION_DETAILS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return ['details', addNativeProvider('details'), ...deprecatedConversationSummaryPanelIds].includes(\n                appDefId\n            );\n        },\n        transformAppDefId: () => {\n            return CONVERSATION_DETAILS_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['conversationSummary3256', 'PURE-3256_useConversationDetails'],\n        active: features => {\n            return features.conversationSummary3256 && features['PURE-3256_useConversationDetails'];\n        }\n    },\n    reverseDetails: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CONVERSATION_DETAILS_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'details'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return [...deprecatedConversationSummaryPanelIds, CONVERSATION_DETAILS_GADGET_PANEL_ID].includes(appDefId);\n        },\n        transformAppDefId: () => {\n            return 'details';\n        },\n        active: features => {\n            return !transformationMaps.details.active(features);\n        }\n    },\n    notes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'notes' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: NOTES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'notes' || appDefId === addNativeProvider('notes');\n        },\n        transformAppDefId: () => {\n            return NOTES_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: features => {\n            return features['auraACWGadgets'];\n        }\n    },\n    reverseNotes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === NOTES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'notes'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === NOTES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'notes';\n        },\n        active: features => {\n            return !transformationMaps.notes.active(features);\n        }\n    },\n    wrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'wrapup' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: WRAPUP_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'wrapup' || appDefId === addNativeProvider('wrapup');\n        },\n        transformAppDefId: () => {\n            return WRAPUP_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: features => {\n            return features['auraACWGadgets'];\n        }\n    },\n    reverseWrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === WRAPUP_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'wrapup'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === WRAPUP_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'wrapup';\n        },\n        active: features => {\n            return !transformationMaps.wrapup.active(features);\n        }\n    },\n    responses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'responses' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CANNED_RESPONSES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'responses' || appDefId == addNativeProvider('responses');\n        },\n        transformAppDefId: () => {\n            return CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['PURE-5421_CannedResponse_Gadget'],\n        active: features => {\n            return features['PURE-5421_CannedResponse_Gadget'];\n        }\n    },\n    reverseResponses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CANNED_RESPONSES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'responses'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'responses';\n        },\n        active: features => {\n            return !transformationMaps.responses.active(features);\n        }\n    },\n    scheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scheduleCallback' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCHEDULE_CALLBACK_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scheduleCallback' || appDefId === addNativeProvider('scheduleCallback');\n        },\n        transformAppDefId: () => {\n            return SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['scheduleCallbackGadget'], // assumption for the ft\n        active: features => {\n            return features['scheduleCallbackGadget']; // assumption for the ft\n        }\n    },\n    reverseScheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === SCHEDULE_CALLBACK_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'scheduleCallback'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'scheduleCallback';\n        },\n        active: features => {\n            return !transformationMaps.scheduleCallback.active(features);\n        }\n    },\n    scripts: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scripts' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCRIPTS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scripts' || appDefId === addNativeProvider('scripts');\n        },\n        transformAppDefId: () => {\n            return SCRIPTS_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['PURE-6186_Scripter_Gadget_GCUI'], // assumption for the ft\n        active: features => {\n            // Here, we do not have to check for workitem scripter FT\n            // PEF does not support workitems and therefore we only need to transform query params for conversations\n            // The Workitem scripter PM setting will use the built-in provider panel setting from the get-go\n            // The workitem scritper panel will use the built-in provider panelId from the get-go\n            // legacy scripter panel ids in layout models only need to be transformed for conversations;\n            //   again because workitem scripter panelIds will use provider from the get-go\n            return features['PURE-6186_Scripter_Gadget_GCUI'];\n        }\n    }\n};\n\nexport const transformationDependentFeatureToggles = [\n    ...new Set(\n        Object.values(transformationMaps).flatMap(({ dependentFeatureToggles }) => dependentFeatureToggles ?? [])\n    )\n];\n\nexport const buildTransformationFtComputedDepKey = (injectionPrefix: string): string => {\n    return `${injectionPrefix}.{${transformationDependentFeatureToggles.join(',')}}`;\n};\n\nexport const standardTransformationFtComputedDepKey = buildTransformationFtComputedDepKey('session.features');\n\nexport const transformPanelSetting = (panelSetting: PanelSetting, features: Record<string, boolean>) => {\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformPanelSetting(panelSetting)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformPanelSetting();\n    }\n    return panelSetting;\n};\n\n/**\n * Transforms the provided panelId to the target panelId based on the enable state of various transformers.\n * If no applicable transformer is found, the original panelId is returned. This\n * transformation will work for native src panels with and without a native provider, but note that\n * transformations back to native panels will not include the native provider.  If the native provider is needed,\n * callers should call `addNativeProvider` on the returned panelId.\n *\n * @param panelId The panelId (with or without native provider) to transform, when applicable\n * @param features The feature flags to use when determining which transformer to use\n * @returns A transformed panelId if applicable, otherwise the original panelId.  Native panelIds will not include the native provider.\n */\nexport const transformPanelId = (panelId: string, features: Record<string, boolean>) => {\n    // Normalize native panel ids to not include the native provider for searching transformers\n    const srcNativePanelMatch = findNativePanel(panelId);\n    const toSearch = srcNativePanelMatch ? srcNativePanelMatch.panelId : panelId;\n\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformAppDefId(toSearch)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformAppDefId();\n    }\n    return panelId;\n};\n\n/**\n * Appends the native provider to the end of the provided panelId if it represents a native panel.\n * This function is idempotent and safe to call on non-native panelIds as well as panelIds\n * which may already include the native provider.\n *\n * eg.\n * scheduleCallback -> scheduleCallback&native\n * scheduleCallback&native -> scheuldeCallback&native\n * nonNativePanelId -> nonNativePanelId\n * nonNativePanelId&nonNativeProviderId -> nonNativePanelId&nonNativeProviderId\n */\nexport const addNativeProvider = (panelId: string): string => {\n    const nativePanel = findNativePanel(panelId);\n    if (nativePanel) {\n        return `${nativePanel.panelId}&native`;\n    }\n\n    return panelId;\n};\n\ntype NativePanelMatch = {\n    panelId: NativePanel;\n    includedNativeProvider: boolean;\n};\nconst findNativePanel = (panelId: string): NativePanelMatch | undefined => {\n    const nativePanel = NATIVE_PANELS.find(\n        currNativePanel => panelId === currNativePanel || panelId === `${currNativePanel}&native`\n    );\n    if (!nativePanel) {\n        return;\n    }\n\n    return {\n        panelId: nativePanel,\n        includedNativeProvider: panelId.endsWith('&native')\n    };\n};\n","import { hasKey } from './types';\n\ntype CacheEntry<T> = {\n    expirationTimestamp?: number;\n    value: T;\n};\ntype TtlCacheConfig = {\n    defaultTtl?: number;\n};\n\n// A bit of jitter to ensure the TTL has been reached upon timer expiration\nconst TIMER_JITTER_MILLIS = 5;\n\nexport default class TtlCache<T> {\n    private config: TtlCacheConfig;\n    private cacheData: Record<string, CacheEntry<T>>;\n    private expiryCheck: {\n        timerRef?: number;\n        nextExpirationTimestamp?: number;\n    };\n    private tearingDown: boolean;\n\n    constructor({ defaultTtl }: TtlCacheConfig = {}) {\n        this.config = {\n            // <0, 0, and undefined all equate to no TTL (undefined)\n            defaultTtl: this.normalizeTtl(defaultTtl)\n        };\n        this.cacheData = {};\n        this.tearingDown = false;\n        this.expiryCheck = {};\n    }\n\n    keys(): string[] {\n        return Object.keys(this.cacheData);\n    }\n\n    /**\n     * Returns true if the key is in the cache, regardless of expiry; flase otherwise.\n     * Calls to has and get are stable within the same function.\n     *\n     * @param key The key to check\n     * @returns true if an item exists in the case under the specified key (regardless of expiry); false otherwise.\n     */\n    has(key: string): boolean {\n        return hasKey(this.cacheData, key);\n    }\n\n    get(key: string): undefined | T {\n        return this.cacheData[key]?.value;\n    }\n\n    /**\n     * @param key The key to use for this cache entry\n     * @param value The value to use for this cache entry\n     * @param ttl Unspecified/undefined uses the default ttl; <=0 indicates no caching, ttl otherwise\n     */\n    put(key: string, value: T, ttl?: number) {\n        const currTimeMillis = Date.now();\n\n        // Use the default ttl if item ttl is unspecified\n        // <=0 indicates no cache\n        const effectiveTtl = typeof ttl === 'undefined' ? this.config.defaultTtl : this.normalizeTtl(ttl);\n        const expirationTimestamp = typeof effectiveTtl === 'number' ? currTimeMillis + effectiveTtl : undefined;\n\n        this.cacheData[key] = {\n            expirationTimestamp,\n            value\n        };\n\n        if (expirationTimestamp) {\n            this.scheduleEviction(expirationTimestamp);\n        }\n    }\n\n    delete(key: string): boolean {\n        if (this.has(key)) {\n            const removedExpirationTimestamp = this.cacheData[key]?.expirationTimestamp;\n            delete this.cacheData[key];\n\n            if (removedExpirationTimestamp && removedExpirationTimestamp === this.expiryCheck.nextExpirationTimestamp) {\n                // We've removed an item which matches the next eviction timestamp\n\n                // Clear the existing timer.  Otherwise, scheduleEviction will still see\n                // the exiting timer as earlier than the new timer we're trying to set and noop\n                this.clearEvictionTimer();\n\n                // Re-schedule the eviction timer in case this is the last such entry at that eviction time\n                this.scheduleEviction();\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    clear() {\n        this.clearEvictionTimer();\n\n        this.cacheData = {};\n    }\n\n    tearDown(): void {\n        this.tearingDown = true;\n\n        this.clearEvictionTimer();\n\n        this.clear();\n    }\n\n    private clearEvictionTimer() {\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck = {};\n    }\n\n    /**\n     * Schedules an eviction timer to run approximately at the sprecified timestamp if no earlier timer already exists.\n     *\n     * If an earlier timer exists, this function will no-op; however, the \"interval\" will continue to be set\n     * based on the expiry timestamps of the cache, always selecting the nearest timestamp until no such timer is needed.\n     *\n     * @param requestedTimestamp The desired timestamp for the next timer. If no timestamp is provided, the next\n     *  timer will be calculated from the entries in the cache.\n     */\n    private scheduleEviction(requestedTimestamp = this.getEarliestExpirationTimestamp()) {\n        const currTimeMillis = Date.now();\n\n        if (this.tearingDown || typeof requestedTimestamp !== 'number' || requestedTimestamp < currTimeMillis) {\n            return;\n        }\n\n        if (\n            this.expiryCheck.nextExpirationTimestamp &&\n            this.expiryCheck.nextExpirationTimestamp <= requestedTimestamp\n        ) {\n            return;\n        }\n\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck.nextExpirationTimestamp = requestedTimestamp;\n        this.expiryCheck.timerRef = window.setTimeout(() => {\n            this.evictExpiredItems();\n            this.scheduleEviction();\n        }, requestedTimestamp - currTimeMillis + TIMER_JITTER_MILLIS);\n    }\n\n    private evictExpiredItems() {\n        const currTimeMillis = Date.now();\n        Object.entries(this.cacheData).forEach(([key, cacheEntry]) => {\n            if (cacheEntry.expirationTimestamp && cacheEntry.expirationTimestamp <= currTimeMillis) {\n                delete this.cacheData[key];\n            }\n        });\n    }\n\n    private getEarliestExpirationTimestamp() {\n        let earliestExpiration: undefined | number;\n\n        Object.values(this.cacheData).forEach(({ expirationTimestamp }) => {\n            if (expirationTimestamp && (!earliestExpiration || expirationTimestamp < earliestExpiration)) {\n                earliestExpiration = expirationTimestamp;\n            }\n        });\n\n        return earliestExpiration;\n    }\n\n    private normalizeTtl(ttl: undefined | number) {\n        if (typeof ttl === 'undefined') {\n            return undefined;\n        }\n\n        if (ttl <= 0) {\n            return undefined;\n        }\n\n        return ttl;\n    }\n}\n","const TWITTER_PROP = {\n    FILE_SIZE: 3,\n    MESSAGE_TYPE: 'twitter'\n};\n\nexport default TWITTER_PROP;\n","/*\n * Utility and Common types\n * Note: Feature-specific types should be kept within their own or separate util files.\n */\nexport function assertNever(x: never): never {\n    throw new Error(`Unexpected object: ${x}`);\n}\n\n// TS can't narrow `object` to an object with a known key, so we need a type-guard for that\nexport function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {\n    return key in obj;\n}\n\n// Includes type-guard/utility for readonly arrays/tuples/string unions\nexport function includes<S extends string>(haystack: readonly S[], needle: string): needle is S {\n    const _haystack: readonly string[] = haystack;\n    return _haystack.includes(needle);\n}\n\nexport type UnionFromTuple<T extends any[] | readonly any[]> = T[number];\n","const APPS_URI_V2 = 'api/v2/apps';\nconst BASE_URI_V2 = 'api/v2/conversations';\nconst PC_BASE_URI = 'platform';\n\nconst SEND_MESSAGING_TYPING_URI = 'messages/{conversationId}/communications/{communicationId}/typing';\nconst GET_APPS_DOWNLOAD_URI = 'downloads/{downloadId}?contentDisposition=INLINE';\n\n/**\n * Replaces patterns param names with provided values.\n * @param path - the string path to replace\n * @param values - the replacement values\n */\nfunction paramReplace(path: string, baseUri: string, values: Record<string, string>) {\n    for (const [key, value] of Object.entries(values)) {\n        const pattern = new RegExp(`\\{${key}\\}`);\n        path = path.replace(pattern, value);\n    }\n    return `/${PC_BASE_URI}/${baseUri}/${path}`;\n}\n\nexport default function UriBuilder() {\n    return {\n        /**\n         * Path to notify a message conversation's typing state\n         * @param conversationId - the conversation guid\n         * @param communicationId - the communication guid\n         */\n        sendMessagingTypingUri(conversationId: string, communicationId: string) {\n            const params = { conversationId, communicationId };\n            return paramReplace(SEND_MESSAGING_TYPING_URI, BASE_URI_V2, params);\n        },\n\n        /**\n         * Path to retrieve the download URL for the specified download.\n         * Used for cookie authentication.\n         * @param downloadId - the download guid\n         */\n        getAppsDownloadUri(downloadId: string) {\n            const params = { downloadId };\n            return paramReplace(GET_APPS_DOWNLOAD_URI, APPS_URI_V2, params);\n        }\n    };\n}\n","define(\"connections-ui/utils/uuid-generator\", [\"exports\", \"ember-uuid/utils/uuid-generator\"], function (_exports, _uuidGenerator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.default;\n    }\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v4;\n    }\n  });\n});\n","import { v4 } from 'uuid';\n\nfunction generate() {\n    return v4();\n}\n\nexport default {\n    generate\n};\n","define(\"connections-ui/utils/video-frame-checker\", [\"exports\", \"ember-webrtc-troubleshoot/utils/video-frame-checker\"], function (_exports, _videoFrameChecker) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoFrameChecker.default;\n    }\n  });\n});\n","const WEBMESSAGING_PROP = {\n    CHARACTER_LIMIT: 4000,\n    FILE_SIZE: 25\n};\n\nexport default WEBMESSAGING_PROP;\n","define(\"connections-ui/validators/alias\", [\"exports\", \"ember-cp-validations/validators/alias\"], function (_exports, _alias) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _alias.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/belongs-to\", [\"exports\", \"ember-cp-validations/validators/belongs-to\"], function (_exports, _belongsTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _belongsTo.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/collection\", [\"exports\", \"ember-cp-validations/validators/collection\"], function (_exports, _collection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _collection.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/confirmation\", [\"exports\", \"ember-cp-validations/validators/confirmation\"], function (_exports, _confirmation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _confirmation.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/date\", [\"exports\", \"ember-cp-validations/validators/date\"], function (_exports, _date) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _date.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/dependent\", [\"exports\", \"ember-cp-validations/validators/dependent\"], function (_exports, _dependent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dependent.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/ds-error\", [\"exports\", \"ember-cp-validations/validators/ds-error\"], function (_exports, _dsError) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dsError.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/exclusion\", [\"exports\", \"ember-cp-validations/validators/exclusion\"], function (_exports, _exclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/format\", [\"exports\", \"ember-cp-validations/validators/format\"], function (_exports, _format) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _format.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/has-many\", [\"exports\", \"ember-cp-validations/validators/has-many\"], function (_exports, _hasMany) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hasMany.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/inclusion\", [\"exports\", \"ember-cp-validations/validators/inclusion\"], function (_exports, _inclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/length\", [\"exports\", \"ember-cp-validations/validators/length\"], function (_exports, _length) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _length.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/messages\", [\"exports\", \"ember-intl-cp-validations/validators/messages\"], function (_exports, _messages) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messages.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/number\", [\"exports\", \"ember-cp-validations/validators/number\"], function (_exports, _number) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _number.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/presence\", [\"exports\", \"ember-cp-validations/validators/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant-v2/model\", [\"exports\", \"ember-webrtc-components/models/video-participant-v2\"], function (_exports, _videoParticipantV) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipantV.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant/model\", [\"exports\", \"ember-webrtc-components/models/video-participant\"], function (_exports, _videoParticipant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipant.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    templateName: 'card/tree/tree',\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    attachTextInputListeners: Ember.on('didInsertElement', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.on('keydown', event => event.stopPropagation());\n    }),\n\n    removeTextInputListeners: Ember.on('willClearRender', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.off('keydown');\n    })\n});\n","define(\"connections-ui/webrtc-conversation/model\", [\"exports\", \"ember-webrtc-components/models/webrtc-conversation\"], function (_exports, _webrtcConversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversation.default;\n    }\n  });\n});\n","define('connections-ui/config/environment', ['ember'], function(Ember) {\n  var prefix = 'connections-ui';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(unescape(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","if (!runningTests) {\n  require(\"connections-ui/app\")[\"default\"].create({\"version\":\"1.13.0\",\"semver\":\"1.13.0+70-master-24075b2526042f014ac460f53109ecf8b7637f97\",\"urlprefix\":\"/connections-ui/build-assets/1.13.0-70/\",\"buildNumber\":\"70\",\"libs\":{\"@purecloud/ember-purecloud-components\":\"13.6.7\",\"@purecloud/ember-softphone-integration\":\"1.0.8\"},\"INTL_LANGUAGES\":{\"ar\":\"العربية (beta)\",\"cs\":\"Čeština\",\"da\":\"Dansk\",\"de\":\"Deutsch\",\"en-us\":\"English\",\"es\":\"Español\",\"fi\":\"Suomi\",\"fr-ca\":\"Français (Canada) (beta)\",\"fr\":\"Français\",\"he\":\"עברית (beta)\",\"hi\":\"हिन्दी\",\"it\":\"Italiano\",\"ja\":\"日本語\",\"ko\":\"한국어\",\"nl\":\"Nederlands\",\"no\":\"Norsk\",\"pl\":\"Polski\",\"pt-br\":\"Português do Brasil\",\"pt-pt\":\"Português\",\"ru\":\"Русский\",\"sv\":\"Svenska\",\"th\":\"ไทย\",\"tr\":\"Türkçe\",\"uk\":\"Українська\",\"zh-cn\":\"简体中文\",\"zh-tw\":\"繁體中文\"},\"name\":\"connections-ui\"});\n}\n"]}