{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/views/About.vue?a4d2","webpack:///./src/components/connectedradio.vue?2aeb","webpack:///./src/components/zone.vue?ef5c","webpack:///./src/components/supportedfeatures.vue?7526","webpack:///./src/components/webdfuradio.vue?e3ec","webpack:///./src/components/dmrid.vue?3eb0","webpack:///./src/components/manualcps.vue?4ad1","webpack:///./src/views/Main.vue?a3f9","webpack:///./src/components/channel.vue?7f3e","webpack:///./src/views/Home.vue?ba13","webpack:///./src/App.vue","webpack:///./src/App.vue?dfb6","webpack:///./src/views/Home.vue","webpack:///./src/views/Home.vue?ab8c","webpack:///./src/views/About.vue","webpack:///./src/components/supportedfeatures.vue","webpack:///./src/components/supportedfeatures.vue?2763","webpack:///./src/views/About.vue?008a","webpack:///./src/views/Main.vue","webpack:///./src/views/Main.vue?61a7","webpack:///./src/components/webdfuradio.vue","webpack:///./src/components/connectedradio.vue","webpack:///./src/libs/misc.js","webpack:///./src/libs/rf.js","webpack:///./src/libs/codeplug.js","webpack:///./src/components/connectedradio.vue?0cb0","webpack:///./src/components/usbhelp.vue","webpack:///./src/components/usbhelp.vue?8834","webpack:///./src/components/usbdebugging.vue","webpack:///./src/components/usbdebugging.vue?7563","webpack:///./src/libs/dfu.js","webpack:///./src/components/webdfuradio.vue?0df5","webpack:///./src/components/keyloader.vue","webpack:///./src/components/keyloader.vue?5eb8","webpack:///./src/components/dmrid.vue","webpack:///./src/components/dmrid.vue?1e55","webpack:///./src/components/manualcps.vue","webpack:///./src/components/channel.vue","webpack:///./src/components/channel.vue?1383","webpack:///./src/components/zone.vue","webpack:///./src/components/zone.vue?9a7a","webpack:///./src/components/manualcps.vue?227e","webpack:///./src/router/index.ts","webpack:///./src/store/index.ts","webpack:///./src/main.ts","webpack:///./src/components/keyloader.vue?bcd6","webpack:///./src/App.vue?9f89"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","class","needsrefresh","currentview","to","showdev","toggledevmode","devmode","components","created","this","loadsession","loadDataFiles","methods","fetch","then","json","fwl","add_firmwares","method","catch","e","console","log","mysess","ok","myaccount","computed","includes","location","hostname","$route","loggedin","online","render","__scopeId","src","mini","disabled","links","link","path","img","title","description","mnemonic","props","$store","state","devtools","radios","list","hidden","getPlatform","platforms","values","platform","idx","features","feature","featureidx","platformidx","isChrome","navigator","userAgent","OS","split","isPlatform","target","SupportedFeaturesMatrix","href","type","usb","load_usb","usbconnected","codeplugmode","readall","writeall","firmwaremode","selected_firmware_url","firmware_list","fw","url","upgradeall","usbdevices","device","get_codeplug","put_codeplug","statusmsg","upload_firmware","firmwareready","firmware","recoverymode","recover","hastools","screenshot","dmesg","imgpath","model","bands","join","dmrid","progress","current","max","screenshotbloburl","assert","expected","msg","Error","invert","io","k","v","wait_for","ms","Promise","setTimeout","_x","a","toString","grouppairs","arr","Array","from","_","bytes2string","map","String","fromCharCode","xxd","lst","maxaddr","Math","floor","thisrow","padStart","fetchblob","uri","arrayBuffer","ab","Uint8Array","readFile","file","resolve","reject","reader","FileReader","onload","res","onerror","err","readAsArrayBuffer","standard_offset","freq_to_band","f","band","standard_offset_from_freq","emission_designator_to_protocol","emd","emd2p","proto","uint8s_to_int","lr","reverse","cstr2js","end_of_ascii_string","indexOf","js2cstr","sint","x","charCodeAt","utf16str2js","jsstr2utf16","flat","assemble_le","bytes","byteLength","dissemble_le","somenum","sz","undefined","bs","acc","dissemble_le_sz","val","fromBCD","out","parseFloat","toBCD","nibbles","parseInt","nibbles2","hex2bytes","pairs","bytes2hex","bits_to_int","ft","bo","bitOffset","bitSize","mask","byteidx","Bo","b","subarray","bO","ret","set_bits_of_int","existing_value","newvalue","imask","shifted_newvalue","clean_existing","ident_codeplug_radio_rdt","intended_radio","radioname","make_editor","codeplug_format","getValueTypes","introLine","contactName","textMessage","ascii","biFrequency","frequency","frequencyOffset","callID","ctcssDcs","contactListIndex","memberListIndex","gpsListIndex","spanList","listIndex","hexadecimal32","hexadecimal4","indexedStrings","iStrings","strings","setValueTypes","bandwidth","scaled","make_field_array","pare","rt","record_data","offset","thesebytes","make_field","typeName","make_value","field_data","valueType","bits","set","_idx","size","_cp","writeBytes","old","newval","modified","dst","configurable","add_field","make_record","fieldTypes","fields","filter","make_record_array","return_record","handler1","prop","receiver","iterator","propnum","proxy1","Proxy","cp_def","codeplugs","models","recordTypes","records","codeplug_editor","codeplug","start","Date","editor","end","readFileBytes","bin2rdt","dfu","bin","raw_identify_radio","radioidbytes","get_radio_name","get_radio_gen","gen","gen1_size","gen2_size","binsizeoffset","rdt_size","rdt","gen12_split","gen1_bin","gen2_bin","rdt2bin","bin_size","ranges","range","edge","rf","cpj","rdt_w_metadata","filename","cpm","readdate","tyt_get_dmrid","cp_filename","def","overall","cp","id","ts","getFullYear","getMonth","getDate","getHours","getMinutes","make_codeplug_proxy","mounted","pingtimer","setInterval","ping","beforeUnmount","clearInterval","getdmesg","get_screen_bmp","bmp","blob","Blob","URL","createObjectURL","reboot","$parent","debug","alive","localfirmware","fw_bytes","firmware_upload","error","files","event","endsWith","loaded_firmwares","devstatus","statusString","stateString","progress_get","bandselect","toLowerCase","tytera_380_series","vendorId","productId","openrtx_serial","tytera_md430","gd77","anytone","radio_filters","filters","address_parts","addr","Request","State","iState","Status","iStatus","USB","dev","mock","in_or_out","in_or_out_a","type_a","typestr","recipient","recipient_a","recipientstr","requestType","request","index","length2read_or_data2send","bmRequestTypeInt2obj","setup","controlTransferIn","d2sb","controlTransferOut","ACM","open","DFU","status","claimInterface","selectConfiguration","selectAlternateInterface","ctrl_transfer","CLRSTATUS","DETACH","action_map","get_state","dfuIDLE","GETSTATE","y","getUint8","GETSTATUS","z","ABORT","expected_state","get_status","wait","enter_dfu_mode","desired_state","clear_status","DNLOAD","change_state_and_reenter_dfu","dfuDNLOAD_IDLE","blk_n","block_size","request_upload","tres","buf","OK","buf_to_bytes","expected_bytes","bufs","block_num","UPLOAD","TYTDMRDFU","md380_custom","clear_status_until_state","read","bytes_to_list","parse_radio_freqs","freq_ranges","parse_radio_name","identify_radio","bytes2nibbles","bcdFreqRange2IntFreqRange","raw_freq_range","n1","n2","first_range","second_range","int_ranges","fill","now","oldprogress","diff","lastupdated","finished","progress_clean","errored","started","elapsed","has_error","bytelen","block_number","block_count","bytebufs","progress_init","set_address","total_read","adjusted_block_number","progress_update","bytes_concat","progress_finish","ceil","blockedSize","total_written","eraseFlashBlocks","this_block","pad_bytes","request_dnload","wait_until_state","adjusted_addr","erase_sector","programming_mode","read_flash","write_flash","header_bytes","header","magic","radio","unk","sections","num_sections","memloc","secsize","block_total","get_sector_size","written","block_data","data_bytes","parseHeader","sections_done","sz_remaining","datalength","min","data_for_this_sector","write_sector","VCZTYTDFU","adr","buffer","cmd","query","cmdbytes","cmdbyteslist","resultsize","line","read_framebuf_line","text","MockUSB","manufacturerName","productName","opened","idx1","idx2","MockDFU","MockTYTDFU","addEventListener","ConnectedRadio","USBHelp","USBDebugging","recv_codeplug","add_codeplug","current_codeplug","send_codeplug","sortusb","sort","new_device","init","add_usb","getDevices","devs","requestDevice","appCodeName","oscpu","has_codeplug","encryption_keys","startsWith","hashinput","style","hash","beforeMount","beforeUpdate","crypto","subtle","digest","hashbytes","$forceUpdate","keys","idlist","newid","addID","newcall","findID","idmap","callsignmap","orig","newcp","num","lookupID","name_or_call","callsignlist","channels","chanidx","addToZone","zoneidx","rw","zones","setselectedchannel","thischan","thisdef","entry","string","sanify","advancedfields","fieldname","onlyname","recordname","regularfields","listfields","Channels","el","typename","oldval","defval","defaultValue","draggable","thiszone","ABChannels","zonechanidx","dodragstart","$event","dragend","dragenter","dragleave","dragdrop","select","Channel","Zones","$emit","zonermchan","evt","zchanidx","dataTransfer","dropEffect","effectAllowed","setData","opacity","dragover","newzonechanidx","border","oldzonechanidx","getData","temp","Zone","newchanidx","routes","component","Main","About","Home","router","history","radioiddotnet","namespaced","mutations","actions","getters","firmwares","clear_firmwares","current_firmware","loaded_codeplugs","definitions","current_definition","set_definitions","defs","delete_codeplug","select_codeplug","clear_codeplugs","App","use","store","mount","config","globalProperties","$filters","JSON","stringify"],"mappings":"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","file":"js/app.cfb54ac2.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./About.vue?vue&type=style&index=0&id=6f881f60&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./connectedradio.vue?vue&type=style&index=0&id=00315c8a&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./zone.vue?vue&type=style&index=0&id=4cab6ef7&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./supportedfeatures.vue?vue&type=style&index=0&id=6b3c55f7&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./webdfuradio.vue?vue&type=style&index=0&id=78d9c484&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./dmrid.vue?vue&type=style&index=0&id=01470d76&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./manualcps.vue?vue&type=style&index=0&id=1c18a40a&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./Main.vue?vue&type=style&index=0&id=58f2d348&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./channel.vue?vue&type=style&index=0&id=44539def&scoped=true&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./Home.vue?vue&type=style&index=0&id=06dc4e01&lang=css\"","\n\n\n","import { render } from \"./App.vue?vue&type=template&id=247c9eae&scoped=true\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=247c9eae&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-247c9eae\"\n\nexport default script","\n\n\n\n","import { render } from \"./Home.vue?vue&type=template&id=06dc4e01\"\nimport script from \"./Home.vue?vue&type=script&lang=js\"\nexport * from \"./Home.vue?vue&type=script&lang=js\"\n\nimport \"./Home.vue?vue&type=style&index=0&id=06dc4e01&lang=css\"\nscript.render = render\n\nexport default script","\n\n\n\n","\n\n\n","import { render } from \"./supportedfeatures.vue?vue&type=template&id=6b3c55f7&scoped=true\"\nimport script from \"./supportedfeatures.vue?vue&type=script&lang=js\"\nexport * from \"./supportedfeatures.vue?vue&type=script&lang=js\"\n\nimport \"./supportedfeatures.vue?vue&type=style&index=0&id=6b3c55f7&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-6b3c55f7\"\n\nexport default script","import { render } from \"./About.vue?vue&type=template&id=6f881f60&scoped=true\"\nimport script from \"./About.vue?vue&type=script&lang=js\"\nexport * from \"./About.vue?vue&type=script&lang=js\"\n\nimport \"./About.vue?vue&type=style&index=0&id=6f881f60&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-6f881f60\"\n\nexport default script","\n\n\n\n","import { render } from \"./Main.vue?vue&type=template&id=58f2d348&scoped=true\"\nimport script from \"./Main.vue?vue&type=script&lang=js\"\nexport * from \"./Main.vue?vue&type=script&lang=js\"\n\nimport \"./Main.vue?vue&type=style&index=0&id=58f2d348&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-58f2d348\"\n\nexport default script","\n\n\n\n","\n\n\n","import { saveAs } from 'file-saver';\n\nexport function assert(c, expected, msg){\n //call like assert(1==1)\n //or assert(1,1)\n //or assert(1==1, \"failure in mathematics\")\n //or assert(1,1, \"failure in mathematics\")\n //TODO: not working like i want, needs a revisit\n if( typeof(c) == typeof(1==1)){\n if(!c){\n const msg = expected; //reordered arguments\n throw new Error(\"Assertion failed \" + msg?msg:\"\");\n }\n } else { \n if( c != expected ){\n console.log(c,expected);\n throw new Error(\"Assertion failed: \"+ c + \" != \"+ expected+\", \"+ msg?msg:\"\");\n }\n }\n}\nexport function invert(o){\n const io = {};\n for( const k in o){\n const v = o[k];\n io[v] = k;\n }\n return io;\n}\nexport function wait_for(ms){\n return new Promise( r => setTimeout(r,ms));\n}\n\nexport function _x(a){\n return \"0x\" + a.toString(16);\n}\n\nexport function grouppairs(arr){\n return Array.from({ length: arr.length / 2 }, (_, i) => arr.slice(i * 2, i * 2 + 2))\n}\n\nexport function sorted_counts(c){\n return Object.entries(c).sort((a,b) => b[1] >= a[1] ).map(x=>x[1] + \" \" + x[0]);\n}\n\nexport function uuidv4() {\n //https://stackoverflow.com/a/2117523\n return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>\n (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)\n );\n}\nexport function sortbykey(key){\n return function(a,b){\n if( a[key] < b[key] ){\n return -1;\n } else if( a[key] > b[key] ){\n return 1;\n } \n return 0\n }\n}\nexport function save_data(data, filename){\n const da = new Uint8Array(data);\n //console.log(da);\n const ba = new Blob([da], {type:\"application/octet-stream\"} );\n console.log(ba);\n saveAs(ba, filename)\n}\n\n\n\nfunction browser_save(name,data){\n localStorage[name] = JSON.stringify(data);\n}\nfunction browser_load(name){\n return localStorage[name];\n}\nfunction bytes2string(data){\n return data.map(c=> String.fromCharCode(c)).join(\"\");\n}\nexport function xxd(lst){\n //lst is a list of 8 bit bytes (i.e. 0-255 are only allowed values)\n const maxaddr = Math.floor(Math.log(lst.length) / Math.log(16))+1;\n let s = \"\";\n for( let i = 0; i < lst.length/16; i++){\n const thisrow = lst.slice(i*16, (i+1)*16);\n s += \"0x\" + (i*16).toString(16).padStart(maxaddr,'0') + \": \";\n for( let j = 0; j < 16 && i*16+j < lst.length; j++){\n s += lst[i*16+j].toString(16).padStart(2,'0');\n if( (j +1 )% 2 == 0 ){\n s+= \" \";\n }\n if( (j +1 )% 8 == 0 ){\n s+= \" \";\n }\n }\n s += \" \";\n const v = bytes2string(Array.from(thisrow));\n s += v;\n s += \"\\n\";\n }\n return s;\n}\nexport async function fetchblob(uri){\n const p = await fetch(uri);\n console.log(p);\n //const b = p.blob()\n //console.log(b);\n const ab = await p.arrayBuffer();\n console.log(ab);\n return new Uint8Array(ab);\n}\nexport function readFile(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = res => {\n resolve(res.target.result);\n };\n reader.onerror = err => reject(err);\n reader.readAsArrayBuffer(file);\n });\n}\n","\nconst standard_offset = {\n \"2m\": 0.6,\n \"70cm\": 5,\n \"1.25m\":1.6,\n \"10m\":.1\n}\nfunction freq_to_band(f){\n const bands = [\n [136, 174, \"2m\"],\n [219, 225, \"1.25m\"],\n [400, 480, \"70cm\"],\n [902, 928, \"33cm\"]\n ];\n for (const band of bands){\n if( f >= band[0] && f <= band[1] ){\n return band[2];\n }\n }\n return \"unknown band\";\n\n}\nfunction standard_offset_from_freq(f){\n return standard_offset[ freq_to_band( f ) ];\n}\nfunction emission_designator_to_protocol( emd ){\n const emd2p = {\n \"7K60FXW\":\"DMR\", \n \"7K60FXD\":\"DMR\",\n \"7K60FXE\":\"DMR\",\n \"11K2F3E\":\"FM2.5\", //\"FM%d\"%(FM_tx_deviation)\n\n }\n const proto = emd2p[emd];\n return proto ? proto: \"unk\";\n}\n\nexport default {\n standard_offset,\n standard_offset_from_freq,\n freq_to_band,\n emission_designator_to_protocol\n}\n","//TODO: list of radioids to generate codeplugs for\n// so take in a codeplug, modify the encryption keys uniformly\n// generate a modified codeplug for each radio id\n//TODO findings:\n//encryption keys are read and wrote backwards to editcp\n//compare to OEM software and fix if necessary\n//my code appears to go left to right, so that may be an issue on their end\n//\n//loading two codeplugs fails - possible there's a conflict for the original div, rather than re-assigning vue data.editor or something\n//\n//https://github.com/DaleFarnsworth-DMR/codeplug/blob/master/field.go\n//fetch( \"/data/zones.json\").then(r=>r.json()).then(j=>z=j);\n\nimport { readFile, assert, grouppairs, sortbykey } from './misc.js';\nimport rf from '../libs/rf.js';\n// bit/byte converters\nfunction bytes2string(data){\n return data.map(c=> String.fromCharCode(c)).join(\"\");\n}\nfunction dec2bin(dec){\n return (dec >>> 0).toString(2);\n}\nfunction bitmask2value( maskedbits, values ){\n return values[Math.log2( maskedbits )];\n}\nexport function uint8s_to_int( lst ){ //why do i have this _and_ assemble_le?\n const lr = lst.reverse();\n let n = 0;\n for( let i = 0; i < lst.length; i++){\n n <<= 8;\n n |= lr[i];\n }\n return n;\n}\n\n\nfunction cstr2js(data){\n //expects an array of ints, not a uint8 array\n const end_of_ascii_string = data.indexOf(0);\n let name;\n if( end_of_ascii_string != -1 ){\n name = bytes2string(data.slice(0,end_of_ascii_string));\n } else {\n name = bytes2string(data);\n }\n return name;\n}\nfunction js2cstr(s){\n //expects a js string\n const sint = Array.from(s).map(x=>x.charCodeAt());\n sint.push(0); //terminating null byte\n return new Uint8Array(sint);\n}\nfunction test_js_2_4_cstr(){\n assert(cstr2js(Array.from(js2cstr(\"test\"))) == \"test\")\n assert(cstr2js(Array.from(js2cstr(\"\"))) == \"\")\n}\n\n\nfunction utf16str2js(data){\n //expects an array of ints, not a typed array\n //var end_of_ascii_string = data.indexOf(0);\n //console.log(data);\n const x = grouppairs(data).map(x=>x[0]); //only support ascii\n return cstr2js(x);\n}\nfunction jsstr2utf16(s){\n return new Uint8Array(\n Array.from(s).map(x=>[x.charCodeAt(),0]).flat()\n )\n}\nfunction test_js_2_4_utf16str(){\n assert(utf16str2js(Array.from(jsstr2utf16(\"test\"))) == \"test\")\n assert(utf16str2js(Array.from(jsstr2utf16(\"\"))) == \"\")\n}\n\n\n\nfunction assemble_le(bytes){\n let n = 0;\n for(let i = 0; i < bytes.byteLength; i++){\n n |= bytes[i] << (i*8);\n }\n return n;\n}\nfunction dissemble_le(somenum,sz){\n if( sz == undefined ){\n sz = 4; //assume 32 bit\n }\n assert(somenum >= 0);\n const bs = [];\n let acc = somenum;\n while( bs.length < sz ){\n bs.push(acc & 0xff);\n acc >>= 8;\n }\n //console.log(\"somenum:\",somenum, bs);\n return new Uint8Array(bs);\n}\nfunction dissemble_le_sz(sz){\n return (val)=>dissemble_le(val,sz);\n}\n\n\nfunction fromBCD(data){\n let out = [];\n for( let i = data.length-1; i >=0; i--){\n out.push((data[i] & 0xf0)>>4);\n out.push(data[i] & 0x0f);\n }\n return parseFloat(out.join(\"\"));\n}\nfunction toBCD(val){\n let nibbles = Array.from(String(val)).map(x=>parseInt(x));\n let nibbles2 = grouppairs(nibbles);\n let bs = nibbles2.map(x=>x[0]<<4 | x[1]);\n //console.log(val,nibbles,nibbles2,bs);\n return new Uint8Array(bs.reverse()); \n}\nfunction test_bcd(){\n assert(fromBCD(toBCD(45112500)) == 45112500)\n}\n\n\nfunction hex2bytes(s){\n let pairs = grouppairs(s)\n let bytes = pairs.map(x=>parseInt(x,16));\n return new Uint8Array(bytes);\n}\nfunction bytes2hex(data){\n return Array.from(data).map(x=>x.toString(16).padStart(2,\"0\")).join(\"\");\n}\nfunction test_hex_2_4_bytes(){\n assert(bytes2hex(hex2bytes(\"ff\")) == \"ff\")\n assert(bytes2hex(hex2bytes(\"00\")) == \"00\")\n}\nfunction bits_to_int(data,ft){\n //candidate for cleanup TODO\n let bo = ft.bitOffset;\n let bs = ft.bitSize;\n const mask = (2**bs)-1; //so size of 2 gives 0b11, 3 gives 0b111, etc\n //we have an array of bits as 8bit bytes\n //[ 0x3f, 0x81]\n //== [0011_1111, 1000_0001]\n //let's say bo is 2\n //and bs is 7\n //so it spans byte boundaries and such - does that every happen?\n //\n //cat codeplugs.json | grep bitSize|sort |uniq -c |sort -k 3n\n //suggests that in practice, anything >= 8 bits is always integer multiples of 8 bits\n //so those are already taken care of with slice!\n //and that also means we probably don't have any bits crossing byte boundaries.\n // (probably)\n //just need to find the right byte that has what we need, and mask and dice until we get only what we need\n //\n assert(bs < 8); //only call us after handling the byte-aligned byte-sized stuff already\n\n let byteidx = Math.floor(bo/8); //so bit 2 is in byte 0, bit 9 is in byte 1, etc\n let Bo = bo - (byteidx*8); //get the bit offset in this byte, so \n assert(bs+Bo <= 8); //error out if we actually do cross a byte boundary!\n //if bo == 9, Bo == 1\n //if bo == 2, Bo == 2, etc\n let b = data.subarray(byteidx,byteidx+1);\n let bO = 8 - Bo - bs; //get the amount to shift right by\n const ret = (b >> bO) & mask; //shift it, and mask it so we on;y get what we asked for\n //console.log(\"bits_to_int: \",data, ft, \"bo\",bo, \"bs\",bs, \"byteidx\",byteidx, \"Bo\", Bo, \"b\", b, \"bO\", bO, \"mask\",mask,\"(b>>bO)&mask\",ret);\n return ret;\n}\nfunction set_bits_of_int(existing_value, ft, newvalue){\n //assumes you're only working on a single byte...\n let bo = ft.bitOffset;\n let bs = ft.bitSize;\n assert(bs <= 8, \"trying to work on more than a byte\" );\n assert(existing_value <= 255 && newvalue <= 255, \"values out of range set_bits_of_int\" );\n assert(newvalue < 2**bs && newvalue >= 0, \"new value is too big (or too small)\");\n\n const byteidx = Math.floor(bo/8); //so bit 2 is in byte 0, bit 9 is in byte 1, etc\n const Bo = bo - (byteidx*8); //get the bit offset in this byte, so \n const bO = 8 - Bo - bs; //get the amount to shift by\n\n const mask = (2**bs)-1; //so size of 2 gives 0b11, 3 gives 0b111, etc\n const imask = 0xff - mask;\n const shifted_newvalue = newvalue << bO;\n\n const clean_existing = existing_value & imask;\n //console.log(\"existing value, newvalue: \",existing_value, newvalue);\n //console.log(\"mask, imask: \",mask,imask);\n //console.log(\"clean existing: \",clean_existing);\n //console.log(\"shifted new: \",shifted_newvalue);\n return clean_existing | shifted_newvalue;\n}\n//assert(set_bits_of_int(0,{bitOffset:7,bitSize:1},1), 1 );\n//assert(set_bits_of_int(0,{bitOffset:0,bitSize:1},1), 0x80, \"0,1,1 failure\");\n\nfunction test_bits_to_int(){\n let x = [\n new Uint8Array([0x3f,0x81]),\n new Uint8Array([0x3f,0x81]),\n ]\n let y = [\n {\n bitOffset: 2,\n bitSize: 3,\n },\n {\n bitOffset: 7,\n bitSize: 1,\n }\n ]\n let z = [\n 3,\n 1\n ]\n for( let i = 0; i < x.length; i++){\n assert(bits_to_int(x[i], y[i]) == z[i]);\n }\n}\n\n\nexport const tests = {\n test_bits_to_int,\n test_bcd,\n test_js_2_4_cstr,\n test_js_2_4_utf16str,\n test_hex_2_4_bytes,\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nexport function ident_codeplug_radio_rdt(data){\n let intended_radio = data.slice(0x125,0x125+32)\n let radioname = cstr2js(Array.from(intended_radio));\n return radioname;\n}\nfunction make_editor(codeplug_format, radioname, data){\n //this is slow to build - 10k+ contacts and 3k+ channels and 250+ zones\n //will do that.\n\n let getValueTypes = {\n name: data => utf16str2js(Array.from(data)),\n introLine: data => utf16str2js(Array.from(data)),\n contactName: data => utf16str2js(Array.from(data)),\n textMessage: data => utf16str2js(Array.from(data)),\n ascii: data => cstr2js(Array.from(data)),\n\n biFrequency: data=> fromBCD(data)/10,\n frequency: data=> fromBCD(data)/1e5,\n frequencyOffset: data=> fromBCD(data)/1e5,\n\n callID: assemble_le,\n ctcssDcs: function(data){\n if( assemble_le(data) == 65535 ){\n return 0;\n }\n return fromBCD(data)/10\n },\n contactListIndex: assemble_le,\n memberListIndex: assemble_le,\n gpsListIndex: assemble_le,\n spanList: x=>x,\n listIndex: assemble_le,\n\n hexadecimal32: bytes2hex,\n hexadecimal4: bytes2hex,\n indexedStrings: x=>x,\n iStrings: (data,ft)=>{ \n //problem - there are iStrings that are byte based and iStrings that aren't.\n //\n let idx = assemble_le(data);\n return ft.strings[ idx ];\n },\n\n }\n let setValueTypes = {\n name: jsstr2utf16,\n introLine: jsstr2utf16,\n contactName: jsstr2utf16,\n textMessage: jsstr2utf16,\n ascii: js2cstr,\n indexedStrings: x=>x,\n spanList: x=>x,\n bandwidth: x=>x,\n\n ctcssDcs: (val)=>{\n let scaled;\n if( val == 0 || val == null || val == undefined ){\n return dissemble_le(65535,2);\n } else {\n scaled = Math.floor(val * 10);\n }\n return toBCD(scaled);\n },\n frequency: (val)=>{\n let scaled = Math.floor(val * 1e5);\n return toBCD(scaled);\n },\n frequencyOffset: (val)=>{\n let scaled = Math.floor(val * 1e5);\n return toBCD(scaled);\n },\n biFrequency: (val)=>{\n let scaled = Math.floor(val * 10);\n return toBCD(scaled);\n },\n\n hexadecimal32: hex2bytes,\n hexadecimal4: hex2bytes,\n callID: dissemble_le_sz(3),\n listIndex: dissemble_le_sz(2),\n contactListIndex: dissemble_le_sz(2),\n\n }\n let e = {};\n function isDel(rt,data){ //untested, not sure\n if( rt.delDesc == undefined ){ return false; }\n let dof = rt.delDesc.offset;\n let sz = rt.delDesc.size;\n let equal_if_del = rt.delDesc.value;\n let cmp = data.slice(dof,dof+sz);\n if( cmp == equal_if_del ){\n return true;\n }\n console.log(cmp,equal_if_del);\n return false;\n }\n function make_field_array(pare,rt,ft,record_data){\n let o = []\n for( let i = 0; i < ft.max; i++ ){\n let idx = i;\n let offset = ft.bitOffset/8 + idx*ft.bitSize/8;\n let thesebytes = record_data.subarray(offset, offset+ft.bitSize/8);\n make_field(o, rt,ft,thesebytes,i);\n }\n pare[ft.typeName] = o;\n }\n function make_value(pare, rt, ft, field_data, name){\n let get = function(){\n if( ft.bitOffset % 8 == 0 && ft.bitSize %8 == 0){ //byte boundaries yay! if( getValueTypes[ft.valueType] ){\n if( getValueTypes[ft.valueType] ){\n return getValueTypes[ft.valueType](field_data,ft);\n } else {\n return field_data;\n }\n } else {\n let bits = bits_to_int(field_data, ft);\n //console.log(\"[341]bits:\",bits);\n if( getValueTypes[ft.valueType] ){\n return getValueTypes[ft.valueType](bits,ft);\n } else {\n return bits;\n }\n //return `${ft.typeName} isn't byte-based: boundary:${ft.bitOffset %8} size:${ft.bitSize%8}`;\n //can i even handle this nicely in javascript?\n }\n }\n let set = function(val){\n //TODO: can i used a subarray to just write to the field data directly? \n //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray\n //\n //need a handle to the codeplug\n //need a byteoffset into the full thing, plus the size of course\n //if not byte-aligned and byte-sized\n // need to pull current value to handle bits properly \n // then modify that value\n //then overwrite the existing content by splicing into the main codeplug file\n //which may require padding the value or truncating it\n console.log(pare,rt,ft,name,val);\n if( ft.bitOffset % 8 == 0 && ft.bitSize %8 == 0){ //byte boundaries yay!\n if( setValueTypes[ft.valueType] ){\n let x = setValueTypes[ft.valueType](val,ft);\n let offset = rt.offset;\n //console.log(offset)\n if( pare._idx != undefined ){\n offset += pare._idx * rt.size;\n }\n //console.log(offset)\n offset = offset + ft.bitOffset/8;\n //console.log(offset)\n let sz = ft.bitSize/8;\n if( ft.max ){\n let idx = name;\n offset += idx*sz;\n }\n console.log(bytes2hex(e._cp.slice(offset,offset+sz)));\n writeBytes(e._cp, x, offset, sz);\n console.log(bytes2hex(e._cp.slice(offset,offset+sz)));\n } else {\n throw `unimplemented valueType to set: ${ft.valueType}`;\n }\n } else {//not byte aligned, or smaller than bytes, or whatever\n //we don't actually handle values that cross byte boundaries, just smaller-than-a-byte values\n if( setValueTypes[ft.valueType] ){\n //should only have to handle single bytes at a time\n //core of this: get current value. Make sure bits at selected position equal what we say.\n //then assert we haven't changed the other bits\n //console.log(\"set val to ft\", ft.bitOffset, ft.bitSize, ft);\n\n //copied and pasted ... \n let offset = rt.offset;\n //console.log(offset);\n if( pare._idx != undefined ){\n offset += pare._idx * rt.size;\n }\n //console.log(offset);\n offset = offset + ft.bitOffset/8;\n //console.log(offset);\n let sz = ft.bitSize/8;\n if( ft.max ){\n let idx = name;\n offset += idx*sz;\n } \n //console.log(offset);\n offset = Math.floor(offset);\n //console.log(offset);\n ////\n //writeBytes(dst,modified,offset,1);\n //writeBytes(e._cp, x, offset, sz);\n //console.log(e._cp[offset]);\n //const old = get();\n const old = e._cp[offset];\n const newval = setValueTypes[ft.valueType](val,ft);\n const modified = set_bits_of_int(old, ft, newval);\n e._cp[offset] = modified;\n assert(get(), val, \"failure to verify set\");\n\n } else {\n throw `unimplemented valueType to set: ${ft.valueType}`;\n }\n }\n function writeBytes(dst,src,offset,size){\n for( let i = 0; i < size; i++ ){\n dst[offset+i] = src[i];\n }\n }\n }\n Object.defineProperty(pare, name, {\n get: get,\n set: set,\n configurable: true,\n enumerable: true,\n }); \n }\n function make_field(pare,rt,ft,field_data,name){\n return make_value(pare,rt,ft,field_data,name);\n }\n function add_field(pare, rt, ft, record_data){\n //and fields can have arrays too (dammit)\n if( ft.max ){\n make_field_array(pare,rt,ft,record_data);\n } else {\n let bo = Math.floor(ft.bitOffset/8);\n let bs = Math.floor(ft.bitSize/8);\n let field_data;\n if( bs == 0 ){ //if it's less than a byte in size, all our bit-handling expects to have to handle offsets directly\n field_data = record_data;\n } else {\n field_data = record_data.subarray(bo,bo+bs)\n }\n if( field_data.length == 0 ){\n console.log(ft, bo,bs, record_data);\n throw(new Error(\"Could not subarray bytes\"));\n }\n //I'm sorry, I know\n //TODO! make this whole file more consistent\n make_field(pare, rt, ft, field_data, ft.typeName);\n }\n }\n function make_record(rt,data,idx){\n let o = {};\n\n //useful for debugging, commented out to speed things up a bit\n //o[\"_rt\"] = rt;\n //o._rt.fields= {};\n //o[\"_bytes\"] = data;\n for( let f of rt.fieldTypes ){ \n let ft = codeplug_format.fields.filter(x=>x.type==f)[0];\n //o._rt.fields[f] = ft;\n o._idx = idx\n add_field(o,rt,ft,data);\n }\n return o;\n\n }\n function make_record_array(rt,data){\n//TODO: that proxy in make_editor needs to implement the iterators so i don't have to do this Channels.length thing\n//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators\n function return_record(rt,idx,data){\n let offset = rt.offset + idx*rt.size;\n let thesebytes = data.subarray(offset, offset+rt.size+10);\n return make_record(rt, thesebytes, idx);\n }\n const handler1 = {\n get: function(target, prop, receiver ){\n //console.log(\"record_array\",target.rt.typeName, typeof(prop),prop);\n if( prop == Symbol.iterator ){\n console.log(\"Need to implement iterator!\");\n return function*(){\n for( let i = 0; i < target.rt.max; i++){\n if( target[propnum] == undefined ){\n target[propnum] = return_record(target.rt,propnum, target.data);\n }\n yield target[propnum];\n }\n }\n }\n if( typeof(prop) != typeof(\"\") ){\n return;\n }\n const propnum = parseInt(prop);\n if( prop == \"length\" ){\n return target.rt.max;\n } else if (propnum >= 0 && propnum < target.rt.max ){\n if( target[propnum] == undefined ){\n target[propnum] = return_record(target.rt,propnum, target.data);\n }\n return target[propnum];\n }\n },\n };\n const proxy1 = new Proxy({rt:rt,data:data}, handler1);\n return proxy1;\n }\n console.log(codeplug_format);\n e._cp = data;\n let cp_def = codeplug_format.codeplugs.filter(x=>x.models.includes(radioname))[0];\n if( cp_def == undefined ){\n throw \"not a recognized or supported codeplug format\";\n }\n for( let r of cp_def.recordTypes ){ //for every record in our relevant codeplug\n let rt = codeplug_format.records.filter(x=>x.type==r)[0];\n //if( rt.typeName == \"Contacts\" ){ continue; }\n if( rt.max != undefined ){ //records can have arrays\n e[rt.typeName] = make_record_array(rt, data);\n } else {\n let offset = rt.offset;\n let thesebytes = data.subarray(offset, offset+rt.size);\n e[rt.typeName] = make_record(rt, thesebytes);\n }\n }\n return e;\n}\nlet tytera_map = {\n //deviation:\"Bandwidth (KHz)\",\n name: \"Channel Name\",\n //talkgroup:\"Contact Name\", //needs an fn\n //timeslot:\"Repeater Slot\", //off by one i think\n //color_code:\"Color Code\",\n //offset:\"Tx Offset (MHz)\", //needs an fn\n freq:\"Rx Frequency (MHz)\",\n //need a mode indicator\n //need a type (simplex, repeater) indicator\n}\n\nasync function apply_json_to_codeplug(zones,editor,codeplug){\n print(\"start apply \" + new Date());\n let newchannels = [];\n for( let c of zones[0].channels ){\n let newc = {};\n for( let k in tytera_map ){\n let t = tytera_map[k];\n if( c[k] ){\n newc[t] = c[k];\n }\n }\n newchannels.push(newc);\n }\n function get_first_empty_channel(editor){\n let cidx = 0;\n while( editor.Channels[cidx][\"Channel Name\"] != \"\" ){\n cidx++;\n }\n return cidx;\n }\n console.log(newchannels);\n let cidx = get_first_empty_channel(editor);\n for( const c of newchannels ){\n Object.assign( editor.Channels[cidx], c );\n //console.log(editor.Channels[cidx]);\n cidx++;\n }\n}\nfunction check_codeplug_layout(cpfmt){\n for( let cp of cpfmt.codeplugs ){\n let messages = [];\n const calert = (condition,msg)=>{\n if(condition){\n messages.push(msg);\n }\n }\n let fmt = cp.ext;\n let sz = cp[`${fmt}Size`];\n let sections = [];\n for( let r of cp.recordTypes ){\n let rt = cpfmt.records.filter(x=>x.type==r)[0];\n let start = rt.offset;\n let end = start+rt.size;\n if( rt.max ){\n end = start+rt.size*rt.max;\n } \n sections.push({name:rt.typeName,start:start, end:end});\n }\n sections = sections.sort(sortbykey(\"start\"));\n console.log(cp.type, sections);\n\n calert( sections[0].start != 0, \"Unused beginning of file\");\n for( let i = 1; i < sections.length; i++){\n let a = sections[i-1].end;\n let b = sections[i].start;\n calert(a>b, `Overlap between ${sections[i-1].name} and ${sections[i].name}: ${a-b} bytes overlap`);\n calert(ar.json());\n }\n //TODO cache this somehow\n const e = await codeplug_editor(cpm.rdt, cpj);\n cpm.editor = e;\n\n\n const def = {};\n def.overall = cpj.codeplugs.filter(x=>x.models.includes(model))[0];\n def.records = {};\n def.fields = {};\n for( let r of def.overall.recordTypes ){ //for every record in our relevant codeplug\n let rt = cpj.records.filter(x=>x.type == r )[0]\n def.records[rt.typeName] = rt;\n def.records[rt.type] = rt;\n for( let f of rt.fieldTypes ){\n let ft = cpj.fields.filter(x=>x.type == f )[0]\n def.fields[ft.typeName] = ft;\n def.fields[ft.type] = ft;\n }\n }\n //console.log(def);\n cpm.def = def;\n console.log(cpj, e);\n return cpm;\n}\nfunction tyt_get_dmrid(cp){\n console.log(\"get_dmrid\",cp);\n const id = uint8s_to_int(cp.slice(549+0x2084, 549+0x2084+4));\n console.log(\"get_dmrid\",cp,id);\n return id;\n}\nfunction cp_filename(cp){\n if( cp.filename ){\n return cp.filename;\n }\n const t = cp.readdate;\n let ts = [\n t.getFullYear(),\n t.getMonth()+1, //wtf javascript\n t.getDate(), //not getDay, mind you\n t.getHours(),\n t.getMinutes()\n ].map(x=>String(x).padStart(2,\"0\")).join(\"\");\n return `${ts}_${cp.model}_${cp.bands.join(\"\")}_${cp.dmrid}.rdt`;\n}\n\n//rewrite make_editor to use es6 proxies\n//https://medium.com/@xoor/an-introduction-to-es6-proxies-acc6b59c713b\n//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n//https://github.com/vuejs/vue/issues/4384\n\n//web workers:\n//https://developers.google.com/web/fundamentals/primers/service-workers/\n//https://www.html5rocks.com/en/tutorials/workers/basics/\nfunction make_codeplug_proxy(cp){\n console.log(cp);\n const handler1 = {\n get: function(target, prop, receiver ){\n console.log(receiver, prop);\n return receiver;\n },\n set: function(target, prop, receiver ){\n console.log(receiver, prop);\n return receiver;\n }\n };\n //have proxys all the way down to the records/record arrays?\n //the goal being to not have 100000 proxies, just like, idk, 50?\n const proxy1 = new Proxy(cp, handler1);\n console.log(\"PROXY\",proxy1);\n}\nexport default {\n make_editor,\n make_codeplug_proxy,\n ident_codeplug_radio_rdt,\n codeplug_editor,\n bin2rdt,\n rdt2bin,\n readFileBytes,\n uint8s_to_int,\n rdt_w_metadata,\n cp_filename,\n bands,\n hex2bytes,\n bytes2hex,\n bytes2string,\n js2cstr,\n cstr2js,\n assemble_le,\n};\n","import { render } from \"./connectedradio.vue?vue&type=template&id=00315c8a&scoped=true\"\nimport script from \"./connectedradio.vue?vue&type=script&lang=js\"\nexport * from \"./connectedradio.vue?vue&type=script&lang=js\"\n\nimport \"./connectedradio.vue?vue&type=style&index=0&id=00315c8a&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-00315c8a\"\n\nexport default script","\n\n\n","import { render } from \"./usbhelp.vue?vue&type=template&id=7af34f35&scoped=true\"\nimport script from \"./usbhelp.vue?vue&type=script&lang=js\"\nexport * from \"./usbhelp.vue?vue&type=script&lang=js\"\nscript.render = render\nscript.__scopeId = \"data-v-7af34f35\"\n\nexport default script","\n\n\n","import { render } from \"./usbdebugging.vue?vue&type=template&id=61147e38&scoped=true\"\nimport script from \"./usbdebugging.vue?vue&type=script&lang=js\"\nexport * from \"./usbdebugging.vue?vue&type=script&lang=js\"\nscript.render = render\nscript.__scopeId = \"data-v-61147e38\"\n\nexport default script","//TODO\n//firmware version\n//radio feature tests (GPS, etc)\n//memory map of the codeplug in offsets \n\n/*\n\nAll Codeplugs:\n\n------ 0\n549 header\n------ 549\n262144 body\n------ 262693 (40220 + 5 - 40220 + 5 + 16)\n16 bytes trailer (blank in gen1 radios? has data in gen2?)(or is that a product of the trailer actually being in the middle of the codeplug?\n------ 262709\n589824 Gen2 radio body\n64 bytes [3000] channels immediately after the trailer\n------ 852533\n\nNotice that the \"trailer\" is embedded in the middle of the RDT for newer radios\nThey (TYT) literally just appended the new codeplug flash contents to\nthe end of the old system. Gross.\n\n\n*/\n\nimport { xxd, assert, invert, wait_for, _x, fetchblob } from '@/libs/misc.js';\nimport codeplugs from '@/libs/codeplug.js';\n//uses DFU\nconst tytera_380_series = {vendorId:0x0483, productId:0xDF11};\nconst openrtx_serial = {vendorId:0x0483, productId:0x5740};\nconst tytera_md430 = {vendorId:0x1206, productId:0x0227};\n\n//serial port implementation needed, CDC-ACM i believe\nconst gd77 = {vendorId:0x15a2, productId:0x0073};\nconst anytone = {vendorId:0x28e9, productId:0x018a};\nexport const radio_filters = {filters:[\n tytera_380_series, \n openrtx_serial,\n tytera_md430,\n gd77, anytone \n]};\nfunction address_parts(addr){ //can replace with dissemble_le\n const a = addr & 0xff;\n const b = (addr >> 8) & 0xff;\n const c = (addr >> 16) & 0xff;\n const d = (addr >> 24) & 0xff;\n return [a,b,c,d]\n}\n\nconst Request = {\n \"DETACH\": 0,\n \"DNLOAD\": 1,\n \"UPLOAD\": 2, \n \"GETSTATUS\": 3,\n \"CLRSTATUS\": 4,\n \"GETSTATE\": 5,\n \"ABORT\": 6\n}\nconst iRequest = invert(Request);\n\nconst State = {\n \"appIDLE\":0,\n \"appDETACH\":1,\n \"dfuIDLE\":2,\n \"dfuDNLOAD_SYNC\":3,\n \"dfuDNBUSY\":4,\n \"dfuDNLOAD_IDLE\":5,\n \"dfuMANIFEST_SYNC\":6,\n \"dfuMANIFEST\":6,\n \"dfuMANIFEST_WAIT_RESET\":8,\n \"dfuUPLOAD_IDLE\":9,\n \"dfuERROR\":10,\n}\nconst iState = invert(State);\n\nconst Status = {\n \"OK\":0,\n \"errTARGET\":1,\n \"errFILE\":2,\n \"errWRITE\":3,\n \"errERASE\":4,\n \"errCHECK_ERASED\":5,\n \"errPROG\":6,\n \"errVERIFY\":7,\n \"errADDRESS\":8,\n \"errNOTDONE\":9,\n \"errFIRMWARE\":10,\n \"errVENDOR\":11,\n \"errUSBR\":12,\n \"errPOR\":13,\n \"errUNKNOWN\":14,\n \"errSTALLEDPKT\":15\n}\nconst iStatus = invert(Status);\n\nclass USB {\n //needs a common set like the libusb-like compat wrapper methods\n //and then make the DFU and ACM from this one\n constructor(dev){\n this.device = dev;\n this.mock = false;\n }\n bmRequestTypeInt2obj(i){\n //console.log(\"bmRt: \",dec2bin(i));\n const in_or_out = (i>>7) & 0x1;\n const in_or_out_a = [\"out\",\"in\"];\n //console.log(\"in_or_out:\",in_or_out,dec2bin(in_or_out));\n\n const type = (i >> 5) & 0x3;\n const type_a = [\"standard\",\"class\",\"vendor\",\"reserved\"];\n const typestr = type_a[type];\n //console.log(\"type:\",type,dec2bin(type),typestr);\n\n\n const recipient = (i) & 0x1f;\n const recipient_a = [\"device\",\"interface\",\"endpoint\",\"other\",\"reserved\"];\n const recipientstr = recipient_a[recipient];\n //console.log(\"recipient:\",recipient, dec2bin(recipient),recipientstr);\n\n return [in_or_out_a[in_or_out], {\n requestType: typestr,\n recipient: recipientstr,\n }]\n\n }\n async ctrl_transfer( requestType, request, value, index, length2read_or_data2send ){\n const [in_or_out,setup] = this.bmRequestTypeInt2obj(requestType); \n\n assert(\"requestType\" in setup);\n assert(\"recipient\" in setup);\n setup[\"request\"] = request;\n setup[\"value\"] = value;\n setup[\"index\"] = index; //webusb seems to 1 index this?\n //console.log(\"in or out:\", in_or_out);\n //console.log(\"setup:\", setup);\n //console.log(\"l2r or d2s:\", length2read_or_data2send);\n if( in_or_out == \"in\" ){\n return await this.device.controlTransferIn(setup, length2read_or_data2send);\n } else {\n if( !length2read_or_data2send ){\n //console.log(\"replacing with empty array buffer\");\n length2read_or_data2send = [];\n }\n const d2sb = Uint8Array.from(length2read_or_data2send);\n return await this.device.controlTransferOut(setup, d2sb);\n }\n }\n}\nclass ACM extends USB {\n async init(){\n console.log(\"ACM init\");\n await this.device.open();\n //await this.device.claimInterface(0);\n //await this.device.selectConfiguration(1);\n //await this.device.selectAlternateInterface(0,0);\n return;\n }\n}\nclass DFU extends USB {\n async init(){\n this.state = null;\n this.stateString = \"\";\n this.status = null;\n this.statusString = \"\";\n await this.device.open();\n await this.device.claimInterface(0);\n //only ddifference between normal and dfu mode i can see is memory\n //location for iInterface (despite how libusb works... which is\n //weird that they're so different)\n await this.device.selectConfiguration(1);\n await this.device.selectAlternateInterface(0,0);\n //console.log(\"dfu init() complete\");\n return;\n }\n async wait(){\n //console.log(\"dfu.wait 10ms\");\n await wait_for(10); //time in ms\n return;\n }\n async clear_status(){\n const x = await this.ctrl_transfer( 0x21, Request.CLRSTATUS, 0, 0, null);\n //console.log(\"dfu.clear_status: \",x);\n return x;\n\n }\n async detach(){\n const x = await this.ctrl_transfer( 0x21, Request.DETACH, 0, 0, null);\n //console.log(\"dfu.detach: \",x);\n return x;\n }\n async enter_dfu_mode(){\n const action_map = [ //written in order of enum values, e.g. this.detach when appIDLE\n \"detach\",\n \"wait\",\n \"wait\",\n \"abort\",\n \"wait\",\n \"abort\",\n \"abort\",\n \"abort\",\n \"wait\",\n \"abort\",\n \"clear_status\",\n ] \n //console.log(`[DFU]: Entering DFU mode on usb device '${this.device.productName}'`);\n while( 1 ){\n const state = await this.get_state();\n //console.log(`dfu.enter_dfu_mode: current state ${state}`);\n if( state == State.dfuIDLE ){\n //console.log(\"dfu.enter_dfu_mode: done!\");\n break;\n } else {\n //console.log(`dfu.enter_dfu_mode: calling ${action_map[state]}`);\n //console.log(\"enter_dfu_mode\",this);\n //(this) was getting clobbered when just doing action_map[state](), so instead of function references went to strings.\n await this[ action_map[state] ]() \n }\n }\n }\n async ping(){\n try {\n await this.get_state();\n return true;\n } catch (e){\n return false;\n }\n }\n async get_state(){\n const x = await this.ctrl_transfer( 0xA1, Request.GETSTATE, 0, 0, 1);\n const y = x.data.getUint8();\n //console.log(\"dfu.get_state:\",y);\n this.state = y;\n this.stateString = iState[this.state];\n return y;\n }\n async get_status(){\n const x = await this.ctrl_transfer( 0xA1, Request.GETSTATUS, 0, 0, 6);\n //console.log(\"dfu.get_status: raw \",x);\n const y = [];\n for( let i = 0; i < x.data.byteLength; i++){\n y.push( x.data.getUint8(i));\n }\n const z = [\n y[0], //status int\n (((y[1] << 8) | y[2]) << 8) | y[3], //timeout?\n y[4], //state int\n y[5] //discarded\n ];\n this.status = z[0];\n this.statusString = iStatus[this.status];\n this.state = y[4];\n this.stateString = iState[this.state];\n //console.log(\"dfu.get_status: y \",y);\n //console.log(\"dfu.get_status: z \",z);\n return z;\n }\n async abort(){\n const x = await this.ctrl_transfer( 0x21, Request.ABORT, 0, 0, null);\n return x;\n }\n async change_state_and_reenter_dfu(name, expected_state, ...args){\n await this.get_status(); //change state\n await this.wait();\n const s = await this.get_status(); //get status now that state has changed\n if( s[2] == expected_state ){\n //console.log(`Success in ${name}`);\n await this.enter_dfu_mode()\n return true;\n } else {\n //console.log(`Error in ${name}`);\n await this.enter_dfu_mode()\n return false;\n }\n }\n async wait_until_state(desired_state){\n let [status, timeout, state, discarded] = await this.get_status();\n while( state != desired_state ){\n await this.wait();\n [status, timeout, state, discarded] = await this.get_status();\n }\n return\n }\n async clear_status_until_state( desired_state){\n let [status, timeout, state, discarded] = await this.get_status();\n while( state != desired_state ){\n await this.clear_status();\n [status, timeout, state, discarded] = await this.get_status();\n }\n return\n }\n async set_address(addr){\n const [a,b,c,d] = address_parts(addr);\n const x = await this.ctrl_transfer( 0x21, Request.DNLOAD, 0, 0, [0x21, a, b, c, d] );\n const y = await this.change_state_and_reenter_dfu(`dfu.set_address(addr=${addr})`, State.dfuDNLOAD_IDLE );\n if( y ){ return x}\n else { \n //console.log(\"x\",x);\n //console.log(\"y\",y);\n return y;\n }\n }\n async read(blk_n, block_size){\n const tres = await this.request_upload( blk_n, block_size);\n const buf = tres.data;\n const [status, timeout, state, discarded] = await this.get_status();\n if( status != Status.OK || tres.status != \"ok\" ){\n //console.log(`read dfu status = ${status} (${iStatus[status]}), state=${state} (${iState[state]}) `);\n }\n if( tres.status != \"ok\" || buf.byteLength != block_size ){\n\n //console.log(tres, buf);\n throw new Error(`in read, received block length (${buf.byteLength}) does not equal expected block_size (${block_size})`);\n } else {\n return this.buf_to_bytes(buf);\n }\n }\n\n\n bytes_to_list(bytes){\n return Array.from(bytes);\n }\n buf_to_bytes(buf){\n const size = buf.byteLength;\n const a = new Uint8Array(size);\n for( let i = 0; i < size; i++){\n a[i] = buf.getUint8(i);\n }\n return a;\n }\n bytes_concat(expected_bytes,bufs){\n const a = new Uint8Array(expected_bytes);\n for( let i = 0; i < bufs.length; i++ ){\n a.set(bufs[i], i*1024);\n }\n return a;\n }\n async request_upload(block_num, length, idx=0){\n //console.log(`request_upload(block_num=${block_num}, length=${length}, idx=${idx})`);\n const x = await this.ctrl_transfer(0xA1,Request.UPLOAD, block_num, idx, length);\n //console.log(`dfu.request_upload(block_num=${_x(block_num)}, length=${length}, idx=${idx}) -> ${x.data.byteLength} bytes`);\n return x;\n }\n async request_dnload(block_num, data, idx=0){\n //console.log(`request_dnload(block_num=${block_num}, data=${data}, idx=${idx})`);\n return await this.ctrl_transfer(0x21,Request.DNLOAD, block_num, idx, data);\n }\n}\n\n\nclass TYTDMRDFU extends DFU {\n async md380_custom(a,b){\n const x = await this.ctrl_transfer( 0x21, Request.DNLOAD, 0, 0, [a, b]);\n const y = await this.change_state_and_reenter_dfu(`md380_custom( ${_x(a)}, ${_x(b)} )`, State.dfuDNLOAD_IDLE);\n if( y ){ return x}\n else { \n //console.log(\"x\",x);\n //console.log(\"y\",y);\n throw new Error(\"md380_custom failed\");\n //return y;\n }\n }\n async programming_mode(){\n const x = await this.md380_custom(0x91, 0x01);\n return x;\n }\n async reboot(){\n //console.log(\"THIS:\",this);\n await this.enter_dfu_mode();\n const x = await this.md380_custom(0x91, 0x05);\n return x;\n }\n async raw_identify_radio(){\n await this.md380_custom(0xa2, 0x01);\n await this.clear_status_until_state( State.dfuIDLE );\n //const tres = await this.request_upload(0,32);\n const bytes = await this.read(0, 32);\n await this.enter_dfu_mode();\n return bytes;\n }\n async identify_radio(){\n //await this.ctrl_transfer(0x21, 1, 0, 0, [0xA2, 0x01])\n const bytes = await this.raw_identify_radio();\n const data = this.bytes_to_list(bytes);\n //await this.enter_dfu_mode();\n /*\n * Example: \n UV380 with GPS, S_017.009\n CPS 1.06\n 00000000: 4d44 2d55 5633 3930 00ff ffff ffff ffff MD-UV390........\n 00000010: 2302 0052 0040 0048 6013 4017 ffd9 ffff #..R.@.H`.@.....\n \n MD2017 with GPS, S004.002\n CPS 1.20\n 00000000: 3230 3137 00ff ffff ffff ffff ffff ffff 2017............\n 00000010: 2102 0052 0040 0048 6013 4017 fff8 ffff !..R.@.H`.@.....\n\n MD2017 no GPS, D004.002\n CP 1.16\n 00000000: 3230 3137 00ff ffff ffff ffff ffff ffff 2017............\n 00000010: 2102 0052 0040 0048 6013 4017 fff8 ffff !..R.@.H`.@.....\n\n MD380 VHF with GPS, md380tools 9a771c9, S13ish\n CPS 1.36\n 00000000: 4d44 3339 3000 ffff ffff ffff ffff ffff MD390...........\n 00000010: 2000 0252 6013 4017 0888 8888 fffe ffff ..R`.@.........\n\n MD380 VHF no gps\n CPS 1.36\n 00000000: 4452 3738 3000 ffff ffff ffff ffff ffff DR780...........\n 00000010: 2000 ff33 6013 4017 ffff ffff fffe ffff ..3`.@.........\n\n MD380 uhf no gps, md380tools based on D13ish I think\n CPS 1.30\n 00000000: 4452 3738 3000 ffff ffff ffff ffff ffff DR780...........\n 00000010: 2002 ff33 0040 0048 ffff ffff ffff ffff ..3.@.H........\n\n\n\n */\n /*\n * scratch space:\n\n 2302 0052 ___________________ __d9 ____ UV380 with GPS\n 2000 0252 ___________________ __fe ____ MD380 VHF with GPS\n 2102 0052 ___________________ __f8 ____ MD2017 with GPS\n 2102 0052 ___________________ __f8 ____ MD2017\n 2000 ff33 ___________________ __fe ____ MD380 VHF\n 2002 ff33 ___________________ __ff ____ MD380 UHF\n 0x0 byte counts up (CPS version?)\n ff, fe, f8, d9 counts down (?)\n all dual-banders have 0052...\n gps and non-gps md2017 have identical signatures, \n so gps does not appear to be reported\n\n */\n\n //console.log(data);\n const ident_report = {\n //\"from\": myid,\n \"name\": \"radio_identity_report\",\n \"function\": \"DFU.identify_radio\",\n \"data\": data\n }\n //console.log(ident_report);\n //rprint(data);\n //if( !dev ){\n //jl.info(JSON.stringify(ident_report));\n //}\n //hexprint(\"radio id response:\",data);\n //returns a 32 byte list with an ascii string describing the radio,\n //some 0xFFs, and then what I assume is either chinese or version\n //numbers or something\n //save_data( data, \"identify_radio.bin\");\n const freq_ranges = await this.parse_radio_freqs(data);\n const name = await this.parse_radio_name(data);\n\n return [name, freq_ranges, data];\n }\n async get_radio_name(){\n const [name,freq_ranges] = await this.identify_radio();\n await this.enter_dfu_mode();\n return name;\n }\n async parse_radio_freqs(data){\n data = data.slice(0x10); //first 16 bytes appear to set aside for model names\n const first_range = data.slice(4,4+4);\n const second_range = data.slice(8,8+4);\n let ranges;\n if( [0xff, 0x08].includes( second_range[0]) ){\n //what the fuck kind of test is _that_?\n ranges = [first_range];\n //single band radio\n } else {\n ranges = [first_range, second_range];\n //multi band radio\n }\n function bytes2nibbles(bs){\n const nibbles = [];\n for( let i = bs.length-1; i >= 0; i--){\n const n1 = (bs[i] >> 4)& 0xF;\n const n2 = bs[i] & 0xF;\n nibbles.push(n1);\n nibbles.push(n2);\n }\n return nibbles;\n }\n function bcdFreqRange2IntFreqRange(raw_freq_range){\n let start = raw_freq_range.slice(0,0+2);\n let end = raw_freq_range.slice(2,2+2);\n start = bytes2nibbles(start).join(\"\");\n end = bytes2nibbles(end).join(\"\");\n //now in strings like 4800, meaning 480MHz, or 4800 * 100KHz, or 4800*1e5\n start = parseInt(start)*1e5;\n end = parseInt(end)*1e5;\n //now an int that represents frequency in Hz\n return [start, end]\n }\n //console.log(data);\n const int_ranges = ranges.map(x=>bcdFreqRange2IntFreqRange(x))\n return int_ranges\n \n \n }\n async parse_radio_name(data){\n const end_of_ascii_string = data.indexOf(0);\n const name = data.slice(0,end_of_ascii_string)\n .map(c=> String.fromCharCode(c)).join(\"\");\n return name;\n }\n async get_radio_gen(radioname){\n if( ! radioname ){\n const radioname = await this.get_radio_name();\n }\n let gen = 1;\n if( [\"2017\", \"MD-UV390\",\"MD-UV380\"].includes(radioname) ){\n gen = 2;\n }\n return gen;\n }\n pad_bytes(buf, block_size){\n const a = new Uint8Array(block_size);\n a.fill(0xff);\n a.set(buf);\n return a;\n }\n progress_clean(){\n const now = new Date();\n if( ! this.progress ){\n this.progress = {}; //it's an object for easier updates by name\n }\n let oldprogress = this.progress;\n this.progress = {}; \n for( let old of Object.values(oldprogress) ){\n let diff = now - old.lastupdated;\n if( !(old.finished && diff > 5000 )){\n this.progress[ old.name ] = old;\n } \n }\n }\n progress_get(){\n const now = new Date();\n this.progress_clean();\n return this.progress;\n }\n progress_init(name,max){\n const now = new Date();\n this.progress_clean();\n this.progress[name] = {\n name: name,\n max: max,\n current:0,\n finished:false,\n errored: false,\n started: new Date(),\n lastupdated:new Date(),\n elapsed: 0,\n msg:\"started\",\n };\n }\n progress_update(name,current){\n const now = new Date();\n this.progress[name].current = current;\n this.progress[name].lastupdated = now;\n this.progress[name].elapsed = now - this.progress[name].started;\n }\n progress_finish(name, has_error, msg){\n this.progress[name].errored = has_error;\n this.progress[name].current = this.progress[name].max;\n this.progress[name].lastupdated = new Date();\n this.progress[name].msg = msg;\n if( ! has_error ){\n this.progress[name].finished = true;\n }\n\n }\n async read_flash(addr, bytelen){\n const block_size = 1024;\n let block_number = addr/block_size;\n const block_count = bytelen/block_size;\n const bytebufs = [];\n this.progress_init(\"read_flash\",bytelen);\n await this.set_address(0x00000000);\n //console.log(`Expecting to read ${bytelen} bytes from flash`);\n let total_read = 0;\n for( let i = 0; i < block_count; i++){\n let adjusted_block_number = block_number + 2;\n if( block_number >= 256 && block_number < 2048-832 ){\n adjusted_block_number += 832;\n }\n const buf = await this.read(adjusted_block_number, block_size);\n total_read += buf.byteLength;\n this.progress_update(\"read_flash\",total_read);\n\n bytebufs.push(buf);\n block_number += 1;\n }\n //console.log(bytebufs);\n const a = this.bytes_concat(bytelen, bytebufs);\n this.progress_finish(\"read_flash\",false,\"ok\");\n return a;\n }\n async write_flash(addr, data){\n const block_size = 1024;\n let block_number = addr/block_size;\n const bytelen = data.byteLength;\n const block_count = Math.ceil(bytelen/block_size);\n const blockedSize = block_count * block_size;\n const bytebufs = [];\n let total_written = 0;\n console.log(`Erasing ${blockedSize} bytes at ${_x(addr)}`);\n await this.eraseFlashBlocks(addr, blockedSize);\n //console.log(`Expecting to write ${block_count} blocks, ${bytelen} bytes (actually ${blockedSize} bytes for block writes) to flash`);\n this.progress_init(\"write_flash\",bytelen);\n await this.set_address(0x00000000);\n for( let i = 0; i < block_count; i++){\n let this_block = data.slice(i*block_size, (i+1)*block_size);\n if( this_block.length != block_size ){\n this_block = this.pad_bytes(this_block, block_size);\n }\n let adjusted_block_number = block_number + 2;\n if( block_number >= 256 && block_number < 2048-832 ){\n adjusted_block_number += 832;\n }\n //console.log(`writing num ${i}, adj ${adjusted_block_number}, size: ${block_size}`);\n await this.request_dnload(adjusted_block_number, this_block);\n await this.wait_until_state( State.dfuDNLOAD_IDLE );\n total_written += this_block.byteLength;\n this.progress_update(\"write_flash\",total_written);\n block_number += 1;\n }\n this.progress_finish(\"write_flash\",false,\"ok\");\n }\n async eraseFlashBlocks(addr, size){//this needs to be simplified into erase_sector\n const block_size = 64*1024;\n const block_count = Math.ceil(size/block_size);\n this.progress_init(\"erase_flash\",block_count);\n for( let i =0; i < block_count; i++){\n let adjusted_addr = addr;\n if( addr >= 0x40000 && addr <0x200000-0xd0000 ){\n adjusted_addr += 0xd0000;\n }\n await this.erase_sector(adjusted_addr);\n addr += block_size;\n this.progress_update(\"erase_flash\",i);\n }\n this.progress_finish(\"erase_flash\",false,\"ok\");\n }\n async recv_codeplug(){\n const radioname = await this.get_radio_name();\n const gen = await this.get_radio_gen(radioname);\n const rdt_size = gen == 1 ? 262709 : 852533;\n const expected_bytes = rdt_size - 549 - 16;\n await this.programming_mode();\n await this.md380_custom(0xa2, 0x02);\n await this.md380_custom(0xa2, 0x02);\n await this.md380_custom(0xa2, 0x03);\n await this.md380_custom(0xa2, 0x04);\n await this.md380_custom(0xa2, 0x07);\n await this.set_address(0x00000000);\n const a = await this.read_flash(0, expected_bytes);\n await this.enter_dfu_mode();\n //console.log(\"bin\",a);\n //console.log(\"recv_codeplug finished\", expected_bytes);\n return a;\n }\n async send_codeplug(data){ //must be a raw bin (use codeplugs.rdt2bin)\n //console.log(data);\n const radioname = await this.get_radio_name();\n const gen = await this.get_radio_gen(radioname);\n const rdt_size = gen == 1 ? 262709 : 852533;\n const expected_bytes = rdt_size - 549 - 16;\n if( data.length != expected_bytes ){\n console.log(data);\n throw \"Codeplug to program is not expected size for headerless or RDT files\";\n }\n await this.programming_mode();\n await this.programming_mode();\n await this.md380_custom(0xa2, 0x02);\n await this.md380_custom(0xa2, 0x02);\n await this.md380_custom(0xa2, 0x03);\n await this.md380_custom(0xa2, 0x04);\n await this.md380_custom(0xa2, 0x07);\n\n await this.write_flash(0, data);\n\n await this.enter_dfu_mode();\n //console.log(\"Wrote codeplug!\");\n }\n async erase_sector(addr){\n const [a,b,c,d] = address_parts(addr);\n const x = await this.ctrl_transfer( 0x21, Request.DNLOAD, 0, 0, [0x41, a,b,c,d]);\n const y = await this.change_state_and_reenter_dfu(`erase_sector( addr=${_x(addr)} )`, State.dfuDNLOAD_IDLE);\n if( y ){ return x}\n else { \n //console.log(\"x\",x);\n //console.log(\"y\",y);\n throw new Error(\"erase_sector failed\");\n //return y;\n }\n }\n async parseHeader(header_bytes){\n xxd(Array.from(header_bytes));\n let header = {};\n let offset = 0;\n header.magic = header_bytes.subarray(offset,offset+16);\n offset += 16\n\n header.radio = header_bytes.subarray(offset,offset+16);\n offset += 16\n\n header.unk = header_bytes.subarray(offset,offset+92);\n offset += 92\n\n if( offset != 0x7C ){\n throw(\"offset != 0x7C as expected, offset = \" + offset );\n }\n header.sections = [];\n let num_sections = codeplugs.assemble_le(header_bytes.subarray(offset,offset+4));\n console.log(num_sections);\n if( num_sections == (1<<32) - 1 || num_sections == -1 ){\n num_sections = 1;\n }\n header.num_sections = num_sections;\n offset += 4;\n //parse into uint32_t_LE\n for( let i = 0; i < num_sections; i++){\n const memloc = codeplugs.assemble_le(header_bytes.subarray(offset, offset+4))\n offset += 4;\n const size = codeplugs.assemble_le(header_bytes.subarray(offset, offset+4))\n offset += 4;\n header.sections.push( [memloc, size] );\n }\n //anything left between offset and 0x100 is don't care (or at\n //least, we've never seen anything beyond 0xff there and it makes\n //sense to have it there for multiple sections)\n console.log(header);\n return header;\n }\n get_sector_size(addr){\n if( addr < 0x8000000 ){\n return 0x10000;\n } else if ( addr >= 0x8000000 && addr < 0x8010000 ){\n return 0x04000;\n } else if ( addr == 0x8010000 ){\n return 0x10000;\n } else {\n return 0x20000;\n }\n }\n async write_sector(addr, secsize, data){\n const block_size = 1024;\n const block_total = data.length / 1024;\n console.log(`write_sector(addr=0x${addr.toString(16)}, secsize=0x${secsize.toString(16)}, len(data)=${data.length}, numblocks=${block_total}`);\n assert(secsize == this.get_sector_size(addr));\n //assert(data.length%1024 == 0);\n await this.set_address(addr);\n\n let written = 0;\n let block_num = 0;\n this.progress_init(\"flash_sector\", block_total);\n while( written < data.length ){\n if( block_num >= block_total ){\n console.log(\"way too many blocks ...\");\n }\n let block_data = data.subarray(written, written+block_size);\n //console.log(`request_dnload(blockid=${block_num+2}, block_data.length=${block_data.length})`);\n if( block_data.length != block_size ){\n block_data = this.pad_bytes(block_data, block_size);\n }\n if( this.mock === true ){\n await wait_for(10);\n } else {\n await this.request_dnload(block_num+2, block_data);\n await this.wait_until_state( State.dfuDNLOAD_IDLE );\n }\n written+= block_size;\n block_num++;\n this.progress_update(\"flash_sector\", block_num);\n }\n this.progress_finish(\"flash_sector\", false, \"ok\");\n return written; //TODO: this includes padding, which we may not want, depending!\n }\n async firmware_upload(data_bytes){\n console.log(\"firmware upload\");\n //TODO detect firmware upload mode\n await this.get_status()\n await this.md380_custom(0x91, 0x01);\n await this.md380_custom(0x91, 0x31);\n //0x100 at the start is the header\n //0x100 footer, too, but without interesting data\n const header = await this.parseHeader(data_bytes.subarray(0x0,0x100));\n console.log(header, data_bytes.length);\n const firmware = data_bytes.subarray(0x100);\n //need to check header radio magic, but skip that for now lol\n let offset = 0; //offset into firmware to read from\n this.progress_init(\"firmware_sections\", header.num_sections);\n let sections_done = 0;\n\n for( const [memloc,size] of header.sections){\n console.log(`Location: 0x${memloc.toString(16)} [${size.toString(16)}]`);\n //erase and then write each sector (as opposed to erasing all sectors and then writing all sectors...)\n //\n //per nizzo, this is non ideal - BUT, i have an overriding concern:\n //I don't actually know the memory layout like Tytera does!\n //or what memory will be used!\n //so I don't actually know which sectors will need to be\n //erased until I look at the firmware and try to write it\n //(unless i generate the addresses for the sectors ahead of time...?)\n\n // for each sequence for the location and size:\n let sz_remaining = size;\n let addr = memloc;\n this.progress_init(\"fw_section\", sz_remaining);\n while( sz_remaining > 0 ){\n //TODO: problem is that we blow right past sz_remaining ... \n const secsize = this.get_sector_size(addr);\n const datalength = Math.min(sz_remaining, secsize);\n const data_for_this_sector = firmware.subarray(offset,offset+datalength)\n //if( data_for_this_sector.length != secsize ){\n //console.log(\"data did not match sec size\",data_for_this_sector.length, secsize, addr, memloc, offset, sz_remaining);\n //}\n console.log(`offset=0x${offset.toString(16)}, Sector 0x${addr.toString(16)}, size=0x${secsize.toString(16)}, datalength=0x${data_for_this_sector.length.toString(16)}`);\n if( this.mock === true ){\n await wait_for(5);\n } else {\n await this.erase_sector(addr);\n }\n const written = await this.write_sector(addr, secsize, data_for_this_sector)\n addr += secsize; \n offset += written; \n sz_remaining -= written; \n console.log(\"remaining:\",sz_remaining);\n this.progress_update(\"fw_section\", size-sz_remaining);\n }\n console.log(\"done with \",memloc.toString(16));\n sections_done++;\n this.progress_finish(\"fw_section\", false, \"ok\");\n this.progress_update(\"firmware_sections\", sections_done);\n \n }\n console.log(\"done with firmware\");\n this.progress_finish(\"firmware_sections\", false, \"ok\");\n console.log(this.progress_get());\n console.log(this);\n }\n}\nclass VCZTYTDFU extends TYTDMRDFU {\n //port of md380_tool from KK4VCZ and friends\n //supposedly needs to read the manufacturer string to hook the added USB functions\n async peek(adr, size){\n await this.set_address(adr);\n const res = await this.request_upload( 1, size);\n return new Uint8Array(res.data.buffer);\n }\n async spiflashgetid(){\n const size=4;\n const cmd = 0x05;\n return await this.query([cmd], size);\n }\n async spiflashpeek( adr, size=1024){\n const cmd= 0x01;\n const cmdbytes = [cmd, ...codeplugs.dissemble_le(adr,4)];\n return await this.query(cmdbytes, size);\n }\n async query(cmdbyteslist, resultsize){\n //console.log(`query(cmdbyteslist=${cmdbyteslist}, resultsize=${resultsize})`);\n await this.request_dnload( 1, new Uint8Array(cmdbyteslist));\n await this.get_status();\n const status = await this.get_status();\n const res = await this.request_upload( 1, resultsize);\n return new Uint8Array(res.data.buffer);\n }\n async read_framebuf_line(y){\n //console.log(`read_framebuf_line(y=${y})`);\n const cmdbytes = [0x84, 0, y, 159, y];\n const size = 160*3+5;\n const res = await this.query(cmdbytes, size);\n if( res[4] == y ){ //0-4 are the cmdbytes echoed if all is well\n return res.slice(5); //so strip those and just return the BGR pixels, 8 bits each color\n } else {\n return null;\n }\n }\n async get_screen_bmp(){\n console.log(\"get_screen_bmp\");\n const size = 0xf036;\n this.progress_init(\"screenshot\", size);\n const bmp = new Uint8Array(size);\n const header = codeplugs.hex2bytes(\n \"424d\" + \"36f0\" + \"0000\" + \"00000000\"+\n \"36000000\"+ //54\n \"28000000\"+ //40 sizeof(bitmapinfoheader)\n \"a0000000\"+ //160 width pixels\n \"80000000\"+ //128 height pixels\n \"01001800\"+ //bitplanes (1) and bits per pixel (24 / 0x18)\n \"00000000\"+\n \"00A00000\"+ //sizeof(pixel data)\n \"00000000\"+ //x pixel per meter\n \"00000000\"+ //y pixel per meter\n \"00000000\"+ //no colour palette\n \"00000000\" //number of colours used: 0=all colors\n );\n bmp.set(header,0);\n let offset = header.length;\n for( let y = 127; y >=0; y--){ //bmp files begin with the bottom line\n let line = null;\n while( ! line ){ //may need a retry\n line = await this.read_framebuf_line(y);\n await wait_for(10);\n }\n bmp.set(line, offset);\n offset += line.length;\n this.progress_update(\"screenshot\",offset);\n await wait_for(1);\n }\n this.progress_finish(\"screenshot\", false, \"ok\");\n return bmp;\n }\n async getdmesg(){\n const res = await this.query( [0], 1024);\n const text = codeplugs.bytes2string(Array.from(res));\n //need to reorder the ring buffer\n console.log(text);\n return text;\n }\n}\nclass MockUSB {\n //console.log(`[DFU]: Entering DFU mode on usb device '${this.device.productName}'`);\n constructor(dev){\n this.manufacturerName =\"tarxvf\";\n this.productName= \"mockUSB\";\n this.opened= false;\n }\n async open(){\n //await this.device.open();\n this.opened = true;\n await wait_for(1);\n }\n async claimInterface(idx){\n //await this.device.claimInterface(0);\n await wait_for(1);\n }\n async selectConfiguration(idx){\n //await this.device.selectConfiguration(1);\n await wait_for(1);\n }\n async selectAlternateInterface(idx1,idx2){\n //await this.device.selectAlternateInterface(0,0);\n await wait_for(1);\n }\n\n async controlTransferOut(setup, d2sb){\n assert(this.opened);\n await wait_for(1);\n //console.log(\"controlTransferOut\", setup, d2sb);\n }\n async controlTransferIn(setup, length2read_or_data2send){\n assert(this.opened);\n await wait_for(1);\n //console.log(\"controlTransferIn\", setup, length2read_or_data2send);\n }\n}\nclass MockDFU extends DFU {\n //constructor(dev){\n //async init(){\n //async wait(){\n //async clear_status(){\n //async detach(){\n //async enter_dfu_mode(){\n //async ctrl_transfer( requestType, request, value, index, length2read_or_data2send ){\n //async get_state(){\n //async get_status(){\n //async abort(){\n //async change_state_and_reenter_dfu(name, expected_state, ...args){\n //async wait_until_state(desired_state){\n //async clear_status_until_state( desired_state){\n //async set_address(addr){\n //async read(blk_n, block_size){\n //async request_upload(block_num, length, idx=0){\n //async request_dnload(block_num, data, idx=0){\n}\nclass MockTYTDFU extends MockDFU {\n constructor(dev){\n super();\n this.device = dev;\n }\n async enter_dfu_mode(){\n //console.log(\"enter_dfu_mode\");\n }\n async programming_mode(){\n //console.log(\"programming_mode\");\n }\n async reboot(){\n this.device = null;\n }\n async identify_radio(){\n return [\"MD-UV390\",[[136000000,174000000]],\"10C\"];\n }\n async ping(){\n return true;\n }\n async get_radio_name(){\n return \"MD-UV390\";\n }\n async raw_identify_radio(){\n return new Uint8Array([77,68,45,85,86,51,57,48,0,255,255,255,255,255,255,255,35,2,0,82,0,64,0,72,96,19,64,23,255,217,255,255]);\n }\n async get_radio_gen(){\n return 2;\n }\n progress_get(){\n return {\n \"erase_flash\":{\n name: \"erase_flash\",\n max: 825533,\n current:825533,\n finished:true,\n errored: false,\n started: new Date()-60*1000,\n lastupdated:new Date()-50*1000,\n elapsed: 10*1000,\n msg:\"ok\",\n },\n \"write_flash\":{\n name: \"write_flash\",\n max: 825533,\n current:825533,\n finished:true,\n errored: false,\n started: new Date()-50*1000,\n lastupdated:new Date()-30*1000,\n elapsed: 20*1000,\n msg:\"ok\",\n },\n \"read_flash\":{\n name: \"read_flash\",\n max: 825533,\n current:55000,\n finished:false,\n errored: false,\n started: new Date()-3*1000,\n lastupdated:new Date(),\n elapsed: 3,\n msg:\"started\",\n }\n }\n }\n //async md380_custom(a,b){\n //async get_radio_name(){\n //async parse_radio_freqs(data){\n //async parse_radio_name(data){\n //async get_radio_gen(radioname){\n //async read_flash(addr, bytelen){\n //async write_flash(addr, data){\n //async eraseFlashBlocks(addr, size){\n //async erase_sector(addr){\n \n async recv_codeplug(){\n const rdt = await fetchblob( \"/data/codeplug1_tarxvf.rdt\");\n return rdt;\n }\n //async send_codeplug(data){\n}\n\n//TODO: Firmware upload for gen1 and gen2 radios\n\nexport default {\n ACM,\n DFU,\n TYTDMRDFU,\n VCZTYTDFU,\n MockUSB,\n MockDFU,\n MockTYTDFU,\n radio_filters\n}\n","import { render } from \"./webdfuradio.vue?vue&type=template&id=78d9c484&scoped=true\"\nimport script from \"./webdfuradio.vue?vue&type=script&lang=js\"\nexport * from \"./webdfuradio.vue?vue&type=script&lang=js\"\n\nimport \"./webdfuradio.vue?vue&type=style&index=0&id=78d9c484&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-78d9c484\"\n\nexport default script","\n\n\n","import { render } from \"./keyloader.vue?vue&type=template&id=27505480&scoped=true\"\nimport script from \"./keyloader.vue?vue&type=script&lang=js\"\nexport * from \"./keyloader.vue?vue&type=script&lang=js\"\n\nimport \"./keyloader.vue?vue&type=style&index=0&id=27505480&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-27505480\"\n\nexport default script","\n\n\n","import { render } from \"./dmrid.vue?vue&type=template&id=01470d76&scoped=true\"\nimport script from \"./dmrid.vue?vue&type=script&lang=js\"\nexport * from \"./dmrid.vue?vue&type=script&lang=js\"\n\nimport \"./dmrid.vue?vue&type=style&index=0&id=01470d76&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-01470d76\"\n\nexport default script","\n\n\n","\n\n\n","import { render } from \"./channel.vue?vue&type=template&id=44539def&scoped=true\"\nimport script from \"./channel.vue?vue&type=script&lang=js\"\nexport * from \"./channel.vue?vue&type=script&lang=js\"\n\nimport \"./channel.vue?vue&type=style&index=0&id=44539def&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-44539def\"\n\nexport default script","\n\n\n","import { render } from \"./zone.vue?vue&type=template&id=4cab6ef7&scoped=true\"\nimport script from \"./zone.vue?vue&type=script&lang=js\"\nexport * from \"./zone.vue?vue&type=script&lang=js\"\n\nimport \"./zone.vue?vue&type=style&index=0&id=4cab6ef7&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-4cab6ef7\"\n\nexport default script","import { render } from \"./manualcps.vue?vue&type=template&id=1c18a40a&scoped=true\"\nimport script from \"./manualcps.vue?vue&type=script&lang=js\"\nexport * from \"./manualcps.vue?vue&type=script&lang=js\"\n\nimport \"./manualcps.vue?vue&type=style&index=0&id=1c18a40a&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-1c18a40a\"\n\nexport default script","import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'\nimport Home from '@/views/Home.vue'\nimport About from '@/views/About.vue'\nimport MainMenu from '@/views/Main.vue'\nimport WebDFURadio from '@/components/webdfuradio.vue'\nimport Keyloader from '@/components/keyloader.vue'\nimport DMRID from '@/components/dmrid.vue'\nimport ManualCPS from '@/components/manualcps.vue'\n\nconst routes: Array = [\n {\n path: '/',\n name: 'MainMenu',\n component: MainMenu\n },\n {\n path: '/about',\n name: 'About',\n // route level code-splitting\n // this generates a separate chunk (about.[hash].js) for this route\n // which is lazy-loaded when the route is visited.\n //component: () => import([> webpackChunkName: \"about\" <] '../views/About.vue')\n component: About\n },\n {\n path: '/usb',\n name: 'USB',\n component: WebDFURadio,\n },\n {\n path: '/flashfirmware',\n name: 'firmware',\n component: WebDFURadio,\n },\n {\n path: '/recoverradios',\n name: 'recover',\n component: WebDFURadio,\n },\n {\n path: '/keyloader',\n name: 'Keyloader',\n component: Keyloader,\n },\n {\n path: '/dmrid',\n name: 'ID Manager',\n component: DMRID\n },\n {\n path: '/manualcps',\n name: 'Manual CPS',\n component: ManualCPS\n },\n {\n path: '/autocps',\n name: 'Auto CPS',\n component: Home\n }\n]\n\nconst router = createRouter({\n history: createWebHashHistory(),\n routes\n})\n\nexport default router\n","import { createStore } from 'vuex'\nconst radioiddotnet = {\n namespaced: true,\n state: () => ({\n }),\n mutations: {\n },\n actions: {\n },\n getters: {\n }\n}\nconst firmwares = {\n namespaced: true,\n state: () => ({\n loaded_firmwares: [],\n }),\n mutations: {\n add_firmwares(state: any, firmwares: any){\n console.log(`add_firmware()`);\n for( const fw of firmwares ){\n state.loaded_firmwares.push(fw);\n }\n },\n clear_firmwares(state: any, idx: number ){\n console.log(`clear_firmwares()`);\n state.current_firmware = undefined;\n state.loaded_firmwares = [];\n }\n },\n actions: {\n },\n getters: {\n }\n}\nconst codeplugs = {\n namespaced: true,\n state: () => ({\n loaded_codeplugs: [],\n current_codeplug: undefined,\n definitions: {},\n current_definition: {},\n }),\n mutations: {\n set_definitions(state: any, defs: any ){\n state.definitions = defs;\n },\n add_codeplug(state: any, codeplug: any){\n console.log(`add_codeplug()`);\n state.loaded_codeplugs.push(codeplug);\n },\n delete_codeplug(state: any, idx: number){\n console.log(`delete_codeplug(${idx})`);\n if( state.current_codeplug == state.loaded_codeplugs[idx] ){\n state.current_codeplug = undefined;\n }\n state.loaded_codeplugs.splice(idx,1);\n },\n select_codeplug(state: any, idx: number ){\n console.log(`select_codeplug(${idx})`);\n state.current_codeplug = state.loaded_codeplugs[ idx ];\n },\n clear_codeplugs(state: any, idx: number ){\n console.log(`clear_codeplugs()`);\n state.current_codeplug = undefined;\n state.loaded_codeplugs = [];\n }\n },\n actions: {\n },\n getters: {\n }\n}\nconst devtools = {\n namespaced: true,\n state: () => ({\n devmode: false,\n }),\n mutations: {\n toggledevmode(state: any){\n state.devmode = !state.devmode;\n console.log(\"devmode=\",state.devmode);\n },\n },\n actions: {\n },\n getters: {\n }\n}\nexport default createStore({\n modules: {\n devtools: devtools,\n codeplugs: codeplugs,\n radioiddotnet: radioiddotnet,\n firmwares: firmwares,\n }\n})\n","import { createApp } from 'vue'\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\n//import './unregisterServiceWorker'\n\n\nconst a = createApp(App);\na.use(store).use(router).mount('#app');\na.config.globalProperties.$filters = {\n json(v: any){\n return JSON.stringify(v, null, 2)\n }\n}\n\n//TODO explain advantage of storing codeplugs in cloud:\n// great for mobile editing and synchronization\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./keyloader.vue?vue&type=style&index=0&id=27505480&scoped=true&lang=css\"","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader-v16/dist/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./App.vue?vue&type=style&index=0&id=247c9eae&scoped=true&lang=css\""],"sourceRoot":""}