{"version":3,"file":"mst-libs-utils.js","sources":["../../../libs/utils/src/lib/Dupes/BuildDuplicateCriteria.ts","../../../libs/utils/src/lib/ASync/asyncThrottle.ts","../../../libs/utils/src/lib/RequestHelpers/URLHelper.ts","../../../libs/utils/src/lib/Object/Has.ts","../../../libs/utils/src/lib/LocalStorage/LocalStorageHelper.ts","../../../libs/utils/src/lib/IndexedDB/migrations.ts","../../../libs/utils/src/lib/IndexedDB/UserStorage.ts","../../../libs/utils/src/lib/UserDetect/index.ts","../../../libs/utils/src/lib/HtmlHelpers/CleanHTMLClasses.ts","../../../libs/utils/src/lib/FunctionHelpers/RunWhen.ts","../../../libs/utils/src/lib/dom/dom.tsx","../../../libs/utils/src/lib/Capture/index.ts","../../../libs/utils/src/lib/Xlate/Xlate.ts","../../../libs/utils/src/lib/Spread.tsx","../../../libs/utils/src/lib/DataUtilites/DataValidation.ts","../../../libs/utils/src/lib/Browser/BrowserHelper.tsx","../../../libs/utils/src/lib/ColorUtils.tsx","../../../libs/utils/src/lib/PCR9/SkipOnly.ts","../../../libs/utils/src/lib/Generators/Identity.ts","../../../libs/utils/src/lib/DateAndTime/DateTimeUtil.ts","../../../libs/utils/src/lib/Currency/CurrencyCodeFormatInfo.ts","../../../libs/utils/src/lib/ImportFromWindow/Globalize/Globalize.ts","../../../libs/utils/src/lib/HtmlHelpers/PcrHtmlHelper.ts","../../../libs/utils/src/lib/HtmlHelpers/TranslationHelpers.ts","../../../libs/utils/src/lib/DataUtilites/DataFormatters.ts","../../../libs/utils/src/lib/HtmlHelpers/isTruncated.ts","../../../libs/utils/src/lib/RequestHelpers/LoadingMachine.ts","../../../libs/utils/src/lib/WindowHelper/Resize.ts","../../../libs/utils/src/lib/DateAndTime/Timer.ts","../../../libs/utils/src/lib/PCR9/Routes.ts","../../../libs/utils/src/lib/WindowHelper/WindowHelper.ts","../../../libs/utils/src/lib/Formatters/CityStateFormatter.ts","../../../libs/utils/src/lib/LocalStorage/UserLocalStorage.ts","../../../libs/utils/src/lib/Clipboard.ts","../../../libs/utils/src/lib/Formatters/StringFormatter.tsx","../../../libs/utils/src/lib/Analytics/Filter.tsx","../../../libs/utils/src/lib/DateAndTime/PartialDateSearch.ts","../../../libs/utils/src/lib/Security/UserSecurityHelper.ts","../../../libs/utils/src/lib/BinaryHelpers/index.ts","../../../libs/utils/src/lib/Dupes/ParseDuplicateRecord.ts","../../../libs/utils/src/lib/ImageUtilities.tsx","../../../libs/utils/src/lib/UnsavedRecord/index.ts"],"sourcesContent":["import {\n\tDefaultDuplicateRecordWeights,\n\tDuplicateRecordWeights,\n\tDuplicateRequestField,\n\tDuplicateRequestRecord,\n\tSearchDuplicateParameters\n} from '@mst/api/models/DuplicateRecord';\nimport { RecordType } from '@mst/api/models/RecordType';\n\n/**\n * Generates an object with the necessary criteria to run a duplicate check on a dupes-compatible record.\n */\nexport function buildDuplicateCriteria(\n\tconfig: SearchDuplicateParameters\n): DuplicateRequestRecord['criteria'] {\n\tconst { record, fieldWeights, deterministicGroups, determinateOnly, minimumScore, recordType } = config;\n\n\t//filter null values out of custom fields - Null value searches for NONEXISTENCE which isn't conducive to good dupes.\n\t//Not having a Social_Twitter, for example, does not mean that two records might be the same person.\n\tconfig.record.CustomFields = config.record?.CustomFields?.filter(\n\t\tfield => field.Value.length && field.Value[0] !== null\n\t) as typeof config.record.CustomFields;\n\n\t//allow override of deterministic groups - default is TOSSED, so any existing defaults must be incldued in override\n\tconst overriddenDeterministicGroups: Array> =\n\t\tdeterministicGroups ?? DefaultDuplicateRecordWeights[recordType]?.deterministic;\n\n\t//allow override of field weights - default is TOSSED, so any existing defaults must be included in override\n\tconst overriddenFieldWeights: DuplicateRecordWeights =\n\t\tfieldWeights ?? DefaultDuplicateRecordWeights[recordType]?.weights ?? 0;\n\n\tconst criteria: DuplicateRequestRecord['criteria'] = {\n\t\tdeterministicGroups: overriddenDeterministicGroups,\n\t\tminimumWeight: minimumScore ?? 1,\n\t\tfields: []\n\t};\n\n\tif (!determinateOnly) {\n\t\tcriteria.fields = [];\n\n\t\tObject.keys(record).forEach(key => {\n\t\t\t// Intentional loosy undefined comparison\n\t\t\t// biome-ignore lint/suspicious/noDoubleEquals: \n\t\t\tif (record[key] != undefined) {\n\t\t\t\tif (key !== 'CustomFields') {\n\t\t\t\t\tcriteria.fields.push({ fieldName: key, weight: overriddenFieldWeights?.[key] });\n\t\t\t\t} else {\n\t\t\t\t\tfor (const customField of record.CustomFields) {\n\t\t\t\t\t\tconst fieldHasWeight = overriddenFieldWeights?.[`CustomFields.${customField.FieldName}`] !== undefined;\n\t\t\t\t\t\tconst isDeterministicCriteria =\n\t\t\t\t\t\t\tcriteria.deterministicGroups?.filter(group =>\n\t\t\t\t\t\t\t\tgroup.find(fieldName => fieldName === `CustomFields.${customField.FieldName}`)\n\t\t\t\t\t\t\t).length > 0;\n\t\t\t\t\t\t//If one of these two conditions is not met, the field is not considered part of the duplicate check.\n\t\t\t\t\t\tif (fieldHasWeight || isDeterministicCriteria) {\n\t\t\t\t\t\t\tcriteria.fields.push({\n\t\t\t\t\t\t\t\tfieldName: `CustomFields.${customField.FieldName}`,\n\t\t\t\t\t\t\t\tweight: overriddenFieldWeights?.[`CustomFields.${customField.FieldName}`] ?? 1\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t//for each deterministic group...\n\t\tconst filteredGroups = criteria.deterministicGroups.filter(group => {\n\t\t\t//filter down each group...\n\t\t\treturn (\n\t\t\t\tgroup.filter(field => {\n\t\t\t\t\t//search through the fields that were just populated in criteria...\n\t\t\t\t\treturn !criteria.fields.find((dupeField: DuplicateRequestField) => {\n\t\t\t\t\t\t//If a deterministic field is found and is NOT in the source record, return positive to parent filter\n\t\t\t\t\t\treturn field === dupeField.fieldName;\n\t\t\t\t\t});\n\t\t\t\t\t//if no missing fields were found, keep the group. Else, toss it.\n\t\t\t\t})?.length === 0\n\t\t\t);\n\t\t});\n\n\t\t//If NO deterministic groups can be met by SOURCE record, don't bother sending them to the server\n\t\tcriteria.deterministicGroups = filteredGroups.length ? filteredGroups : undefined;\n\t}\n\n\treturn criteria;\n}\n","/**\n * This will run a series of async functions and wait for all Promises until they have all been completed.\n * This is similar to Promise.all() except it takes an function which generates a Promise as opposed to the Promise itself.\n *\n * Usage:\n * const allResults = await asyncThrottle([\n * async () => { 1st long running function },\n * async () => { 2nd long running function },\n * async () => { 3rd long running function },\n * ], 2);\n * @param asyncFunctions async functions to run in parallel, up to maxParallel simultaneously, and as one completes a new one will start until they have all completed\n * @param maxParallel maximum async functions to run in parallel, the default is 5 if omitted or a value of 0 or less is passed in\n * @returns an array of each function's results, keep in mind that the order will be kept of the order the async functions were passed in, not the order they completed\n */\nexport const asyncThrottle = (asyncFunctions: (() => Promise)[], maxParallel: number = 5): Promise => {\n\treturn new Promise((resolve, reject) => {\n\t\ttype RaceWinner = { promise: Promise };\n\t\tconst combinedResults: T[] = [];\n\t\tlet pendingFunctions: Promise[] = [];\n\t\tlet currentIndex = 0;\n\n\t\tif (!maxParallel || maxParallel <= 0) {\n\t\t\t//safety net\n\t\t\tmaxParallel = 5;\n\t\t}\n\n\t\tconst processNext = () => {\n\t\t\t//check to see if all pending functions have completed\n\t\t\tif (currentIndex === asyncFunctions.length && pendingFunctions.length === 0) {\n\t\t\t\tresolve(combinedResults);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//loop and fill pending Promises up to maxParallel items\n\t\t\twhile (currentIndex < asyncFunctions.length && pendingFunctions.length < maxParallel) {\n\t\t\t\tconst capturedIndex = currentIndex++;\n\n\t\t\t\t//call async function here and modify the promise so we can remove it from the pending array afterwards\n\t\t\t\tconst promise = asyncFunctions[capturedIndex]().then(\n\t\t\t\t\tresults => {\n\t\t\t\t\t\t//when the async function finishes, add the results to the combinedResults and return information required to locate and remove the promise from the array\n\t\t\t\t\t\t//do not remove the promise from the array here or it can cause the Promise.race() to fail\n\t\t\t\t\t\tcombinedResults[capturedIndex] = results;\n\t\t\t\t\t\treturn { promise }; //encapsulate the promise in an object, or Promise.race() will resolve incorrectly\n\t\t\t\t\t},\n\t\t\t\t\terror => {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tpendingFunctions.push(promise);\n\t\t\t}\n\n\t\t\t//wait for any pending Promise to finish, then call this function again to kick off the next function waiting\n\t\t\tPromise.race(pendingFunctions)\n\t\t\t\t.then(results => {\n\t\t\t\t\t//remove race winning promise from pending array\n\t\t\t\t\tpendingFunctions = pendingFunctions.filter(p => p !== results.promise);\n\t\t\t\t\tprocessNext();\n\t\t\t\t})\n\t\t\t\t.catch(msg => {\n\t\t\t\t\treject(msg);\n\t\t\t\t});\n\t\t};\n\n\t\t//kick the processing off\n\t\tprocessNext();\n\t});\n};\n","class URLHelper {\n\tparseSearchUrlForValue(name: string, url?: string): string | undefined {\n\t\tif (!url) {\n\t\t\turl = window.location.href;\n\t\t}\n\t\tname = name.replace(/[[\\]]/g, '\\\\$&');\n\t\tconst regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`),\n\t\t\tresults = regex.exec(url);\n\t\tif (!results) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!results[2]) {\n\t\t\treturn '';\n\t\t}\n\t\treturn decodeURIComponent(results[2].replace(/\\+/g, ' '));\n\t}\n\n\tparseSearchUrlForValueAsIs(key: string, searchUrl: string) {\n\t\tconst keyIndex: number = searchUrl.indexOf(key);\n\t\tconst valueString = searchUrl.slice(keyIndex);\n\t\tconst startOfValue = valueString.indexOf(`${key}=`) + key.length + 1;\n\t\tlet endOfValue = valueString.indexOf('&');\n\t\tif (endOfValue === -1) {\n\t\t\tendOfValue = valueString.length;\n\t\t}\n\t\treturn valueString.slice(startOfValue, endOfValue);\n\t}\n\n\t//take our url and grab the search string and break it up into an dictionary\n\tgetSearchUrlAsObject(location?: Location): Record {\n\t\t//Turn:\n\t\t// \"?[key]=[value]&[key]=[value]\"\n\t\t//to\n\t\t// {[key]:[value], [key]:[value]}\n\t\tconst searchValuesObj: Record = {};\n\t\tlet searchString = '';\n\t\t//if we pass in a location use that, otherwise use the current window location.\n\t\tif (location !== undefined) {\n\t\t\tsearchString = location.search;\n\t\t} else {\n\t\t\tsearchString = window.location.search;\n\t\t}\n\t\t//if no search string is provided then just exit with an empty dictionary object\n\t\tif (searchString.indexOf('?') === -1) {\n\t\t\treturn {};\n\t\t}\n\t\t//pull out all the values to be parsed individually for their key and value\n\t\tconst arrayOfValues: Array = searchString.split('?')[1].split('&');\n\t\tarrayOfValues.forEach((searchValueString: string) => {\n\t\t\tconst key = decodeURIComponent(searchValueString.slice(0, searchValueString.indexOf('=')));\n\t\t\tconst value = decodeURIComponent(searchValueString.slice(searchValueString.indexOf('=') + 1));\n\t\t\tsearchValuesObj[key] = value;\n\t\t});\n\t\treturn searchValuesObj;\n\t}\n\n\t// regex taken from jquery-validation library\n\tisValidURL(str: string) {\n\t\treturn /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test(\n\t\t\tstr\n\t\t);\n\t}\n}\n\nconst urlHelper: URLHelper = new URLHelper();\nexport default urlHelper;\n","/**\n * Wrapper utility to see if an object/dictionary has a property key\n */\nexport function Has(object: unknown, key: string): boolean {\n\treturn Object.prototype.hasOwnProperty.call(object, key);\n}\n","/**\n * Helper class to have static functions to interact with local storage.\n * Local Storage exists until the browser cache is cleared. So anything\n * saved in local storage will persist between windows and tabs being closed.\n */\nexport class LocalStorageHelper {\n\t/**\n\t * Saves a value or object to the local storage as a string.\n\t * @param key Lookup value of what is being saved.\n\t * @param item Object or value to be stored as a string.\n\t */\n\tstatic Save(key: string, item: unknown): void {\n\t\tif (!HasWindowLocalStorage()) {\n\t\t\treturn;\n\t\t}\n\n\t\t//strings are already valid, and other primitives get automatically stringified\n\t\tif (isPrimitiveValue(item)) {\n\t\t\tlocalStorage.setItem(key, item as string);\n\t\t} else {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(item));\n\t\t}\n\t}\n\n\t/**\n\t * Loads a value from local storage and parses it.\n\t * @param key Lookup value of what is to be read from local storage.\n\t */\n\tstatic Load(key: string): any {\n\t\tif (!HasWindowLocalStorage()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = localStorage.getItem(key);\n\n\t\t//intended to match the localStorage[key] access method\n\t\t//getItem returns null for nonexistent values, localStorage[key] returns undefined\n\t\tif (data === null) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (isParseableValue(data)) {\n\t\t\ttry {\n\t\t\t\tconst parsedData = JSON.parse(data);\n\n\t\t\t\t// TEMPORARY - strings were being \"extra\" stringified on save and that was messing with PCR9\n\t\t\t\t// BUT - PCR10 is now dependent on getting correct types back from this helper, which was done by stringifying EVERYTHING.\n\t\t\t\t// The issue of preexisting double-stringified values is rectified here. This if() block can be removed with time.\n\t\t\t\tif (typeof parsedData === 'string') {\n\t\t\t\t\tconsole.warn('[CONVERTED AN ERRANT VALUE IN LOCALSTORAGE: ', key, '] [Before: ', data, '] [After: ', parsedData, ']');\n\t\t\t\t\tLocalStorageHelper.Save(key, parsedData);\n\t\t\t\t}\n\t\t\t\treturn parsedData;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(`[LocalStorageHelper]: Error loading from key ${key}, attempted to parse data: ${data}`, e);\n\t\t\t}\n\t\t} else {\n\t\t\treturn data;\n\t\t}\n\t}\n\n\t/**\n\t * Keep local storage clean using this function to pick out what no longer needs stored.\n\t * @param key Lookup value of what to remove from local storage.\n\t */\n\tstatic Remove(key: string): void {\n\t\tif (!HasWindowLocalStorage()) {\n\t\t\treturn;\n\t\t}\n\t\tlocalStorage.removeItem(key);\n\t}\n\n\t/**\n\t * Clear out all values in local storage. BE CAREFULL as this may not be wise to\n\t * remove all data from local storage.\n\t */\n\tstatic RemoveAll(): void {\n\t\tif (!HasWindowLocalStorage()) {\n\t\t\treturn;\n\t\t}\n\t\tlocalStorage.clear();\n\t}\n}\n\n/**\n * Helper for checking window for localstorage\n * @returns True if there is a window obj with localstorage on it.\n */\nfunction HasWindowLocalStorage(): boolean {\n\tif (globalThis?.window?.localStorage === undefined) {\n\t\tconsole.warn(`No window object with localstorage`);\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Checks if a value is primitive.\n * This will return false if the value is an object, array, function, etc.\n */\nfunction isPrimitiveValue(value: unknown): boolean {\n\treturn !(typeof value === 'object' && value !== null);\n}\n\n/**\n * This is a stupid band-aid. LocalStorage is string-only, so here's my attempt at getting the types back.\n * - Wayne\n */\nfunction isParseableValue(value: string): boolean {\n\t//'undefined' does NOT parse\n\tif (value === undefined || value === 'undefined' || value === null) {\n\t\treturn false;\n\t}\n\n\t//'null' will parse to null\n\tif (value === 'null') {\n\t\treturn true;\n\t}\n\n\t// A \"questionable character\" - a precursor to a stringified object/array\n\t// We've gotta stop storing objects in localStorage\n\tconst qc = value?.[0];\n\n\treturn (\n\t\tqc &&\n\t\t(qc === '[' ||\n\t\t\tqc === '{' ||\n\t\t\tqc === '\"' ||\n\t\t\tvalue === 'true' ||\n\t\t\tvalue === 'false' ||\n\t\t\t// NaN is a number, because... reasons.\n\t\t\t//If you have to modify this, be careful and read the w3 docs.\n\t\t\t!Number.isNaN(Number(value)))\n\t);\n}\n","import { Session } from '@mst/global';\nimport { IApertureBlueprint } from '@mst/ui/lib/Apertures/Aperture';\nimport { QuickSearchRecentSearches } from '@mst/api/models/RecentlyViewedRecords';\nimport { LogicElementSearch } from '../../../../../apps/web/src/controls/comps/savedQueries/LogicBubble';\n\n/* ------------------------------------------------------------------------------------------\n * NOTE: To add a store, follow the instructions in the comments of this file in order.\n * If you need to add a store WITHOUT extra indices, follow the instructions labeled with (a)\n * If you need to add a store WITH extra indices, follow the instructions labeled with (b)\n * ------------------------------------------------------------------------------------------ */\n\n/**\n * DO NOT MODIFY - keys required on ALL UserStorage stores\n *\n * pair of keys required on all user stores that isolate data by\n * the username and database that it is related to.\n */\nconst REQUIRED_INDICES = ['username_idxdb', 'database_idxdb'];\n\n/**\n * DO NOT MODIFY - label data for keys required on ALL UserStorage stores\n *\n * pairs of label data used for setting up stores\n */\nconst USERKEYS = [\n\t{\n\t\tkey: 'username_idxdb',\n\t\tlabel: 'Username'\n\t},\n\t{\n\t\tkey: 'database_idxdb',\n\t\tlabel: 'Database'\n\t}\n];\n\n/**\n * The list of key names of stores in UserStorage which can be keyed by username/db\n *\n * 1(a). Name Your Store Here.\n */\nconst DEFAULT_INDEX_STORES = ['theme', 'session'] as const;\n\n/**\n * The list of key names of stores in UserStorage which can be keyed by username/db\n */\nexport type DefaultIndexStore = (typeof DEFAULT_INDEX_STORES)[number];\n\n/**\n * The list of key names of stores in UserStorage which require other keys (like ID) to be uniquely identified\n *\n * 1(b). Name Your Store Here.\n */\nconst ADDITIONAL_INDEX_STORES = ['blueprint-drafts', 'qs-recently-searched', 'record-search'] as const;\n\n/**\n * The list of key names of stores in UserStorage which require other keys (like ID) to be uniquely identified\n */\nexport type ExtraIndexStore = (typeof ADDITIONAL_INDEX_STORES)[number];\n\n/**\n * Union type of store names in UserStorage\n */\nexport type StoreName = (typeof DEFAULT_INDEX_STORES)[number] | (typeof ADDITIONAL_INDEX_STORES)[number];\n\n/*\n * Extra interfaces\n * This should rarely be necessary.\n * The item being stored is a boolean value and needs to live inside an object.\n */\n\ninterface ThemeStorage {\n\tisDark: boolean;\n}\n\n/**\n * Conditional type used to determine the data type in a store from its key\n *\n * 2(a+b). Add an extra condition to this conditional type. Key on the left, data you're storing on the right.\n */\nexport type StoreType = T extends 'session'\n\t? Partial\n\t: T extends 'theme'\n\t\t? ThemeStorage\n\t\t: T extends 'blueprint-drafts'\n\t\t\t? IApertureBlueprint\n\t\t\t: T extends 'qs-recently-searched'\n\t\t\t\t? QuickSearchRecentSearches\n\t\t\t\t: T extends 'record-search'\n\t\t\t\t\t? LogicElementSearch\n\t\t\t\t\t: never;\n\n/**\n * Additional indices for each store (req'd even if empty, see readme)\n *\n * 3(a+b). Define storage indices\n */\nexport const STORE_KEYS: { [key in StoreName]: readonly string[] } = {\n\t'blueprint-drafts': ['id'] as const,\n\t'qs-recently-searched': [] as const,\n\t'record-search': ['id'] as const,\n\ttheme: [] as const,\n\tsession: [] as const\n} as const;\n\n/**\n * Conditional type used to determine whether or not additional keys need to be provided.\n * 3(b):\n */\nexport type StoreIndexType = T extends 'blueprint-drafts'\n\t? { id: string }\n\t: T extends 'record-search'\n\t\t? { id: string }\n\t\t: never;\n\n/**\n * Upgrades the UserData database when a versioning difference is detected.\n * If you need to make a change, PLEASE SEE THE README.\n * DO NOT modify upgrades for previous versions.\n *\n * 4(a+b). Append \"if\" block to the end of this function with migration code\n */\nexport function upgradeUserDatabase(event: IDBVersionChangeEvent): void {\n\tconsole.info('[IndexedDB] Incorrect DB Version found upgrading...', event);\n\tconst dbToUpgrade = event.target.result;\n\n\t/** 20965\n\t * IndexedDB Initialization Code (migration 0)\n\t */\n\tif (event.oldVersion < 1) {\n\t\t/*\n\t\t * SESSIONS\n\t\t */\n\n\t\t//Create a store, indexed by the required indices\n\t\tconst sessionStore = dbToUpgrade.createObjectStore('session', {\n\t\t\tkeyPath: [...REQUIRED_INDICES]\n\t\t});\n\n\t\t//For each key listed in the keyPath, it must be added as an index. Here, we're doing the required indices.\n\t\tUSERKEYS.forEach(primaryIndex => {\n\t\t\tsessionStore.createIndex(primaryIndex.label, primaryIndex.key, {\n\t\t\t\tunique: false\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * THEME\n\t\t */\n\n\t\t//Create a store, indexed by the required indices\n\t\tconst themeStore = dbToUpgrade.createObjectStore('theme', {\n\t\t\tkeyPath: [...REQUIRED_INDICES]\n\t\t});\n\n\t\t//For each key listed in the keyPath, it must be added as an index.\n\t\tUSERKEYS.forEach(primaryIndex => {\n\t\t\tthemeStore.createIndex(primaryIndex.label, primaryIndex.key, {\n\t\t\t\tunique: false\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * BLUEPRINTS\n\t\t */\n\n\t\t//Create a store, indexed by the required indices (username, password) and any other unique/identifying information\n\t\tconst blueprintStore = dbToUpgrade.createObjectStore('blueprint-drafts', {\n\t\t\t//A user can have many blueprints, so the blueprint ID must be part of the key path. Think of these as primary keys.\n\t\t\tkeyPath: [...REQUIRED_INDICES, ...STORE_KEYS['blueprint-drafts']]\n\t\t});\n\n\t\t//For each key listed in the keyPath, it must be added as an index. Here, we're doing the required indices.\n\t\tUSERKEYS.forEach(primaryIndex => {\n\t\t\tblueprintStore.createIndex(primaryIndex.label, primaryIndex.key, {\n\t\t\t\tunique: false\n\t\t\t});\n\t\t});\n\n\t\t//Add the other indices for the given store.\n\t\t//You might think this should be unique, but multiple users can have different blueprints with the same ID.\n\t\t//The COMBINATION of username, password, and blueprint ID serve as our 'primary key' here. Other implementations may warrant a unique index.\n\t\tblueprintStore.createIndex('blueprint-id', 'id', {\n\t\t\tunique: false\n\t\t});\n\t}\n\tif (event.oldVersion < 4) {\n\t\t// remove object store that was never used but may have been added in association with a spec that was ultimately changed\n\t\tif (dbToUpgrade.objectStoreNames.contains('recently-viewed')) {\n\t\t\tdbToUpgrade.deleteObjectStore('recently-viewed');\n\t\t}\n\n\t\t/**\n\t\t * QUICKSEARCH RECENTLY SEARCHED\n\t\t */\n\n\t\t//Create a store, indexed by the required indices (username, password) and any other unique/identifying information\n\t\tconst recentlyViewedStore = dbToUpgrade.createObjectStore('qs-recently-searched', {\n\t\t\tkeyPath: [...REQUIRED_INDICES, ...STORE_KEYS['qs-recently-searched']]\n\t\t});\n\n\t\t//For each key listed in the keyPath, it must be added as an index. Here, we're doing the required indices.\n\t\tUSERKEYS.forEach(primaryIndex => {\n\t\t\trecentlyViewedStore.createIndex(primaryIndex.label, primaryIndex.key, {\n\t\t\t\tunique: false\n\t\t\t});\n\t\t});\n\t}\n\t/**\n\t * 4(a+b). Add Additonal Schema Changes here\n\t *\n\t * if (event.oldVersion < #) {\n\t * // modifications and migration code here\n\t * }\n\t */\n\tif (event.oldVersion < 3) {\n\t\t/**\n\t\t * Record Search\n\t\t */\n\t\tconst recordSearchStore = dbToUpgrade.createObjectStore('record-search', {\n\t\t\tkeyPath: [...REQUIRED_INDICES, ...STORE_KEYS['record-search']]\n\t\t});\n\t\tUSERKEYS.forEach(primaryIndex => {\n\t\t\trecordSearchStore.createIndex(primaryIndex.label, primaryIndex.key, {\n\t\t\t\tunique: false\n\t\t\t});\n\t\t});\n\t\trecordSearchStore.createIndex('record-search-id', 'id', {\n\t\t\tunique: false\n\t\t});\n\t}\n}\n\n/**\n * The Database number constant used to understand what version of the front-end's\n * IndexedDB schema is the current version.\n *\n * 5(a+b). Increment the DATABASE_VERSION +1\n */\nexport const DATABASE_VERSION = 4;\n","import { Session } from '@mst/global';\nimport {\n\tDATABASE_VERSION,\n\tSTORE_KEYS,\n\tStoreIndexType,\n\tStoreName,\n\tStoreType,\n\tDefaultIndexStore,\n\tExtraIndexStore,\n\tupgradeUserDatabase\n} from './migrations';\n\n/**\n * IndexedDB wrapper class for storing and accessing user data.\n * Requires a strictly enforced schema\n */\nclass UserStorageUtility {\n\tdb: IDBDatabase;\n\n\tasync Connect(): Promise {\n\t\tif (!this.db) {\n\t\t\tconst db = await createOrLoadDatabase();\n\t\t\tthis.db = db;\n\t\t}\n\t}\n\n\t/**\n\t * Inserts or updates a value to the table (named as key) into a database\n\t * Keys which are indexed are required in the value parameter.\n\t * (Are multiple items for the same user in this store? If so, there are indexed keys. See Readme.)\n\t * @param store - The name of the store to be saved to. Must be configured in ./migrations. See Readme.\n\t * @param value - Must contain at minimum any fields which are indexed.\n\t * If there are multiple entries for a given user/db in the store, there are indexed fields. See Readme for more info.\n\t */\n\tasync Save>(store: T, value: U): Promise {\n\t\treturn insertValue(store, value, await this.db);\n\t}\n\t/**\n\t * Gets a value from a store in the UserData database\n\t * Any additional indexes must be provided via keyData.\n\t * (Are multiple items for the same user in this store? If so, you need to provide keyData. See Readme.)\n\t * @param store - The name of the store to be loaded from. Must be configured in ./migrations. See readme.\n\t * @param keyData - Must contain any fields which are indexed.\n\t * If there are multiple entries for a given user/db in the store, there are indexed fields. See Readme for more info.\n\t */\n\tasync Load, V extends StoreType>(store: T, keyData: U): Promise;\n\tasync Load>(store: T, keyData?: U): Promise;\n\tasync Load, V>(store: T, keyData?: U): Promise {\n\t\treturn getValue(store, await this.db, keyData) as V;\n\t}\n\t/**\n\t * deletes a value from a store in the UserData database.\n\t * Any additional indexes must be provided via keyData.\n\t * (Are multiple items for the same user in this store? If so, you need keyData. See Readme.)\n\t * @param store - The name of the store to delete an entry from. Must be configured in ./migrations. See readme.\n\t * @param keyData - Must contain any fields which are indexed.\n\t * If there are multiple entries for a given user/db in the store, there are indexed fields. See Readme for more info.\n\t */\n\tasync Delete, V extends StoreType>(store: T, keyData: U): Promise;\n\tasync Delete>(store: T, keyData?: U): Promise;\n\tasync Delete>(store: T, keyData?: U): Promise {\n\t\treturn deleteValue(store, await this.db, keyData);\n\t}\n}\n\nexport const UserStorage = new UserStorageUtility();\n\n/**\n * Creates a database, or loads it if one already exists\n */\nasync function createOrLoadDatabase(): Promise {\n\tconst promise = new Promise((resolve, reject) => {\n\t\t//request database to be opened. It's created if it doesn't exist.\n\t\tconst request = indexedDB.open('PCRUserStorage', DATABASE_VERSION);\n\n\t\t//something went bad when loading/creating db\n\t\trequest.onerror = (event: Event) => {\n\t\t\tconsole.error(`Database error: ${(event.target as IDBOpenDBRequest)?.error}`);\n\t\t\treject(event.target?.error);\n\t\t};\n\n\t\t//db was loaded and was the expected version\n\t\trequest.onsuccess = (event: Event) => {\n\t\t\tresolve((event.target as IDBOpenDBRequest).result);\n\t\t};\n\n\t\t//db loaded, but needs upgraded. Brand new DB or versioning difference fires this.\n\t\trequest.onupgradeneeded = upgradeUserDatabase;\n\t});\n\n\treturn await promise;\n}\n\n/**\n * Extracts indexed key values from a provided object.\n * All unique identifying information must be present to access data.\n * Raises an error if an indexed key is missing.\n */\nfunction getIndexedInformationFromObject(storeName: T, object?: Partial>): string[] {\n\tconst keyValues: string[] = [];\n\t//If there are required keys and none were provided, throw an error, as there isn't enough data to act on the store.\n\tif (!object && STORE_KEYS[storeName].length) {\n\t\tthrow new Error(\n\t\t\t`No required keys were provided for accessing IndexedDB. Store ${storeName} requires the following keys to access its data: ${STORE_KEYS[storeName]}`\n\t\t);\n\t}\n\t//For each key, ensure a value exists. If it does not, throw an error, as there isn't enough data to act on the store.\n\tfor (const key of STORE_KEYS[storeName]) {\n\t\tif (object?.[key] !== null && typeof object?.[key] !== 'undefined') {\n\t\t\tkeyValues.push(object[key]);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Not all required keys are populated on a record that was saved to IndexedDB. Store ${storeName} requires key ${key} to access its data.`\n\t\t\t);\n\t\t}\n\t}\n\n\treturn keyValues;\n}\n\n/**\n * Inserts or updates a value to the table (named as key) into a database\n * Keys which are indexed are required in the value parameter.\n * (Are multiple items for the same user in this store? If so, there are indexed keys. See Readme.)\n */\nasync function insertValue>(storeName: T, value: U, db: IDBDatabase): Promise {\n\t//bail if no user/db - you aren't getting data anyways\n\tif (!Session.username || !Session.databaseId) {\n\t\tconsole.warn(`Attempted to acces UserStorage, but no user was found. Bypassed access of key: ${storeName}`);\n\t\treturn undefined;\n\t}\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst store = db.transaction(storeName, 'readwrite').objectStore(storeName);\n\n\t\t//check that all indices are present. If they are not, an error is thrown.\n\t\tconst keyValues = getIndexedInformationFromObject(storeName, value);\n\n\t\t//check for existing value\n\t\tconst request = store.get([Session.username?.toUpperCase(), Session.databaseId?.toUpperCase(), ...keyValues]);\n\t\trequest.onsuccess = (event: Event) => {\n\t\t\tconst oldDataset: T & { username_idxdb: string; database_idxdb: string } = (event.target as IDBRequest).result;\n\n\t\t\t//If existing, need to modify that entry\n\t\t\tif (oldDataset) {\n\t\t\t\tconst { username_idxdb, database_idxdb } = oldDataset;\n\t\t\t\tstore.put({\n\t\t\t\t\t...value,\n\t\t\t\t\tusername_idxdb,\n\t\t\t\t\tdatabase_idxdb\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//Else, create a new one\n\t\t\tstore.add({\n\t\t\t\t...value,\n\t\t\t\tusername_idxdb: Session.username?.toUpperCase(),\n\t\t\t\tdatabase_idxdb: Session.databaseId?.toUpperCase()\n\t\t\t});\n\t\t};\n\n\t\tstore.transaction.oncomplete = () => {\n\t\t\tresolve();\n\t\t};\n\t\tstore.transaction.onerror = (event: Event) => {\n\t\t\treject(`IndexedDB Error: ${event.target.error}`);\n\t\t};\n\t});\n}\n\n/**\n * Gets a value from a store in the UserData database\n * Any additional indexes for the given store must be provided via keyData.\n * (Are multiple items for the same user in this store? If so, you need keyData. See Readme.)\n */\nasync function getValue, V extends StoreType>(\n\tstoreName: T,\n\tdb: IDBDatabase,\n\tkeyData?: U\n): Promise {\n\t//bail if no user/db - you aren't getting data anyways\n\tif (!Session.username || !Session.databaseId) {\n\t\tconsole.warn(`Attempted to acces UserStorage, but no user was found. Bypassed access of key: ${storeName}`);\n\t\treturn undefined;\n\t}\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst keyValues = getIndexedInformationFromObject(storeName, keyData);\n\n\t\tconst request = db\n\t\t\t.transaction(storeName)\n\t\t\t.objectStore(storeName)\n\t\t\t.get([Session.username?.toUpperCase(), Session.databaseId?.toUpperCase(), ...keyValues]);\n\t\trequest.onsuccess = (event: Event) => {\n\t\t\tconst result = (event.target as IDBRequest).result;\n\t\t\tif (result) {\n\t\t\t\tconst { username_idxdb, database_idxdb, ...data } = result;\n\t\t\t\tresolve(data);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve(undefined as V);\n\t\t};\n\t\trequest.onerror = (event: Event) => {\n\t\t\treject(`IndexedDB Error: ${event.target.error}`);\n\t\t};\n\t});\n}\n\n/**\n * deletes a value from a store in the UserData database.\n * Any additional indexes must be provided via keyData.\n * (Are multiple items for the same user in this store? If so, you need keyData. See Readme.)\n */\nasync function deleteValue>(\n\tstoreName: T,\n\tdb: IDBDatabase,\n\tkeyData?: U\n): Promise {\n\t//bail if no user/db - you aren't getting data anyways\n\tif (!Session.username || !Session.databaseId) {\n\t\tconsole.warn(`Attempted to acces UserStorage, but no user was found. Bypassed access of key: ${storeName}`);\n\t\treturn undefined;\n\t}\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst keyValues = getIndexedInformationFromObject(storeName, keyData);\n\n\t\tconst request = db\n\t\t\t.transaction(storeName, 'readwrite')\n\t\t\t.objectStore(storeName)\n\t\t\t.delete([Session.username?.toUpperCase(), Session.databaseId?.toUpperCase(), ...keyValues]);\n\t\trequest.onsuccess = (_event: Event) => {\n\t\t\tresolve();\n\t\t};\n\t\trequest.onerror = (event: Event) => {\n\t\t\treject(`IndexedDB Error: ${event.target.error}`);\n\t\t};\n\t});\n}\n\n/**\n * Syntax testing - leave these here!\n * If any of the usages below become underlined, there's an issue.\n *\n * Lines expected to error are marked with @ts-expect-error-next-line, so they will only underline when they aren't raising an error.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n// function lintingTestFunction() {\n// \t//Try saving with and without necessary data\n// \t// biome-ignore lint/correctness/noUnusedVariables: \n// \tlet x = UserStorage.Save('blueprint-drafts', { id: 'hello', recordType: 'name', views: [] });\n// \t// biome-ignore lint/correctness/noUnusedVariables: \n// \tlet y = UserStorage.Save('blueprint-drafts');\n// \t// biome-ignore lint/correctness/noUnusedVariables: \n// \tlet a = UserStorage.Save('session', { username: 'jeff', password: 'bob' });\n// \t// biome-ignore lint/correctness/noUnusedVariables: \n// \tlet z = UserStorage.Save('session'); // eslint-disable-line @typescript-eslint/no-unused-vars\n\n// \t//try loading with and without necessary keys\n// \tx = UserStorage.Load('blueprint-drafts', { id: 'hello' }); // eslint-disable-line @typescript-eslint/no-unused-vars\n// \t// @ts-expect-error-next-line\n// \ty = UserStorage.Load('blueprint-drafts'); // eslint-disable-line @typescript-eslint/no-unused-vars\n// \tz = UserStorage.Load('session'); // eslint-disable-line @typescript-eslint/no-unused-vars\n// \t// @ts-expect-error-next-line\n// \ta = UserStorage.Load('session', {}); // eslint-disable-line @typescript-eslint/no-unused-vars\n\n// \t//try deleting with and without necessary keys\n// \tx = UserStorage.Delete('blueprint-drafts', { id: 'hello' }); // eslint-disable-line @typescript-eslint/no-unused-vars\n// \t// @ts-expect-error-next-line\n// \ty = UserStorage.Delete('blueprint-drafts'); // eslint-disable-line @typescript-eslint/no-unused-vars\n// \tz = UserStorage.Delete('session'); // eslint-disable-line @typescript-eslint/no-unused-vars\n// \t// @ts-expect-error-next-line\n// \ta = UserStorage.Delete('session', {}); // eslint-disable-line @typescript-eslint/no-unused-vars\n// }\n","import { Session } from '@mst/global';\n\n/**\n * This function helps determine if a userId belongs to a PCR user or a web extension/jobboard user.\n * PCR users are 10 characters or less and are alpha numeric.\n * Registered web extension are 15 digit numbers (which is their candidateId).\n * Anonymous web extension users have the word \"PUBLIC\" or \"WEBGUEST\" depending on what section they logged in under.\n * @param userId\n * @param detectAnonymousWebExtensionLogin\n * @returns\n * @todo Move to security code/module once that has been determined\n */\nexport const isIdentification = (userId: string | number, detectAnonymousWebExtensionLogin?: boolean): boolean => {\n\tif (!userId) {\n\t\treturn false;\n\t}\n\tconst strId = userId.toString();\n\tswitch (strId.substring(0, 1)) {\n\t\tcase '{':\n\t\tcase '[':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\tif (strId.length > 10 && strId === parseInt(strId).toString()) {\n\t\t\t\treturn true;\n\t\t\t} else if (detectAnonymousWebExtensionLogin) {\n\t\t\t\tswitch (strId) {\n\t\t\t\t\tcase 'PUBLIC':\n\t\t\t\t\tcase 'WEBGUEST':\n\t\t\t\t\tcase 'pcrCOOKIE':\n\t\t\t\t\tcase '0':\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn false;\n};\n\n/**\n * This determines if the current user session belongs to a PCR user or a web extension/jobboard user.\n * @returns\n * @todo Move to security code/module once that has been determined\n */\nexport const isWebUser = (): boolean => {\n\treturn isIdentification(Session.username, true);\n};\n","/**\n * Helper function to clean up the final class string and remove any unwanted formatting pieces used for organization in the code.\n * @param classStr string of class names for html class assignment; Could have newlines, tabs, extraspaces\n * @returns string of class names for html class assignment with newlines, tabs, and extra spaces cleaned out\n */\nexport function cleanHTMLClasses(classStr: string): string {\n\ttry {\n\t\treturn classStr\n\t\t\t.replaceAll(/\\s+/g, ' ') // Replace all sequences of whitespace characters with a single space\n\t\t\t.trim(); // Remove leading and trailing whitespace\n\t} catch (e) {\n\t\tconsole.error('Error cleaning the html class string, see error:', e);\n\t}\n}\n","/**\n * Wait till a certain value is ran and then run a side effect, using setTimeout\n * @param callbackToRun A function to run once we have met our whenTrue check of true\n * @param whenTrue Checks if the we are ready to run our callback.\n * @param time Defaults to 0 but if you want to provide a longer timeout you can.\n */\nexport function RunWhen(callbackToRun: () => void, whenTrue: () => boolean, time?: number): void {\n\tconst timeoutLength = time ?? 0;\n\tconst timeout = () =>\n\t\tsetTimeout(() => {\n\t\t\tif (whenTrue()) {\n\t\t\t\tcallbackToRun();\n\t\t\t} else {\n\t\t\t\ttimeout();\n\t\t\t}\n\t\t}, timeoutLength);\n\ttimeout();\n}\n","/* eslint-disable no-restricted-globals */\n\n/**\n * Function to return an element given a location in the viewport.\n * @param doc - document the element lives in\n * @param x - location to look at in x coordinates\n * @param y - location to look at in y coordinates\n */\nexport function getElementInDocumentAtCoords(doc: Document, x: number, y: number): Element {\n\treturn doc.elementFromPoint(x, y);\n}\n\n/**\n * Selects all text of a given element\n * @param {HTMLElement} element\n */\nexport const selectText = (element: HTMLElement): void => {\n\tif (window.getSelection && document.createRange) {\n\t\t//Browser compatibility\n\t\tconst sel: Selection = window.getSelection();\n\t\tconst range: Range = document.createRange(); //range object\n\t\trange.selectNodeContents(element); //sets Range\n\t\tsel.removeAllRanges(); //remove all ranges from selection\n\t\tsel.addRange(range); //add Range to a Selection.\n\t}\n};\n\n/**\n * Add/Remove events to all frames\n * @param eventType\n * @param handler\n * @param remove\n */\nexport const listenOnAllDocuments = (eventType: string, handler: (e) => void, remove?: boolean): void => {\n\t//Add to top window\n\twindow.top.document[remove ? 'removeEventListener' : 'addEventListener'](eventType, handler, true);\n\n\tlet frames = Array.from(window.top.frames);\n\n\tframes.forEach(fr => {\n\t\t//Add any inner frames to list\n\t\tframes = frames.concat(Array.from(fr.frames));\n\t});\n\n\tframes.forEach(fr => {\n\t\t//Add listeners to all frames\n\t\tfr.document[remove ? 'removeEventListener' : 'addEventListener'](eventType, handler, true);\n\t});\n};\n\n/**\n * Helper for getting a particular detail of offset info for a given frame based on document.body position\n * @param elementToFindOffsetOn element of concern where we are looking to offset by, most likely window.document.body or top.document.body\n * @param side which piece of the frame do we want the offset of\n * @returns number value representing the offset\n */\nexport function getFrameOffset(elementToFindOffsetOn: HTMLElement, side: 'top' | 'left' | 'right' | 'bottom'): number {\n\tlet offset = 0;\n\n\t/**\n\t * Recursive function to walk up the stack of windows to find the total offset\n\t * @param win\n\t * @returns\n\t */\n\tfunction WalkthroughWindows(el: HTMLElement) {\n\t\tif (el === top.document.body) {\n\t\t\t//assuming body is 0,0 coordinate\n\t\t\treturn;\n\t\t} else if (el === el.ownerDocument.body && el.ownerDocument.defaultView !== top) {\n\t\t\t//offset to local body, now check to offset by iframe\n\t\t\toffset += el.ownerDocument?.defaultView?.frameElement?.getBoundingClientRect()[side] ?? 0;\n\t\t\tWalkthroughWindows(el.ownerDocument.defaultView.frameElement.closest('body'));\n\t\t} else {\n\t\t\t//grab offset to current document body then offset from parent body elements from all frames.\n\t\t\toffset += el.getBoundingClientRect()[side] ?? 0;\n\t\t\tWalkthroughWindows(el.ownerDocument.body);\n\t\t}\n\t}\n\tWalkthroughWindows(elementToFindOffsetOn);\n\treturn offset;\n}\n","/**\n * Used to get the capture body for portaled content.\n * @returns the body of the Capture iFrame document.\n */\nexport const GetCaptureBody = (): HTMLElement => {\n\treturn document?.getElementById('crx-root')?.shadowRoot?.querySelector('iframe')?.contentWindow?.document?.body;\n};\n","const xlate = (text: string): string => {\n\t/*xlate logic */\n\treturn text;\n};\n\nexport default xlate;\n","import * as React from 'react';\nimport { Observer } from 'mobx-react';\n\n/**\n * When using a spread operator for component props, this will wrap an Observe component around the desired component, and then perform the spread operator INSIDE the Observe
\n * This creates a barrier so the current component will not re-render/re-reconcile when creating a child component due to the spread operator\n * @param Component Choosen component to wrap with Observer higher order and to spread props into.\n * @param propsToSpread Props to spread into the above component.\n */\nexport const Spread = function (\n\tComponent: React.ComponentType,\n\tpropsToSpread: T\n): React.ReactElement | JSX.Element | null {\n\treturn {() => };\n};\n","import { z } from 'zod';\n\nexport class PcrDataValidations {\n\tstatic validateDecimalValue(suppliedValue: string): boolean {\n\t\tlet isValid: boolean = false;\n\t\tif (suppliedValue !== undefined && suppliedValue !== null && suppliedValue !== '') {\n\t\t\tif (isNaN(parseFloat(suppliedValue)) === false) {\n\t\t\t\tisValid = true;\n\t\t\t}\n\t\t}\n\t\treturn isValid;\n\t}\n\tstatic validateIntegerValue(suppliedValue: number): boolean {\n\t\tlet isValid: boolean = false;\n\t\tif (suppliedValue !== undefined && suppliedValue !== null) {\n\t\t\tif ((suppliedValue ^ 0) === suppliedValue) {\n\t\t\t\tisValid = true;\n\t\t\t}\n\t\t}\n\t\treturn isValid;\n\t}\n\t//need to create or use a library to use this - moment.js and Globalize don't mix, else we could just use that.\n\t//this makes sure you have a value, it is at least 4 characters, and checks if there are only letters and spaces.\n\t//this needs to be more complex, but this should at least drop out some of the completely invalid values.\n\t//make sure to leave parens out of the regex below or ensure (No End Date) is accounted for when translated.\n\tstatic isValidDate(suppliedValue: string): boolean {\n\t\tlet isValid: boolean = true;\n\t\tif (!suppliedValue) {\n\t\t\tisValid = false;\n\t\t} else if (suppliedValue.length < 4) {\n\t\t\tisValid = false;\n\t\t} else if (/^[a-zA-Z\\s]+$/.test(suppliedValue) === true) {\n\t\t\tisValid = false;\n\t\t}\n\t\treturn isValid;\n\t}\n\n\tstatic isValidEmail(suppliedValue: string): boolean {\n\t\t// Defining a schema for email validation using Zod https://www.npmjs.com/package/zod\n\t\tconst emailSchema = z.string().email();\n\t\ttry {\n\t\t\t// Validate email against the schema\n\t\t\temailSchema.parse(suppliedValue);\n\t\t\t// Email is valid\n\t\t\treturn true;\n\t\t} catch (_error) {\n\t\t\t// Email is invalid\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic isValidURL(suppliedValue: string): boolean {\n\t\tif (suppliedValue === undefined || suppliedValue.length <= 0) {\n\t\t\treturn true;\n\t\t}\n\t\tconst pattern = new RegExp(\n\t\t\t'^(https?:\\\\/\\\\/)?' + // protocol\n\t\t\t\t'((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.)+[a-z]{2,}|' + // domain name\n\t\t\t\t'((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))' + // OR ip (v4) address\n\t\t\t\t'(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+]*)*' + // port and path\n\t\t\t\t'(\\\\?[;&a-z\\\\d%_.~+=-]*)?' + // query string\n\t\t\t\t'(\\\\#[-a-z\\\\d_]*)?$',\n\t\t\t'i'\n\t\t); // fragment locator\n\t\treturn !!pattern.test(suppliedValue);\n\t}\n}\n","const BrowserHelper = {\n\tisIEorEdge: (): boolean => {\n\t\treturn BrowserHelper.isIE() || BrowserHelper.isEdge();\n\t},\n\tisIE: (): boolean => {\n\t\treturn navigator.appVersion.indexOf('Trident') > -1 && window.document['documentMode'] !== undefined;\n\t},\n\tisEdge: (): boolean => {\n\t\treturn navigator.appVersion.indexOf('Edge') > -1;\n\t},\n\tisSafari: (): boolean => {\n\t\treturn /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\t},\n\t/**\n\t * returns true only if mobile phone, tablets will return false\n\t */\n\tisMobile: (): boolean => {\n\t\tif (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\t/**\n\t * returns true if is a mobile phone or tablet\n\t */\n\tisTouchDevice: (): boolean => {\n\t\tif (navigator.platform === 'MacIntel' && navigator.maxTouchPoints && navigator.maxTouchPoints > 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\tisIOS: ()=> /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window),\n\tisStandalone: () => window.matchMedia('(display-mode: standalone)').matches || 'standalone' in window.navigator,\n\tisNotificationsAllowed: (): boolean => {\n\t\treturn !((BrowserHelper.isIOS() && !BrowserHelper.isStandalone()) || !('Notification' in window));\n\t}\n};\n\nexport default BrowserHelper;\n","import * as c2k from 'color2k';\nimport { FieldRecordType } from '@mst/api/models/ConfiguredField';\nimport { CORE_PALETTE } from '../../../../ColorPalette';\n\n/**\n * Returns the full hsla color definition from the parts of hsla\n */\nexport function colorInHsl(colorText: string, inFullHSLA?: boolean): string {\n\tconst [h, s, l, a] = c2k.parseToHsla(colorText);\n\tif (inFullHSLA) {\n\t\treturn c2k.hsla(h, s, l, a);\n\t}\n\n\treturn `${h}, ${s * 100}%, ${l * 100}%`;\n}\n\n/**\n * Takes in any color definition then outputs the hsl version but lighter.\n * @param color input color to modify\n * @param percent amount to lighten by, default 15%\n * @param inFullHSLA when true function returns a full color value, otherwise only hsl values returned\n * @returns\n * outputs: '123, 23%, 23%' or similar ||\n * outputs with inFullHSLA: 'hsla(123,23%,23%,1)'\n */\nexport function lighten(color: string, percent?: number, inFullHSLA?: boolean): string {\n\tconst DEFAULT_INCREASE = 15;\n\tif (inFullHSLA) {\n\t\treturn c2k.lighten(color, (percent ?? DEFAULT_INCREASE) / 100);\n\t}\n\tlet newColor = '';\n\t//convert whatever is passed in to our three hsl values\n\t//newColor = '123, 23%, 23%' or similar\n\tnewColor = colorInHsl(color);\n\t//split to get each value\n\tconst newColorSplit = newColor.split(',');\n\t//Grab the third value which represents the colors lightness.\n\tlet percentLightness = parseInt(newColorSplit[2]);\n\t//add lightness\n\tif (percent !== undefined) {\n\t\tpercentLightness += percent;\n\t} else {\n\t\tpercentLightness += DEFAULT_INCREASE;\n\t}\n\t//build output similar to colorInHsl output aka '123, 23%, 23%' or similar\n\tnewColor = `${newColorSplit[0]}, ${newColorSplit[1]}, ${percentLightness}%`;\n\treturn newColor;\n}\n\n/**\n * Takes in any color definition then outputs the hsl version but darker.\n * @param color input color to modify\n * @param percent amount to darken by, default 15%\n * @param inFullHSLA when true function returns a full color value, otherwise only hsl values returned\n * @returns\n * outputs: '123, 23%, 23%' or similar ||\n * outputs with inFullHSLA: 'hsla(123,23%,23%,1)'\n */\nexport function darken(color: string, percent?: number, inFullHSLA?: boolean): string {\n\tconst DEFAULT_INCREASE = 15;\n\tif (inFullHSLA) {\n\t\treturn c2k.darken(color, (percent ?? DEFAULT_INCREASE) / 100);\n\t}\n\tlet newColor = '';\n\t//convert whatever is passed in to our three hsl values\n\t//newColor = '123, 23%, 23%' or similar\n\tnewColor = colorInHsl(color);\n\t//split to get each value\n\tconst newColorSplit = newColor.split(',');\n\t//Grab the third value which represents the colors lightness.\n\tlet percentLightness = parseInt(newColorSplit[2]);\n\t//add lightness\n\tif (percent !== undefined) {\n\t\tpercentLightness -= percent;\n\t} else {\n\t\tpercentLightness -= DEFAULT_INCREASE;\n\t}\n\t//build output similar to colorInHsl output aka '123, 23%, 23%' or similar\n\tnewColor = `${newColorSplit[0]}, ${newColorSplit[1]}, ${percentLightness}%`;\n\treturn newColor;\n}\n\n/**\n * Get theme color key for a record type\n * @param fieldRecordType\n * @returns string key usable in the IThemePalette object\n */\nexport function getThemeKeyByRecordType(fieldRecordType: FieldRecordType): { light: string; dark: string } {\n\tif (fieldRecordType) {\n\t\tif (fieldRecordType === 'candidates') {\n\t\t\treturn { light: CORE_PALETTE.teal[500], dark: CORE_PALETTE.teal[500] };\n\t\t}\n\t\tif (fieldRecordType === 'companies') {\n\t\t\treturn { light: CORE_PALETTE.lavender[500], dark: CORE_PALETTE.lavender[500] };\n\t\t}\n\t\tif (fieldRecordType === 'positions') {\n\t\t\treturn { light: CORE_PALETTE.aqua[500], dark: CORE_PALETTE.aqua[500] };\n\t\t}\n\t}\n\treturn { light: CORE_PALETTE.blue[500], dark: CORE_PALETTE.blue[500] };\n}\n","import { Session } from '@mst/global';\n\n/**\n * Pass in any type of object,\n * if in PCR10 mode it will return an array with that object,\n * whereas PCR9 mode will return an empty array.\n *\n * When filling a menu array you MUST prefix this with the spread operator or it will not be effective!\n *\n * i.e.\n * const menuItems = [\n * {menu1},\n * {menu2},\n * ...skipWhenPCR9({menu3}),\n * {menu4}\n * ]\n */\nexport const skipWhenPCR9 = (i: T): T[] => (Session.appId === 'PCR9' ? [] : [i]);\n\n/**\n * Pass in any type of object,\n * if sec is true then return an array with that object, otherwise return and empty array\n *\n * When filling a menu array you MUST prefix this with the spread operator or it will not be effective!\n *\n * i.e.\n * const menuItems = [\n * {menu1},\n * {menu2},\n * ...checkSecurity({menu3}),\n * {menu4}\n * ]\n */\nexport const checkSecurity = (sec: boolean, o: T): T[] => (sec ? [o] : []);\n\n/**\n * Pass in any type of object,\n * if in PCR9 mode it will return an array with that object,\n * whereas PCR10 mode will return an empty array.\n *\n * When filling a menu array you MUST prefix this with the spread operator or it will not be effective!\n *\n * i.e.\n * const menuItems = [\n * {menu1},\n * {menu2},\n * ...onlyWhenPCR9({menu3}),\n * {menu4}\n * ]\n */\nexport const onlyWhenPCR9 = (i: T): T[] => (Session.appId === 'PCR9' ? [i] : []);\n","/**\n * Generate 15 digit unique ID (used for primary keys)\n *\n * Do not use this unless you absolutely need to, as the API will autogenerate primary keys and return them to you upon creation of a record\n *\n * @returns id as string\n */\nexport const IdentityStr = (): string => {\n\tif (window?.crypto) {\n\t\tconst buffer = new Uint8Array(15);\n\t\twindow.crypto.getRandomValues(buffer);\n\t\tlet id = String.fromCharCode(49 + (buffer[0] % 9));\n\t\tfor (let i = 1; i < 15; i++) {\n\t\t\tid += String.fromCharCode(48 + (buffer[i] % 10));\n\t\t}\n\t\treturn id;\n\t} else {\n\t\tlet id = '';\n\t\tconst characters = '0123456789';\n\t\tconst charactersLength = characters.length;\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\tid += characters.charAt(Math.floor(Math.random() * charactersLength));\n\t\t}\n\t\treturn id;\n\t}\n};\n\n/**\n * Generate 15 digit unique ID (used for primary keys)\n *\n * Do not use this unless you absolutely need to, as the API will autogenerate primary keys and return them to you upon creation of a record\n *\n * @returns id as number\n */\nexport const Identity = (): number => {\n\treturn parseInt(IdentityStr());\n};\n","import { DateTime } from 'luxon';\n\n/**\n * Date options based on the options used in the Intl Date browser object and is used by our help library Luxon.\n * See: https://devhints.io/wip/intl-datetime js date object cheatsheet.\n * See: https://moment.github.io/luxon/index.html for Luxon that builds a helpful wrapper around the native date object.\n */\nexport interface DateTimeOptions {\n\tweekday?: 'narrow' | 'short' | 'long';\n\tera?: 'narrow' | 'short' | 'long';\n\tyear?: 'numeric' | '2-digit';\n\tmonth?: 'numeric' | '2-digit' | 'narrow' | 'short' | 'long';\n\tday?: 'numeric' | '2-digit';\n\thour?: 'numeric' | '2-digit';\n\tminute?: 'numeric' | '2-digit';\n\tsecond?: 'numeric' | '2-digit';\n\ttimeZoneName?: 'short' | 'long';\n\n\t// Time zone to express it in\n\ttimeZone?: string;\n\t// Force 12-hour or 24-hour\n\thour12?: true | false;\n\n\t// Rarely-used options\n\thourCycle?: 'h11' | 'h12' | 'h23' | 'h24';\n\tformatMatcher?: 'basic' | 'best fit';\n\twhenInvalid?: any;\n}\n\n/**\n * Collection of formats made by building out an object of date options. ( See DateTimeOptions )\n */\nexport class DateTimeFormat {\n\tstatic LongDateTime12Hour: DateTimeOptions = {\n\t\tmonth: 'long',\n\t\tday: 'numeric',\n\t\tyear: 'numeric',\n\t\thour: 'numeric',\n\t\tminute: '2-digit',\n\t\thour12: true,\n\t\twhenInvalid: () => 'Invalid Date'\n\t};\n\n\t//Time only\n\t// 12:59:59 AM EDT\n\tstatic TimeLongTZ: DateTimeOptions = {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\ttimeZoneName: 'long',\n\t\twhenInvalid: () => '--:--:--'\n\t};\n\n\t// 12:59 AM EDT\n\tstatic TimeShortTZ: DateTimeOptions = {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\ttimeZoneName: 'short',\n\t\twhenInvalid: () => '--:-- ZZZ'\n\t};\n\n\t// 12:59:59 AM\n\tstatic TimeLong: DateTimeOptions = {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\twhenInvalid: () => '--:--:--'\n\t};\n\n\t// 12:59 AM\n\tstatic TimeShort: DateTimeOptions = {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\twhenInvalid: () => '--:--'\n\t};\n\n\t//Date only\n\t//January 01, 1111\n\tstatic DateTextLong: DateTimeOptions = {\n\t\tyear: 'numeric',\n\t\tmonth: 'long',\n\t\tday: '2-digit',\n\t\twhenInvalid: () => DateTime.local().toLocaleString(DateTimeFormat.DateSimple).replace(/[0-9]/g, '-')\n\t};\n\n\t//Jan 01, 1111\n\tstatic DateTextShort: DateTimeOptions = {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\twhenInvalid: () => DateTime.local().toLocaleString(DateTimeFormat.DateSimple).replace(/[0-9]/g, '-')\n\t};\n\n\t//01/01/1111\n\tstatic DateSimple: DateTimeOptions = {\n\t\tyear: 'numeric',\n\t\tmonth: '2-digit',\n\t\tday: '2-digit',\n\t\twhenInvalid: () => DateTime.local().toLocaleString(DateTimeFormat.DateSimple).replace(/[0-9]/g, '-')\n\t};\n\n\tstatic DateTextLongWithWeekday: DateTimeOptions = {\n\t\tyear: 'numeric',\n\t\tday: '2-digit',\n\t\tweekday: 'long',\n\t\tmonth: 'long',\n\t\twhenInvalid: () => DateTime.local().toLocaleString(DateTimeFormat.DateSimple).replace(/[0-9]/g, '-')\n\t};\n\n\tstatic DateMonthAndYear: DateTimeOptions = {\n\t\tyear: 'numeric',\n\t\tmonth: 'long',\n\t\twhenInvalid: value => (value === 'current' ? 'Current' : 'Select Month and Year')\n\t\t// whenInvalid: () => 'Current'\n\t};\n\n\tstatic DateMonthAndYearShort: DateTimeOptions = {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\twhenInvalid: DateTime.local().toLocaleString(DateTimeFormat.DateSimple).replace(/[0-9]/g, '-')\n\t};\n\n\t//Date and Time\n\tstatic DateTimeFullTextTZ: DateTimeOptions = {\n\t\t...DateTimeFormat.TimeLongTZ,\n\t\t...DateTimeFormat.DateTextLong,\n\t\twhenInvalid: () => 'Invalid Date'\n\t};\n\n\tstatic DateTimeShortTextTZ: DateTimeOptions = {\n\t\t...DateTimeFormat.TimeShortTZ,\n\t\t...DateTimeFormat.DateTextShort,\n\t\twhenInvalid: () => 'Invalid Date'\n\t};\n\n\tstatic DateTimeFullText: DateTimeOptions = {\n\t\t...DateTimeFormat.TimeLong,\n\t\t...DateTimeFormat.DateTextLong,\n\t\twhenInvalid: () => 'Invalid Date'\n\t};\n\n\tstatic DateTimeShortText: DateTimeOptions = {\n\t\t...DateTimeFormat.TimeShort,\n\t\t...DateTimeFormat.DateTextShort,\n\t\twhenInvalid: () => 'Invalid Date'\n\t};\n\n\tstatic DateTimeSimpleTZ: DateTimeOptions = {\n\t\t...DateTimeFormat.DateSimple,\n\t\t...DateTimeFormat.TimeShortTZ,\n\t\twhenInvalid: () => 'Invalid Date'\n\t};\n\n\tstatic DateTimeSimple: DateTimeOptions = {\n\t\t...DateTimeFormat.DateSimple,\n\t\t...DateTimeFormat.TimeShort,\n\t\twhenInvalid: () => 'Invalid Date'\n\t};\n}\n\n/**\n * Transforms a js date into the current locale's format.\n * @param date Date object that we want to display.\n * @param format Options object in how to generally format the date string. ( See DateTimeFormat Object )\n */\nexport function DateTimeToLocale(date: Date, format?: DateTimeOptions): string {\n\tlet d = DateTime.fromJSDate(date);\n\n\t/**\n\t * Weird case where we have automatically set a date value long into the future.\n\t * THIS SHOULDN'T BE IN HERE AND SHOULD BE A CASE BY CASE THING.\n\t * For example:\n\t * Contract Placements without an end date will be given this date.\n\t * Work history also does this.\n\t *\n\t * With this date set, we expect it to be formatted to be shown as 'Current' if its still their current position.\n\t * ...or potentially \"No End Date\" for contracts. See \\Source\\mst-apps\\apps\\web\\src\\utilities\\Formatters\\DataFormatter.ts\n\t */\n\tif (d.month === 1 && d.year === 2099) {\n\t\treturn 'Current';\n\t}\n\n\tif (!format) {\n\t\tformat = DateTimeFormat.DateSimple;\n\t}\n\tconst lng = window.navigator.language;\n\tif (lng) {\n\t\td = d.setLocale(lng);\n\t}\n\tlet dateStr = d.toLocaleString(format);\n\tif (dateStr === 'Invalid DateTime') {\n\t\tdateStr = format.whenInvalid?.();\n\t}\n\n\treturn dateStr;\n}\n\n/**\n * Helper function to build out a iso date that is set for the server that we want to keep as local time and not be considered utc\n */\nexport function DateTimeISOWithNoTZOffset(dateTime: Date | DateTime): string {\n\tlet date: DateTime;\n\tif (DateTime.isDateTime(dateTime)) {\n\t\tdate = dateTime;\n\t} else {\n\t\tdate = DateTime.fromJSDate(dateTime);\n\t}\n\tconst asISO = date.toISO();\n\tconst withoutTimezoneOffset = asISO.slice(0, 23);\n\treturn withoutTimezoneOffset;\n}\n\n/**\n * Gets the date and transforms it into UTC date\n * @param date specifically provided in the format of the date only such as '06/15/2022' or other language variant version\n * @returns string iso utc date to send to server with\n */\nexport function DateOnlyForServerToIdentifyAsUTC(date: string): string {\n\tconst dt = DateTime.fromFormat(date, 'D', { locale: navigator.language });\n\tdt.set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n\treturn DateTimeISOForServerToIdentifyAsUTC(dt.toJSDate());\n}\n\n/**\n * Gets the date and transforms it into UTC date\n * @param date specifically provided in the format of the date only such as '06/15/2022' or other language variant version\n * @returns string iso utc date to send to server with\n */\nexport function DateOnlyForServerToIdentify(date: string): string {\n\tconst dt = DateTime.fromFormat(date, 'D', { locale: navigator.language });\n\tdt.set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n\treturn dt.toISO();\n}\n\n/**\n * Returns the iso value with a Z at the end. The server knows to treat it as utc then.\n */\nexport function DateTimeISOForServerToIdentifyAsUTC(dateTime: Date): string {\n\treturn DateTime.fromJSDate(dateTime).toUTC().toISO();\n}\n\n/**\n * Returns true if both provided dates are the same day\n */\nexport function IsSameDay(date1: DateTime, date2: DateTime): boolean {\n\treturn date1.hasSame(date2, 'day');\n}\n\n/**\n * Returns true if the provided date is today.\n */\nexport function IsToday(date: DateTime): boolean {\n\treturn IsSameDay(date, DateTime.now());\n}\n\n/**\n * Returns true if the provided date is yesterday.\n */\nexport function IsYesterday(date: DateTime): boolean {\n\t//now, minus the number of milliseconds in one day\n\tconst yesterday = DaysAgo(1);\n\treturn IsSameDay(yesterday, date);\n}\n\n/**\n * Returns a date which is the provided number of days ago\n */\nexport function DaysAgo(numberOfDays: number): DateTime {\n\t//now - (number of milliseconds in a day * number of days)\n\treturn DateTime.now().minus({ day: numberOfDays });\n}\n","//https://gist.github.com/Fluidbyte/2973986\nexport const CurrencyCodeFormatInfo: Record<\n\tstring,\n\t{\n\t\tsymbol: string;\n\t\tname: string;\n\t\tsymbol_native: string;\n\t\tdecimal_digits: number;\n\t\trounding: number;\n\t\tcode: string;\n\t\tname_plural: string;\n\t}\n> = {\n\t'': {\n\t\tsymbol: '$',\n\t\tname: 'US Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'USD',\n\t\tname_plural: 'US dollars'\n\t},\n\tUSD: {\n\t\tsymbol: '$',\n\t\tname: 'US Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'USD',\n\t\tname_plural: 'US dollars'\n\t},\n\tCAD: {\n\t\tsymbol: 'CA$',\n\t\tname: 'Canadian Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'CAD',\n\t\tname_plural: 'Canadian dollars'\n\t},\n\tEUR: {\n\t\tsymbol: '€',\n\t\tname: 'Euro',\n\t\tsymbol_native: '€',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'EUR',\n\t\tname_plural: 'euros'\n\t},\n\tAED: {\n\t\tsymbol: 'AED',\n\t\tname: 'United Arab Emirates Dirham',\n\t\tsymbol_native: 'د.إ.‏',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'AED',\n\t\tname_plural: 'UAE dirhams'\n\t},\n\tAFN: {\n\t\tsymbol: 'Af',\n\t\tname: 'Afghan Afghani',\n\t\tsymbol_native: '؋',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'AFN',\n\t\tname_plural: 'Afghan Afghanis'\n\t},\n\tALL: {\n\t\tsymbol: 'ALL',\n\t\tname: 'Albanian Lek',\n\t\tsymbol_native: 'Lek',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'ALL',\n\t\tname_plural: 'Albanian lekë'\n\t},\n\tAMD: {\n\t\tsymbol: 'AMD',\n\t\tname: 'Armenian Dram',\n\t\tsymbol_native: 'դր.',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'AMD',\n\t\tname_plural: 'Armenian drams'\n\t},\n\tARS: {\n\t\tsymbol: 'AR$',\n\t\tname: 'Argentine Peso',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'ARS',\n\t\tname_plural: 'Argentine pesos'\n\t},\n\tAUD: {\n\t\tsymbol: 'AU$',\n\t\tname: 'Australian Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'AUD',\n\t\tname_plural: 'Australian dollars'\n\t},\n\tAZN: {\n\t\tsymbol: 'man.',\n\t\tname: 'Azerbaijani Manat',\n\t\tsymbol_native: 'ман.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'AZN',\n\t\tname_plural: 'Azerbaijani manats'\n\t},\n\tBAM: {\n\t\tsymbol: 'KM',\n\t\tname: 'Bosnia-Herzegovina Convertible Mark',\n\t\tsymbol_native: 'KM',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BAM',\n\t\tname_plural: 'Bosnia-Herzegovina convertible marks'\n\t},\n\tBDT: {\n\t\tsymbol: 'Tk',\n\t\tname: 'Bangladeshi Taka',\n\t\tsymbol_native: '৳',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BDT',\n\t\tname_plural: 'Bangladeshi takas'\n\t},\n\tBGN: {\n\t\tsymbol: 'BGN',\n\t\tname: 'Bulgarian Lev',\n\t\tsymbol_native: 'лв.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BGN',\n\t\tname_plural: 'Bulgarian leva'\n\t},\n\tBHD: {\n\t\tsymbol: 'BD',\n\t\tname: 'Bahraini Dinar',\n\t\tsymbol_native: 'د.ب.‏',\n\t\tdecimal_digits: 3,\n\t\trounding: 0,\n\t\tcode: 'BHD',\n\t\tname_plural: 'Bahraini dinars'\n\t},\n\tBIF: {\n\t\tsymbol: 'FBu',\n\t\tname: 'Burundian Franc',\n\t\tsymbol_native: 'FBu',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'BIF',\n\t\tname_plural: 'Burundian francs'\n\t},\n\tBND: {\n\t\tsymbol: 'BN$',\n\t\tname: 'Brunei Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BND',\n\t\tname_plural: 'Brunei dollars'\n\t},\n\tBOB: {\n\t\tsymbol: 'Bs',\n\t\tname: 'Bolivian Boliviano',\n\t\tsymbol_native: 'Bs',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BOB',\n\t\tname_plural: 'Bolivian bolivianos'\n\t},\n\tBRL: {\n\t\tsymbol: 'R$',\n\t\tname: 'Brazilian Real',\n\t\tsymbol_native: 'R$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BRL',\n\t\tname_plural: 'Brazilian reals'\n\t},\n\tBWP: {\n\t\tsymbol: 'BWP',\n\t\tname: 'Botswanan Pula',\n\t\tsymbol_native: 'P',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BWP',\n\t\tname_plural: 'Botswanan pulas'\n\t},\n\tBYN: {\n\t\tsymbol: 'Br',\n\t\tname: 'Belarusian Ruble',\n\t\tsymbol_native: 'руб.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BYN',\n\t\tname_plural: 'Belarusian rubles'\n\t},\n\tBZD: {\n\t\tsymbol: 'BZ$',\n\t\tname: 'Belize Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'BZD',\n\t\tname_plural: 'Belize dollars'\n\t},\n\tCDF: {\n\t\tsymbol: 'CDF',\n\t\tname: 'Congolese Franc',\n\t\tsymbol_native: 'FrCD',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'CDF',\n\t\tname_plural: 'Congolese francs'\n\t},\n\tCHF: {\n\t\tsymbol: 'CHF',\n\t\tname: 'Swiss Franc',\n\t\tsymbol_native: 'CHF',\n\t\tdecimal_digits: 2,\n\t\trounding: 0.05,\n\t\tcode: 'CHF',\n\t\tname_plural: 'Swiss francs'\n\t},\n\tCLP: {\n\t\tsymbol: 'CL$',\n\t\tname: 'Chilean Peso',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'CLP',\n\t\tname_plural: 'Chilean pesos'\n\t},\n\tCNY: {\n\t\tsymbol: 'CN¥',\n\t\tname: 'Chinese Yuan',\n\t\tsymbol_native: 'CN¥',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'CNY',\n\t\tname_plural: 'Chinese yuan'\n\t},\n\tCOP: {\n\t\tsymbol: 'CO$',\n\t\tname: 'Colombian Peso',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'COP',\n\t\tname_plural: 'Colombian pesos'\n\t},\n\tCRC: {\n\t\tsymbol: '₡',\n\t\tname: 'Costa Rican Colón',\n\t\tsymbol_native: '₡',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'CRC',\n\t\tname_plural: 'Costa Rican colóns'\n\t},\n\tCVE: {\n\t\tsymbol: 'CV$',\n\t\tname: 'Cape Verdean Escudo',\n\t\tsymbol_native: 'CV$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'CVE',\n\t\tname_plural: 'Cape Verdean escudos'\n\t},\n\tCZK: {\n\t\tsymbol: 'Kč',\n\t\tname: 'Czech Republic Koruna',\n\t\tsymbol_native: 'Kč',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'CZK',\n\t\tname_plural: 'Czech Republic korunas'\n\t},\n\tDJF: {\n\t\tsymbol: 'Fdj',\n\t\tname: 'Djiboutian Franc',\n\t\tsymbol_native: 'Fdj',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'DJF',\n\t\tname_plural: 'Djiboutian francs'\n\t},\n\tDKK: {\n\t\tsymbol: 'Dkr',\n\t\tname: 'Danish Krone',\n\t\tsymbol_native: 'kr',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'DKK',\n\t\tname_plural: 'Danish kroner'\n\t},\n\tDOP: {\n\t\tsymbol: 'RD$',\n\t\tname: 'Dominican Peso',\n\t\tsymbol_native: 'RD$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'DOP',\n\t\tname_plural: 'Dominican pesos'\n\t},\n\tDZD: {\n\t\tsymbol: 'DA',\n\t\tname: 'Algerian Dinar',\n\t\tsymbol_native: 'د.ج.‏',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'DZD',\n\t\tname_plural: 'Algerian dinars'\n\t},\n\tEEK: {\n\t\tsymbol: 'Ekr',\n\t\tname: 'Estonian Kroon',\n\t\tsymbol_native: 'kr',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'EEK',\n\t\tname_plural: 'Estonian kroons'\n\t},\n\tEGP: {\n\t\tsymbol: 'EGP',\n\t\tname: 'Egyptian Pound',\n\t\tsymbol_native: 'ج.م.‏',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'EGP',\n\t\tname_plural: 'Egyptian pounds'\n\t},\n\tERN: {\n\t\tsymbol: 'Nfk',\n\t\tname: 'Eritrean Nakfa',\n\t\tsymbol_native: 'Nfk',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'ERN',\n\t\tname_plural: 'Eritrean nakfas'\n\t},\n\tETB: {\n\t\tsymbol: 'Br',\n\t\tname: 'Ethiopian Birr',\n\t\tsymbol_native: 'Br',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'ETB',\n\t\tname_plural: 'Ethiopian birrs'\n\t},\n\tGBP: {\n\t\tsymbol: '£',\n\t\tname: 'British Pound Sterling',\n\t\tsymbol_native: '£',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'GBP',\n\t\tname_plural: 'British pounds sterling'\n\t},\n\tGEL: {\n\t\tsymbol: 'GEL',\n\t\tname: 'Georgian Lari',\n\t\tsymbol_native: 'GEL',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'GEL',\n\t\tname_plural: 'Georgian laris'\n\t},\n\tGHS: {\n\t\tsymbol: 'GH₵',\n\t\tname: 'Ghanaian Cedi',\n\t\tsymbol_native: 'GH₵',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'GHS',\n\t\tname_plural: 'Ghanaian cedis'\n\t},\n\tGNF: {\n\t\tsymbol: 'FG',\n\t\tname: 'Guinean Franc',\n\t\tsymbol_native: 'FG',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'GNF',\n\t\tname_plural: 'Guinean francs'\n\t},\n\tGTQ: {\n\t\tsymbol: 'GTQ',\n\t\tname: 'Guatemalan Quetzal',\n\t\tsymbol_native: 'Q',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'GTQ',\n\t\tname_plural: 'Guatemalan quetzals'\n\t},\n\tHKD: {\n\t\tsymbol: 'HK$',\n\t\tname: 'Hong Kong Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'HKD',\n\t\tname_plural: 'Hong Kong dollars'\n\t},\n\tHNL: {\n\t\tsymbol: 'HNL',\n\t\tname: 'Honduran Lempira',\n\t\tsymbol_native: 'L',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'HNL',\n\t\tname_plural: 'Honduran lempiras'\n\t},\n\tHRK: {\n\t\tsymbol: 'kn',\n\t\tname: 'Croatian Kuna',\n\t\tsymbol_native: 'kn',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'HRK',\n\t\tname_plural: 'Croatian kunas'\n\t},\n\tHUF: {\n\t\tsymbol: 'Ft',\n\t\tname: 'Hungarian Forint',\n\t\tsymbol_native: 'Ft',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'HUF',\n\t\tname_plural: 'Hungarian forints'\n\t},\n\tIDR: {\n\t\tsymbol: 'Rp',\n\t\tname: 'Indonesian Rupiah',\n\t\tsymbol_native: 'Rp',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'IDR',\n\t\tname_plural: 'Indonesian rupiahs'\n\t},\n\tILS: {\n\t\tsymbol: '₪',\n\t\tname: 'Israeli New Sheqel',\n\t\tsymbol_native: '₪',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'ILS',\n\t\tname_plural: 'Israeli new sheqels'\n\t},\n\tINR: {\n\t\tsymbol: 'Rs',\n\t\tname: 'Indian Rupee',\n\t\tsymbol_native: 'টকা',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'INR',\n\t\tname_plural: 'Indian rupees'\n\t},\n\tIQD: {\n\t\tsymbol: 'IQD',\n\t\tname: 'Iraqi Dinar',\n\t\tsymbol_native: 'د.ع.‏',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'IQD',\n\t\tname_plural: 'Iraqi dinars'\n\t},\n\tIRR: {\n\t\tsymbol: 'IRR',\n\t\tname: 'Iranian Rial',\n\t\tsymbol_native: '﷼',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'IRR',\n\t\tname_plural: 'Iranian rials'\n\t},\n\tISK: {\n\t\tsymbol: 'Ikr',\n\t\tname: 'Icelandic Króna',\n\t\tsymbol_native: 'kr',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'ISK',\n\t\tname_plural: 'Icelandic krónur'\n\t},\n\tJMD: {\n\t\tsymbol: 'J$',\n\t\tname: 'Jamaican Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'JMD',\n\t\tname_plural: 'Jamaican dollars'\n\t},\n\tJOD: {\n\t\tsymbol: 'JD',\n\t\tname: 'Jordanian Dinar',\n\t\tsymbol_native: 'د.أ.‏',\n\t\tdecimal_digits: 3,\n\t\trounding: 0,\n\t\tcode: 'JOD',\n\t\tname_plural: 'Jordanian dinars'\n\t},\n\tJPY: {\n\t\tsymbol: '¥',\n\t\tname: 'Japanese Yen',\n\t\tsymbol_native: '¥',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'JPY',\n\t\tname_plural: 'Japanese yen'\n\t},\n\tKES: {\n\t\tsymbol: 'Ksh',\n\t\tname: 'Kenyan Shilling',\n\t\tsymbol_native: 'Ksh',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'KES',\n\t\tname_plural: 'Kenyan shillings'\n\t},\n\tKHR: {\n\t\tsymbol: 'KHR',\n\t\tname: 'Cambodian Riel',\n\t\tsymbol_native: '៛',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'KHR',\n\t\tname_plural: 'Cambodian riels'\n\t},\n\tKMF: {\n\t\tsymbol: 'CF',\n\t\tname: 'Comorian Franc',\n\t\tsymbol_native: 'FC',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'KMF',\n\t\tname_plural: 'Comorian francs'\n\t},\n\tKRW: {\n\t\tsymbol: '₩',\n\t\tname: 'South Korean Won',\n\t\tsymbol_native: '₩',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'KRW',\n\t\tname_plural: 'South Korean won'\n\t},\n\tKWD: {\n\t\tsymbol: 'KD',\n\t\tname: 'Kuwaiti Dinar',\n\t\tsymbol_native: 'د.ك.‏',\n\t\tdecimal_digits: 3,\n\t\trounding: 0,\n\t\tcode: 'KWD',\n\t\tname_plural: 'Kuwaiti dinars'\n\t},\n\tKZT: {\n\t\tsymbol: 'KZT',\n\t\tname: 'Kazakhstani Tenge',\n\t\tsymbol_native: 'тңг.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'KZT',\n\t\tname_plural: 'Kazakhstani tenges'\n\t},\n\tLBP: {\n\t\tsymbol: 'LB£',\n\t\tname: 'Lebanese Pound',\n\t\tsymbol_native: 'ل.ل.‏',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'LBP',\n\t\tname_plural: 'Lebanese pounds'\n\t},\n\tLKR: {\n\t\tsymbol: 'SLRs',\n\t\tname: 'Sri Lankan Rupee',\n\t\tsymbol_native: 'SL Re',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'LKR',\n\t\tname_plural: 'Sri Lankan rupees'\n\t},\n\tLTL: {\n\t\tsymbol: 'Lt',\n\t\tname: 'Lithuanian Litas',\n\t\tsymbol_native: 'Lt',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'LTL',\n\t\tname_plural: 'Lithuanian litai'\n\t},\n\tLVL: {\n\t\tsymbol: 'Ls',\n\t\tname: 'Latvian Lats',\n\t\tsymbol_native: 'Ls',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'LVL',\n\t\tname_plural: 'Latvian lati'\n\t},\n\tLYD: {\n\t\tsymbol: 'LD',\n\t\tname: 'Libyan Dinar',\n\t\tsymbol_native: 'د.ل.‏',\n\t\tdecimal_digits: 3,\n\t\trounding: 0,\n\t\tcode: 'LYD',\n\t\tname_plural: 'Libyan dinars'\n\t},\n\tMAD: {\n\t\tsymbol: 'MAD',\n\t\tname: 'Moroccan Dirham',\n\t\tsymbol_native: 'د.م.‏',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'MAD',\n\t\tname_plural: 'Moroccan dirhams'\n\t},\n\tMDL: {\n\t\tsymbol: 'MDL',\n\t\tname: 'Moldovan Leu',\n\t\tsymbol_native: 'MDL',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'MDL',\n\t\tname_plural: 'Moldovan lei'\n\t},\n\tMGA: {\n\t\tsymbol: 'MGA',\n\t\tname: 'Malagasy Ariary',\n\t\tsymbol_native: 'MGA',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'MGA',\n\t\tname_plural: 'Malagasy Ariaries'\n\t},\n\tMKD: {\n\t\tsymbol: 'MKD',\n\t\tname: 'Macedonian Denar',\n\t\tsymbol_native: 'MKD',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'MKD',\n\t\tname_plural: 'Macedonian denari'\n\t},\n\tMMK: {\n\t\tsymbol: 'MMK',\n\t\tname: 'Myanma Kyat',\n\t\tsymbol_native: 'K',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'MMK',\n\t\tname_plural: 'Myanma kyats'\n\t},\n\tMOP: {\n\t\tsymbol: 'MOP$',\n\t\tname: 'Macanese Pataca',\n\t\tsymbol_native: 'MOP$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'MOP',\n\t\tname_plural: 'Macanese patacas'\n\t},\n\tMUR: {\n\t\tsymbol: 'MURs',\n\t\tname: 'Mauritian Rupee',\n\t\tsymbol_native: 'MURs',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'MUR',\n\t\tname_plural: 'Mauritian rupees'\n\t},\n\tMXN: {\n\t\tsymbol: 'MX$',\n\t\tname: 'Mexican Peso',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'MXN',\n\t\tname_plural: 'Mexican pesos'\n\t},\n\tMYR: {\n\t\tsymbol: 'RM',\n\t\tname: 'Malaysian Ringgit',\n\t\tsymbol_native: 'RM',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'MYR',\n\t\tname_plural: 'Malaysian ringgits'\n\t},\n\tMZN: {\n\t\tsymbol: 'MTn',\n\t\tname: 'Mozambican Metical',\n\t\tsymbol_native: 'MTn',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'MZN',\n\t\tname_plural: 'Mozambican meticals'\n\t},\n\tNAD: {\n\t\tsymbol: 'N$',\n\t\tname: 'Namibian Dollar',\n\t\tsymbol_native: 'N$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'NAD',\n\t\tname_plural: 'Namibian dollars'\n\t},\n\tNGN: {\n\t\tsymbol: '₦',\n\t\tname: 'Nigerian Naira',\n\t\tsymbol_native: '₦',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'NGN',\n\t\tname_plural: 'Nigerian nairas'\n\t},\n\tNIO: {\n\t\tsymbol: 'C$',\n\t\tname: 'Nicaraguan Córdoba',\n\t\tsymbol_native: 'C$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'NIO',\n\t\tname_plural: 'Nicaraguan córdobas'\n\t},\n\tNOK: {\n\t\tsymbol: 'Nkr',\n\t\tname: 'Norwegian Krone',\n\t\tsymbol_native: 'kr',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'NOK',\n\t\tname_plural: 'Norwegian kroner'\n\t},\n\tNPR: {\n\t\tsymbol: 'NPRs',\n\t\tname: 'Nepalese Rupee',\n\t\tsymbol_native: 'नेरू',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'NPR',\n\t\tname_plural: 'Nepalese rupees'\n\t},\n\tNZD: {\n\t\tsymbol: 'NZ$',\n\t\tname: 'New Zealand Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'NZD',\n\t\tname_plural: 'New Zealand dollars'\n\t},\n\tOMR: {\n\t\tsymbol: 'OMR',\n\t\tname: 'Omani Rial',\n\t\tsymbol_native: 'ر.ع.‏',\n\t\tdecimal_digits: 3,\n\t\trounding: 0,\n\t\tcode: 'OMR',\n\t\tname_plural: 'Omani rials'\n\t},\n\tPAB: {\n\t\tsymbol: 'B/.',\n\t\tname: 'Panamanian Balboa',\n\t\tsymbol_native: 'B/.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'PAB',\n\t\tname_plural: 'Panamanian balboas'\n\t},\n\tPEN: {\n\t\tsymbol: 'S/.',\n\t\tname: 'Peruvian Nuevo Sol',\n\t\tsymbol_native: 'S/.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'PEN',\n\t\tname_plural: 'Peruvian nuevos soles'\n\t},\n\tPHP: {\n\t\tsymbol: '₱',\n\t\tname: 'Philippine Peso',\n\t\tsymbol_native: '₱',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'PHP',\n\t\tname_plural: 'Philippine pesos'\n\t},\n\tPKR: {\n\t\tsymbol: 'PKRs',\n\t\tname: 'Pakistani Rupee',\n\t\tsymbol_native: '₨',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'PKR',\n\t\tname_plural: 'Pakistani rupees'\n\t},\n\tPLN: {\n\t\tsymbol: 'zł',\n\t\tname: 'Polish Zloty',\n\t\tsymbol_native: 'zł',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'PLN',\n\t\tname_plural: 'Polish zlotys'\n\t},\n\tPYG: {\n\t\tsymbol: '₲',\n\t\tname: 'Paraguayan Guarani',\n\t\tsymbol_native: '₲',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'PYG',\n\t\tname_plural: 'Paraguayan guaranis'\n\t},\n\tQAR: {\n\t\tsymbol: 'QR',\n\t\tname: 'Qatari Rial',\n\t\tsymbol_native: 'ر.ق.‏',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'QAR',\n\t\tname_plural: 'Qatari rials'\n\t},\n\tRON: {\n\t\tsymbol: 'RON',\n\t\tname: 'Romanian Leu',\n\t\tsymbol_native: 'RON',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'RON',\n\t\tname_plural: 'Romanian lei'\n\t},\n\tRSD: {\n\t\tsymbol: 'din.',\n\t\tname: 'Serbian Dinar',\n\t\tsymbol_native: 'дин.',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'RSD',\n\t\tname_plural: 'Serbian dinars'\n\t},\n\tRUB: {\n\t\tsymbol: 'RUB',\n\t\tname: 'Russian Ruble',\n\t\tsymbol_native: '₽.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'RUB',\n\t\tname_plural: 'Russian rubles'\n\t},\n\tRWF: {\n\t\tsymbol: 'RWF',\n\t\tname: 'Rwandan Franc',\n\t\tsymbol_native: 'FR',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'RWF',\n\t\tname_plural: 'Rwandan francs'\n\t},\n\tSAR: {\n\t\tsymbol: 'SR',\n\t\tname: 'Saudi Riyal',\n\t\tsymbol_native: 'ر.س.‏',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'SAR',\n\t\tname_plural: 'Saudi riyals'\n\t},\n\tSDG: {\n\t\tsymbol: 'SDG',\n\t\tname: 'Sudanese Pound',\n\t\tsymbol_native: 'SDG',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'SDG',\n\t\tname_plural: 'Sudanese pounds'\n\t},\n\tSEK: {\n\t\tsymbol: 'Skr',\n\t\tname: 'Swedish Krona',\n\t\tsymbol_native: 'kr',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'SEK',\n\t\tname_plural: 'Swedish kronor'\n\t},\n\tSGD: {\n\t\tsymbol: 'S$',\n\t\tname: 'Singapore Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'SGD',\n\t\tname_plural: 'Singapore dollars'\n\t},\n\tSOS: {\n\t\tsymbol: 'Ssh',\n\t\tname: 'Somali Shilling',\n\t\tsymbol_native: 'Ssh',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'SOS',\n\t\tname_plural: 'Somali shillings'\n\t},\n\tSYP: {\n\t\tsymbol: 'SY£',\n\t\tname: 'Syrian Pound',\n\t\tsymbol_native: 'ل.س.‏',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'SYP',\n\t\tname_plural: 'Syrian pounds'\n\t},\n\tTHB: {\n\t\tsymbol: '฿',\n\t\tname: 'Thai Baht',\n\t\tsymbol_native: '฿',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'THB',\n\t\tname_plural: 'Thai baht'\n\t},\n\tTND: {\n\t\tsymbol: 'DT',\n\t\tname: 'Tunisian Dinar',\n\t\tsymbol_native: 'د.ت.‏',\n\t\tdecimal_digits: 3,\n\t\trounding: 0,\n\t\tcode: 'TND',\n\t\tname_plural: 'Tunisian dinars'\n\t},\n\tTOP: {\n\t\tsymbol: 'T$',\n\t\tname: 'Tongan Paʻanga',\n\t\tsymbol_native: 'T$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'TOP',\n\t\tname_plural: 'Tongan paʻanga'\n\t},\n\tTRY: {\n\t\tsymbol: 'TL',\n\t\tname: 'Turkish Lira',\n\t\tsymbol_native: 'TL',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'TRY',\n\t\tname_plural: 'Turkish Lira'\n\t},\n\tTTD: {\n\t\tsymbol: 'TT$',\n\t\tname: 'Trinidad and Tobago Dollar',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'TTD',\n\t\tname_plural: 'Trinidad and Tobago dollars'\n\t},\n\tTWD: {\n\t\tsymbol: 'NT$',\n\t\tname: 'New Taiwan Dollar',\n\t\tsymbol_native: 'NT$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'TWD',\n\t\tname_plural: 'New Taiwan dollars'\n\t},\n\tTZS: {\n\t\tsymbol: 'TSh',\n\t\tname: 'Tanzanian Shilling',\n\t\tsymbol_native: 'TSh',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'TZS',\n\t\tname_plural: 'Tanzanian shillings'\n\t},\n\tUAH: {\n\t\tsymbol: '₴',\n\t\tname: 'Ukrainian Hryvnia',\n\t\tsymbol_native: '₴',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'UAH',\n\t\tname_plural: 'Ukrainian hryvnias'\n\t},\n\tUGX: {\n\t\tsymbol: 'USh',\n\t\tname: 'Ugandan Shilling',\n\t\tsymbol_native: 'USh',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'UGX',\n\t\tname_plural: 'Ugandan shillings'\n\t},\n\tUYU: {\n\t\tsymbol: '$U',\n\t\tname: 'Uruguayan Peso',\n\t\tsymbol_native: '$',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'UYU',\n\t\tname_plural: 'Uruguayan pesos'\n\t},\n\tUZS: {\n\t\tsymbol: 'UZS',\n\t\tname: 'Uzbekistan Som',\n\t\tsymbol_native: 'UZS',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'UZS',\n\t\tname_plural: 'Uzbekistan som'\n\t},\n\tVEF: {\n\t\tsymbol: 'Bs.F.',\n\t\tname: 'Venezuelan Bolívar',\n\t\tsymbol_native: 'Bs.F.',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'VEF',\n\t\tname_plural: 'Venezuelan bolívars'\n\t},\n\tVND: {\n\t\tsymbol: '₫',\n\t\tname: 'Vietnamese Dong',\n\t\tsymbol_native: '₫',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'VND',\n\t\tname_plural: 'Vietnamese dong'\n\t},\n\tXAF: {\n\t\tsymbol: 'FCFA',\n\t\tname: 'CFA Franc BEAC',\n\t\tsymbol_native: 'FCFA',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'XAF',\n\t\tname_plural: 'CFA francs BEAC'\n\t},\n\tXOF: {\n\t\tsymbol: 'CFA',\n\t\tname: 'CFA Franc BCEAO',\n\t\tsymbol_native: 'CFA',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'XOF',\n\t\tname_plural: 'CFA francs BCEAO'\n\t},\n\tYER: {\n\t\tsymbol: 'YR',\n\t\tname: 'Yemeni Rial',\n\t\tsymbol_native: 'ر.ي.‏',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'YER',\n\t\tname_plural: 'Yemeni rials'\n\t},\n\tZAR: {\n\t\tsymbol: 'R',\n\t\tname: 'South African Rand',\n\t\tsymbol_native: 'R',\n\t\tdecimal_digits: 2,\n\t\trounding: 0,\n\t\tcode: 'ZAR',\n\t\tname_plural: 'South African rand'\n\t},\n\tZMK: {\n\t\tsymbol: 'ZK',\n\t\tname: 'Zambian Kwacha',\n\t\tsymbol_native: 'ZK',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'ZMK',\n\t\tname_plural: 'Zambian kwachas'\n\t},\n\tZWL: {\n\t\tsymbol: 'ZWL$',\n\t\tname: 'Zimbabwean Dollar',\n\t\tsymbol_native: 'ZWL$',\n\t\tdecimal_digits: 0,\n\t\trounding: 0,\n\t\tcode: 'ZWL',\n\t\tname_plural: 'Zimbabwean Dollar'\n\t}\n};\n","export const Globalize = window['Globalize'];\n","export interface PcrAttribute {\n\tAttributeName: string;\n\tAttributeValue: any;\n}\n\nexport class PcrHtmlHelper {\n\t//generates a random valid html id for an element\n\tstatic createHTMLUniqueId(): string {\n\t\tconst dateVal = new Date();\n\t\tconst numberVal = dateVal.getTime();\n\t\tconst availableLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\t\tlet randomletters1 = '';\n\t\tlet randomletters2 = '';\n\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\trandomletters1 += availableLetters.charAt(Math.floor(Math.random() * availableLetters.length));\n\t\t\trandomletters2 += availableLetters.charAt(Math.floor(Math.random() * availableLetters.length));\n\t\t}\n\n\t\tconst uniqueId = randomletters1 + numberVal + randomletters2;\n\t\treturn uniqueId;\n\t}\n\t//replaces illegal characters that will cause binding events to fail\n\tstatic makeElementValidHTMLId(inputId: string): string {\n\t\tlet returnId = '';\n\t\tif (inputId) {\n\t\t\treturnId = inputId.replace(/[^a-z0-9\\-_:.]|^[^a-z]+/gi, '');\n\t\t} else {\n\t\t\tconsole.log('error: inputID was null');\n\t\t}\n\n\t\treturn returnId;\n\t}\n\t//simple function to help quickly add classes to an element as needed\n\tstatic AddExtraClasses(elem: Element, extraClasses: string[]): void {\n\t\tif (extraClasses) {\n\t\t\tfor (const elemClass of extraClasses) {\n\t\t\t\telem.classList.add(elemClass);\n\t\t\t}\n\t\t}\n\t}\n\t//simple function to help quickly add attributes to an element as needed\n\tstatic AddExtraAttributes(elem: Element, extraAttributes: Array): void {\n\t\tif (extraAttributes) {\n\t\t\tfor (const elemAttr of extraAttributes) {\n\t\t\t\telem.setAttribute(elemAttr.AttributeName, elemAttr.AttributeValue);\n\t\t\t}\n\t\t}\n\t}\n\tstatic PcrHtmlEncode(dataValue: string): string {\n\t\tlet response = dataValue;\n\t\tif (dataValue) {\n\t\t\tresponse = String(dataValue)\n\t\t\t\t.replace(/&/g, '&')\n\t\t\t\t.replace(/\"/g, '"')\n\t\t\t\t.replace(/'/g, ''')\n\t\t\t\t.replace(//g, '>');\n\t\t}\n\t\treturn response;\n\t}\n\tstatic PcrHtmlDecode(dataValue: string): string {\n\t\tlet response = dataValue;\n\t\tif (dataValue) {\n\t\t\tresponse = String(dataValue)\n\t\t\t\t.replace(/"/g, '\"')\n\t\t\t\t.replace(/'/g, \"'\")\n\t\t\t\t.replace(/</g, '<')\n\t\t\t\t.replace(/>/g, '>')\n\t\t\t\t.replace(/&/g, '&');\n\t\t}\n\t\treturn response;\n\t}\n}\n","import { PcrHtmlHelper } from '../HtmlHelpers/PcrHtmlHelper';\n\nexport class TranslationHelpers {\n\tpublic static Xlate(pcrWord: string, srcDictionary?: Record): string {\n\t\tlet translatedWord = pcrWord;\n\t\tif (srcDictionary) {\n\t\t\tif (srcDictionary.hasOwnProperty(pcrWord)) {\n\t\t\t\ttranslatedWord = srcDictionary[pcrWord];\n\t\t\t}\n\t\t} else {\n\t\t\t//in the event their is no pcrDataObj this traps the exception\n\t\t\t//let translatedWordCheck = pcrDataObj.Translations[pcrWord];\n\n\t\t\t//TODO: NEEDS TO BE AN ACTUAL TRANSLATION HERE\n\t\t\tconst translatedWordCheck = pcrWord;\n\n\t\t\tif (translatedWordCheck) {\n\t\t\t\ttranslatedWord = translatedWordCheck;\n\t\t\t}\n\t\t}\n\t\treturn PcrHtmlHelper.PcrHtmlEncode(translatedWord);\n\t}\n}\n","import { CurrencyCodeFormatInfo } from '../Currency/CurrencyCodeFormatInfo';\nimport { Globalize } from '../ImportFromWindow/Globalize/Globalize';\nimport { PcrDataValidations } from '../DataUtilites/DataValidation';\nimport { TranslationHelpers } from '../HtmlHelpers/TranslationHelpers';\nimport Currency from '@mst/api/models/Currency';\nimport { CurrencyCodes } from '@mst/api/models/generated/CurrencyCodes';\n\nexport class PcrDataFormatters {\n\tstatic formatDateForDisplay(dateVal: string, translations: Record, returnOnlyTime: boolean): string {\n\t\tlet returnDate = '';\n\t\tif (dateVal) {\n\t\t\tif (dateVal.indexOf('2099-01-01') > -1) {\n\t\t\t\treturnDate = `(${TranslationHelpers.Xlate('No End Date', translations)})`;\n\t\t\t} else {\n\t\t\t\tif (PcrDataValidations.isValidDate(dateVal) === true) {\n\t\t\t\t\tconst dateFormat = Globalize.culture().calendars.standard.patterns.d;\n\n\t\t\t\t\tconst dateSplit = dateVal.split('T');\n\t\t\t\t\tconst datepartsplit = dateSplit[0].split('-');\n\t\t\t\t\tconst timepartsplit = dateSplit[1].split(':');\n\n\t\t\t\t\tconst yr = parseInt(datepartsplit[0]);\n\t\t\t\t\tconst mn = parseInt(datepartsplit[1]) - 1;\n\t\t\t\t\tconst dy = parseInt(datepartsplit[2]);\n\t\t\t\t\tconst hr = parseInt(timepartsplit[0]);\n\t\t\t\t\tconst min = parseInt(timepartsplit[1]);\n\t\t\t\t\tconst sec = parseInt(timepartsplit[2]);\n\n\t\t\t\t\tconst fixedDate = new Date(yr, mn, dy, hr, min, sec);\n\n\t\t\t\t\tconst datePart = Globalize.format(fixedDate, dateFormat);\n\t\t\t\t\t//need to remove miliseconds and deals with the AM/PM managment accordingly\n\t\t\t\t\tconst timePart = PcrDataFormatters.removeMillisFromTimeString(fixedDate);\n\t\t\t\t\tif (returnOnlyTime === false) {\n\t\t\t\t\t\treturnDate = `${datePart} ${timePart}`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturnDate = timePart;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn returnDate;\n\t}\n\tstatic removeMillisFromTimeString(dateObj: Date): string {\n\t\tlet returnVal = '';\n\t\tconst timeFormat = Globalize.culture().calendars.standard.patterns.T;\n\t\tconst timeSeparator = Globalize.culture().calendars.standard[':'];\n\t\tlet rawTimePart = Globalize.format(dateObj, timeFormat);\n\t\tlet AMPMstring = '';\n\t\tif (rawTimePart.indexOf('AM') > -1) {\n\t\t\tAMPMstring = rawTimePart.substring(rawTimePart.indexOf('AM'), rawTimePart.indexOf('AM') + 2);\n\t\t\trawTimePart = rawTimePart.replace('AM', '');\n\t\t} else if (rawTimePart.indexOf('PM') > -1) {\n\t\t\tAMPMstring = rawTimePart.substring(rawTimePart.indexOf('PM'), rawTimePart.indexOf('PM') + 2);\n\t\t\trawTimePart = rawTimePart.replace('PM', '');\n\t\t}\n\n\t\tconst rawTimePartSplit = rawTimePart.split(timeSeparator);\n\t\tfor (let i = 0; i < rawTimePartSplit.length; i++) {\n\t\t\tif (i < 2) {\n\t\t\t\treturnVal = returnVal + rawTimePartSplit[i];\n\t\t\t\tif (i === 0) {\n\t\t\t\t\treturnVal = `${returnVal}:`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturnVal = `${returnVal} ${AMPMstring}`;\n\t\treturn returnVal;\n\t}\n\tstatic addMillisToTimeString(rawTimeString: string, timeSeparater: string): string {\n\t\tlet AMPMstring = '';\n\t\tif (rawTimeString.indexOf('AM') > -1) {\n\t\t\tAMPMstring = rawTimeString.substring(rawTimeString.indexOf('AM'), rawTimeString.indexOf('AM') + 2);\n\t\t\trawTimeString = rawTimeString.replace('AM', '');\n\t\t} else if (rawTimeString.indexOf('PM') > -1) {\n\t\t\tAMPMstring = rawTimeString.substring(rawTimeString.indexOf('PM'), rawTimeString.indexOf('PM') + 2);\n\t\t\trawTimeString = rawTimeString.replace('PM', '');\n\t\t}\n\n\t\tconst splitTime = rawTimeString.split(timeSeparater);\n\t\tconst fixedTimeArr = [];\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tconst timePart = splitTime[i];\n\t\t\tif (timePart === undefined) {\n\t\t\t\tfixedTimeArr.push('00');\n\t\t\t} else {\n\t\t\t\tfixedTimeArr.push(timePart.trim());\n\t\t\t}\n\t\t}\n\t\tconst fixedString = `${fixedTimeArr.join(timeSeparater)} ${AMPMstring}`;\n\t\treturn fixedString;\n\t}\n\n\t// value expected format of 123.23 CAN or $123.34, convert that string to Currency Object\n\tstatic convertCurrencyTextToObject = (value: string): Currency => {\n\t\tconst result: Currency = {\n\t\t\tValue: undefined,\n\t\t\tCurrencyCode: CurrencyCodes.USD\n\t\t};\n\n\t\t// If no value return default values\n\t\tif (!value) {\n\t\t\treturn result;\n\t\t}\n\n\t\tvalue = value.replace(/,/g, '');\n\n\t\tif (value.indexOf('$') > -1) {\n\t\t\t// if it contains a dollar assign then we can assume usd\n\t\t\tvalue = value.replace('$', '');\n\t\t} else {\n\t\t\t// no dollar sign then we just pull the code from the string\n\t\t\tresult.CurrencyCode = CurrencyCodes[value.split(' ')[1]];\n\t\t}\n\n\t\tresult.Value = parseFloat(value.split(' ')[0]);\n\n\t\treturn result;\n\t};\n\n\t//output into a string with a value then the code such as 123.23 CAN or 123.23 USD\n\tstatic convertCurrencyObjectToText = (value: Currency): string => {\n\t\tif (value.CurrencyCode) {\n\t\t\treturn `${value.Value} ${value.CurrencyCode}`;\n\t\t}\n\t\treturn value.Value.toString();\n\t};\n\n\tstatic formatCurrency(currency: Currency): string {\n\t\treturn this.formatCurrencyForDisplay(currency.Value, currency.CurrencyCode);\n\t}\n\n\tstatic formatCurrencyForDisplay(currencyVal: string | number, currencyCode?: string): string {\n\t\tlet baseCurrencyVal = currencyVal;\n\t\tlet baseCurrencyCode = currencyCode;\n\t\tlet baseCurrencySymbol = '';\n\t\tlet returnCurrency = '';\n\t\tlet culture = Intl.DateTimeFormat().resolvedOptions().locale;\n\t\tif (!culture) {\n\t\t\tculture = 'en-us';\n\t\t}\n\n\t\tif (culture.toLowerCase() === 'en-us' && !currencyCode) {\n\t\t\tbaseCurrencyCode = 'USD';\n\t\t}\n\t\t//see if a currency code was submitted (i.e custom fields or field modifications);\n\t\tif (!baseCurrencyCode && typeof baseCurrencyVal === 'string') {\n\t\t\tbaseCurrencyCode = PcrDataFormatters.getAlphaCurrency(baseCurrencyVal);\n\t\t\tbaseCurrencySymbol = PcrDataFormatters.getCurrencySymbol(baseCurrencyVal);\n\t\t}\n\t\t//remove code and vals from string\n\t\tif (typeof baseCurrencyVal === 'string') {\n\t\t\tconst valReg = new RegExp(baseCurrencyCode, 'g');\n\t\t\tbaseCurrencyVal = baseCurrencyVal.replace(valReg, '');\n\t\t\tconst symReg = new RegExp(baseCurrencySymbol, 'g');\n\t\t\tbaseCurrencyVal = baseCurrencyVal.replace(symReg, '');\n\t\t\tbaseCurrencyVal = baseCurrencyVal.trim();\n\t\t}\n\n\t\t//check for type and make it a number to format properly\n\t\tif (typeof baseCurrencyVal === 'string') {\n\t\t\tif (isNaN(parseFloat(baseCurrencyVal)) === false) {\n\t\t\t\tbaseCurrencyVal = parseFloat(baseCurrencyVal);\n\t\t\t}\n\t\t}\n\n\t\t//only en-us and USD gets a dollar sign for now\n\t\ttry {\n\t\t\treturnCurrency = new Intl.NumberFormat(culture.toLowerCase(), {\n\t\t\t\tstyle: 'currency',\n\t\t\t\tcurrency: baseCurrencyCode\n\t\t\t}).format(baseCurrencyVal as number);\n\t\t} catch (e) {\n\t\t\t//basecurrencycode doesn't exist\n\t\t\tconsole.log(`error formatting ${baseCurrencyCode} ${e}`);\n\t\t\treturnCurrency = baseCurrencyVal.toLocaleString(culture.toLowerCase(), {\n\t\t\t\tstyle: 'decimal',\n\t\t\t\tminimumFractionDigits: 2,\n\t\t\t\tmaximumFractionDigits: 2\n\t\t\t});\n\t\t}\n\n\t\tif (returnCurrency !== '' && returnCurrency !== undefined && returnCurrency !== null && baseCurrencyCode) {\n\t\t\tif (returnCurrency.indexOf(baseCurrencyCode) < 0 && baseCurrencyCode.toUpperCase() !== 'USD') {\n\t\t\t\treturnCurrency = `${returnCurrency} ${baseCurrencyCode}`;\n\t\t\t}\n\t\t}\n\n\t\treturn returnCurrency;\n\t}\n\tstatic getCurrencySymbol(currencyVal: string): string {\n\t\tlet currencySymbol = '';\n\t\tif (currencyVal !== '' && currencyVal !== undefined && currencyVal !== null) {\n\t\t\tif (currencyVal.length > 0) {\n\t\t\t\tconst symbolList =\n\t\t\t\t\t/[$\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BD\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6]/;\n\t\t\t\tconst firstChar = currencyVal.substring(0, 1);\n\t\t\t\tconst matched = firstChar.match(symbolList);\n\t\t\t\tif (matched !== undefined) {\n\t\t\t\t\tcurrencySymbol = matched.input;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn currencySymbol;\n\t}\n\tstatic getAlphaCurrency(currencyVal: string): string {\n\t\tlet alphaCurrency = '';\n\t\tif (currencyVal) {\n\t\t\tcurrencyVal = currencyVal.toUpperCase();\n\t\t\tif (currencyVal.length > 3) {\n\t\t\t\tconst alphaCurrencyVal = currencyVal.substring(currencyVal.length - 3, currencyVal.length);\n\t\t\t\tconst lettervals = /^[A-Z]+$/;\n\t\t\t\tconst matched = alphaCurrencyVal.match(lettervals);\n\t\t\t\tif (matched !== undefined) {\n\t\t\t\t\talphaCurrency = matched.input;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn alphaCurrency;\n\t}\n\n\tstatic pcrBase64Encode(dataValue: string): string {\n\t\tlet returnVal = '';\n\t\tif (dataValue) {\n\t\t\treturnVal = window.btoa(PcrDataFormatters.utf16to8(dataValue));\n\t\t}\n\t\treturn returnVal;\n\t}\n\tstatic pcrBase64Decode(dataValue: string): string {\n\t\tlet returnVal = '';\n\t\tif (dataValue) {\n\t\t\treturnVal = PcrDataFormatters.utf8to16(window.atob(dataValue)); // decode a string\n\t\t}\n\t\treturn returnVal;\n\t}\n\tstatic utf16to8(dataValue: string): string {\n\t\tlet out, i, len, c;\n\n\t\tout = '';\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tc = dataValue.charCodeAt(i);\n\t\t\tif (c >= 0x0001 && c <= 0x007f) {\n\t\t\t\tout += dataValue.charAt(i);\n\t\t\t} else if (c > 0x07ff) {\n\t\t\t\tout += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f));\n\t\t\t\tout += String.fromCharCode(0x80 | ((c >> 6) & 0x3f));\n\t\t\t\tout += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));\n\t\t\t} else {\n\t\t\t\tout += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f));\n\t\t\t\tout += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\tstatic utf8to16(dataValue: string): string {\n\t\tlet out, i, len, c;\n\t\tlet char2, char3;\n\n\t\tout = '';\n\t\ti = 0;\n\t\twhile (i < len) {\n\t\t\tc = dataValue.charCodeAt(i++);\n\t\t\tswitch (c >> 4) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\tcase 3:\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\tcase 6:\n\t\t\t\tcase 7:\n\t\t\t\t\t// 0xxxxxxx\n\t\t\t\t\tout += dataValue.charAt(i - 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 12:\n\t\t\t\tcase 13:\n\t\t\t\t\t// 110x xxxx 10xx xxxx\n\t\t\t\t\tchar2 = dataValue.charCodeAt(i++);\n\t\t\t\t\tout += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 14:\n\t\t\t\t\t// 1110 xxxx 10xx xxxx 10xx xxxx\n\t\t\t\t\tchar2 = dataValue.charCodeAt(i++);\n\t\t\t\t\tchar3 = dataValue.charCodeAt(i++);\n\t\t\t\t\tout += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t}\n\n\tstatic formatToInt(dataValue: string): string {\n\t\treturn parseInt(dataValue).toString();\n\t}\n\n\tstatic getFullName(firstName: string = '', lastName: string = ''): string {\n\t\tconst language = Globalize.culture().name;\n\t\tlet fullName: string;\n\t\tswitch (language) {\n\t\t\tcase 'ja':\n\t\t\tcase 'zh':\n\t\t\tcase 'zh-TW':\n\t\t\t\tfullName = `${lastName} ${firstName}`;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfullName = `${firstName} ${lastName}`;\n\t\t}\n\t\treturn fullName;\n\t}\n}\n","import * as React from 'react';\n\n/**\n * Checks if the text is truncated with Tailwind's truncate class.\n * @param el - a ref to the element to check\n * @returns a boolean indicating if the element's content is truncated\n */\nexport const isTruncated = (\n\tel:\n\t\t| React.RefObject\n\t\t| ((instance: HTMLDivElement | HTMLSpanElement | HTMLAnchorElement | null) => void)\n\t\t| null\n): boolean => {\n\tlet current: HTMLDivElement | HTMLSpanElement | HTMLAnchorElement | null = null;\n\n\t// Handle different types of refs\n\tif (el && 'current' in el) {\n\t\tcurrent = el.current;\n\t} else if (typeof el === 'function') {\n\t\t// Ref callbacks are not directly supported by this function\n\t\tconsole.warn('isTruncated does not support callback refs.');\n\t\treturn false;\n\t}\n\n\tif (current) {\n\t\treturn current.scrollWidth > current.clientWidth;\n\t}\n\n\treturn false;\n};\n","import { makeObservable, observable } from 'mobx';\nimport { Has } from '../Object/Has';\n\nexport interface LoadingMachineProps {\n\tonAllCompletedClean: () => void;\n\tonAllCompletedWithErrors: () => void;\n}\n\n/**\n * @deprecated AKA: Needs to be removed, replaced with Union String\n */\nexport enum LoadingState {\n\tLoading = 'LOADING',\n\tDone = 'DONE',\n\tError = 'ERROR'\n}\n\n/**\n * Class for managing loading state for multiple requests\n * @deprecated JTB: Use Promises and Promise.All instead\n */\nclass LoadingMachine {\n\t@observable public loadingState: LoadingState = LoadingState.Loading;\n\t@observable private requests: any = {};\n\t@observable private requestCount: number = 0;\n\tprivate onAllCompletedClean: any = null;\n\tprivate onAllCompletedWithErrors: any = null;\n\n\tconstructor(props?: LoadingMachineProps) {\n\t\tmakeObservable(this);\n\t\tif (props !== undefined) {\n\t\t\tthis.onAllCompletedClean = props.onAllCompletedClean;\n\t\t\tthis.onAllCompletedWithErrors = props.onAllCompletedWithErrors;\n\t\t}\n\t}\n\n\tpublic addLoadRequest(requestName?: string): string {\n\t\tconst requestId: string = this.requestCount.toString();\n\t\tif (this.loadingState !== LoadingState.Error) {\n\t\t\tthis.loadingState = LoadingState.Loading;\n\t\t}\n\t\tthis.requests[requestId] = [LoadingState.Loading, requestName];\n\t\tthis.requestCount++;\n\t\treturn requestId;\n\t}\n\n\tpublic setError(requestId: string): void {\n\t\tif (Object.keys(this.requests).length > 0 && this.requests[requestId]) {\n\t\t\tthis.requests[requestId][0] = LoadingState.Error;\n\t\t} else {\n\t\t\tconsole.log('requests empty, why is this being called.');\n\t\t}\n\t\tthis.checkIfAllAreFinished();\n\t\tthis.loadingState = LoadingState.Error;\n\t}\n\n\tpublic setDone(requestId: string): void {\n\t\tif (Object.keys(this.requests).length > 0 && this.requests[requestId]) {\n\t\t\tthis.requests[requestId][0] = LoadingState.Done;\n\t\t}\n\t\tthis.checkIfAllAreFinished();\n\t}\n\n\tpublic setLoading(requestId: string): void {\n\t\tif (this.requests.length > 0 && this.requests[requestId]) {\n\t\t\tthis.requests[requestId][0] = LoadingState.Loading;\n\t\t}\n\t}\n\n\tprivate checkIfAllAreFinished() {\n\t\tlet allFinished = true;\n\t\tlet errorCount = 0;\n\t\tfor (const key in this.requests) {\n\t\t\tif (Has(this.requests, key)) {\n\t\t\t\tif (this.requests[key][0] !== LoadingState.Done && this.requests[key][0] !== LoadingState.Error) {\n\t\t\t\t\tallFinished = false;\n\t\t\t\t}\n\t\t\t\tif (this.requests[key][0] === LoadingState.Error) {\n\t\t\t\t\terrorCount++;\n\t\t\t\t}\n\n\t\t\t\tif (!allFinished) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (errorCount <= 0) {\n\t\t\tif (this.onAllCompletedClean !== null) {\n\t\t\t\tthis.onAllCompletedClean();\n\t\t\t}\n\t\t\tthis.loadingState = LoadingState.Done;\n\t\t} else {\n\t\t\tif (this.onAllCompletedWithErrors !== null) {\n\t\t\t\tthis.onAllCompletedWithErrors();\n\t\t\t}\n\t\t\tthis.loadingState = LoadingState.Error;\n\t\t}\n\t}\n}\n\nexport default LoadingMachine;\n","export const optimizedResize = (): { add: (callback) => void } => {\n\tconst scallbacks = [];\n\tlet running = false;\n\n\t/** funciton fired on resize event */\n\tfunction resize() {\n\t\tif (!running) {\n\t\t\trunning = true;\n\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(runCallbacks);\n\t\t\t} else {\n\t\t\t\tsetTimeout(runCallbacks, 66);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Run the actual callbacks */\n\tfunction runCallbacks() {\n\t\tscallbacks.forEach(function (callback) {\n\t\t\tcallback();\n\t\t});\n\n\t\trunning = false;\n\t}\n\n\t/** adds callback to loop */\n\tfunction addCallback(callback) {\n\t\tif (scallbacks && callback) {\n\t\t\tscallbacks.push(callback);\n\t\t}\n\t}\n\n\treturn {\n\t\t// public method to add additional callback\n\t\tadd: function (callback) {\n\t\t\tif (!scallbacks.length) {\n\t\t\t\twindow.addEventListener('resize', resize);\n\t\t\t}\n\t\t\taddCallback(callback);\n\t\t}\n\t};\n};\n","export class Timer {\n\tprivate timer: NodeJS.Timer;\n\tprivate startedTime: number;\n\tprivate remainingTime: number;\n\tprivate initialTime: number;\n\tprivate callback: (...args: Array) => void;\n\n\tconstructor(timeMs: number, callback: (...args: Array) => void) {\n\t\tthis.initialTime = timeMs;\n\t\tthis.callback = callback;\n\n\t\tthis.initialize();\n\t\tthis.start();\n\t}\n\n\tprivate initialize = () => {\n\t\tthis.remainingTime = this.initialTime;\n\t};\n\n\tstart = (): void => {\n\t\tif (!this.timer) {\n\t\t\tthis.startedTime = new Date().getTime();\n\t\t\tthis.timer = setTimeout(this.callback, this.remainingTime);\n\t\t}\n\t};\n\n\tstop = (): void => {\n\t\tclearTimeout(this.timer);\n\t\tthis.timer = null;\n\t};\n\n\tpause = (): void => {\n\t\tthis.stop();\n\t\tconst now = new Date().getTime();\n\t\tthis.remainingTime -= now - this.startedTime;\n\t};\n\n\trestart = (): void => {\n\t\tthis.stop();\n\t\tthis.initialize();\n\t\tthis.start();\n\t};\n}\n","import { PCR_Record_Type } from '@mst/api/models/generated/PCR_Record_Type';\nimport { PcrDataFormatters } from '../DataUtilites/DataFormatters';\nimport { Session } from '@mst/global';\n\ndeclare function openIFrameMin(id: string, title: string, link: string): void;\ndeclare function composeEmail(\n\tuser,\n\tfrompage,\n\tcaid,\n\tcoid,\n\tjoid,\n\tseid,\n\ttoemail,\n\tccemail,\n\tmid,\n\tmoffset,\n\treplytype,\n\tsessionid,\n\tforcePCRMail,\n\tfromScreen,\n\tdefaulthtml,\n\tdefaultsubject,\n\tcallonsend,\n\topenInNewWindow\n): void;\n\nconst BuildURLInfo = (partialURL: string, launch: (URL: string) => void) => {\n\tconst URL = `${Session.sessionUrl}/PCRBIN/${partialURL}&pcr-id=${encodeURIComponent(Session.sessionId)}`;\n\treturn { URL: URL, launch: () => launch(URL) };\n};\n\n/**\n * Generate PCR9 links to provide various pieces of functionality, along with the frame id that they belong in.\n *\n * Used when navigating component actions that are embedded in PCR9, such as RowCards.tsx\n */\nexport const PCR9Links = {\n\tPickerProfileTemplate: () =>\n\t\tBuildURLInfo('dropdown.aspx?action=PROFILETEMPLATE', URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerFeedbackLetter: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=FEEDBACKTEMPLATE`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerCompany: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=COM&subaction=DROPALL`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerCandidate: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=NAM&subaction=DROPALL`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerPosition: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=POS&subaction=DROPALL`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerCandidateEmail: () =>\n\t\tBuildURLInfo(\n\t\t\t`addrbook.aspx?i1=&i2=FROMHOT&action=OMAILPICKER&i4=&i5=&i6=ADD&i7=${new Date().toISOString()}&i8=TO&i9=&i10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerRecordAttachment: (\n\t\trecordId: string | number,\n\t\trecordType: 'COMPANY' | 'NAME' | 'POSITION' | 'NAMECOMPANY' | 'NAMEPOSITION'\n\t) =>\n\t\tBuildURLInfo(\n\t\t\t`scripts.aspx?i1=&record_id=${recordId}&action=LIST3&i4=0&stype=${recordType}&i6=&i7=&i8=&i9=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerRolluplist: (recordType: PCR_Record_Type) =>\n\t\tBuildURLInfo(\n\t\t\t`hotadd.aspx?i=&i=&action=CUSTOM&PARENT=&Record_Type=${recordType}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerPositionLetter: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=POSITIONTEMPLATE`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerPositionAttachments_QUERY: (sqlWhere: string) =>\n\t\tBuildURLInfo(\n\t\t\t`bulkres.aspx?action=OUTLOOKATTACHLIST&mailtype=POSMAIL&joid=&recordset=SENDALL&sql=${sqlWhere}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerPositionAttachments: (jobIds: (string | number)[]) =>\n\t\tBuildURLInfo(\n\t\t\t`bulkres.aspx?action=OUTLOOKATTACHLIST&mailtype=POSMAIL&joid=&recordset=SENDPAGE&sql=${jobIds.map(id => `&GUID=${id}`).join()}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerInterviewLetter: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=SENDOUTTEMPLATE`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerPlacementLetter: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=PLACEMENTTEMPLATE`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerInterviewAttachments_QUERY: (sqlWhere: string) =>\n\t\tBuildURLInfo(\n\t\t\t`bulkres.aspx?action=OUTLOOKATTACHLIST&mailtype=SMAIL&joid=&recordset=SENDALL&sql=${sqlWhere}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerInterviewAttachments: (candidateSendoutIds: `${string | number}|${string | number}`[]) =>\n\t\tBuildURLInfo(\n\t\t\t`bulkres.aspx?action=OUTLOOKATTACHLIST&mailtype=SMAIL&joid=&recordset=SENDPAGE&sql=${candidateSendoutIds.map(id => `&GUID=${id}`).join()}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerResumeroutingTemplate: () =>\n\t\tBuildURLInfo(`dropdown.aspx?action=RESUMEROUTINGTEMPLATE`, URL => (document.getElementById('detailframe')['src'] = URL)),\n\tPickerResumeroutingAttachments_QUERY: (sqlQuery: string) =>\n\t\tBuildURLInfo(\n\t\t\t`bulkres.aspx?action=OUTLOOKATTACHLIST&mailtype=BULKRES&joid=&recordset=SENDPAGE&sql=${sqlQuery}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tPickerResumeroutingAttachments: (candidateSendoutIds: `${string | number}|${string | number}`[]) =>\n\t\tBuildURLInfo(\n\t\t\t`bulkres.aspx?action=OUTLOOKATTACHLIST&mailtype=BULKRES&joid=&recordset=SENDPAGE&sql=${candidateSendoutIds.map(id => `&GUID=${id}`).join()}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tFeatureCompanyEmail: //TODO: determine if this should open in a new window or not\n\t\t(companyName: string, email: string, companyId: string | number) => ({\n\t\t\tURL: undefined,\n\t\t\tlaunch: () => {\n\t\t\t\tcomposeEmail(\n\t\t\t\t\tSession.username,\n\t\t\t\t\t'mail',\n\t\t\t\t\t'',\n\t\t\t\t\tcompanyId,\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t`${companyName} <${email}>`,\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\tSession.sessionId,\n\t\t\t\t\tfalse,\n\t\t\t\t\t'COACT',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t}\n\t\t}),\n\tFeatureCandidateEmail: //TODO: determine if this should open in a new window or not\n\t\t(firstName: string, lastName: string, email: string, candidateId: string | number) => ({\n\t\t\tURL: undefined,\n\t\t\tlaunch: () => {\n\t\t\t\tcomposeEmail(\n\t\t\t\t\tSession.username,\n\t\t\t\t\t'mail',\n\t\t\t\t\tcandidateId,\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t`${PcrDataFormatters.getFullName(firstName, lastName)} <${email}>`,\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\tSession.sessionId,\n\t\t\t\t\tfalse,\n\t\t\t\t\t'NAMEACT',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\t'',\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t}\n\t\t}),\n\tFeaturePositionLetter: () =>\n\t\tBuildURLInfo(\n\t\t\t`posmail.aspx?p1=&p2=&p3=TEMPLATE&p4=0&p5=Edit&p6=${new Date().toISOString()}&p7=&p8=&p9=EDITJO&p10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tFeatureInterviewLetter: () =>\n\t\tBuildURLInfo(\n\t\t\t`smail.aspx?p1=&p2=&p3=TEMPLATE&p4=0&p5=Edit&p6=${new Date().toISOString()}&p7=&p8=&p9=EDITJO&p10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tFeaturePlacementLetter: () =>\n\t\tBuildURLInfo(\n\t\t\t`letter.aspx?p1=&p2=&p3=MANAGELIST&p4=0&p5=&p6=${new Date().toISOString()}&p7=&p8=&init=Y&i10=&type=31`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tFeatureResumerouting: () =>\n\t\tBuildURLInfo(\n\t\t\t`bulkres.aspx?i1=&i2=&action=TEMPLATE&i4=0&i5=Edit&i6=${new Date().toISOString()}&i7=&i8=&i9=EDITJO&i10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tFeatureFeedback: () =>\n\t\tBuildURLInfo(\n\t\t\t`feedback.aspx?p1=&p2=&p3=&p4=&p5=&p6=${new Date().toISOString()}&p7=&p8=&p9=&p10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tFeatureMap: (address: string, city: string, state: string, zip: string, country: string) => {\n\t\tconst URL = `http://maps.google.com/maps?oi=map&q=${encodeURIComponent(address)},${encodeURIComponent(city)},${encodeURIComponent(state)} ${encodeURIComponent(zip)} ${encodeURIComponent(country)}`;\n\t\treturn {\n\t\t\tURL: URL,\n\t\t\tlaunch: () => {\n\t\t\t\twindow.open(\n\t\t\t\t\tURL,\n\t\t\t\t\t'_blank',\n\t\t\t\t\t'status=yes,resizable=yes,toolbar=yes,location=no,scrollbars=yes,width=1024,height=500,top=0,left=0'\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t},\n\tVieweditCompany: (companyId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`editco.aspx?i=&i=${companyId}&i=Edit&i=${new Date().toISOString()}&i=4&i=5&i=6&i=7&i=8&i=9`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditHiringauthorityPositions: (haId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`position.aspx?I=&I=&action=KEYWORD&I=0&KEYSEARCH=&partialword=WW&SearchIn=ALL&filters=NO&rtype=3&query=(Positions.Candidate_Id=${haId})`,\n\t\t\tURL => (document.getElementById('listframe')['src'] = URL)\n\t\t),\n\tVieweditCandidatePositions: (candidateId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`sendall.aspx?I1=&I2=${candidateId}&I3=&I4=0&I5=CANDIDATE&I6=C&I7=${new Date().toISOString()}&I8=&I9=POSITION&I10=&caid=${candidateId}`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditCandidate: (candidateId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`editna.aspx?i=&nameGUID=${candidateId}&menuSelection=xyz&i=&i=&i=${new Date().toISOString()}&i=&i=0&i=0`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditPosition: (jobId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`editjo.aspx?i=&i=${jobId}&i=List&i=${jobId}&i=Edit&i=${new Date().toISOString()}&i=Edit&i=Edit&i=Edit`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditCompanyPositions: (companyId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`position.aspx?action=POSCO&recordid=${companyId}&I3=xyz&I4=&I5=0&I6=&I7=${new Date().toISOString()}&I8=&I9=&I10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditInterview: (interviewId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`sendout.aspx?i1=&i2=&i3=Edit&i4=0&i5=${interviewId}&i=${new Date().toISOString()}&i=Edit&i=Edit&i=Edit`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditCompanyActivity: (companyId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`coact.aspx?i=&i=${companyId}&i=Edit&i=0i=4&i=5&i=6&i=${new Date().toISOString()}&i=8&i=9`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditCandidateActivity: (candidateId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`nameact.aspx?i=&i=${candidateId}&i=&i=NAME&i=&i=&i=&i=${new Date().toISOString()}&i=0&i=0`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditPositionActivity: (jobId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`posact.aspx?i=&i=${jobId}&i=&i=&i=&i=&i=&i=${new Date().toISOString()}&i=&i=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditCompanyRollup: (rollupCode: string) =>\n\t\tBuildURLInfo(\n\t\t\t`hot.aspx?i1=&i2=&i3=${new Date().toISOString()}&i4=0&haction=LIST&code=${rollupCode}&rolluptyp=COMPANIES&i8=FRAMES&i9=`,\n\t\t\tURL => (document.getElementById('listframe')['src'] = URL)\n\t\t),\n\tVieweditCandidateRollup: (rollupCode: string) =>\n\t\tBuildURLInfo(\n\t\t\t`hot.aspx?i1=&i2=&i3=${new Date().toISOString()}&i4=0&haction=LIST&code=${rollupCode}&rolluptyp=NAMES&i8=FRAMES&i9=`,\n\t\t\tURL => (document.getElementById('listframe')['src'] = URL)\n\t\t),\n\tVieweditPositionRollup: (rollupCode: string) =>\n\t\tBuildURLInfo(\n\t\t\t`hot.aspx?i1=&i2=&i3=${new Date().toISOString()}&i4=0&haction=LIST&code=${rollupCode}&rolluptyp=POSITIONS&i8=FRAMES&i9=`,\n\t\t\tURL => (document.getElementById('listframe')['src'] = URL)\n\t\t),\n\tVieweditCompanyRollups: (companyId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`rmember.aspx?I1=&I2=${companyId}&I3=&I4=COMPANY&I5=ADD&I6=&I7=${new Date().toISOString()}&I8=&I9=&I10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditCandidateRollups: (candidateId: string) =>\n\t\tBuildURLInfo(\n\t\t\t`rmember.aspx?I1=&I2=${candidateId}&I3=&I4=NAME&I5=ADD&I6=&I7=${new Date().toISOString()}&I8=&I9=&I10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditPositionRollups: (jobId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`rmember.aspx?I1=&I2=${jobId}&rectype=POSITIONS&I4=POSITION&I5=ADD&I6=&I7=${new Date().toISOString()}&I8=&I9=&I10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditCandidateCompany: (candidateId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`editco.aspx?i=&i=${candidateId}&i=CAID&i=${new Date().toISOString()}&i=4&i=5&i=6&i=7&i=8&i=9`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditResumeHeaderfooter: () =>\n\t\tBuildURLInfo(\n\t\t\t`rheader.aspx?i1=&i2=&i3=&i4=&i5=Edit&i6=${new Date().toISOString()}&i7=&i8=&i9=&i10=`,\n\t\t\tURL => (document.getElementById('detailframe')['src'] = URL)\n\t\t),\n\tVieweditPositionPipeline: (jobId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`sendlist.aspx?i1=&joid=${jobId}&i3=VIEWACT&i4=0&i5=POSINTERVIEW&i6=${new Date().toISOString()}&i7=&i8=&hidemenu=H&i10=`,\n\t\t\tURL => window.open(URL)\n\t\t),\n\tCreateCompanyActivity: (companyName: string, companyId: string | number) =>\n\t\tBuildURLInfo(`coact.aspx?i=&i=${companyId}&i=Edit&i=0i=4&i=5&i=NEWACT&i=${new Date().toISOString()}&i=8&i=9`, URL =>\n\t\t\topenIFrameMin(`addAct${companyId}`, `${companyName} - Add Activity`, URL)\n\t\t),\n\tCreateCandidateActivity: (firstName: string, lastName: string, candidateId: string | number) =>\n\t\tBuildURLInfo(`nameact.aspx?i=&i=${candidateId}&i=&i=&i=&i=NEWACT&i=${new Date().toISOString()}&i=8&i=0`, URL =>\n\t\t\topenIFrameMin(`addAct${candidateId}`, `${PcrDataFormatters.getFullName(firstName, lastName)} - Add Activity`, URL)\n\t\t),\n\tCreatePositionActivity: (jobTitle: string, jobId: string | number) =>\n\t\tBuildURLInfo(`posact.aspx?i=&i=${jobId}&i=&i=&i=&i=NEWACT&i=${new Date().toISOString()}&i=&i=`, URL =>\n\t\t\topenIFrameMin('submitProfile', `${jobTitle} - Add Activity`, URL)\n\t\t),\n\tCreateCompanyProfile: (companyId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`scripts.aspx?i1=&recid=${companyId}&formaction=ADDPROFILE2&morecount=&rectype=COMPANYX&sid=&attachname=Edit&attachmode=&i9=Edit&i10=`,\n\t\t\tURL => openIFrameMin('submitProfile', 'Submit Company Profile', URL)\n\t\t),\n\tCreateCandidateProfile: (candidateId: string | number) =>\n\t\tBuildURLInfo(\n\t\t\t`scripts.aspx?i1=&recid=${candidateId}&formaction=ADDPROFILE3&morecount=&rectype=NAMEX&sid=&attachname=Edit&attachmode=&i9=Edit&i10=`,\n\t\t\tURL => openIFrameMin('submitProfile', 'Submit Candidate Profile', URL)\n\t\t),\n\tNotices: () => {\n\t\tconst URL = 'https://www2.pcrecruiter.net/notices.htm';\n\t\treturn {\n\t\t\tURL: URL,\n\t\t\tlaunch: () => {\n\t\t\t\twindow.open(URL);\n\t\t\t}\n\t\t};\n\t}\n} as const;\n","import { Has } from '../Object/Has';\n\n/**\n * There is a function in helper.js::GetTopWindow() that might be better suited to retrieve the top window,\n * as it works even when opening new tabs or navigating through multiple Iframes, and also works with Outlook Portal\n * @returns\n */\nexport const getHighestWindow = (): Window => {\n\treturn window.top;\n};\n\n/**\n * Copies the style rules from what emotion js generates and also what is built from our main.css file\n *\n * @props windows: `{ fromWin?: Window; toWin: Window }`\n */\nexport const copyPCRLibCSSFromFrameToFrame = (windows: { fromWin?: Window; toWin: Window }): void => {\n\tlet topWindow = null;\n\tconst toWin = windows.toWin;\n\tif (windows.fromWin) {\n\t\ttopWindow = windows.fromWin;\n\t} else {\n\t\ttopWindow = getHighestWindow();\n\t}\n\n\tif (toWin.document.querySelector('[data-emotion]') || toWin.document.querySelector('[data-emotion-copy]')) {\n\t\tconsole.error('Styles already exist.');\n\t\treturn;\n\t}\n\n\tif (Has(topWindow, 'PCRLib')) {\n\t\t//pass it on\n\t\tconst emotionStyle = topWindow.document.querySelector('[data-emotion]');\n\n\t\t//new style to append to our toWindow\n\t\tconst style: any = toWin.document.createElement('style');\n\t\ttoWin.document.head.appendChild(style);\n\t\tstyle.setAttribute('data-emotion-copy', 'css');\n\n\t\t//copy css rules from emotion over to our new style object\n\t\tArray.from(emotionStyle.sheet.cssRules).forEach((cssRule: CSSRule) => {\n\t\t\tstyle.sheet.insertRule(cssRule.cssText, style.sheet.cssRules);\n\t\t});\n\n\t\t//copy over main.css styles as well.\n\t\tArray.from(topWindow.document.querySelectorAll('link')).forEach((link: any) => {\n\t\t\tif (link.href && link.href.indexOf('PCR/app') > -1 && link.sheet !== undefined) {\n\t\t\t\tArray.from(link.sheet.cssRules).forEach((cssRule: CSSRule) => {\n\t\t\t\t\tif (cssRule.type === 1) {\n\t\t\t\t\t\t//in ie the keyframe css rules were breaking things so we are restricting those out. If needed put them in the emotion lib.\n\t\t\t\t\t\tstyle.sheet.insertRule(cssRule.cssText, style.sheet.cssRules);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t} else {\n\t\t//no pcrlib found\n\t\tconsole.error('No PCRLib found to retrieve emotion css');\n\t}\n};\n\n//Copies the core pcr framework js object into a new iframe window\n//props:\n// windows: {fromWin?:Window, toWin:Window}\nexport const copyPCRLibJSFromFrameToFrame = (windows: { fromWin?: Window; toWin: Window }): void => {\n\tlet topWindow = null;\n\tconst toWin = windows.toWin;\n\tif (windows.fromWin) {\n\t\ttopWindow = windows.fromWin;\n\t} else {\n\t\ttopWindow = getHighestWindow();\n\t}\n\n\tif (Has(toWin, 'PCRLib')) {\n\t\tconsole.error('PCRLib already exists.');\n\t\treturn;\n\t}\n\n\tif (Has(topWindow, 'PCRLib')) {\n\t\t//pass it on\n\t\ttoWin['PCRLib'] = topWindow.PCRLib;\n\t\ttoWin['PCRApi'] = topWindow.PCRApi;\n\t} else {\n\t\t//no pcrlib found\n\t\tconsole.error('No PCRLib found.');\n\t}\n};\n","export const FormatCityState = (city?: string, state?: string): string => {\n\tswitch (true) {\n\t\tcase !!city && !!state:\n\t\t\treturn `${city}, ${state}`;\n\t\tcase !!city && !state:\n\t\t\treturn city;\n\t\tcase !city && !!state:\n\t\t\treturn state;\n\t\tdefault:\n\t\t\treturn '';\n\t}\n};\n","import SessionApi from '@mst/api/api/SessionApi';\nimport { FeedbackViewedStorage } from '@mst/api/models/Feedback';\nimport { LocalStorageHelper } from './LocalStorageHelper';\nimport { IOption } from '@mst/api/models/GlobalEnums';\nimport { Session } from '@mst/global';\n\nexport interface PCRUserData {\n\t[username: string]: {\n\t\t[database: string]: PCRUserLocalStorage;\n\t};\n}\n\n/**\n * This interface is intended to hold all keys present for a given \"user instance\"\n * (username/database pair)\n * If you need to save user-specific data, add a key here and use this class!\n * @deprecated Use IndexDB\n */\ninterface PCRUserLocalStorage {\n\t/** dark mode toggle for popup AND content */\n\tdarkMode?: boolean;\n\t/** Session information */\n\tsession?: Partial;\n\t/** User Tab Order Collection */\n\ttabOrderList?: {\n\t\t/**TODO: Tabs are all messed up right now, navOrder and config objects\n\t\t * living in RecordPages instead of just buildng out the tabs\n\t\t */\n\t\t[key: string]: unknown;\n\t};\n\t/** Viewed Feedback */\n\tfeedbackViewed?: Partial;\n\tSubmitProfile_Previous?: IOption[];\n\t/** Track whether the user has viewed ai help before, if they have not then show AI help when they first switch to it in the Quick Search box */\n\thasViewedAIHelp?: boolean;\n\t/** Track how many valid ai searches have been performed, this is used to display a tooltip when search counts are below a certain threshold */\n\taiSearchCount?: number;\n}\n\n/**\n * Helper class with static members to interact with LocalStorage on a per-user basis.\n * Capture LocalStorage is typed with the interface used below.\n * @deprecated Use IndexDB\n */\nexport class UserLocalStorage {\n\t/**\n\t * Saves a value or object to local storage for the current user-database pair\n\t * @param key Lookup value of what is being saved.\n\t * @param item Object or value to be stored as a string.\n\t */\n\tstatic Save(key: keyof PCRUserLocalStorage, item: unknown): void {\n\t\tif (!Session.username || !Session.databaseId) {\n\t\t\tconsole.error(`Could not modify key ${key} in user local storage. User or database not found.`);\n\t\t\treturn;\n\t\t}\n\n\t\tlet usersData: PCRUserLocalStorage = LocalStorageHelper.Load('userData');\n\n\t\tif (!usersData) {\n\t\t\tusersData = {\n\t\t\t\t[Session.username?.toUpperCase()]: {\n\t\t\t\t\t[Session.databaseId.toLowerCase()]: {}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tlet userInstance = usersData[Session.username?.toUpperCase()];\n\n\t\tif (!userInstance) {\n\t\t\tuserInstance = {\n\t\t\t\t[Session.databaseId.toLowerCase()]: {}\n\t\t\t};\n\t\t\tusersData[Session.username?.toUpperCase()] = userInstance;\n\t\t}\n\n\t\tif (!userInstance?.[Session.databaseId.toLowerCase()]) {\n\t\t\tuserInstance[Session.databaseId.toLowerCase()] = {};\n\t\t}\n\n\t\tuserInstance[Session.databaseId.toLowerCase()][key] = item;\n\n\t\tusersData[Session.username?.toUpperCase()] = userInstance;\n\n\t\tLocalStorageHelper.Save('userData', usersData);\n\t}\n\n\t/**\n\t * Loads a value from local storage for the current user-database pair and parses it.\n\t * @param key Lookup value of what is to be read from local storage.\n\t */\n\tstatic Load(key: keyof PCRUserLocalStorage): any {\n\t\tif (!Session.username || !Session.databaseId) {\n\t\t\tconsole.error('Could not access local storage. User or database not found.');\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst usersData = LocalStorageHelper.Load('userData');\n\n\t\treturn usersData?.[Session.username?.toUpperCase()]?.[Session.databaseId.toLowerCase()]?.[key];\n\t}\n\n\t/**\n\t * Remove an item from LocalStorage for the current user-database pair\n\t * @param key Lookup value of what to remove from local storage.\n\t */\n\tstatic Remove(key: keyof PCRUserLocalStorage): void {\n\t\tif (!Session.username || !Session.databaseId) {\n\t\t\tconsole.error('Could not modify local storage. User or database not found.');\n\t\t\treturn;\n\t\t}\n\n\t\tconst usersData = LocalStorageHelper.Load('userData');\n\n\t\tif (usersData?.[Session.username?.toUpperCase()]?.[Session.databaseId?.toLowerCase()?.[key]]) {\n\t\t\tdelete usersData?.[Session.username?.toUpperCase()]?.[Session.databaseId]?.toLowerCase()?.[key];\n\n\t\t\tLocalStorageHelper.Save('userData', usersData);\n\t\t}\n\t}\n\n\t/**\n\t * Clear out all values in local storage for the current user-database pair\n\t */\n\tstatic RemoveAll(): void {\n\t\tif (!Session.username || !Session.databaseId) {\n\t\t\tconsole.error('Could not modify local storage. User or database not found.');\n\t\t\treturn;\n\t\t}\n\n\t\tconst usersData = LocalStorageHelper.Load('userData');\n\n\t\tif (usersData?.[Session.username?.toUpperCase()]?.[Session.databaseId.toLowerCase()]) {\n\t\t\tusersData[Session.username?.toUpperCase()][Session.databaseId.toLowerCase()] = {};\n\t\t}\n\n\t\tLocalStorageHelper.Save('userData', usersData);\n\t}\n\n\t/**\n\t * Retrieves the entire collection of items belonging to the current user/db pair.\n\t */\n\tstatic GetUserInstance(): PCRUserLocalStorage {\n\t\tif (!Session.username || !Session.databaseId) {\n\t\t\tconsole.error('Could not retrieve user instance. User or database not found.');\n\t\t}\n\n\t\tconst usersData = LocalStorageHelper.Load('userData');\n\n\t\treturn usersData?.[Session.username?.toUpperCase()]?.[Session.databaseId.toLowerCase()];\n\t}\n}\n","/**\n * Copy text value to clipboard.\n * @param text value to copy to clipboard\n */\nexport function copyToClipboard(text: string, windowContextOverride?: Window): Promise {\n\treturn getWindowContext(windowContextOverride)\n\t\t.navigator.clipboard.writeText(text)\n\t\t.catch(err => {\n\t\t\tconsole.error('Failed to copy text: ', err);\n\t\t});\n}\n\n/**\n * Read text value from clipboard.\n */\nexport function readFromClipboard(windowContextOverride?: Window): Promise {\n\treturn getWindowContext(windowContextOverride)\n\t\t.navigator.clipboard.readText()\n\t\t.catch(err => {\n\t\t\tconsole.error('Failed to read from clipboard: ', err);\n\t\t});\n}\n\n/**\n * Helper to get the appropriate window context to run the clipboard logic from\n * @param windowContextOverride override to specifically choose the window context\n * @returns a Window object\n */\nfunction getWindowContext(windowContextOverride?: Window): Window {\n\t//by default we want to use the top window if available and an override not provided\n\treturn windowContextOverride ?? globalThis.top ?? window;\n}\n","export interface filterItem {\n\tid: string;\n\tname: string;\n\trecordtype: string;\n}\nexport const filterListToString = (useId: boolean, name: string, list: Array): string => {\n\tlet ret = '';\n\tif (list !== null && list.length > 0) {\n\t\tfor (let i = 0; i < list.length; i++) {\n\t\t\tlet value = '';\n\t\t\tif (useId) {\n\t\t\t\tvalue = list[i].id;\n\t\t\t} else {\n\t\t\t\tvalue = list[i].name;\n\t\t\t}\n\t\t\tret += `${name}=${value}`;\n\t\t\tif (i !== list.length - 1) {\n\t\t\t\tret += '&';\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ret;\n};\n\nexport const numberToString = (number: number): string => {\n\treturn number.toLocaleString();\n};\n","import { filterListToString } from '../Formatters/StringFormatter';\n\nexport class DateFilter {\n\tcustomDashDate: string;\n\tregularDashDate: {\n\t\tlabel: string;\n\t\tstartDate: string;\n\t\tendDate: string;\n\t};\n\tconstructor() {\n\t\tthis.customDashDate = '';\n\t\tthis.regularDashDate = {\n\t\t\tlabel: 'thisyear',\n\t\t\tstartDate: '',\n\t\t\tendDate: ''\n\t\t};\n\t}\n}\n\nexport class LoggedInUser {\n\tusername: string = '';\n\tuserId: string = '';\n\tsecurityLevel: string = '';\n}\n\nexport class FilterToggleList {\n\tdate: boolean = true;\n\tbucketFilter: boolean = true;\n\tcompanyFilter: boolean = true;\n\tdatabaseFilter: boolean = true;\n\tposFilter: boolean = true;\n\tpositionStatusFilter: boolean = true;\n\trecordTypeFilter: boolean = true;\n\tteamFilter: boolean = true;\n\tuserFilter: boolean = true;\n\tuserAllFilter: boolean = true;\n\tplacementTypeFilter: boolean = true;\n\tcategoryFilter: boolean = true;\n\n\tallOff(): void {\n\t\tthis.date = false;\n\t\tthis.bucketFilter = false;\n\t\tthis.companyFilter = false;\n\t\tthis.databaseFilter = false;\n\t\tthis.posFilter = false;\n\t\tthis.positionStatusFilter = false;\n\t\tthis.recordTypeFilter = false;\n\t\tthis.teamFilter = false;\n\t\tthis.userFilter = false;\n\t\tthis.userAllFilter = false;\n\t\tthis.placementTypeFilter = false;\n\t\tthis.categoryFilter = false;\n\t}\n}\nexport default class Filter {\n\tdate: DateFilter = new DateFilter();\n\tloggedInUser: LoggedInUser = new LoggedInUser();\n\tbucketFilter: string = '';\n\tcompanyFilter: Array = [];\n\tdatabaseFilter: Array = [];\n\tposFilter: Array = [];\n\tpositionStatusFilter: Array = [];\n\trecordTypeFilter: Array = [];\n\tteamFilter: Array = [];\n\tuserFilter: Array = [];\n\tuserAllFilter: boolean = false;\n\tplacementTypeFilter: Array = [];\n\tcategoryFilter: Array = [];\n\n\tinitFilterFromString(input: string): Filter {\n\t\tconst tempFilter: Filter = new Filter();\n\t\tif (input.length > 0) {\n\t\t\tObject.assign(tempFilter, JSON.parse(input));\n\t\t}\n\t\tObject.assign(this, tempFilter);\n\t\treturn tempFilter;\n\t}\n\n\tfiltersToApiString(filterToggleList?: FilterToggleList): string {\n\t\tlet ret = '';\n\t\tconst ftl: FilterToggleList = filterToggleList ? filterToggleList : new FilterToggleList();\n\n\t\tif (ftl.date && this.date.regularDashDate.label !== null) {\n\t\t\tif (this.date.regularDashDate.label === 'customrange') {\n\t\t\t\tret += 'dateFilter=Custom';\n\t\t\t\tret += `&CustomMinDate=${this.date.regularDashDate.startDate}`;\n\t\t\t\tret += `&CustomMaxDate=${this.date.regularDashDate.endDate}`;\n\t\t\t} else {\n\t\t\t\tret += `dateFilter=${this.date.regularDashDate.label}`;\n\t\t\t}\n\t\t}\n\n\t\tif (ftl.bucketFilter && this.bucketFilter !== null && this.bucketFilter.length > 0) {\n\t\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\t\tret += '&';\n\t\t\t}\n\t\t\tret += `BucketTypeFilter=${this.bucketFilter}`;\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.companyFilter) {\n\t\t\tret += filterListToString(true, 'CompanyFilter', this.companyFilter);\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.databaseFilter) {\n\t\t\tret += filterListToString(true, 'DatabaseFilter', this.databaseFilter);\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.posFilter) {\n\t\t\tret += filterListToString(true, 'JobFilter', this.posFilter);\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.positionStatusFilter) {\n\t\t\tret += filterListToString(false, 'PositionStatusFilter', this.positionStatusFilter);\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.recordTypeFilter) {\n\t\t\tret += filterListToString(true, 'RecordTypeFilter', this.recordTypeFilter);\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.teamFilter) {\n\t\t\tret += filterListToString(true, 'TeamFilter', this.teamFilter);\n\t\t}\n\t\tif (ftl.userAllFilter && this.userAllFilter === false) {\n\t\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\t\tret += '&';\n\t\t\t}\n\t\t\tret += filterListToString(true, 'userFilter', this.userFilter);\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.placementTypeFilter) {\n\t\t\tret += filterListToString(true, 'PlacementTypeFilter', this.placementTypeFilter);\n\t\t}\n\t\tif (ret.length > 0 && ret[ret.length - 1] !== '&') {\n\t\t\tret += '&';\n\t\t}\n\t\tif (ftl.categoryFilter) {\n\t\t\tret += filterListToString(true, 'CategoryFilter', this.categoryFilter);\n\t\t}\n\n\t\tif (ret[ret.length - 1] === '&') {\n\t\t\tret = ret.substr(0, ret.length - 1);\n\t\t}\n\n\t\treturn ret;\n\t}\n}\n","/**\n * Search for a date in from either year, month-year, or month-day-year\n * @param dates: Date constructor\n * @param value: the value to search for\n */\nexport function PartialDateSearch(dates?: Date, value?: string): boolean {\n\tconst searchValue = value.replace(/-/g, '/');\n\tconst splitDates = searchValue.split('/');\n\tif (splitDates.length === 1) {\n\t\tconst searchDate: number | Date = new Date(searchValue);\n\t\tif (!isNaN(searchDate as unknown as number)) {\n\t\t\treturn dates.getFullYear() === Number(searchValue);\n\t\t}\n\t}\n\tif (splitDates.length === 2) {\n\t\tconst monthYear = new Date();\n\t\tmonthYear.setFullYear(Number(splitDates[1]));\n\t\tmonthYear.setMonth(Number(splitDates[0]) - 1);\n\t\tif (!isNaN(monthYear as unknown as number)) {\n\t\t\treturn dates.getFullYear() === monthYear.getFullYear() && dates.getMonth() === monthYear.getMonth();\n\t\t}\n\t}\n\tif (splitDates.length === 3) {\n\t\tconst searchDate = new Date(searchValue);\n\t\tif (!isNaN(searchDate as unknown as number)) {\n\t\t\treturn (\n\t\t\t\tdates.getFullYear() === searchDate.getFullYear() &&\n\t\t\t\tdates.getMonth() === searchDate.getMonth() &&\n\t\t\t\tdates.getDay() === searchDate.getDay()\n\t\t\t);\n\t\t}\n\t}\n\treturn false;\n}\n","import { UserSecurity, enumUserSecurityCrud } from '@mst/api/models/UserSecurity';\nimport { eSecurity } from '@mst/api/models/generated/eSecurity';\nimport { Permissions } from '@mst/global';\n\n/**\n * Check if all operations in security are enabled (or true)\n * If one operation is disabled then this function will return false\n */\nexport function IsUserSecurityEnabled(security: unknown): boolean {\n\tif (!security) {\n\t\treturn false;\n\t}\n\n\treturn Object.keys(security).every(k => security[k]);\n}\n\ninterface SharedSecurityProps {\n\tUserSecuritySettings: UserSecurity;\n}\n\nexport { eSecurity };\nexport { enumUserSecurityCrud };\n\n//singleton to hold current user security settings\nexport const SharedUserSecurity: SharedSecurityProps = {\n\tUserSecuritySettings: undefined\n};\n\n/** Function to check if a user is an Admin User */\nexport const IsUserAdmin = (): boolean => {\n\treturn IsUserSecurityEnabled(Permissions.Administrator);\n};\n\n/** Function to return the message that should be displayed when a user does not have permission to view a page or perform a task */\nexport function getNoPermissionString(permissionName: string): string {\n\treturn `Unfortunately, you do not have access to \"${permissionName}\". Please contact your admin.`;\n}\n","/**\n * Converts blob data (such as a file from a fetch request) to a base64 encoded string.\n * @example fetch('https://path/to/pdf').then(resp => blobToBase64(resp.blob()))\n */\nexport async function blobToBase64(blob: Blob): Promise {\n\treturn new Promise((resolve, _) => {\n\t\tconst reader = new FileReader();\n\t\treader.onloadend = () => resolve(reader.result as string);\n\t\treader.readAsDataURL(blob);\n\t});\n}\n\n/**\n * Converts a base64 data URL to a blob.\n * @example base64ToBlob(`data:image/png;base64,${image_data_string}`)\n */\nexport async function base64ToBlob(base64: string): Promise {\n\tconst resp = await fetch(base64);\n\treturn resp.blob();\n}\n\n/**\n * The subset of UploadAttachment (see generated models) that is applicable to a newly uploaded file\n */\ntype attachment = { data: ArrayBuffer | string; displayName: string };\n\n/**\n * Reads a list of files generated from an HTML file input and returns a list of array buffers.\n */\nexport async function readFiles(files: FileList): Promise {\n\tconst attachments: Promise[] = [];\n\tif (files?.length) {\n\t\tfor (const file of files) {\n\t\t\tattachments.push(\n\t\t\t\tnew Promise(resolve => {\n\t\t\t\t\t//File reader is event-driven, so...\n\t\t\t\t\t//create a reader for each file\n\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\t//create handler to resolve the attachment (our upload shape) when the reader completes\n\t\t\t\t\treader.onloadend = () => {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: btoa(reader.result),\n\t\t\t\t\t\t\tdisplayName: file.name\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\t//tell the reader to read the file now that the event has a handler\n\t\t\t\t\treader.readAsBinaryString(file);\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\treturn Promise.all(attachments);\n}\n\n/**\n * Info associated with a file such as mimeType and extension.\n */\nexport interface FileInfo {\n\textension: string;\n\tmimeType: string;\n\tcanOpenInNewTab?: boolean;\n}\n\n/**\n * Assuming browser window context, downloads a file given decoded data and other details.\n * @param fileName What you want to name the downloaded file.\n * @param decodedData Already decoded file data to download as contents of the file.\n * @param fileInfo Info about the file used to download the correct type. Need extension and mimeType.\n * @returns True if successful or false if there was an issue.\n */\nexport function downloadFile(fileName: string, decodedData: Uint8Array, fileInfo: FileInfo): boolean {\n\t// Check if we have a document to reference, otherwise return false.\n\tconst doc = globalThis?.window?.document;\n\tif (!doc) {\n\t\tconsole.error('Error: Could not find window document to download file.');\n\t\treturn false;\n\t}\n\n\t// Create a Blob object from the decoded data and use the correct MIME type\n\tconst blob = new Blob([decodedData], { type: fileInfo.mimeType });\n\n\t// Create a temporary anchor element\n\tconst link = doc.createElement('a');\n\n\t// Create an object URL for the blob\n\tconst url = URL.createObjectURL(blob);\n\n\t// Set the download attribute with the desired filename and extension\n\tlink.href = url;\n\tlink.download = `${fileName}`;\n\n\t// Append the anchor to the body (necessary for Firefox)\n\tdoc.body.appendChild(link);\n\n\t// Trigger the download by programmatically clicking the link\n\tlink.click();\n\n\t// Remove the link from the DOM\n\tdoc.body.removeChild(link);\n\n\t// Revoke the object URL to free up memory\n\tURL.revokeObjectURL(url);\n\treturn true;\n}\n\n/**\n *\n * @param fileName What you want to name the downloaded file if it downloads to view.\n * @param decodedData Already decoded file data to download as contents of the file.\n * @param fileInfo Info about the file used to download the correct type. Need extension and mimeType.\n * @returns True if successful or false if there was an issue.\n */\nexport function viewFileInNewTab(fileName: string, decodedData: Uint8Array, fileInfo: FileInfo): boolean {\n\t// Check if the file can be opened in a new tab\n\tif (!fileInfo.canOpenInNewTab) {\n\t\t// If the file cannot be opened in a new tab, fall back to downloading it\n\t\treturn downloadFile(fileName, decodedData, fileInfo);\n\t}\n\n\t// Check if the window object is available (ensures we're in a browser context). If we arent return false.\n\tif (!globalThis?.window) {\n\t\t// If no window is found, log an error and return false (indicating failure)\n\t\tconsole.error('Error: Could not find window to trigger file view.');\n\t\treturn false;\n\t}\n\n\t// Create a Blob object from the decoded data with the correct MIME type\n\tconst blob = new Blob([decodedData], { type: fileInfo.mimeType });\n\n\t// Generate an object URL for the Blob (used to reference the file data in memory)\n\tconst url = URL.createObjectURL(blob);\n\n\t// Open the generated URL in a new tab using the window object\n\twindow.open(url, '_blank');\n\n\t// Return true to indicate the file was successfully opened in a new tab\n\treturn true;\n}\n\n/**\n * Turn encoded file data into decoded file data with file type info.\n * @param encodedData Encoded base64 based string of a given file.\n * @returns Decoded file along with associated file info.\n */\nexport function decodeAndDetectFileType(encodedData: string): { decodedData: Uint8Array; fileInfo: FileInfo } | undefined {\n\ttry {\n\t\t// Remove data URL prefix if present\n\t\tconst base64Data = encodedData.replace(/^data:[^;]+;base64,/, '');\n\n\t\t// Decode base64 to binary\n\t\t// atob is deprecated in nodejs but not in the window. Just a note here.\n\t\tlet binaryString = globalThis.window.atob(base64Data);\n\n\t\t// Specific case to PCR\n\t\t// Check to see if the data includes nested image data for a large image. Typical for upload scenarios of a record image.\n\t\t// Typically we expect these scenarios to start off with a tag in the data string.\n\t\tif (binaryString.indexOf('') === 0) {\n\t\t\tconst indexOfLargeStart = binaryString.indexOf('') + 7;\n\t\t\tconst indexOfLargeEnd = binaryString.indexOf('');\n\t\t\tconst largeData = binaryString.slice(indexOfLargeStart, indexOfLargeEnd);\n\t\t\tif (largeData) {\n\t\t\t\tbinaryString = largeData;\n\t\t\t}\n\t\t}\n\n\t\t// Convert to binary data array\n\t\tconst len = binaryString.length;\n\t\tconst bytes = new Uint8Array(len);\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tbytes[i] = binaryString.charCodeAt(i);\n\t\t}\n\n\t\t// Detect file type\n\t\tconst fileType = detectFileType(bytes);\n\n\t\treturn { decodedData: bytes, fileInfo: fileType };\n\t} catch (e) {\n\t\tconsole.error('Error when decoding encoded data string.', e);\n\t}\n}\n\n/**\n * Detect the FileInfo from decoded byte data.\n * @param bytes Decoded byte data.\n * @returns Info about the file such as mimeType and extension\n */\nfunction detectFileType(bytes: Uint8Array): FileInfo {\n\tconst signature = bytes.slice(0, 4);\n\tconst hex = Array.from(signature)\n\t\t.map(b => b.toString(16).padStart(2, '0'))\n\t\t.join('');\n\n\tconst possibleHtml = new TextDecoder().decode(bytes.slice(0, 1000)).toLowerCase();\n\tif (possibleHtml.includes('') || possibleHtml.includes('(\n\trecordType: RecordType,\n\trecord: DuplicateResponseRecord,\n\tweights?: DuplicateRecordWeights\n\t//commenting deterministicGroups out as it may be used later\n\t// deterministicGroups?: keyof T[][]\n): ScoredDuplicateRecord {\n\tconst DuplicateCheckableRecords = {\n\t\t[RecordType.Name]: CandidateRecordV2,\n\t\t[RecordType.Company]: CompanyRecordV2,\n\t\t[RecordType.Position]: PositionRecordV2\n\t} as const;\n\n\tconst score: number = record.score;\n\tlet maxScore: number = 0;\n\n\t//create a record of type T so it can be populated with data\n\tconst parsedRecord: WithCustomFields = new DuplicateCheckableRecords[recordType]({\n\t\tCustomFields: []\n\t});\n\n\t//not needed?\n\t//const _deterministicGroups = deterministicGroups ?? DuplicateRecordWeights[recordType].deterministic;\n\t//use weight override, if it exists. Else, use defaults.\n\tconst _weights = weights ?? DefaultDuplicateRecordWeights[recordType].weights;\n\n\tconst fieldScores: DuplicateRecordWeights = {};\n\n\trecord.fields.forEach(field => {\n\t\tif (field.fieldValue !== null && field.fieldValue !== undefined) {\n\t\t\t//extract values and type them\n\t\t\tconst key = field.fieldName as string;\n\t\t\tconst value = field.fieldValue as T[keyof T];\n\t\t\tconst fieldScore = field.fieldWeight;\n\n\t\t\t//increment max score (both sides had a value, but they might be different)\n\t\t\tmaxScore += _weights[key] ?? 1;\n\n\t\t\t//add individual field score to score collection\n\t\t\tfieldScores[key] = fieldScore;\n\n\t\t\tif (key.indexOf('.') > 0) {\n\t\t\t\t//Special cases - add exceptions here. At time of authorship, this is just custom fields.\n\t\t\t\tparsedRecord.CustomFields.push({ FieldName: key.split('.')[1], Value: value as string[], Action: undefined });\n\t\t\t} else {\n\t\t\t\tparsedRecord[key] = value;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn {\n\t\t//If a deterministic match was found, score is automatically 100.\n\t\tpercentScore: record.deterministicMatchIndexes.length > 0 ? 100 : (score / maxScore) * 100,\n\t\tfieldScores: fieldScores,\n\t\trecord: parsedRecord,\n\t\trecordId: record.recordId[0]\n\t};\n}\n","import { ProxyApi } from '@mst/api/api/ProxyApi';\n/**\n * Takes a image path and returns the data for it. Conversion is clientside.\n * @param img image source\n */\nexport function getBase64Image(imgPath: string, callback: (ret: string) => void): void {\n\tif (imgPath.length <= 0) {\n\t\tcallback('');\n\t\treturn;\n\t}\n\tconst img = window.top.document.createElement('img');\n\timg.style.position = 'absolute';\n\timg.style.top = '0px';\n\timg.style.left = '-300px';\n\timg.style.maxHeight = '100%';\n\timg.style.maxWidth = '100%';\n\timg.width = 256;\n\timg.height = 256;\n\timg.src = imgPath;\n\timg.crossOrigin = 'anonymous';\n\timg.onload = () => {\n\t\tconst canvas = window.top.document.createElement('canvas');\n\t\tcanvas.width = img.width;\n\t\tcanvas.height = img.height;\n\t\tconst ctx = canvas.getContext('2d');\n\t\tctx.drawImage(img, 0, 0);\n\t\tconst dataURL = canvas.toDataURL('image/png');\n\t\t// return dataURL.replace(/^data:image\\/(png|jpg);base64,/, \"\");\n\t\tcallback(dataURL.replace(/^data:image\\/(png|jpg);base64,/, ''));\n\t\timg.remove();\n\t\tcanvas.remove();\n\t};\n\twindow.top.document.body.appendChild(img);\n}\n\n/**\n * Async\n * @param url the url hosting the image. HOSTNAME MUST BE WHITELISTED.\n * @returns base64 image url, undefined if no image\n */\nexport async function getBase64ImageCors(url: string): Promise {\n\tif (url.length > 0) {\n\t\t//TODO: this is temporary.\n\t\t//Our current version of windows server doesn't support the cipher suite used by hireEZ.\n\t\t//The temporary solution (until our servers are updated) is to use http to fetch the images.\n\t\tif (url.indexOf('https://') > -1) {\n\t\t\turl = url.replace('https://', 'http://');\n\t\t}\n\t\tconst response = await new ProxyApi().get(`?binary=true&ResourcePath=${url}`, { hideToast: true });\n\t\tif (response?.data?.BinaryResponseBody?.length > 0) {\n\t\t\treturn `${response.data.BinaryResponseBody}`;\n\t\t}\n\t}\n\treturn undefined;\n}\n//data:image/png;base64,\n","import { LocalStorageHelper } from '../LocalStorage/LocalStorageHelper';\n\nexport class UnsavedRecordHelper {\n\t/**\n\t * Store unsaved record data in local storage, used to track unsaved data between routes.\n\t * @param recordId\n\t * @param apiName - Api property name inside api object. call Api[apiName] to retrieve api for update\n\t * @param updateData\n\t * @param isFlyout - a record may be edited in a flyout or on the main screen, therefore keep track of both\n\t */\n\tstatic SetUnsavedRecord(recordId: string | string[], apiName: string, updateData: unknown, isFlyout?: boolean): void {\n\t\tLocalStorageHelper.Save(isFlyout ? 'UNSAVEDFLYOUT' : 'UNSAVED', {\n\t\t\trecordId,\n\t\t\tapiName,\n\t\t\tupdateData,\n\t\t\tisFlyout\n\t\t});\n\t}\n\n\t/**\n\t * Get unsaved record data\n\t * @param isFlyout\n\t * @returns\n\t */\n\tstatic GetUnsavedRecord(isFlyout?: boolean): {\n\t\trecordId: string | string[];\n\t\tapiName: string;\n\t\tupdateData: unknown;\n\t\tisFlyout?: boolean;\n\t} {\n\t\treturn LocalStorageHelper.Load(isFlyout ? 'UNSAVEDFLYOUT' : 'UNSAVED');\n\t}\n\n\tstatic RemoveUnsavedRecord(fromFlyout?: boolean): void {\n\t\tLocalStorageHelper.Remove(fromFlyout ? 'UNSAVEDFLYOUT' : 'UNSAVED');\n\t}\n}\n"],"names":["buildDuplicateCriteria","config","record","fieldWeights","deterministicGroups","determinateOnly","minimumScore","recordType","_b","_a","field","overriddenDeterministicGroups","_c","DefaultDuplicateRecordWeights","overriddenFieldWeights","_d","criteria","key","customField","fieldHasWeight","isDeterministicCriteria","group","fieldName","filteredGroups","dupeField","asyncThrottle","asyncFunctions","maxParallel","resolve","reject","combinedResults","pendingFunctions","currentIndex","processNext","capturedIndex","promise","results","error","p","msg","URLHelper","name","url","regex","searchUrl","keyIndex","valueString","startOfValue","endOfValue","location","searchValuesObj","searchString","searchValueString","value","str","urlHelper","Has","object","LocalStorageHelper","item","HasWindowLocalStorage","isPrimitiveValue","data","isParseableValue","parsedData","e","qc","REQUIRED_INDICES","USERKEYS","STORE_KEYS","upgradeUserDatabase","event","dbToUpgrade","sessionStore","primaryIndex","themeStore","blueprintStore","recentlyViewedStore","recordSearchStore","DATABASE_VERSION","UserStorageUtility","__publicField","db","createOrLoadDatabase","store","insertValue","keyData","getValue","deleteValue","UserStorage","request","getIndexedInformationFromObject","storeName","keyValues","Session","oldDataset","username_idxdb","database_idxdb","result","_event","isIdentification","userId","detectAnonymousWebExtensionLogin","strId","isWebUser","cleanHTMLClasses","classStr","RunWhen","callbackToRun","whenTrue","time","timeout","getElementInDocumentAtCoords","doc","x","y","selectText","element","sel","range","listenOnAllDocuments","eventType","handler","remove","frames","fr","getFrameOffset","elementToFindOffsetOn","side","offset","WalkthroughWindows","el","GetCaptureBody","_e","xlate","text","Spread","Component","propsToSpread","Observer","PcrDataValidations","suppliedValue","isValid","emailSchema","z","BrowserHelper","lighten","color","percent","inFullHSLA","c2k.lighten","darken","c2k.darken","getThemeKeyByRecordType","fieldRecordType","CORE_PALETTE","skipWhenPCR9","i","checkSecurity","sec","o","onlyWhenPCR9","IdentityStr","buffer","id","characters","charactersLength","Identity","_DateTimeFormat","DateTime","DateTimeFormat","DateTimeToLocale","date","format","d","lng","dateStr","DateTimeISOWithNoTZOffset","dateTime","DateOnlyForServerToIdentify","dt","DateTimeISOForServerToIdentifyAsUTC","IsSameDay","date1","date2","IsToday","IsYesterday","yesterday","DaysAgo","numberOfDays","CurrencyCodeFormatInfo","Globalize","PcrHtmlHelper","numberVal","availableLetters","randomletters1","randomletters2","inputId","returnId","elem","extraClasses","elemClass","extraAttributes","elemAttr","dataValue","response","TranslationHelpers","pcrWord","srcDictionary","translatedWord","translatedWordCheck","_PcrDataFormatters","dateVal","translations","returnOnlyTime","returnDate","dateFormat","dateSplit","datepartsplit","timepartsplit","yr","mn","dy","hr","min","fixedDate","datePart","timePart","dateObj","returnVal","timeFormat","timeSeparator","rawTimePart","AMPMstring","rawTimePartSplit","rawTimeString","timeSeparater","splitTime","fixedTimeArr","currency","currencyVal","currencyCode","baseCurrencyVal","baseCurrencyCode","baseCurrencySymbol","returnCurrency","culture","valReg","symReg","currencySymbol","symbolList","matched","alphaCurrency","alphaCurrencyVal","lettervals","out","len","c","char2","char3","firstName","lastName","language","fullName","CurrencyCodes","PcrDataFormatters","isTruncated","current","LoadingState","LoadingMachine","props","makeObservable","requestName","requestId","allFinished","errorCount","__decorateClass","observable","optimizedResize","scallbacks","running","resize","runCallbacks","callback","addCallback","Timer","timeMs","now","BuildURLInfo","partialURL","launch","URL","PCR9Links","recordId","sqlWhere","jobIds","candidateSendoutIds","sqlQuery","companyName","email","companyId","candidateId","address","city","state","zip","country","haId","jobId","interviewId","rollupCode","jobTitle","getHighestWindow","FormatCityState","UserLocalStorage","usersData","userInstance","_h","_g","_f","copyToClipboard","windowContextOverride","getWindowContext","err","readFromClipboard","filterListToString","useId","list","ret","DateFilter","LoggedInUser","FilterToggleList","Filter","input","tempFilter","filterToggleList","ftl","PartialDateSearch","dates","searchValue","splitDates","searchDate","monthYear","IsUserSecurityEnabled","security","k","IsUserAdmin","Permissions","getNoPermissionString","permissionName","blobToBase64","blob","_","reader","readFiles","files","attachments","file","downloadFile","fileName","decodedData","fileInfo","link","viewFileInNewTab","decodeAndDetectFileType","encodedData","base64Data","binaryString","indexOfLargeStart","indexOfLargeEnd","largeData","bytes","fileType","detectFileType","signature","hex","b","possibleHtml","parseDuplicateRecord","weights","DuplicateCheckableRecords","RecordType","CandidateRecordV2","CompanyRecordV2","PositionRecordV2","score","maxScore","parsedRecord","_weights","fieldScores","fieldScore","getBase64Image","imgPath","img","canvas","dataURL","getBase64ImageCors","ProxyApi","UnsavedRecordHelper","apiName","updateData","isFlyout","fromFlyout"],"mappings":"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"}