[{"data":1,"prerenderedAt":4730},["ShallowReactive",2],{"/docs/scripts/free-phone/exports":3,"/docs/scripts/free-phone/exports-surround":4718,"/docs/scripts/free-phone/exports-implemented-suggestions":4729},{"id":4,"title":5,"body":6,"description":4709,"extension":4710,"head":4711,"implementedSuggestions":4711,"meta":4712,"navigation":561,"path":4713,"schemaOrg":4711,"seo":4714,"sitemap":4715,"stem":4716,"__hash__":4717},"docs/1.docs/scripts/4.free-phone/3.exports.md","Exports",{"type":7,"value":8,"toc":4671},"minimark",[9,13,26,31,38,45,219,644,650,656,684,918,921,927,954,1031,1034,1040,1074,1229,1232,1238,1263,1338,1344,1377,1542,1545,1551,1653,1803,1811,1817,1830,1979,1982,1986,1992,1996,1999,2005,2047,2164,2170,2199,2324,2330,2355,2428,2434,2461,2578,2581,2587,2621,2706,2711,2724,2792,2796,2799,2805,2919,3126,3129,3135,3172,3248,3254,3284,3348,3354,3387,3467,3471,3477,3483,3510,3581,3587,3615,3696,3702,3733,3779,3785,3817,3902,3908,3994,4172,4178,4213,4279,4283,4294,4467,4520,4523,4527,4530,4648,4651,4655,4658,4667],[10,11,12],"p",{},"This page documents the supported public integration calls. Client exports must run in a client\nscript and server exports must run in a server script. Internal NUI callbacks and net events are not\npublic APIs.",[14,15,18],"callout",{"color":16,"icon":17},"success","i-lucide-shield-check",[10,19,20,21,25],{},"Keep the resource folder named ",[22,23,24],"code",{},"sky_phone",". Validate every returned success value and keep money,\npermissions, ownership, and other authoritative changes on the server.",[27,28,30],"h2",{"id":29},"client-exports","Client Exports",[10,32,33,34,37],{},"Client exports register and control custom apps owned by the calling resource. Free Phone binds the\nowner automatically through ",[22,35,36],{},"GetInvokingResource()",".",[39,40,42],"h3",{"id":41},"addcustomappdefinition",[22,43,44],{},"AddCustomApp(definition)",[46,47,48,56,201],"ul",{},[49,50,51,55],"li",{},[52,53,54],"strong",{},"Purpose",": Registers a custom app owned by the calling resource.",[49,57,58,61,62],{},[52,59,60],{},"Arguments",":\n",[46,63,64],{},[49,65,66,69,70,73,74],{},[22,67,68],{},"definition"," (",[22,71,72],{},"table","): Complete app definition.\n",[46,75,76,85,94,106,115,124,149,159,168,184,193],{},[49,77,78,69,81,84],{},[22,79,80],{},"id",[22,82,83],{},"string","): Stable lowercase app ID. Required.",[49,86,87,69,90,93],{},[22,88,89],{},"name",[22,91,92],{},"string | table","): Display name or localized names. Required.",[49,95,96,69,99,101,102,105],{},[22,97,98],{},"ui",[22,100,83],{},"): Local ",[22,103,104],{},"web/..."," entry file or allowed remote UI. Required.",[49,107,108,69,111,114],{},[22,109,110],{},"description",[22,112,113],{},"string | table?","): Optional description.",[49,116,117,69,120,123],{},[22,118,119],{},"developer",[22,121,122],{},"string?","): Developer or resource label.",[49,125,126,69,129,131,132,135,136,135,139,135,142,145,146,37],{},[22,127,128],{},"category",[22,130,122],{},"): ",[22,133,134],{},"games",", ",[22,137,138],{},"productivity",[22,140,141],{},"shopping",[22,143,144],{},"social",", or ",[22,147,148],{},"utilities",[49,150,151,69,154,101,156,158],{},[22,152,153],{},"icon",[22,155,122],{},[22,157,104],{}," icon or allowed remote icon.",[49,160,161,69,164,167],{},[22,162,163],{},"permissions",[22,165,166],{},"table?","): Requested app permissions.",[49,169,170,69,173,131,175,135,178,145,181,37],{},[22,171,172],{},"orientation",[22,174,122],{},[22,176,177],{},"portrait",[22,179,180],{},"landscape",[22,182,183],{},"any",[49,185,186,69,189,192],{},[22,187,188],{},"defaultInstalled",[22,190,191],{},"boolean?","): Installs the app by default.",[49,194,195,69,198,200],{},[22,196,197],{},"removable",[22,199,191],{},"): Allows the player to uninstall the app.",[49,202,203,206,207,210,211,214,215,218],{},[52,204,205],{},"Returns",": ",[22,208,209],{},"boolean, string?"," — ",[22,212,213],{},"true"," on success, otherwise ",[22,216,217],{},"false"," and a stable error code.",[220,221,227],"pre",{"className":222,"code":223,"filename":224,"language":225,"meta":226,"style":226},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","local app = {\n    id = \"dispatch-board\",\n    name = {\n        en = \"Dispatch Board\",\n        de = \"Leitstelle\",\n    },\n    description = {\n        en = \"Live dispatch information\",\n        de = \"Live-Informationen der Leitstelle\",\n    },\n    developer = \"my_dispatch\",\n    category = \"productivity\",\n    ui = \"web/index.html\",\n    icon = \"web/icon.webp\",\n    orientation = \"portrait\",\n    defaultInstalled = true,\n    removable = true,\n    permissions = {\n        \"app.close\",\n        \"device.storage\",\n        \"notifications\",\n        \"theme.read\",\n        \"locale.read\",\n    },\n}\n\nlocal registered, error_code = exports[\"sky_phone\"]:AddCustomApp(app)\n\nif not registered then\n    print((\"[my_dispatch] Registration failed: %s\"):format(error_code))\nend\n","client.lua","lua","",[22,228,229,248,269,279,296,313,319,329,345,361,366,383,399,416,433,449,462,474,484,497,509,521,533,545,550,556,563,592,597,613,638],{"__ignoreMap":226},[230,231,234,238,242,245],"span",{"class":232,"line":233},"line",1,[230,235,237],{"class":236},"sMK4o","local",[230,239,241],{"class":240},"sTEyZ"," app ",[230,243,244],{"class":236},"=",[230,246,247],{"class":240}," {\n",[230,249,251,254,256,259,263,266],{"class":232,"line":250},2,[230,252,253],{"class":240},"    id ",[230,255,244],{"class":236},[230,257,258],{"class":236}," \"",[230,260,262],{"class":261},"sfazB","dispatch-board",[230,264,265],{"class":236},"\"",[230,267,268],{"class":240},",\n",[230,270,272,275,277],{"class":232,"line":271},3,[230,273,274],{"class":240},"    name ",[230,276,244],{"class":236},[230,278,247],{"class":240},[230,280,282,285,287,289,292,294],{"class":232,"line":281},4,[230,283,284],{"class":240},"        en ",[230,286,244],{"class":236},[230,288,258],{"class":236},[230,290,291],{"class":261},"Dispatch Board",[230,293,265],{"class":236},[230,295,268],{"class":240},[230,297,299,302,304,306,309,311],{"class":232,"line":298},5,[230,300,301],{"class":240},"        de ",[230,303,244],{"class":236},[230,305,258],{"class":236},[230,307,308],{"class":261},"Leitstelle",[230,310,265],{"class":236},[230,312,268],{"class":240},[230,314,316],{"class":232,"line":315},6,[230,317,318],{"class":240},"    },\n",[230,320,322,325,327],{"class":232,"line":321},7,[230,323,324],{"class":240},"    description ",[230,326,244],{"class":236},[230,328,247],{"class":240},[230,330,332,334,336,338,341,343],{"class":232,"line":331},8,[230,333,284],{"class":240},[230,335,244],{"class":236},[230,337,258],{"class":236},[230,339,340],{"class":261},"Live dispatch information",[230,342,265],{"class":236},[230,344,268],{"class":240},[230,346,348,350,352,354,357,359],{"class":232,"line":347},9,[230,349,301],{"class":240},[230,351,244],{"class":236},[230,353,258],{"class":236},[230,355,356],{"class":261},"Live-Informationen der Leitstelle",[230,358,265],{"class":236},[230,360,268],{"class":240},[230,362,364],{"class":232,"line":363},10,[230,365,318],{"class":240},[230,367,369,372,374,376,379,381],{"class":232,"line":368},11,[230,370,371],{"class":240},"    developer ",[230,373,244],{"class":236},[230,375,258],{"class":236},[230,377,378],{"class":261},"my_dispatch",[230,380,265],{"class":236},[230,382,268],{"class":240},[230,384,386,389,391,393,395,397],{"class":232,"line":385},12,[230,387,388],{"class":240},"    category ",[230,390,244],{"class":236},[230,392,258],{"class":236},[230,394,138],{"class":261},[230,396,265],{"class":236},[230,398,268],{"class":240},[230,400,402,405,407,409,412,414],{"class":232,"line":401},13,[230,403,404],{"class":240},"    ui ",[230,406,244],{"class":236},[230,408,258],{"class":236},[230,410,411],{"class":261},"web/index.html",[230,413,265],{"class":236},[230,415,268],{"class":240},[230,417,419,422,424,426,429,431],{"class":232,"line":418},14,[230,420,421],{"class":240},"    icon ",[230,423,244],{"class":236},[230,425,258],{"class":236},[230,427,428],{"class":261},"web/icon.webp",[230,430,265],{"class":236},[230,432,268],{"class":240},[230,434,436,439,441,443,445,447],{"class":232,"line":435},15,[230,437,438],{"class":240},"    orientation ",[230,440,244],{"class":236},[230,442,258],{"class":236},[230,444,177],{"class":261},[230,446,265],{"class":236},[230,448,268],{"class":240},[230,450,452,455,457,460],{"class":232,"line":451},16,[230,453,454],{"class":240},"    defaultInstalled ",[230,456,244],{"class":236},[230,458,459],{"class":236}," true",[230,461,268],{"class":240},[230,463,465,468,470,472],{"class":232,"line":464},17,[230,466,467],{"class":240},"    removable ",[230,469,244],{"class":236},[230,471,459],{"class":236},[230,473,268],{"class":240},[230,475,477,480,482],{"class":232,"line":476},18,[230,478,479],{"class":240},"    permissions ",[230,481,244],{"class":236},[230,483,247],{"class":240},[230,485,487,490,493,495],{"class":232,"line":486},19,[230,488,489],{"class":236},"        \"",[230,491,492],{"class":261},"app.close",[230,494,265],{"class":236},[230,496,268],{"class":240},[230,498,500,502,505,507],{"class":232,"line":499},20,[230,501,489],{"class":236},[230,503,504],{"class":261},"device.storage",[230,506,265],{"class":236},[230,508,268],{"class":240},[230,510,512,514,517,519],{"class":232,"line":511},21,[230,513,489],{"class":236},[230,515,516],{"class":261},"notifications",[230,518,265],{"class":236},[230,520,268],{"class":240},[230,522,524,526,529,531],{"class":232,"line":523},22,[230,525,489],{"class":236},[230,527,528],{"class":261},"theme.read",[230,530,265],{"class":236},[230,532,268],{"class":240},[230,534,536,538,541,543],{"class":232,"line":535},23,[230,537,489],{"class":236},[230,539,540],{"class":261},"locale.read",[230,542,265],{"class":236},[230,544,268],{"class":240},[230,546,548],{"class":232,"line":547},24,[230,549,318],{"class":240},[230,551,553],{"class":232,"line":552},25,[230,554,555],{"class":240},"}\n",[230,557,559],{"class":232,"line":558},26,[230,560,562],{"emptyLinePlaceholder":561},true,"\n",[230,564,566,568,571,573,576,578,580,582,585,589],{"class":232,"line":565},27,[230,567,237],{"class":236},[230,569,570],{"class":240}," registered, error_code ",[230,572,244],{"class":236},[230,574,575],{"class":240}," exports[",[230,577,265],{"class":236},[230,579,24],{"class":261},[230,581,265],{"class":236},[230,583,584],{"class":240},"]:",[230,586,588],{"class":587},"s2Zo4","AddCustomApp",[230,590,591],{"class":240},"(app)\n",[230,593,595],{"class":232,"line":594},28,[230,596,562],{"emptyLinePlaceholder":561},[230,598,600,604,607,610],{"class":232,"line":599},29,[230,601,603],{"class":602},"s7zQu","if",[230,605,606],{"class":236}," not",[230,608,609],{"class":240}," registered ",[230,611,612],{"class":602},"then\n",[230,614,616,619,622,624,627,629,632,635],{"class":232,"line":615},30,[230,617,618],{"class":587},"    print",[230,620,621],{"class":240},"((",[230,623,265],{"class":236},[230,625,626],{"class":261},"[my_dispatch] Registration failed: %s",[230,628,265],{"class":236},[230,630,631],{"class":240},"):",[230,633,634],{"class":587},"format",[230,636,637],{"class":240},"(error_code))\n",[230,639,641],{"class":232,"line":640},31,[230,642,643],{"class":602},"end\n",[10,645,646,647,37],{},"Local UI and icon files belong to the calling resource and must be included in that resource's\n",[22,648,649],{},"fxmanifest.lua",[39,651,653],{"id":652},"updatecustomappdefinition",[22,654,655],{},"UpdateCustomApp(definition)",[46,657,658,663,678],{},[49,659,660,662],{},[52,661,54],{},": Replaces an owned custom app definition.",[49,664,665,61,667],{},[52,666,60],{},[46,668,669],{},[49,670,671,69,673,675,676,37],{},[22,672,68],{},[22,674,72],{},"): The complete definition, including the existing ",[22,677,80],{},[49,679,680,206,682,37],{},[52,681,205],{},[22,683,209],{},[220,685,687],{"className":222,"code":686,"filename":224,"language":225,"meta":226,"style":226},"local updated, error_code = exports[\"sky_phone\"]:UpdateCustomApp({\n    id = \"dispatch-board\",\n    name = \"Dispatch Board\",\n    description = \"Live incidents and unit status\",\n    developer = \"my_dispatch\",\n    category = \"productivity\",\n    ui = \"web/index.html\",\n    icon = \"web/icon.webp\",\n    defaultInstalled = true,\n    removable = true,\n    permissions = {\n        \"app.close\",\n        \"device.storage\",\n        \"notifications\",\n    },\n})\n\nif not updated then\n    print((\"[my_dispatch] Update failed: %s\"):format(error_code))\nend\n",[22,688,689,714,728,742,757,771,785,799,813,823,833,841,851,861,871,875,880,884,895,914],{"__ignoreMap":226},[230,690,691,693,696,698,700,702,704,706,708,711],{"class":232,"line":233},[230,692,237],{"class":236},[230,694,695],{"class":240}," updated, error_code ",[230,697,244],{"class":236},[230,699,575],{"class":240},[230,701,265],{"class":236},[230,703,24],{"class":261},[230,705,265],{"class":236},[230,707,584],{"class":240},[230,709,710],{"class":587},"UpdateCustomApp",[230,712,713],{"class":240},"({\n",[230,715,716,718,720,722,724,726],{"class":232,"line":250},[230,717,253],{"class":240},[230,719,244],{"class":236},[230,721,258],{"class":236},[230,723,262],{"class":261},[230,725,265],{"class":236},[230,727,268],{"class":240},[230,729,730,732,734,736,738,740],{"class":232,"line":271},[230,731,274],{"class":240},[230,733,244],{"class":236},[230,735,258],{"class":236},[230,737,291],{"class":261},[230,739,265],{"class":236},[230,741,268],{"class":240},[230,743,744,746,748,750,753,755],{"class":232,"line":281},[230,745,324],{"class":240},[230,747,244],{"class":236},[230,749,258],{"class":236},[230,751,752],{"class":261},"Live incidents and unit status",[230,754,265],{"class":236},[230,756,268],{"class":240},[230,758,759,761,763,765,767,769],{"class":232,"line":298},[230,760,371],{"class":240},[230,762,244],{"class":236},[230,764,258],{"class":236},[230,766,378],{"class":261},[230,768,265],{"class":236},[230,770,268],{"class":240},[230,772,773,775,777,779,781,783],{"class":232,"line":315},[230,774,388],{"class":240},[230,776,244],{"class":236},[230,778,258],{"class":236},[230,780,138],{"class":261},[230,782,265],{"class":236},[230,784,268],{"class":240},[230,786,787,789,791,793,795,797],{"class":232,"line":321},[230,788,404],{"class":240},[230,790,244],{"class":236},[230,792,258],{"class":236},[230,794,411],{"class":261},[230,796,265],{"class":236},[230,798,268],{"class":240},[230,800,801,803,805,807,809,811],{"class":232,"line":331},[230,802,421],{"class":240},[230,804,244],{"class":236},[230,806,258],{"class":236},[230,808,428],{"class":261},[230,810,265],{"class":236},[230,812,268],{"class":240},[230,814,815,817,819,821],{"class":232,"line":347},[230,816,454],{"class":240},[230,818,244],{"class":236},[230,820,459],{"class":236},[230,822,268],{"class":240},[230,824,825,827,829,831],{"class":232,"line":363},[230,826,467],{"class":240},[230,828,244],{"class":236},[230,830,459],{"class":236},[230,832,268],{"class":240},[230,834,835,837,839],{"class":232,"line":368},[230,836,479],{"class":240},[230,838,244],{"class":236},[230,840,247],{"class":240},[230,842,843,845,847,849],{"class":232,"line":385},[230,844,489],{"class":236},[230,846,492],{"class":261},[230,848,265],{"class":236},[230,850,268],{"class":240},[230,852,853,855,857,859],{"class":232,"line":401},[230,854,489],{"class":236},[230,856,504],{"class":261},[230,858,265],{"class":236},[230,860,268],{"class":240},[230,862,863,865,867,869],{"class":232,"line":418},[230,864,489],{"class":236},[230,866,516],{"class":261},[230,868,265],{"class":236},[230,870,268],{"class":240},[230,872,873],{"class":232,"line":435},[230,874,318],{"class":240},[230,876,877],{"class":232,"line":451},[230,878,879],{"class":240},"})\n",[230,881,882],{"class":232,"line":464},[230,883,562],{"emptyLinePlaceholder":561},[230,885,886,888,890,893],{"class":232,"line":476},[230,887,603],{"class":602},[230,889,606],{"class":236},[230,891,892],{"class":240}," updated ",[230,894,612],{"class":602},[230,896,897,899,901,903,906,908,910,912],{"class":232,"line":486},[230,898,618],{"class":587},[230,900,621],{"class":240},[230,902,265],{"class":236},[230,904,905],{"class":261},"[my_dispatch] Update failed: %s",[230,907,265],{"class":236},[230,909,631],{"class":240},[230,911,634],{"class":587},[230,913,637],{"class":240},[230,915,916],{"class":232,"line":499},[230,917,643],{"class":602},[10,919,920],{},"This export does not accept a partial patch. Omitted fields are removed from the stored definition.",[39,922,924],{"id":923},"removecustomappappid",[22,925,926],{},"RemoveCustomApp(appId)",[46,928,929,934,948],{},[49,930,931,933],{},[52,932,54],{},": Removes an app owned by the calling resource.",[49,935,936,61,938],{},[52,937,60],{},[46,939,940],{},[49,941,942,69,945,947],{},[22,943,944],{},"appId",[22,946,83],{},"): App ID used during registration.",[49,949,950,206,952,37],{},[52,951,205],{},[22,953,209],{},[220,955,957],{"className":222,"code":956,"filename":224,"language":225,"meta":226,"style":226},"local removed, error_code = exports[\"sky_phone\"]:RemoveCustomApp(\"dispatch-board\")\n\nif not removed then\n    print((\"[my_dispatch] Removal failed: %s\"):format(error_code))\nend\n",[22,958,959,993,997,1008,1027],{"__ignoreMap":226},[230,960,961,963,966,968,970,972,974,976,978,981,984,986,988,990],{"class":232,"line":233},[230,962,237],{"class":236},[230,964,965],{"class":240}," removed, error_code ",[230,967,244],{"class":236},[230,969,575],{"class":240},[230,971,265],{"class":236},[230,973,24],{"class":261},[230,975,265],{"class":236},[230,977,584],{"class":240},[230,979,980],{"class":587},"RemoveCustomApp",[230,982,983],{"class":240},"(",[230,985,265],{"class":236},[230,987,262],{"class":261},[230,989,265],{"class":236},[230,991,992],{"class":240},")\n",[230,994,995],{"class":232,"line":250},[230,996,562],{"emptyLinePlaceholder":561},[230,998,999,1001,1003,1006],{"class":232,"line":271},[230,1000,603],{"class":602},[230,1002,606],{"class":236},[230,1004,1005],{"class":240}," removed ",[230,1007,612],{"class":602},[230,1009,1010,1012,1014,1016,1019,1021,1023,1025],{"class":232,"line":281},[230,1011,618],{"class":587},[230,1013,621],{"class":240},[230,1015,265],{"class":236},[230,1017,1018],{"class":261},"[my_dispatch] Removal failed: %s",[230,1020,265],{"class":236},[230,1022,631],{"class":240},[230,1024,634],{"class":587},[230,1026,637],{"class":240},[230,1028,1029],{"class":232,"line":298},[230,1030,643],{"class":602},[10,1032,1033],{},"Owned apps are also removed automatically when their resource stops.",[39,1035,1037],{"id":1036},"opencustomappappid-data",[22,1038,1039],{},"OpenCustomApp(appId, data?)",[46,1041,1042,1047,1068],{},[49,1043,1044,1046],{},[52,1045,54],{},": Opens an owned app in an already visible phone.",[49,1048,1049,61,1051],{},[52,1050,60],{},[46,1052,1053,1060],{},[49,1054,1055,69,1057,1059],{},[22,1056,944],{},[22,1058,83],{},"): Registered app ID.",[49,1061,1062,69,1065,1067],{},[22,1063,1064],{},"data",[22,1066,166],{},"): JSON-compatible opening payload delivered to the iframe.",[49,1069,1070,206,1072,37],{},[52,1071,205],{},[22,1073,209],{},[220,1075,1077],{"className":222,"code":1076,"filename":224,"language":225,"meta":226,"style":226},"RegisterCommand(\"dispatchphone\", function()\n    local opened, error_code = exports[\"sky_phone\"]:OpenCustomApp(\n        \"dispatch-board\",\n        {\n            incidentId = 184,\n            source = \"command\",\n        }\n    )\n\n    if not opened then\n        print((\"[my_dispatch] Could not open app: %s\"):format(error_code))\n    end\nend)\n",[22,1078,1079,1101,1127,1137,1142,1155,1171,1176,1181,1185,1197,1217,1222],{"__ignoreMap":226},[230,1080,1081,1084,1086,1088,1091,1093,1095,1098],{"class":232,"line":233},[230,1082,1083],{"class":587},"RegisterCommand",[230,1085,983],{"class":240},[230,1087,265],{"class":236},[230,1089,1090],{"class":261},"dispatchphone",[230,1092,265],{"class":236},[230,1094,135],{"class":240},[230,1096,1097],{"class":602},"function",[230,1099,1100],{"class":236},"()\n",[230,1102,1103,1106,1109,1111,1113,1115,1117,1119,1121,1124],{"class":232,"line":250},[230,1104,1105],{"class":236},"    local",[230,1107,1108],{"class":240}," opened, error_code ",[230,1110,244],{"class":236},[230,1112,575],{"class":240},[230,1114,265],{"class":236},[230,1116,24],{"class":261},[230,1118,265],{"class":236},[230,1120,584],{"class":240},[230,1122,1123],{"class":587},"OpenCustomApp",[230,1125,1126],{"class":240},"(\n",[230,1128,1129,1131,1133,1135],{"class":232,"line":271},[230,1130,489],{"class":236},[230,1132,262],{"class":261},[230,1134,265],{"class":236},[230,1136,268],{"class":240},[230,1138,1139],{"class":232,"line":281},[230,1140,1141],{"class":240},"        {\n",[230,1143,1144,1147,1149,1153],{"class":232,"line":298},[230,1145,1146],{"class":240},"            incidentId ",[230,1148,244],{"class":236},[230,1150,1152],{"class":1151},"sbssI"," 184",[230,1154,268],{"class":240},[230,1156,1157,1160,1162,1164,1167,1169],{"class":232,"line":315},[230,1158,1159],{"class":240},"            source ",[230,1161,244],{"class":236},[230,1163,258],{"class":236},[230,1165,1166],{"class":261},"command",[230,1168,265],{"class":236},[230,1170,268],{"class":240},[230,1172,1173],{"class":232,"line":321},[230,1174,1175],{"class":240},"        }\n",[230,1177,1178],{"class":232,"line":331},[230,1179,1180],{"class":240},"    )\n",[230,1182,1183],{"class":232,"line":347},[230,1184,562],{"emptyLinePlaceholder":561},[230,1186,1187,1190,1192,1195],{"class":232,"line":363},[230,1188,1189],{"class":602},"    if",[230,1191,606],{"class":236},[230,1193,1194],{"class":240}," opened ",[230,1196,612],{"class":602},[230,1198,1199,1202,1204,1206,1209,1211,1213,1215],{"class":232,"line":368},[230,1200,1201],{"class":587},"        print",[230,1203,621],{"class":240},[230,1205,265],{"class":236},[230,1207,1208],{"class":261},"[my_dispatch] Could not open app: %s",[230,1210,265],{"class":236},[230,1212,631],{"class":240},[230,1214,634],{"class":587},[230,1216,637],{"class":240},[230,1218,1219],{"class":232,"line":385},[230,1220,1221],{"class":602},"    end\n",[230,1223,1224,1227],{"class":232,"line":401},[230,1225,1226],{"class":602},"end",[230,1228,992],{"class":240},[10,1230,1231],{},"This export navigates inside an open phone. It does not bypass the phone item, lock screen, or device\nsession.",[39,1233,1235],{"id":1234},"closecustomappappid",[22,1236,1237],{},"CloseCustomApp(appId)",[46,1239,1240,1245,1257],{},[49,1241,1242,1244],{},[52,1243,54],{},": Closes the active owned custom app.",[49,1246,1247,61,1249],{},[52,1248,60],{},[46,1250,1251],{},[49,1252,1253,69,1255,1059],{},[22,1254,944],{},[22,1256,83],{},[49,1258,1259,206,1261,37],{},[52,1260,205],{},[22,1262,209],{},[220,1264,1266],{"className":222,"code":1265,"filename":224,"language":225,"meta":226,"style":226},"local closed, error_code = exports[\"sky_phone\"]:CloseCustomApp(\"dispatch-board\")\n\nif not closed then\n    print((\"[my_dispatch] Close failed: %s\"):format(error_code))\nend\n",[22,1267,1268,1300,1304,1315,1334],{"__ignoreMap":226},[230,1269,1270,1272,1275,1277,1279,1281,1283,1285,1287,1290,1292,1294,1296,1298],{"class":232,"line":233},[230,1271,237],{"class":236},[230,1273,1274],{"class":240}," closed, error_code ",[230,1276,244],{"class":236},[230,1278,575],{"class":240},[230,1280,265],{"class":236},[230,1282,24],{"class":261},[230,1284,265],{"class":236},[230,1286,584],{"class":240},[230,1288,1289],{"class":587},"CloseCustomApp",[230,1291,983],{"class":240},[230,1293,265],{"class":236},[230,1295,262],{"class":261},[230,1297,265],{"class":236},[230,1299,992],{"class":240},[230,1301,1302],{"class":232,"line":250},[230,1303,562],{"emptyLinePlaceholder":561},[230,1305,1306,1308,1310,1313],{"class":232,"line":271},[230,1307,603],{"class":602},[230,1309,606],{"class":236},[230,1311,1312],{"class":240}," closed ",[230,1314,612],{"class":602},[230,1316,1317,1319,1321,1323,1326,1328,1330,1332],{"class":232,"line":281},[230,1318,618],{"class":587},[230,1320,621],{"class":240},[230,1322,265],{"class":236},[230,1324,1325],{"class":261},"[my_dispatch] Close failed: %s",[230,1327,265],{"class":236},[230,1329,631],{"class":240},[230,1331,634],{"class":587},[230,1333,637],{"class":240},[230,1335,1336],{"class":232,"line":298},[230,1337,643],{"class":602},[39,1339,1341],{"id":1340},"sendcustomappmessageappid-payload",[22,1342,1343],{},"SendCustomAppMessage(appId, payload)",[46,1345,1346,1351,1371],{},[49,1347,1348,1350],{},[52,1349,54],{},": Sends JSON-compatible data to an active and ready owned app.",[49,1352,1353,61,1355],{},[52,1354,60],{},[46,1356,1357,1363],{},[49,1358,1359,69,1361,1059],{},[22,1360,944],{},[22,1362,83],{},[49,1364,1365,69,1368,1370],{},[22,1366,1367],{},"payload",[22,1369,183],{},"): JSON-compatible payload within the configured message-size limit.",[49,1372,1373,206,1375,37],{},[52,1374,205],{},[22,1376,209],{},[220,1378,1380],{"className":222,"code":1379,"filename":224,"language":225,"meta":226,"style":226},"local sent, error_code = exports[\"sky_phone\"]:SendCustomAppMessage(\n    \"dispatch-board\",\n    {\n        type = \"incident:update\",\n        incident = {\n            id = 184,\n            status = \"responding\",\n            assignedUnit = \"ADAM-12\",\n        },\n    }\n)\n\nif not sent then\n    print((\"[my_dispatch] Message failed: %s\"):format(error_code))\nend\n",[22,1381,1382,1406,1417,1422,1438,1447,1458,1474,1490,1495,1500,1504,1508,1519,1538],{"__ignoreMap":226},[230,1383,1384,1386,1389,1391,1393,1395,1397,1399,1401,1404],{"class":232,"line":233},[230,1385,237],{"class":236},[230,1387,1388],{"class":240}," sent, error_code ",[230,1390,244],{"class":236},[230,1392,575],{"class":240},[230,1394,265],{"class":236},[230,1396,24],{"class":261},[230,1398,265],{"class":236},[230,1400,584],{"class":240},[230,1402,1403],{"class":587},"SendCustomAppMessage",[230,1405,1126],{"class":240},[230,1407,1408,1411,1413,1415],{"class":232,"line":250},[230,1409,1410],{"class":236},"    \"",[230,1412,262],{"class":261},[230,1414,265],{"class":236},[230,1416,268],{"class":240},[230,1418,1419],{"class":232,"line":271},[230,1420,1421],{"class":240},"    {\n",[230,1423,1424,1427,1429,1431,1434,1436],{"class":232,"line":281},[230,1425,1426],{"class":240},"        type ",[230,1428,244],{"class":236},[230,1430,258],{"class":236},[230,1432,1433],{"class":261},"incident:update",[230,1435,265],{"class":236},[230,1437,268],{"class":240},[230,1439,1440,1443,1445],{"class":232,"line":298},[230,1441,1442],{"class":240},"        incident ",[230,1444,244],{"class":236},[230,1446,247],{"class":240},[230,1448,1449,1452,1454,1456],{"class":232,"line":315},[230,1450,1451],{"class":240},"            id ",[230,1453,244],{"class":236},[230,1455,1152],{"class":1151},[230,1457,268],{"class":240},[230,1459,1460,1463,1465,1467,1470,1472],{"class":232,"line":321},[230,1461,1462],{"class":240},"            status ",[230,1464,244],{"class":236},[230,1466,258],{"class":236},[230,1468,1469],{"class":261},"responding",[230,1471,265],{"class":236},[230,1473,268],{"class":240},[230,1475,1476,1479,1481,1483,1486,1488],{"class":232,"line":331},[230,1477,1478],{"class":240},"            assignedUnit ",[230,1480,244],{"class":236},[230,1482,258],{"class":236},[230,1484,1485],{"class":261},"ADAM-12",[230,1487,265],{"class":236},[230,1489,268],{"class":240},[230,1491,1492],{"class":232,"line":347},[230,1493,1494],{"class":240},"        },\n",[230,1496,1497],{"class":232,"line":363},[230,1498,1499],{"class":240},"    }\n",[230,1501,1502],{"class":232,"line":368},[230,1503,992],{"class":240},[230,1505,1506],{"class":232,"line":385},[230,1507,562],{"emptyLinePlaceholder":561},[230,1509,1510,1512,1514,1517],{"class":232,"line":401},[230,1511,603],{"class":602},[230,1513,606],{"class":236},[230,1515,1516],{"class":240}," sent ",[230,1518,612],{"class":602},[230,1520,1521,1523,1525,1527,1530,1532,1534,1536],{"class":232,"line":418},[230,1522,618],{"class":587},[230,1524,621],{"class":240},[230,1526,265],{"class":236},[230,1528,1529],{"class":261},"[my_dispatch] Message failed: %s",[230,1531,265],{"class":236},[230,1533,631],{"class":240},[230,1535,634],{"class":587},[230,1537,637],{"class":240},[230,1539,1540],{"class":232,"line":435},[230,1541,643],{"class":602},[10,1543,1544],{},"Messages sent while the app is opening are queued up to the configured queue limit and delivered\nafter the iframe reports bridge readiness.",[39,1546,1548],{"id":1547},"sendcustomappnotificationappid-notification",[22,1549,1550],{},"SendCustomAppNotification(appId, notification)",[46,1552,1553,1558,1647],{},[49,1554,1555,1557],{},[52,1556,54],{},": Creates a validated phone notification for an owned app.",[49,1559,1560,61,1562],{},[52,1561,60],{},[46,1563,1564,1570],{},[49,1565,1566,69,1568,1059],{},[22,1567,944],{},[22,1569,83],{},[49,1571,1572,69,1575,1577,1578],{},[22,1573,1574],{},"notification",[22,1576,72],{},"): Notification definition.\n",[46,1579,1580,1588,1596,1604,1620,1631,1639],{},[49,1581,1582,69,1585,1587],{},[22,1583,1584],{},"title",[22,1586,122],{},"): Defaults to the app name.",[49,1589,1590,69,1593,1595],{},[22,1591,1592],{},"text",[22,1594,83],{},"): Notification body. Required.",[49,1597,1598,69,1601,1603],{},[22,1599,1600],{},"subtitle",[22,1602,122],{},"): Optional secondary text.",[49,1605,1606,69,1609,131,1611,135,1614,145,1617,37],{},[22,1607,1608],{},"sound",[22,1610,122],{},[22,1612,1613],{},"chime",[22,1615,1616],{},"signal",[22,1618,1619],{},"soft",[49,1621,1622,69,1625,1627,1628,37],{},[22,1623,1624],{},"critical",[22,1626,191],{},"): Requires ",[22,1629,1630],{},"notifications.critical",[49,1632,1633,69,1636,1638],{},[22,1634,1635],{},"persistent",[22,1637,191],{},"): Keeps the notification visible until handled.",[49,1640,1641,69,1644,1646],{},[22,1642,1643],{},"route",[22,1645,122],{},"): Must resolve to the app's own route.",[49,1648,1649,206,1651,37],{},[52,1650,205],{},[22,1652,209],{},[220,1654,1656],{"className":222,"code":1655,"filename":224,"language":225,"meta":226,"style":226},"local sent, error_code = exports[\"sky_phone\"]:SendCustomAppNotification(\n    \"dispatch-board\",\n    {\n        title = \"New dispatch\",\n        subtitle = \"Incident #184\",\n        text = \"Priority call at Mission Row\",\n        sound = \"signal\",\n    }\n)\n\nif not sent then\n    print((\"[my_dispatch] Notification failed: %s\"):format(error_code))\nend\n",[22,1657,1658,1681,1691,1695,1711,1727,1743,1758,1762,1766,1770,1780,1799],{"__ignoreMap":226},[230,1659,1660,1662,1664,1666,1668,1670,1672,1674,1676,1679],{"class":232,"line":233},[230,1661,237],{"class":236},[230,1663,1388],{"class":240},[230,1665,244],{"class":236},[230,1667,575],{"class":240},[230,1669,265],{"class":236},[230,1671,24],{"class":261},[230,1673,265],{"class":236},[230,1675,584],{"class":240},[230,1677,1678],{"class":587},"SendCustomAppNotification",[230,1680,1126],{"class":240},[230,1682,1683,1685,1687,1689],{"class":232,"line":250},[230,1684,1410],{"class":236},[230,1686,262],{"class":261},[230,1688,265],{"class":236},[230,1690,268],{"class":240},[230,1692,1693],{"class":232,"line":271},[230,1694,1421],{"class":240},[230,1696,1697,1700,1702,1704,1707,1709],{"class":232,"line":281},[230,1698,1699],{"class":240},"        title ",[230,1701,244],{"class":236},[230,1703,258],{"class":236},[230,1705,1706],{"class":261},"New dispatch",[230,1708,265],{"class":236},[230,1710,268],{"class":240},[230,1712,1713,1716,1718,1720,1723,1725],{"class":232,"line":298},[230,1714,1715],{"class":240},"        subtitle ",[230,1717,244],{"class":236},[230,1719,258],{"class":236},[230,1721,1722],{"class":261},"Incident #184",[230,1724,265],{"class":236},[230,1726,268],{"class":240},[230,1728,1729,1732,1734,1736,1739,1741],{"class":232,"line":315},[230,1730,1731],{"class":240},"        text ",[230,1733,244],{"class":236},[230,1735,258],{"class":236},[230,1737,1738],{"class":261},"Priority call at Mission Row",[230,1740,265],{"class":236},[230,1742,268],{"class":240},[230,1744,1745,1748,1750,1752,1754,1756],{"class":232,"line":321},[230,1746,1747],{"class":240},"        sound ",[230,1749,244],{"class":236},[230,1751,258],{"class":236},[230,1753,1616],{"class":261},[230,1755,265],{"class":236},[230,1757,268],{"class":240},[230,1759,1760],{"class":232,"line":331},[230,1761,1499],{"class":240},[230,1763,1764],{"class":232,"line":347},[230,1765,992],{"class":240},[230,1767,1768],{"class":232,"line":363},[230,1769,562],{"emptyLinePlaceholder":561},[230,1771,1772,1774,1776,1778],{"class":232,"line":368},[230,1773,603],{"class":602},[230,1775,606],{"class":236},[230,1777,1516],{"class":240},[230,1779,612],{"class":602},[230,1781,1782,1784,1786,1788,1791,1793,1795,1797],{"class":232,"line":385},[230,1783,618],{"class":587},[230,1785,621],{"class":240},[230,1787,265],{"class":236},[230,1789,1790],{"class":261},"[my_dispatch] Notification failed: %s",[230,1792,265],{"class":236},[230,1794,631],{"class":240},[230,1796,634],{"class":587},[230,1798,637],{"class":240},[230,1800,1801],{"class":232,"line":401},[230,1802,643],{"class":602},[10,1804,1805,1806,1808,1809,37],{},"The app definition must contain ",[22,1807,516],{},". Critical notifications additionally require\n",[22,1810,1630],{},[39,1812,1814],{"id":1813},"getcustomappcapabilities",[22,1815,1816],{},"GetCustomAppCapabilities()",[46,1818,1819,1824],{},[49,1820,1821,1823],{},[52,1822,54],{},": Reads the active custom-app ABI, protocol, bridge methods, context capabilities, and\nconfigured limits.",[49,1825,1826,206,1828,37],{},[52,1827,205],{},[22,1829,72],{},[220,1831,1833],{"className":222,"code":1832,"filename":224,"language":225,"meta":226,"style":226},"local capabilities = exports[\"sky_phone\"]:GetCustomAppCapabilities()\n\nprint(\"ABI\", capabilities.abiVersion)\nprint(\"Protocol\", capabilities.protocolVersion)\nprint(\"Enabled\", capabilities.enabled)\n\nfor _, method in ipairs(capabilities.bridgeMethods or {}) do\n    print(\"Bridge method\", method)\nend\n",[22,1834,1835,1859,1863,1886,1906,1926,1930,1959,1975],{"__ignoreMap":226},[230,1836,1837,1839,1842,1844,1846,1848,1850,1852,1854,1857],{"class":232,"line":233},[230,1838,237],{"class":236},[230,1840,1841],{"class":240}," capabilities ",[230,1843,244],{"class":236},[230,1845,575],{"class":240},[230,1847,265],{"class":236},[230,1849,24],{"class":261},[230,1851,265],{"class":236},[230,1853,584],{"class":240},[230,1855,1856],{"class":587},"GetCustomAppCapabilities",[230,1858,1100],{"class":240},[230,1860,1861],{"class":232,"line":250},[230,1862,562],{"emptyLinePlaceholder":561},[230,1864,1865,1868,1870,1872,1875,1877,1880,1884],{"class":232,"line":271},[230,1866,1867],{"class":587},"print",[230,1869,983],{"class":240},[230,1871,265],{"class":236},[230,1873,1874],{"class":261},"ABI",[230,1876,265],{"class":236},[230,1878,1879],{"class":240},", capabilities.",[230,1881,1883],{"class":1882},"sBMFI","abiVersion",[230,1885,992],{"class":240},[230,1887,1888,1890,1892,1894,1897,1899,1901,1904],{"class":232,"line":281},[230,1889,1867],{"class":587},[230,1891,983],{"class":240},[230,1893,265],{"class":236},[230,1895,1896],{"class":261},"Protocol",[230,1898,265],{"class":236},[230,1900,1879],{"class":240},[230,1902,1903],{"class":1882},"protocolVersion",[230,1905,992],{"class":240},[230,1907,1908,1910,1912,1914,1917,1919,1921,1924],{"class":232,"line":298},[230,1909,1867],{"class":587},[230,1911,983],{"class":240},[230,1913,265],{"class":236},[230,1915,1916],{"class":261},"Enabled",[230,1918,265],{"class":236},[230,1920,1879],{"class":240},[230,1922,1923],{"class":1882},"enabled",[230,1925,992],{"class":240},[230,1927,1928],{"class":232,"line":315},[230,1929,562],{"emptyLinePlaceholder":561},[230,1931,1932,1935,1938,1941,1944,1947,1950,1953,1956],{"class":232,"line":321},[230,1933,1934],{"class":602},"for",[230,1936,1937],{"class":240}," _, method ",[230,1939,1940],{"class":602},"in",[230,1942,1943],{"class":587}," ipairs",[230,1945,1946],{"class":240},"(capabilities.",[230,1948,1949],{"class":1882},"bridgeMethods",[230,1951,1952],{"class":236}," or",[230,1954,1955],{"class":240}," {}) ",[230,1957,1958],{"class":602},"do\n",[230,1960,1961,1963,1965,1967,1970,1972],{"class":232,"line":331},[230,1962,618],{"class":587},[230,1964,983],{"class":240},[230,1966,265],{"class":236},[230,1968,1969],{"class":261},"Bridge method",[230,1971,265],{"class":236},[230,1973,1974],{"class":240},", method)\n",[230,1976,1977],{"class":232,"line":347},[230,1978,643],{"class":602},[10,1980,1981],{},"Use capability detection instead of assuming that a future Free Phone version supports a specific\nbridge extension.",[27,1983,1985],{"id":1984},"server-exports","Server Exports",[10,1987,1988,1989,37],{},"Server exports handle custom-app policies, billing, and CrewLink integrations. Do not proxy these\nexports through an unvalidated ",[22,1990,1991],{},"RegisterNetEvent",[39,1993,1995],{"id":1994},"custom-app-policies","Custom-app policies",[10,1997,1998],{},"Client definitions and server policies are separate. A client definition cannot grant itself\nserver-side permissions.",[39,2000,2002],{"id":2001},"addcustomapppolicydefinition",[22,2003,2004],{},"AddCustomAppPolicy(definition)",[46,2006,2007,2012,2041],{},[49,2008,2009,2011],{},[52,2010,54],{},": Registers a server policy owned by the calling resource.",[49,2013,2014,61,2016],{},[52,2015,60],{},[46,2017,2018],{},[49,2019,2020,69,2022,2024,2025],{},[22,2021,68],{},[22,2023,72],{},"): Policy definition.\n",[46,2026,2027,2034],{},[49,2028,2029,69,2031,2033],{},[22,2030,80],{},[22,2032,83],{},"): Matching custom-app ID. Required.",[49,2035,2036,69,2038,2040],{},[22,2037,163],{},[22,2039,72],{},"): Server-approved permissions.",[49,2042,2043,206,2045,37],{},[52,2044,205],{},[22,2046,209],{},[220,2048,2051],{"className":222,"code":2049,"filename":2050,"language":225,"meta":226,"style":226},"local registered, error_code = exports[\"sky_phone\"]:AddCustomAppPolicy({\n    id = \"dispatch-board\",\n    permissions = {\n        \"device.storage\",\n        \"notifications\",\n    },\n})\n\nif not registered then\n    error((\"[my_dispatch] Policy registration failed: %s\"):format(error_code))\nend\n","server.lua",[22,2052,2053,2076,2090,2098,2108,2118,2122,2126,2130,2140,2160],{"__ignoreMap":226},[230,2054,2055,2057,2059,2061,2063,2065,2067,2069,2071,2074],{"class":232,"line":233},[230,2056,237],{"class":236},[230,2058,570],{"class":240},[230,2060,244],{"class":236},[230,2062,575],{"class":240},[230,2064,265],{"class":236},[230,2066,24],{"class":261},[230,2068,265],{"class":236},[230,2070,584],{"class":240},[230,2072,2073],{"class":587},"AddCustomAppPolicy",[230,2075,713],{"class":240},[230,2077,2078,2080,2082,2084,2086,2088],{"class":232,"line":250},[230,2079,253],{"class":240},[230,2081,244],{"class":236},[230,2083,258],{"class":236},[230,2085,262],{"class":261},[230,2087,265],{"class":236},[230,2089,268],{"class":240},[230,2091,2092,2094,2096],{"class":232,"line":271},[230,2093,479],{"class":240},[230,2095,244],{"class":236},[230,2097,247],{"class":240},[230,2099,2100,2102,2104,2106],{"class":232,"line":281},[230,2101,489],{"class":236},[230,2103,504],{"class":261},[230,2105,265],{"class":236},[230,2107,268],{"class":240},[230,2109,2110,2112,2114,2116],{"class":232,"line":298},[230,2111,489],{"class":236},[230,2113,516],{"class":261},[230,2115,265],{"class":236},[230,2117,268],{"class":240},[230,2119,2120],{"class":232,"line":315},[230,2121,318],{"class":240},[230,2123,2124],{"class":232,"line":321},[230,2125,879],{"class":240},[230,2127,2128],{"class":232,"line":331},[230,2129,562],{"emptyLinePlaceholder":561},[230,2131,2132,2134,2136,2138],{"class":232,"line":347},[230,2133,603],{"class":602},[230,2135,606],{"class":236},[230,2137,609],{"class":240},[230,2139,612],{"class":602},[230,2141,2142,2145,2147,2149,2152,2154,2156,2158],{"class":232,"line":363},[230,2143,2144],{"class":587},"    error",[230,2146,621],{"class":240},[230,2148,265],{"class":236},[230,2150,2151],{"class":261},"[my_dispatch] Policy registration failed: %s",[230,2153,265],{"class":236},[230,2155,631],{"class":240},[230,2157,634],{"class":587},[230,2159,637],{"class":240},[230,2161,2162],{"class":232,"line":368},[230,2163,643],{"class":602},[39,2165,2167],{"id":2166},"updatecustomapppolicydefinition",[22,2168,2169],{},"UpdateCustomAppPolicy(definition)",[46,2171,2172,2177,2193],{},[49,2173,2174,2176],{},[52,2175,54],{},": Replaces the complete policy owned by the calling resource.",[49,2178,2179,61,2181],{},[52,2180,60],{},[46,2182,2183],{},[49,2184,2185,69,2187,2189,2190,2192],{},[22,2186,68],{},[22,2188,72],{},"): Full policy including ",[22,2191,80],{}," and every allowed permission.",[49,2194,2195,206,2197,37],{},[52,2196,205],{},[22,2198,209],{},[220,2200,2202],{"className":222,"code":2201,"filename":2050,"language":225,"meta":226,"style":226},"local updated, error_code = exports[\"sky_phone\"]:UpdateCustomAppPolicy({\n    id = \"dispatch-board\",\n    permissions = {\n        \"device.storage\",\n        \"notifications\",\n        \"notifications.critical\",\n    },\n})\n\nif not updated then\n    print((\"[my_dispatch] Policy update failed: %s\"):format(error_code))\nend\n",[22,2203,2204,2227,2241,2249,2259,2269,2279,2283,2287,2291,2301,2320],{"__ignoreMap":226},[230,2205,2206,2208,2210,2212,2214,2216,2218,2220,2222,2225],{"class":232,"line":233},[230,2207,237],{"class":236},[230,2209,695],{"class":240},[230,2211,244],{"class":236},[230,2213,575],{"class":240},[230,2215,265],{"class":236},[230,2217,24],{"class":261},[230,2219,265],{"class":236},[230,2221,584],{"class":240},[230,2223,2224],{"class":587},"UpdateCustomAppPolicy",[230,2226,713],{"class":240},[230,2228,2229,2231,2233,2235,2237,2239],{"class":232,"line":250},[230,2230,253],{"class":240},[230,2232,244],{"class":236},[230,2234,258],{"class":236},[230,2236,262],{"class":261},[230,2238,265],{"class":236},[230,2240,268],{"class":240},[230,2242,2243,2245,2247],{"class":232,"line":271},[230,2244,479],{"class":240},[230,2246,244],{"class":236},[230,2248,247],{"class":240},[230,2250,2251,2253,2255,2257],{"class":232,"line":281},[230,2252,489],{"class":236},[230,2254,504],{"class":261},[230,2256,265],{"class":236},[230,2258,268],{"class":240},[230,2260,2261,2263,2265,2267],{"class":232,"line":298},[230,2262,489],{"class":236},[230,2264,516],{"class":261},[230,2266,265],{"class":236},[230,2268,268],{"class":240},[230,2270,2271,2273,2275,2277],{"class":232,"line":315},[230,2272,489],{"class":236},[230,2274,1630],{"class":261},[230,2276,265],{"class":236},[230,2278,268],{"class":240},[230,2280,2281],{"class":232,"line":321},[230,2282,318],{"class":240},[230,2284,2285],{"class":232,"line":331},[230,2286,879],{"class":240},[230,2288,2289],{"class":232,"line":347},[230,2290,562],{"emptyLinePlaceholder":561},[230,2292,2293,2295,2297,2299],{"class":232,"line":363},[230,2294,603],{"class":602},[230,2296,606],{"class":236},[230,2298,892],{"class":240},[230,2300,612],{"class":602},[230,2302,2303,2305,2307,2309,2312,2314,2316,2318],{"class":232,"line":368},[230,2304,618],{"class":587},[230,2306,621],{"class":240},[230,2308,265],{"class":236},[230,2310,2311],{"class":261},"[my_dispatch] Policy update failed: %s",[230,2313,265],{"class":236},[230,2315,631],{"class":240},[230,2317,634],{"class":587},[230,2319,637],{"class":240},[230,2321,2322],{"class":232,"line":385},[230,2323,643],{"class":602},[39,2325,2327],{"id":2326},"removecustomapppolicyappid",[22,2328,2329],{},"RemoveCustomAppPolicy(appId)",[46,2331,2332,2337,2349],{},[49,2333,2334,2336],{},[52,2335,54],{},": Removes a policy owned by the calling resource.",[49,2338,2339,61,2341],{},[52,2340,60],{},[46,2342,2343],{},[49,2344,2345,69,2347,1059],{},[22,2346,944],{},[22,2348,83],{},[49,2350,2351,206,2353,37],{},[52,2352,205],{},[22,2354,209],{},[220,2356,2358],{"className":222,"code":2357,"filename":2050,"language":225,"meta":226,"style":226},"local removed, error_code = exports[\"sky_phone\"]:RemoveCustomAppPolicy(\"dispatch-board\")\n\nif not removed then\n    print((\"[my_dispatch] Policy removal failed: %s\"):format(error_code))\nend\n",[22,2359,2360,2391,2395,2405,2424],{"__ignoreMap":226},[230,2361,2362,2364,2366,2368,2370,2372,2374,2376,2378,2381,2383,2385,2387,2389],{"class":232,"line":233},[230,2363,237],{"class":236},[230,2365,965],{"class":240},[230,2367,244],{"class":236},[230,2369,575],{"class":240},[230,2371,265],{"class":236},[230,2373,24],{"class":261},[230,2375,265],{"class":236},[230,2377,584],{"class":240},[230,2379,2380],{"class":587},"RemoveCustomAppPolicy",[230,2382,983],{"class":240},[230,2384,265],{"class":236},[230,2386,262],{"class":261},[230,2388,265],{"class":236},[230,2390,992],{"class":240},[230,2392,2393],{"class":232,"line":250},[230,2394,562],{"emptyLinePlaceholder":561},[230,2396,2397,2399,2401,2403],{"class":232,"line":271},[230,2398,603],{"class":602},[230,2400,606],{"class":236},[230,2402,1005],{"class":240},[230,2404,612],{"class":602},[230,2406,2407,2409,2411,2413,2416,2418,2420,2422],{"class":232,"line":281},[230,2408,618],{"class":587},[230,2410,621],{"class":240},[230,2412,265],{"class":236},[230,2414,2415],{"class":261},"[my_dispatch] Policy removal failed: %s",[230,2417,265],{"class":236},[230,2419,631],{"class":240},[230,2421,634],{"class":587},[230,2423,637],{"class":240},[230,2425,2426],{"class":232,"line":298},[230,2427,643],{"class":602},[39,2429,2431],{"id":2430},"getcustomapppolicyappid",[22,2432,2433],{},"GetCustomAppPolicy(appId)",[46,2435,2436,2441,2454],{},[49,2437,2438,2440],{},[52,2439,54],{},": Reads the normalized server policy for an app.",[49,2442,2443,61,2445],{},[52,2444,60],{},[46,2446,2447],{},[49,2448,2449,69,2451,2453],{},[22,2450,944],{},[22,2452,83],{},"): App ID.",[49,2455,2456,206,2458,37],{},[52,2457,205],{},[22,2459,2460],{},"table | nil",[220,2462,2464],{"className":222,"code":2463,"filename":2050,"language":225,"meta":226,"style":226},"local policy = exports[\"sky_phone\"]:GetCustomAppPolicy(\"dispatch-board\")\n\nif policy then\n    print(\"Owner\", policy.ownerResource)\n    for _, permission in ipairs(policy.permissions or {}) do\n        print(\"Permission\", permission)\n    end\nend\n",[22,2465,2466,2498,2502,2510,2531,2554,2570,2574],{"__ignoreMap":226},[230,2467,2468,2470,2473,2475,2477,2479,2481,2483,2485,2488,2490,2492,2494,2496],{"class":232,"line":233},[230,2469,237],{"class":236},[230,2471,2472],{"class":240}," policy ",[230,2474,244],{"class":236},[230,2476,575],{"class":240},[230,2478,265],{"class":236},[230,2480,24],{"class":261},[230,2482,265],{"class":236},[230,2484,584],{"class":240},[230,2486,2487],{"class":587},"GetCustomAppPolicy",[230,2489,983],{"class":240},[230,2491,265],{"class":236},[230,2493,262],{"class":261},[230,2495,265],{"class":236},[230,2497,992],{"class":240},[230,2499,2500],{"class":232,"line":250},[230,2501,562],{"emptyLinePlaceholder":561},[230,2503,2504,2506,2508],{"class":232,"line":271},[230,2505,603],{"class":602},[230,2507,2472],{"class":240},[230,2509,612],{"class":602},[230,2511,2512,2514,2516,2518,2521,2523,2526,2529],{"class":232,"line":281},[230,2513,618],{"class":587},[230,2515,983],{"class":240},[230,2517,265],{"class":236},[230,2519,2520],{"class":261},"Owner",[230,2522,265],{"class":236},[230,2524,2525],{"class":240},", policy.",[230,2527,2528],{"class":1882},"ownerResource",[230,2530,992],{"class":240},[230,2532,2533,2536,2539,2541,2543,2546,2548,2550,2552],{"class":232,"line":298},[230,2534,2535],{"class":602},"    for",[230,2537,2538],{"class":240}," _, permission ",[230,2540,1940],{"class":602},[230,2542,1943],{"class":587},[230,2544,2545],{"class":240},"(policy.",[230,2547,163],{"class":1882},[230,2549,1952],{"class":236},[230,2551,1955],{"class":240},[230,2553,1958],{"class":602},[230,2555,2556,2558,2560,2562,2565,2567],{"class":232,"line":315},[230,2557,1201],{"class":587},[230,2559,983],{"class":240},[230,2561,265],{"class":236},[230,2563,2564],{"class":261},"Permission",[230,2566,265],{"class":236},[230,2568,2569],{"class":240},", permission)\n",[230,2571,2572],{"class":232,"line":321},[230,2573,1221],{"class":602},[230,2575,2576],{"class":232,"line":331},[230,2577,643],{"class":602},[10,2579,2580],{},"Treat the returned table as a snapshot. Mutating it does not update the registered policy.",[39,2582,2584],{"id":2583},"hascustomapppermissionappid-permission",[22,2585,2586],{},"HasCustomAppPermission(appId, permission)",[46,2588,2589,2594,2614],{},[49,2590,2591,2593],{},[52,2592,54],{},": Checks whether a registered policy contains one permission.",[49,2595,2596,61,2598],{},[52,2597,60],{},[46,2599,2600,2606],{},[49,2601,2602,69,2604,2453],{},[22,2603,944],{},[22,2605,83],{},[49,2607,2608,69,2611,2613],{},[22,2609,2610],{},"permission",[22,2612,83],{},"): Supported permission name.",[49,2615,2616,206,2618,37],{},[52,2617,205],{},[22,2619,2620],{},"boolean",[220,2622,2624],{"className":222,"code":2623,"filename":2050,"language":225,"meta":226,"style":226},"local can_store = exports[\"sky_phone\"]:HasCustomAppPermission(\n    \"dispatch-board\",\n    \"device.storage\"\n)\n\nif not can_store then\n    print(\"Dispatch Board has no storage permission\")\nend\n",[22,2625,2626,2650,2660,2669,2673,2677,2687,2702],{"__ignoreMap":226},[230,2627,2628,2630,2633,2635,2637,2639,2641,2643,2645,2648],{"class":232,"line":233},[230,2629,237],{"class":236},[230,2631,2632],{"class":240}," can_store ",[230,2634,244],{"class":236},[230,2636,575],{"class":240},[230,2638,265],{"class":236},[230,2640,24],{"class":261},[230,2642,265],{"class":236},[230,2644,584],{"class":240},[230,2646,2647],{"class":587},"HasCustomAppPermission",[230,2649,1126],{"class":240},[230,2651,2652,2654,2656,2658],{"class":232,"line":250},[230,2653,1410],{"class":236},[230,2655,262],{"class":261},[230,2657,265],{"class":236},[230,2659,268],{"class":240},[230,2661,2662,2664,2666],{"class":232,"line":271},[230,2663,1410],{"class":236},[230,2665,504],{"class":261},[230,2667,2668],{"class":236},"\"\n",[230,2670,2671],{"class":232,"line":281},[230,2672,992],{"class":240},[230,2674,2675],{"class":232,"line":298},[230,2676,562],{"emptyLinePlaceholder":561},[230,2678,2679,2681,2683,2685],{"class":232,"line":315},[230,2680,603],{"class":602},[230,2682,606],{"class":236},[230,2684,2632],{"class":240},[230,2686,612],{"class":602},[230,2688,2689,2691,2693,2695,2698,2700],{"class":232,"line":321},[230,2690,618],{"class":587},[230,2692,983],{"class":240},[230,2694,265],{"class":236},[230,2696,2697],{"class":261},"Dispatch Board has no storage permission",[230,2699,265],{"class":236},[230,2701,992],{"class":240},[230,2703,2704],{"class":232,"line":331},[230,2705,643],{"class":602},[39,2707,2709],{"id":2708},"getcustomappcapabilities-1",[22,2710,1816],{},[46,2712,2713,2718],{},[49,2714,2715,2717],{},[52,2716,54],{},": Reads the server-side custom-app ABI and policy capabilities.",[49,2719,2720,206,2722,37],{},[52,2721,205],{},[22,2723,72],{},[220,2725,2727],{"className":222,"code":2726,"filename":2050,"language":225,"meta":226,"style":226},"local capabilities = exports[\"sky_phone\"]:GetCustomAppCapabilities()\n\nprint(\"External apps enabled\", capabilities.enabled)\nprint(\"ABI\", capabilities.abiVersion)\n",[22,2728,2729,2751,2755,2774],{"__ignoreMap":226},[230,2730,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749],{"class":232,"line":233},[230,2732,237],{"class":236},[230,2734,1841],{"class":240},[230,2736,244],{"class":236},[230,2738,575],{"class":240},[230,2740,265],{"class":236},[230,2742,24],{"class":261},[230,2744,265],{"class":236},[230,2746,584],{"class":240},[230,2748,1856],{"class":587},[230,2750,1100],{"class":240},[230,2752,2753],{"class":232,"line":250},[230,2754,562],{"emptyLinePlaceholder":561},[230,2756,2757,2759,2761,2763,2766,2768,2770,2772],{"class":232,"line":271},[230,2758,1867],{"class":587},[230,2760,983],{"class":240},[230,2762,265],{"class":236},[230,2764,2765],{"class":261},"External apps enabled",[230,2767,265],{"class":236},[230,2769,1879],{"class":240},[230,2771,1923],{"class":1882},[230,2773,992],{"class":240},[230,2775,2776,2778,2780,2782,2784,2786,2788,2790],{"class":232,"line":281},[230,2777,1867],{"class":587},[230,2779,983],{"class":240},[230,2781,265],{"class":236},[230,2783,1874],{"class":261},[230,2785,265],{"class":236},[230,2787,1879],{"class":240},[230,2789,1883],{"class":1882},[230,2791,992],{"class":240},[27,2793,2795],{"id":2794},"billing-exports","Billing Exports",[10,2797,2798],{},"Billing exports are server-only and validate invoice state and monetary mutations inside Free\nPhone.",[39,2800,2802],{"id":2801},"createinvoicedata",[22,2803,2804],{},"CreateInvoice(data)",[46,2806,2807,2812,2907],{},[49,2808,2809,2811],{},[52,2810,54],{},": Creates a validated invoice for an online player or known character identifier.",[49,2813,2814,61,2816],{},[52,2815,60],{},[46,2817,2818],{},[49,2819,2820,69,2822,2824,2825],{},[22,2821,1064],{},[22,2823,72],{},"): Invoice definition.\n",[46,2826,2827,2836,2844,2852,2860,2868,2876,2883,2890,2899],{},[49,2828,2829,69,2832,2835],{},[22,2830,2831],{},"recipientSource",[22,2833,2834],{},"number?","): Online recipient server ID.",[49,2837,2838,69,2841,2843],{},[22,2839,2840],{},"recipientIdentifier",[22,2842,122],{},"): Known character identifier when no source is supplied.",[49,2845,2846,69,2849,2851],{},[22,2847,2848],{},"issuerSource",[22,2850,2834],{},"): Online issuer server ID.",[49,2853,2854,69,2857,2859],{},[22,2855,2856],{},"issuerIdentifier",[22,2858,122],{},"): Known issuer identifier.",[49,2861,2862,69,2865,2867],{},[22,2863,2864],{},"issuerAccount",[22,2866,83],{},"): Account receiving paid funds.",[49,2869,2870,69,2873,2875],{},[22,2871,2872],{},"issuerLabel",[22,2874,83],{},"): Display name shown to the recipient.",[49,2877,2878,69,2880,2882],{},[22,2879,1584],{},[22,2881,83],{},"): Invoice title.",[49,2884,2885,69,2887,2889],{},[22,2886,110],{},[22,2888,122],{},"): Invoice details.",[49,2891,2892,69,2895,2898],{},[22,2893,2894],{},"amount",[22,2896,2897],{},"number","): Server-validated invoice amount.",[49,2900,2901,69,2904,2906],{},[22,2902,2903],{},"dueDays",[22,2905,2834],{},"): Optional payment period.",[49,2908,2909,206,2911,2914,2915,2918],{},[52,2910,205],{},[22,2912,2913],{},"string | nil, string?"," — invoice ID or ",[22,2916,2917],{},"nil"," and an error code.",[220,2920,2922],{"className":222,"code":2921,"filename":2050,"language":225,"meta":226,"style":226},"local invoice_id, error_code = exports[\"sky_phone\"]:CreateInvoice({\n    recipientSource = target_source,\n    issuerSource = source,\n    issuerAccount = \"ambulance\",\n    issuerLabel = \"Los Santos Medical\",\n    title = \"Medical treatment\",\n    description = \"Emergency treatment and medication.\",\n    amount = 1300,\n    dueDays = 7,\n})\n\nif not invoice_id then\n    print((\"[medical] Invoice failed: %s\"):format(error_code))\n    return\nend\n\nprint((\"[medical] Created invoice %s\"):format(invoice_id))\n",[22,2923,2924,2948,2958,2968,2984,3000,3016,3031,3043,3055,3059,3063,3074,3093,3098,3102,3106],{"__ignoreMap":226},[230,2925,2926,2928,2931,2933,2935,2937,2939,2941,2943,2946],{"class":232,"line":233},[230,2927,237],{"class":236},[230,2929,2930],{"class":240}," invoice_id, error_code ",[230,2932,244],{"class":236},[230,2934,575],{"class":240},[230,2936,265],{"class":236},[230,2938,24],{"class":261},[230,2940,265],{"class":236},[230,2942,584],{"class":240},[230,2944,2945],{"class":587},"CreateInvoice",[230,2947,713],{"class":240},[230,2949,2950,2953,2955],{"class":232,"line":250},[230,2951,2952],{"class":240},"    recipientSource ",[230,2954,244],{"class":236},[230,2956,2957],{"class":240}," target_source,\n",[230,2959,2960,2963,2965],{"class":232,"line":271},[230,2961,2962],{"class":240},"    issuerSource ",[230,2964,244],{"class":236},[230,2966,2967],{"class":240}," source,\n",[230,2969,2970,2973,2975,2977,2980,2982],{"class":232,"line":281},[230,2971,2972],{"class":240},"    issuerAccount ",[230,2974,244],{"class":236},[230,2976,258],{"class":236},[230,2978,2979],{"class":261},"ambulance",[230,2981,265],{"class":236},[230,2983,268],{"class":240},[230,2985,2986,2989,2991,2993,2996,2998],{"class":232,"line":298},[230,2987,2988],{"class":240},"    issuerLabel ",[230,2990,244],{"class":236},[230,2992,258],{"class":236},[230,2994,2995],{"class":261},"Los Santos Medical",[230,2997,265],{"class":236},[230,2999,268],{"class":240},[230,3001,3002,3005,3007,3009,3012,3014],{"class":232,"line":315},[230,3003,3004],{"class":240},"    title ",[230,3006,244],{"class":236},[230,3008,258],{"class":236},[230,3010,3011],{"class":261},"Medical treatment",[230,3013,265],{"class":236},[230,3015,268],{"class":240},[230,3017,3018,3020,3022,3024,3027,3029],{"class":232,"line":321},[230,3019,324],{"class":240},[230,3021,244],{"class":236},[230,3023,258],{"class":236},[230,3025,3026],{"class":261},"Emergency treatment and medication.",[230,3028,265],{"class":236},[230,3030,268],{"class":240},[230,3032,3033,3036,3038,3041],{"class":232,"line":331},[230,3034,3035],{"class":240},"    amount ",[230,3037,244],{"class":236},[230,3039,3040],{"class":1151}," 1300",[230,3042,268],{"class":240},[230,3044,3045,3048,3050,3053],{"class":232,"line":347},[230,3046,3047],{"class":240},"    dueDays ",[230,3049,244],{"class":236},[230,3051,3052],{"class":1151}," 7",[230,3054,268],{"class":240},[230,3056,3057],{"class":232,"line":363},[230,3058,879],{"class":240},[230,3060,3061],{"class":232,"line":368},[230,3062,562],{"emptyLinePlaceholder":561},[230,3064,3065,3067,3069,3072],{"class":232,"line":385},[230,3066,603],{"class":602},[230,3068,606],{"class":236},[230,3070,3071],{"class":240}," invoice_id ",[230,3073,612],{"class":602},[230,3075,3076,3078,3080,3082,3085,3087,3089,3091],{"class":232,"line":401},[230,3077,618],{"class":587},[230,3079,621],{"class":240},[230,3081,265],{"class":236},[230,3083,3084],{"class":261},"[medical] Invoice failed: %s",[230,3086,265],{"class":236},[230,3088,631],{"class":240},[230,3090,634],{"class":587},[230,3092,637],{"class":240},[230,3094,3095],{"class":232,"line":418},[230,3096,3097],{"class":602},"    return\n",[230,3099,3100],{"class":232,"line":435},[230,3101,643],{"class":602},[230,3103,3104],{"class":232,"line":451},[230,3105,562],{"emptyLinePlaceholder":561},[230,3107,3108,3110,3112,3114,3117,3119,3121,3123],{"class":232,"line":464},[230,3109,1867],{"class":587},[230,3111,621],{"class":240},[230,3113,265],{"class":236},[230,3115,3116],{"class":261},"[medical] Created invoice %s",[230,3118,265],{"class":236},[230,3120,631],{"class":240},[230,3122,634],{"class":587},[230,3124,3125],{"class":240},"(invoice_id))\n",[10,3127,3128],{},"Never accept an invoice amount from an untrusted client without validating the service and price on\nthe server.",[39,3130,3132],{"id":3131},"cancelinvoiceinvoiceid-actoridentifier",[22,3133,3134],{},"CancelInvoice(invoiceId, actorIdentifier)",[46,3136,3137,3142,3166],{},[49,3138,3139,3141],{},[52,3140,54],{},": Cancels an open invoice.",[49,3143,3144,61,3146],{},[52,3145,60],{},[46,3147,3148,3158],{},[49,3149,3150,69,3153,3155,3156,37],{},[22,3151,3152],{},"invoiceId",[22,3154,83],{},"): Invoice ID returned by ",[22,3157,2945],{},[49,3159,3160,69,3163,3165],{},[22,3161,3162],{},"actorIdentifier",[22,3164,83],{},"): Character or integration actor responsible for cancellation.",[49,3167,3168,206,3170,37],{},[52,3169,205],{},[22,3171,2620],{},[220,3173,3175],{"className":222,"code":3174,"filename":2050,"language":225,"meta":226,"style":226},"local cancelled = exports[\"sky_phone\"]:CancelInvoice(\n    invoice_id,\n    issuer_identifier\n)\n\nif not cancelled then\n    print(\"Invoice could not be cancelled\")\nend\n",[22,3176,3177,3201,3206,3211,3215,3219,3229,3244],{"__ignoreMap":226},[230,3178,3179,3181,3184,3186,3188,3190,3192,3194,3196,3199],{"class":232,"line":233},[230,3180,237],{"class":236},[230,3182,3183],{"class":240}," cancelled ",[230,3185,244],{"class":236},[230,3187,575],{"class":240},[230,3189,265],{"class":236},[230,3191,24],{"class":261},[230,3193,265],{"class":236},[230,3195,584],{"class":240},[230,3197,3198],{"class":587},"CancelInvoice",[230,3200,1126],{"class":240},[230,3202,3203],{"class":232,"line":250},[230,3204,3205],{"class":240},"    invoice_id,\n",[230,3207,3208],{"class":232,"line":271},[230,3209,3210],{"class":240},"    issuer_identifier\n",[230,3212,3213],{"class":232,"line":281},[230,3214,992],{"class":240},[230,3216,3217],{"class":232,"line":298},[230,3218,562],{"emptyLinePlaceholder":561},[230,3220,3221,3223,3225,3227],{"class":232,"line":315},[230,3222,603],{"class":602},[230,3224,606],{"class":236},[230,3226,3183],{"class":240},[230,3228,612],{"class":602},[230,3230,3231,3233,3235,3237,3240,3242],{"class":232,"line":321},[230,3232,618],{"class":587},[230,3234,983],{"class":240},[230,3236,265],{"class":236},[230,3238,3239],{"class":261},"Invoice could not be cancelled",[230,3241,265],{"class":236},[230,3243,992],{"class":240},[230,3245,3246],{"class":232,"line":331},[230,3247,643],{"class":602},[39,3249,3251],{"id":3250},"getbillingaccountbalanceaccountkey",[22,3252,3253],{},"GetBillingAccountBalance(accountKey)",[46,3255,3256,3261,3277],{},[49,3257,3258,3260],{},[52,3259,54],{},": Reads the current internal balance for a billing account.",[49,3262,3263,61,3265],{},[52,3264,60],{},[46,3266,3267],{},[49,3268,3269,69,3272,3274,3275,37],{},[22,3270,3271],{},"accountKey",[22,3273,83],{},"): Account key such as ",[22,3276,2979],{},[49,3278,3279,206,3281,37],{},[52,3280,205],{},[22,3282,3283],{},"number | nil",[220,3285,3287],{"className":222,"code":3286,"filename":2050,"language":225,"meta":226,"style":226},"local balance = exports[\"sky_phone\"]:GetBillingAccountBalance(\"ambulance\") or 0\nprint((\"Medical billing balance: $%s\"):format(balance))\n",[22,3288,3289,3328],{"__ignoreMap":226},[230,3290,3291,3293,3296,3298,3300,3302,3304,3306,3308,3311,3313,3315,3317,3319,3322,3325],{"class":232,"line":233},[230,3292,237],{"class":236},[230,3294,3295],{"class":240}," balance ",[230,3297,244],{"class":236},[230,3299,575],{"class":240},[230,3301,265],{"class":236},[230,3303,24],{"class":261},[230,3305,265],{"class":236},[230,3307,584],{"class":240},[230,3309,3310],{"class":587},"GetBillingAccountBalance",[230,3312,983],{"class":240},[230,3314,265],{"class":236},[230,3316,2979],{"class":261},[230,3318,265],{"class":236},[230,3320,3321],{"class":240},") ",[230,3323,3324],{"class":236},"or",[230,3326,3327],{"class":1151}," 0\n",[230,3329,3330,3332,3334,3336,3339,3341,3343,3345],{"class":232,"line":250},[230,3331,1867],{"class":587},[230,3333,621],{"class":240},[230,3335,265],{"class":236},[230,3337,3338],{"class":261},"Medical billing balance: $%s",[230,3340,265],{"class":236},[230,3342,631],{"class":240},[230,3344,634],{"class":587},[230,3346,3347],{"class":240},"(balance))\n",[39,3349,3351],{"id":3350},"removebillingaccountbalanceaccountkey-amount",[22,3352,3353],{},"RemoveBillingAccountBalance(accountKey, amount)",[46,3355,3356,3361,3381],{},[49,3357,3358,3360],{},[52,3359,54],{},": Atomically withdraws an amount when sufficient balance is available.",[49,3362,3363,61,3365],{},[52,3364,60],{},[46,3366,3367,3374],{},[49,3368,3369,69,3371,3373],{},[22,3370,3271],{},[22,3372,83],{},"): Billing account key.",[49,3375,3376,69,3378,3380],{},[22,3377,2894],{},[22,3379,2897],{},"): Positive server-calculated withdrawal amount.",[49,3382,3383,206,3385,37],{},[52,3384,205],{},[22,3386,2620],{},[220,3388,3390],{"className":222,"code":3389,"filename":2050,"language":225,"meta":226,"style":226},"local removed = exports[\"sky_phone\"]:RemoveBillingAccountBalance(\n    \"ambulance\",\n    5000\n)\n\nif not removed then\n    print(\"Insufficient billing balance or invalid request\")\nend\n",[22,3391,3392,3415,3425,3430,3434,3438,3448,3463],{"__ignoreMap":226},[230,3393,3394,3396,3398,3400,3402,3404,3406,3408,3410,3413],{"class":232,"line":233},[230,3395,237],{"class":236},[230,3397,1005],{"class":240},[230,3399,244],{"class":236},[230,3401,575],{"class":240},[230,3403,265],{"class":236},[230,3405,24],{"class":261},[230,3407,265],{"class":236},[230,3409,584],{"class":240},[230,3411,3412],{"class":587},"RemoveBillingAccountBalance",[230,3414,1126],{"class":240},[230,3416,3417,3419,3421,3423],{"class":232,"line":250},[230,3418,1410],{"class":236},[230,3420,2979],{"class":261},[230,3422,265],{"class":236},[230,3424,268],{"class":240},[230,3426,3427],{"class":232,"line":271},[230,3428,3429],{"class":1151},"    5000\n",[230,3431,3432],{"class":232,"line":281},[230,3433,992],{"class":240},[230,3435,3436],{"class":232,"line":298},[230,3437,562],{"emptyLinePlaceholder":561},[230,3439,3440,3442,3444,3446],{"class":232,"line":315},[230,3441,603],{"class":602},[230,3443,606],{"class":236},[230,3445,1005],{"class":240},[230,3447,612],{"class":602},[230,3449,3450,3452,3454,3456,3459,3461],{"class":232,"line":321},[230,3451,618],{"class":587},[230,3453,983],{"class":240},[230,3455,265],{"class":236},[230,3457,3458],{"class":261},"Insufficient billing balance or invalid request",[230,3460,265],{"class":236},[230,3462,992],{"class":240},[230,3464,3465],{"class":232,"line":331},[230,3466,643],{"class":602},[27,3468,3470],{"id":3469},"crewlink-exports","CrewLink Exports",[10,3472,3473,3474,37],{},"CrewLink read exports require a valid phone session. External ping mutations additionally require\nthe calling resource in ",[22,3475,3476],{},"Config.CrewLink.ExternalPingResources",[39,3478,3480],{"id":3479},"getcrewlinkactivegroupsource",[22,3481,3482],{},"GetCrewLinkActiveGroup(source)",[46,3484,3485,3490,3504],{},[49,3486,3487,3489],{},[52,3488,54],{},": Returns the active CrewLink group of a player with an open, unlocked phone session.",[49,3491,3492,61,3494],{},[52,3493,60],{},[46,3495,3496],{},[49,3497,3498,69,3501,3503],{},[22,3499,3500],{},"source",[22,3502,2897],{},"): Player server ID.",[49,3505,3506,206,3508,37],{},[52,3507,205],{},[22,3509,2460],{},[220,3511,3513],{"className":222,"code":3512,"filename":2050,"language":225,"meta":226,"style":226},"local group = exports[\"sky_phone\"]:GetCrewLinkActiveGroup(source)\n\nif group then\n    print((\"Active CrewLink group: %s\"):format(group.id))\nend\n",[22,3514,3515,3540,3544,3552,3577],{"__ignoreMap":226},[230,3516,3517,3519,3522,3524,3526,3528,3530,3532,3534,3537],{"class":232,"line":233},[230,3518,237],{"class":236},[230,3520,3521],{"class":240}," group ",[230,3523,244],{"class":236},[230,3525,575],{"class":240},[230,3527,265],{"class":236},[230,3529,24],{"class":261},[230,3531,265],{"class":236},[230,3533,584],{"class":240},[230,3535,3536],{"class":587},"GetCrewLinkActiveGroup",[230,3538,3539],{"class":240},"(source)\n",[230,3541,3542],{"class":232,"line":250},[230,3543,562],{"emptyLinePlaceholder":561},[230,3545,3546,3548,3550],{"class":232,"line":271},[230,3547,603],{"class":602},[230,3549,3521],{"class":240},[230,3551,612],{"class":602},[230,3553,3554,3556,3558,3560,3563,3565,3567,3569,3572,3574],{"class":232,"line":281},[230,3555,618],{"class":587},[230,3557,621],{"class":240},[230,3559,265],{"class":236},[230,3561,3562],{"class":261},"Active CrewLink group: %s",[230,3564,265],{"class":236},[230,3566,631],{"class":240},[230,3568,634],{"class":587},[230,3570,3571],{"class":240},"(group.",[230,3573,80],{"class":1882},[230,3575,3576],{"class":240},"))\n",[230,3578,3579],{"class":232,"line":298},[230,3580,643],{"class":602},[39,3582,3584],{"id":3583},"getcrewlinkgroupmembersgroupid",[22,3585,3586],{},"GetCrewLinkGroupMembers(groupId)",[46,3588,3589,3594,3608],{},[49,3590,3591,3593],{},[52,3592,54],{},": Returns public member data for a CrewLink group.",[49,3595,3596,61,3598],{},[52,3597,60],{},[46,3599,3600],{},[49,3601,3602,69,3605,3607],{},[22,3603,3604],{},"groupId",[22,3606,83],{},"): CrewLink group ID.",[49,3609,3610,206,3612,3614],{},[52,3611,205],{},[22,3613,72],{}," — array of member records.",[220,3616,3618],{"className":222,"code":3617,"filename":2050,"language":225,"meta":226,"style":226},"local members = exports[\"sky_phone\"]:GetCrewLinkGroupMembers(group_id)\n\nfor _, member in ipairs(members) do\n    print(member.id, member.username, member.role, member.joinedAt)\nend\n",[22,3619,3620,3645,3649,3665,3692],{"__ignoreMap":226},[230,3621,3622,3624,3627,3629,3631,3633,3635,3637,3639,3642],{"class":232,"line":233},[230,3623,237],{"class":236},[230,3625,3626],{"class":240}," members ",[230,3628,244],{"class":236},[230,3630,575],{"class":240},[230,3632,265],{"class":236},[230,3634,24],{"class":261},[230,3636,265],{"class":236},[230,3638,584],{"class":240},[230,3640,3641],{"class":587},"GetCrewLinkGroupMembers",[230,3643,3644],{"class":240},"(group_id)\n",[230,3646,3647],{"class":232,"line":250},[230,3648,562],{"emptyLinePlaceholder":561},[230,3650,3651,3653,3656,3658,3660,3663],{"class":232,"line":271},[230,3652,1934],{"class":602},[230,3654,3655],{"class":240}," _, member ",[230,3657,1940],{"class":602},[230,3659,1943],{"class":587},[230,3661,3662],{"class":240},"(members) ",[230,3664,1958],{"class":602},[230,3666,3667,3669,3672,3674,3677,3680,3682,3685,3687,3690],{"class":232,"line":281},[230,3668,618],{"class":587},[230,3670,3671],{"class":240},"(member.",[230,3673,80],{"class":1882},[230,3675,3676],{"class":240},", member.",[230,3678,3679],{"class":1882},"username",[230,3681,3676],{"class":240},[230,3683,3684],{"class":1882},"role",[230,3686,3676],{"class":240},[230,3688,3689],{"class":1882},"joinedAt",[230,3691,992],{"class":240},[230,3693,3694],{"class":232,"line":298},[230,3695,643],{"class":602},[39,3697,3699],{"id":3698},"iscrewlinkgroupmembersource-groupid",[22,3700,3701],{},"IsCrewLinkGroupMember(source, groupId)",[46,3703,3704,3709,3727],{},[49,3705,3706,3708],{},[52,3707,54],{},": Checks whether a player belongs to a CrewLink group.",[49,3710,3711,61,3713],{},[52,3712,60],{},[46,3714,3715,3721],{},[49,3716,3717,69,3719,3503],{},[22,3718,3500],{},[22,3720,2897],{},[49,3722,3723,69,3725,3607],{},[22,3724,3604],{},[22,3726,83],{},[49,3728,3729,206,3731,37],{},[52,3730,205],{},[22,3732,2620],{},[220,3734,3736],{"className":222,"code":3735,"filename":2050,"language":225,"meta":226,"style":226},"if exports[\"sky_phone\"]:IsCrewLinkGroupMember(source, group_id) then\n    print(\"Player is a member of the group\")\nend\n",[22,3737,3738,3760,3775],{"__ignoreMap":226},[230,3739,3740,3742,3744,3746,3748,3750,3752,3755,3758],{"class":232,"line":233},[230,3741,603],{"class":602},[230,3743,575],{"class":240},[230,3745,265],{"class":236},[230,3747,24],{"class":261},[230,3749,265],{"class":236},[230,3751,584],{"class":240},[230,3753,3754],{"class":587},"IsCrewLinkGroupMember",[230,3756,3757],{"class":240},"(source, group_id) ",[230,3759,612],{"class":602},[230,3761,3762,3764,3766,3768,3771,3773],{"class":232,"line":250},[230,3763,618],{"class":587},[230,3765,983],{"class":240},[230,3767,265],{"class":236},[230,3769,3770],{"class":261},"Player is a member of the group",[230,3772,265],{"class":236},[230,3774,992],{"class":240},[230,3776,3777],{"class":232,"line":271},[230,3778,643],{"class":602},[39,3780,3782],{"id":3781},"getcrewlinkgrouprolesource-groupid",[22,3783,3784],{},"GetCrewLinkGroupRole(source, groupId)",[46,3786,3787,3792,3810],{},[49,3788,3789,3791],{},[52,3790,54],{},": Returns a player's role in a CrewLink group.",[49,3793,3794,61,3796],{},[52,3795,60],{},[46,3797,3798,3804],{},[49,3799,3800,69,3802,3503],{},[22,3801,3500],{},[22,3803,2897],{},[49,3805,3806,69,3808,3607],{},[22,3807,3604],{},[22,3809,83],{},[49,3811,3812,206,3814,37],{},[52,3813,205],{},[22,3815,3816],{},"string | nil",[220,3818,3820],{"className":222,"code":3819,"filename":2050,"language":225,"meta":226,"style":226},"local role = exports[\"sky_phone\"]:GetCrewLinkGroupRole(source, group_id)\n\nif role == \"owner\" or role == \"moderator\" then\n    print(\"Player can manage this CrewLink group\")\nend\n",[22,3821,3822,3847,3851,3883,3898],{"__ignoreMap":226},[230,3823,3824,3826,3829,3831,3833,3835,3837,3839,3841,3844],{"class":232,"line":233},[230,3825,237],{"class":236},[230,3827,3828],{"class":240}," role ",[230,3830,244],{"class":236},[230,3832,575],{"class":240},[230,3834,265],{"class":236},[230,3836,24],{"class":261},[230,3838,265],{"class":236},[230,3840,584],{"class":240},[230,3842,3843],{"class":587},"GetCrewLinkGroupRole",[230,3845,3846],{"class":240},"(source, group_id)\n",[230,3848,3849],{"class":232,"line":250},[230,3850,562],{"emptyLinePlaceholder":561},[230,3852,3853,3855,3857,3860,3862,3865,3868,3870,3872,3874,3876,3879,3881],{"class":232,"line":271},[230,3854,603],{"class":602},[230,3856,3828],{"class":240},[230,3858,3859],{"class":236},"==",[230,3861,258],{"class":236},[230,3863,3864],{"class":261},"owner",[230,3866,3867],{"class":236},"\" ",[230,3869,3324],{"class":236},[230,3871,3828],{"class":240},[230,3873,3859],{"class":236},[230,3875,258],{"class":236},[230,3877,3878],{"class":261},"moderator",[230,3880,3867],{"class":236},[230,3882,612],{"class":602},[230,3884,3885,3887,3889,3891,3894,3896],{"class":232,"line":281},[230,3886,618],{"class":587},[230,3888,983],{"class":240},[230,3890,265],{"class":236},[230,3892,3893],{"class":261},"Player can manage this CrewLink group",[230,3895,265],{"class":236},[230,3897,992],{"class":240},[230,3899,3900],{"class":232,"line":298},[230,3901,643],{"class":602},[39,3903,3905],{"id":3904},"createcrewlinkpinggroupid-data",[22,3906,3907],{},"CreateCrewLinkPing(groupId, data)",[46,3909,3910,3915,3986],{},[49,3911,3912,3914],{},[52,3913,54],{},": Creates a shared external ping for a CrewLink group.",[49,3916,3917,61,3919],{},[52,3918,60],{},[46,3920,3921,3928],{},[49,3922,3923,69,3925,3927],{},[22,3924,3604],{},[22,3926,83],{},"): Target group ID.",[49,3929,3930,69,3932,3934,3935],{},[22,3931,1064],{},[22,3933,72],{},"): Ping definition.\n",[46,3936,3937,3959,3967,3978],{},[49,3938,3939,69,3942,131,3944,135,3947,135,3950,135,3953,145,3956,37],{},[22,3940,3941],{},"type",[22,3943,83],{},[22,3945,3946],{},"meeting",[22,3948,3949],{},"danger",[22,3951,3952],{},"help",[22,3954,3955],{},"target",[22,3957,3958],{},"info",[49,3960,3961,69,3964,3966],{},[22,3962,3963],{},"label",[22,3965,83],{},"): Player-facing ping label.",[49,3968,3969,69,3972,131,3974,3977],{},[22,3970,3971],{},"coords",[22,3973,72],{},[22,3975,3976],{},"{ x, y, z }"," world coordinates.",[49,3979,3980,69,3983,3985],{},[22,3981,3982],{},"lifetimeSeconds",[22,3984,2834],{},"): Requested lifetime within configured limits.",[49,3987,3988,206,3990,3993],{},[52,3989,205],{},[22,3991,3992],{},"table | nil, string?"," — created ping or an error code.",[220,3995,3997],{"className":222,"code":3996,"filename":2050,"language":225,"meta":226,"style":226},"local ping, error_code = exports[\"sky_phone\"]:CreateCrewLinkPing(\n    group_id,\n    {\n        type = \"target\",\n        label = \"Mission target\",\n        coords = {\n            x = 125.0,\n            y = -840.0,\n            z = 30.0,\n        },\n        lifetimeSeconds = 180,\n    }\n)\n\nif not ping then\n    print((\"CrewLink ping failed: %s\"):format(error_code))\nend\n",[22,3998,3999,4023,4028,4032,4046,4062,4071,4083,4098,4110,4114,4126,4130,4134,4138,4149,4168],{"__ignoreMap":226},[230,4000,4001,4003,4006,4008,4010,4012,4014,4016,4018,4021],{"class":232,"line":233},[230,4002,237],{"class":236},[230,4004,4005],{"class":240}," ping, error_code ",[230,4007,244],{"class":236},[230,4009,575],{"class":240},[230,4011,265],{"class":236},[230,4013,24],{"class":261},[230,4015,265],{"class":236},[230,4017,584],{"class":240},[230,4019,4020],{"class":587},"CreateCrewLinkPing",[230,4022,1126],{"class":240},[230,4024,4025],{"class":232,"line":250},[230,4026,4027],{"class":240},"    group_id,\n",[230,4029,4030],{"class":232,"line":271},[230,4031,1421],{"class":240},[230,4033,4034,4036,4038,4040,4042,4044],{"class":232,"line":281},[230,4035,1426],{"class":240},[230,4037,244],{"class":236},[230,4039,258],{"class":236},[230,4041,3955],{"class":261},[230,4043,265],{"class":236},[230,4045,268],{"class":240},[230,4047,4048,4051,4053,4055,4058,4060],{"class":232,"line":298},[230,4049,4050],{"class":240},"        label ",[230,4052,244],{"class":236},[230,4054,258],{"class":236},[230,4056,4057],{"class":261},"Mission target",[230,4059,265],{"class":236},[230,4061,268],{"class":240},[230,4063,4064,4067,4069],{"class":232,"line":315},[230,4065,4066],{"class":240},"        coords ",[230,4068,244],{"class":236},[230,4070,247],{"class":240},[230,4072,4073,4076,4078,4081],{"class":232,"line":321},[230,4074,4075],{"class":240},"            x ",[230,4077,244],{"class":236},[230,4079,4080],{"class":1151}," 125.0",[230,4082,268],{"class":240},[230,4084,4085,4088,4090,4093,4096],{"class":232,"line":331},[230,4086,4087],{"class":240},"            y ",[230,4089,244],{"class":236},[230,4091,4092],{"class":236}," -",[230,4094,4095],{"class":1151},"840.0",[230,4097,268],{"class":240},[230,4099,4100,4103,4105,4108],{"class":232,"line":347},[230,4101,4102],{"class":240},"            z ",[230,4104,244],{"class":236},[230,4106,4107],{"class":1151}," 30.0",[230,4109,268],{"class":240},[230,4111,4112],{"class":232,"line":363},[230,4113,1494],{"class":240},[230,4115,4116,4119,4121,4124],{"class":232,"line":368},[230,4117,4118],{"class":240},"        lifetimeSeconds ",[230,4120,244],{"class":236},[230,4122,4123],{"class":1151}," 180",[230,4125,268],{"class":240},[230,4127,4128],{"class":232,"line":385},[230,4129,1499],{"class":240},[230,4131,4132],{"class":232,"line":401},[230,4133,992],{"class":240},[230,4135,4136],{"class":232,"line":418},[230,4137,562],{"emptyLinePlaceholder":561},[230,4139,4140,4142,4144,4147],{"class":232,"line":435},[230,4141,603],{"class":602},[230,4143,606],{"class":236},[230,4145,4146],{"class":240}," ping ",[230,4148,612],{"class":602},[230,4150,4151,4153,4155,4157,4160,4162,4164,4166],{"class":232,"line":451},[230,4152,618],{"class":587},[230,4154,621],{"class":240},[230,4156,265],{"class":236},[230,4158,4159],{"class":261},"CrewLink ping failed: %s",[230,4161,265],{"class":236},[230,4163,631],{"class":240},[230,4165,634],{"class":587},[230,4167,637],{"class":240},[230,4169,4170],{"class":232,"line":464},[230,4171,643],{"class":602},[39,4173,4175],{"id":4174},"removecrewlinkpinggroupid-pingid",[22,4176,4177],{},"RemoveCrewLinkPing(groupId, pingId)",[46,4179,4180,4185,4207],{},[49,4181,4182,4184],{},[52,4183,54],{},": Removes an external ping created by the calling resource.",[49,4186,4187,61,4189],{},[52,4188,60],{},[46,4190,4191,4197],{},[49,4192,4193,69,4195,3607],{},[22,4194,3604],{},[22,4196,83],{},[49,4198,4199,69,4202,4204,4205,37],{},[22,4200,4201],{},"pingId",[22,4203,83],{},"): Ping ID returned by ",[22,4206,4020],{},[49,4208,4209,206,4211,37],{},[52,4210,205],{},[22,4212,2620],{},[220,4214,4216],{"className":222,"code":4215,"filename":2050,"language":225,"meta":226,"style":226},"local removed = exports[\"sky_phone\"]:RemoveCrewLinkPing(group_id, ping.id)\n\nif not removed then\n    print(\"Ping does not exist or belongs to another resource\")\nend\n",[22,4217,4218,4246,4250,4260,4275],{"__ignoreMap":226},[230,4219,4220,4222,4224,4226,4228,4230,4232,4234,4236,4239,4242,4244],{"class":232,"line":233},[230,4221,237],{"class":236},[230,4223,1005],{"class":240},[230,4225,244],{"class":236},[230,4227,575],{"class":240},[230,4229,265],{"class":236},[230,4231,24],{"class":261},[230,4233,265],{"class":236},[230,4235,584],{"class":240},[230,4237,4238],{"class":587},"RemoveCrewLinkPing",[230,4240,4241],{"class":240},"(group_id, ping.",[230,4243,80],{"class":1882},[230,4245,992],{"class":240},[230,4247,4248],{"class":232,"line":250},[230,4249,562],{"emptyLinePlaceholder":561},[230,4251,4252,4254,4256,4258],{"class":232,"line":271},[230,4253,603],{"class":602},[230,4255,606],{"class":236},[230,4257,1005],{"class":240},[230,4259,612],{"class":602},[230,4261,4262,4264,4266,4268,4271,4273],{"class":232,"line":281},[230,4263,618],{"class":587},[230,4265,983],{"class":240},[230,4267,265],{"class":236},[230,4269,4270],{"class":261},"Ping does not exist or belongs to another resource",[230,4272,265],{"class":236},[230,4274,992],{"class":240},[230,4276,4277],{"class":232,"line":298},[230,4278,643],{"class":602},[27,4280,4282],{"id":4281},"trusted-adapter-exports","Trusted Adapter Exports",[10,4284,4285,4286,4289,4290,4293],{},"Exports ending in ",[22,4287,4288],{},"FromAdapter"," are reserved for resources explicitly listed in\n",[22,4291,4292],{},"Config.CustomApps.TrustedAdapters",". Normal custom apps must use the owner-bound exports above.",[72,4295,4296,4312],{},[4297,4298,4299],"thead",{},[4300,4301,4302,4306,4309],"tr",{},[4303,4304,4305],"th",{},"Runtime",[4303,4307,4308],{},"Export",[4303,4310,4311],{},"Signature",[4313,4314,4315,4331,4344,4358,4372,4385,4399,4413,4427,4441,4454],"tbody",{},[4300,4316,4317,4321,4326],{},[4318,4319,4320],"td",{},"Client",[4318,4322,4323],{},[22,4324,4325],{},"AddCustomAppFromAdapter",[4318,4327,4328],{},[22,4329,4330],{},"(ownerResource, definition)",[4300,4332,4333,4335,4340],{},[4318,4334,4320],{},[4318,4336,4337],{},[22,4338,4339],{},"UpdateCustomAppFromAdapter",[4318,4341,4342],{},[22,4343,4330],{},[4300,4345,4346,4348,4353],{},[4318,4347,4320],{},[4318,4349,4350],{},[22,4351,4352],{},"RemoveCustomAppFromAdapter",[4318,4354,4355],{},[22,4356,4357],{},"(ownerResource, appId)",[4300,4359,4360,4362,4367],{},[4318,4361,4320],{},[4318,4363,4364],{},[22,4365,4366],{},"OpenCustomAppFromAdapter",[4318,4368,4369],{},[22,4370,4371],{},"(ownerResource, appId, data?)",[4300,4373,4374,4376,4381],{},[4318,4375,4320],{},[4318,4377,4378],{},[22,4379,4380],{},"CloseCustomAppFromAdapter",[4318,4382,4383],{},[22,4384,4357],{},[4300,4386,4387,4389,4394],{},[4318,4388,4320],{},[4318,4390,4391],{},[22,4392,4393],{},"CloseActiveCustomAppFromAdapter",[4318,4395,4396],{},[22,4397,4398],{},"(ownerResource)",[4300,4400,4401,4403,4408],{},[4318,4402,4320],{},[4318,4404,4405],{},[22,4406,4407],{},"SendCustomAppMessageFromAdapter",[4318,4409,4410],{},[22,4411,4412],{},"(ownerResource, appId, payload)",[4300,4414,4415,4417,4422],{},[4318,4416,4320],{},[4318,4418,4419],{},[22,4420,4421],{},"SendCustomAppNotificationFromAdapter",[4318,4423,4424],{},[22,4425,4426],{},"(ownerResource, appId, notification)",[4300,4428,4429,4432,4437],{},[4318,4430,4431],{},"Server",[4318,4433,4434],{},[22,4435,4436],{},"AddCustomAppPolicyFromAdapter",[4318,4438,4439],{},[22,4440,4330],{},[4300,4442,4443,4445,4450],{},[4318,4444,4431],{},[4318,4446,4447],{},[22,4448,4449],{},"UpdateCustomAppPolicyFromAdapter",[4318,4451,4452],{},[22,4453,4330],{},[4300,4455,4456,4458,4463],{},[4318,4457,4431],{},[4318,4459,4460],{},[22,4461,4462],{},"RemoveCustomAppPolicyFromAdapter",[4318,4464,4465],{},[22,4466,4357],{},[220,4468,4470],{"className":222,"code":4469,"filename":224,"language":225,"meta":226,"style":226},"-- Trusted adapter example only. Normal apps must not use this export.\nlocal registered, error_code = exports[\"sky_phone\"]:AddCustomAppFromAdapter(\n    \"legacy_dispatch\",\n    converted_definition\n)\n",[22,4471,4472,4478,4500,4511,4516],{"__ignoreMap":226},[230,4473,4474],{"class":232,"line":233},[230,4475,4477],{"class":4476},"sHwdD","-- Trusted adapter example only. Normal apps must not use this export.\n",[230,4479,4480,4482,4484,4486,4488,4490,4492,4494,4496,4498],{"class":232,"line":250},[230,4481,237],{"class":236},[230,4483,570],{"class":240},[230,4485,244],{"class":236},[230,4487,575],{"class":240},[230,4489,265],{"class":236},[230,4491,24],{"class":261},[230,4493,265],{"class":236},[230,4495,584],{"class":240},[230,4497,4325],{"class":587},[230,4499,1126],{"class":240},[230,4501,4502,4504,4507,4509],{"class":232,"line":271},[230,4503,1410],{"class":236},[230,4505,4506],{"class":261},"legacy_dispatch",[230,4508,265],{"class":236},[230,4510,268],{"class":240},[230,4512,4513],{"class":232,"line":281},[230,4514,4515],{"class":240},"    converted_definition\n",[230,4517,4518],{"class":232,"line":298},[230,4519,992],{"class":240},[10,4521,4522],{},"The adapter resource remains responsible for mapping the external contract and preserving the real\nowner resource.",[27,4524,4526],{"id":4525},"compatibility-aliases","Compatibility Aliases",[10,4528,4529],{},"Free Phone exposes a documented subset of common third-party phone contracts:",[72,4531,4532,4542],{},[4297,4533,4534],{},[4300,4535,4536,4539],{},[4303,4537,4538],{},"Resource alias",[4303,4540,4541],{},"Supported client exports",[4313,4543,4544,4568,4586,4601,4628],{},[4300,4545,4546,4551],{},[4318,4547,4548],{},[22,4549,4550],{},"lb-phone",[4318,4552,4553,135,4555,135,4557,135,4559,135,4562,135,4565],{},[22,4554,588],{},[22,4556,980],{},[22,4558,1403],{},[22,4560,4561],{},"OpenApp",[22,4563,4564],{},"CloseApp",[22,4566,4567],{},"SendNotification",[4300,4569,4570,4575],{},[4318,4571,4572],{},[22,4573,4574],{},"17mov_Phone",[4318,4576,4577,135,4580,135,4583],{},[22,4578,4579],{},"AddApplication",[22,4581,4582],{},"RemoveApplication",[22,4584,4585],{},"SendAppMessage",[4300,4587,4588,4593],{},[4318,4589,4590],{},[22,4591,4592],{},"high-phone",[4318,4594,4595,135,4598],{},[22,4596,4597],{},"addApplication",[22,4599,4600],{},"sendAppNui",[4300,4602,4603,4608],{},[4318,4604,4605],{},[22,4606,4607],{},"qs-smartphone",[4318,4609,4610,135,4613,135,4616,135,4619,135,4622,135,4625],{},[22,4611,4612],{},"addCustomApp",[22,4614,4615],{},"addCustomAppsBatch",[22,4617,4618],{},"updateCustomApp",[22,4620,4621],{},"removeCustomApp",[22,4623,4624],{},"getCustomApps",[22,4626,4627],{},"OpenPhoneApp",[4300,4629,4630,4635],{},[4318,4631,4632],{},[22,4633,4634],{},"yseries",[4318,4636,4637,135,4639,135,4641,135,4643,135,4645],{},[22,4638,588],{},[22,4640,980],{},[22,4642,4585],{},[22,4644,4564],{},[22,4646,4647],{},"GetDataLoaded",[10,4649,4650],{},"Compatibility is contract-based and does not emulate every feature of the original phone.",[27,4652,4654],{"id":4653},"support","Support",[10,4656,4657],{},"Need help with an integration? Our support team is ready to assist.",[4659,4660],"u-button",{"color":4661,"icon":4662,"label":4663,"target":4664,"to":4665,"variant":4666},"neutral","i-simple-icons-discord","Join Discord","_blank","https://discord.gg/sky-systems","subtle",[4668,4669,4670],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":226,"searchDepth":233,"depth":250,"links":4672},[4673,4683,4692,4698,4706,4707,4708],{"id":29,"depth":250,"text":30,"children":4674},[4675,4676,4677,4678,4679,4680,4681,4682],{"id":41,"depth":271,"text":44},{"id":652,"depth":271,"text":655},{"id":923,"depth":271,"text":926},{"id":1036,"depth":271,"text":1039},{"id":1234,"depth":271,"text":1237},{"id":1340,"depth":271,"text":1343},{"id":1547,"depth":271,"text":1550},{"id":1813,"depth":271,"text":1816},{"id":1984,"depth":250,"text":1985,"children":4684},[4685,4686,4687,4688,4689,4690,4691],{"id":1994,"depth":271,"text":1995},{"id":2001,"depth":271,"text":2004},{"id":2166,"depth":271,"text":2169},{"id":2326,"depth":271,"text":2329},{"id":2430,"depth":271,"text":2433},{"id":2583,"depth":271,"text":2586},{"id":2708,"depth":271,"text":1816},{"id":2794,"depth":250,"text":2795,"children":4693},[4694,4695,4696,4697],{"id":2801,"depth":271,"text":2804},{"id":3131,"depth":271,"text":3134},{"id":3250,"depth":271,"text":3253},{"id":3350,"depth":271,"text":3353},{"id":3469,"depth":250,"text":3470,"children":4699},[4700,4701,4702,4703,4704,4705],{"id":3479,"depth":271,"text":3482},{"id":3583,"depth":271,"text":3586},{"id":3698,"depth":271,"text":3701},{"id":3781,"depth":271,"text":3784},{"id":3904,"depth":271,"text":3907},{"id":4174,"depth":271,"text":4177},{"id":4281,"depth":250,"text":4282},{"id":4525,"depth":250,"text":4526},{"id":4653,"depth":250,"text":4654},"Client and server exports provided by Free Phone, with arguments, return values, security boundaries, and complete Lua examples.","md",null,{},"/docs/scripts/free-phone/exports",{"title":5,"description":4709},{"loc":4713},"1.docs/scripts/4.free-phone/3.exports","i06S_9C0QnBU9Q0fO4tVknQgc_GibsmivNowrX4VldI",[4719,4724],{"title":4720,"path":4721,"stem":4722,"description":4723,"children":-1},"Features","/docs/scripts/free-phone/features","1.docs/scripts/4.free-phone/2.features","Explore the device system, built-in apps, media, social features, integrations, and developer platform included with Free Phone.",{"title":4725,"path":4726,"stem":4727,"description":4728,"children":-1},"Events","/docs/scripts/free-phone/events","1.docs/scripts/4.free-phone/4.events","Public Free Phone observer events, custom-app bridge messages, lifecycle hooks, and internal event boundaries with examples.",[],1787244846793]