| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363 | /* This file is automatically rebuilt by the Cesium build process. */define(['exports', './RuntimeError-c581ca93', './defaultValue-94c3e563', './ComponentDatatype-b1ea011a'], (function (exports, RuntimeError, defaultValue, ComponentDatatype) { 'use strict';  /**   * A 3D Cartesian point.   * @alias Cartesian3   * @constructor   *   * @param {Number} [x=0.0] The X component.   * @param {Number} [y=0.0] The Y component.   * @param {Number} [z=0.0] The Z component.   *   * @see Cartesian2   * @see Cartesian4   * @see Packable   */  function Cartesian3(x, y, z) {    /**     * The X component.     * @type {Number}     * @default 0.0     */    this.x = defaultValue.defaultValue(x, 0.0);    /**     * The Y component.     * @type {Number}     * @default 0.0     */    this.y = defaultValue.defaultValue(y, 0.0);    /**     * The Z component.     * @type {Number}     * @default 0.0     */    this.z = defaultValue.defaultValue(z, 0.0);  }  /**   * Converts the provided Spherical into Cartesian3 coordinates.   *   * @param {Spherical} spherical The Spherical to be converted to Cartesian3.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.   */  Cartesian3.fromSpherical = function (spherical, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("spherical", spherical);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    const clock = spherical.clock;    const cone = spherical.cone;    const magnitude = defaultValue.defaultValue(spherical.magnitude, 1.0);    const radial = magnitude * Math.sin(cone);    result.x = radial * Math.cos(clock);    result.y = radial * Math.sin(clock);    result.z = magnitude * Math.cos(cone);    return result;  };  /**   * Creates a Cartesian3 instance from x, y and z coordinates.   *   * @param {Number} x The x coordinate.   * @param {Number} y The y coordinate.   * @param {Number} z The z coordinate.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.   */  Cartesian3.fromElements = function (x, y, z, result) {    if (!defaultValue.defined(result)) {      return new Cartesian3(x, y, z);    }    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Duplicates a Cartesian3 instance.   *   * @param {Cartesian3} cartesian The Cartesian to duplicate.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided. (Returns undefined if cartesian is undefined)   */  Cartesian3.clone = function (cartesian, result) {    if (!defaultValue.defined(cartesian)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Cartesian3(cartesian.x, cartesian.y, cartesian.z);    }    result.x = cartesian.x;    result.y = cartesian.y;    result.z = cartesian.z;    return result;  };  /**   * Creates a Cartesian3 instance from an existing Cartesian4.  This simply takes the   * x, y, and z properties of the Cartesian4 and drops w.   * @function   *   * @param {Cartesian4} cartesian The Cartesian4 instance to create a Cartesian3 instance from.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.   */  Cartesian3.fromCartesian4 = Cartesian3.clone;  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Cartesian3.packedLength = 3;  /**   * Stores the provided instance into the provided array.   *   * @param {Cartesian3} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Cartesian3.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    array[startingIndex++] = value.x;    array[startingIndex++] = value.y;    array[startingIndex] = value.z;    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Cartesian3} [result] The object into which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.   */  Cartesian3.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    result.x = array[startingIndex++];    result.y = array[startingIndex++];    result.z = array[startingIndex];    return result;  };  /**   * Flattens an array of Cartesian3s into an array of components.   *   * @param {Cartesian3[]} array The array of cartesians to pack.   * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 3 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 3) elements.   * @returns {Number[]} The packed array.   */  Cartesian3.packArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    const length = array.length;    const resultLength = length * 3;    if (!defaultValue.defined(result)) {      result = new Array(resultLength);    } else if (!Array.isArray(result) && result.length !== resultLength) {      //>>includeStart('debug', pragmas.debug);      throw new RuntimeError.DeveloperError(        "If result is a typed array, it must have exactly array.length * 3 elements"      );      //>>includeEnd('debug');    } else if (result.length !== resultLength) {      result.length = resultLength;    }    for (let i = 0; i < length; ++i) {      Cartesian3.pack(array[i], result, i * 3);    }    return result;  };  /**   * Unpacks an array of cartesian components into an array of Cartesian3s.   *   * @param {Number[]} array The array of components to unpack.   * @param {Cartesian3[]} [result] The array onto which to store the result.   * @returns {Cartesian3[]} The unpacked array.   */  Cartesian3.unpackArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("array.length", array.length, 3);    if (array.length % 3 !== 0) {      throw new RuntimeError.DeveloperError("array length must be a multiple of 3.");    }    //>>includeEnd('debug');    const length = array.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 3);    } else {      result.length = length / 3;    }    for (let i = 0; i < length; i += 3) {      const index = i / 3;      result[index] = Cartesian3.unpack(array, i, result[index]);    }    return result;  };  /**   * Creates a Cartesian3 from three consecutive elements in an array.   * @function   *   * @param {Number[]} array The array whose three consecutive elements correspond to the x, y, and z components, respectively.   * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to the x component.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.   *   * @example   * // Create a Cartesian3 with (1.0, 2.0, 3.0)   * const v = [1.0, 2.0, 3.0];   * const p = Cesium.Cartesian3.fromArray(v);   *   * // Create a Cartesian3 with (1.0, 2.0, 3.0) using an offset into an array   * const v2 = [0.0, 0.0, 1.0, 2.0, 3.0];   * const p2 = Cesium.Cartesian3.fromArray(v2, 2);   */  Cartesian3.fromArray = Cartesian3.unpack;  /**   * Computes the value of the maximum component for the supplied Cartesian.   *   * @param {Cartesian3} cartesian The cartesian to use.   * @returns {Number} The value of the maximum component.   */  Cartesian3.maximumComponent = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return Math.max(cartesian.x, cartesian.y, cartesian.z);  };  /**   * Computes the value of the minimum component for the supplied Cartesian.   *   * @param {Cartesian3} cartesian The cartesian to use.   * @returns {Number} The value of the minimum component.   */  Cartesian3.minimumComponent = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return Math.min(cartesian.x, cartesian.y, cartesian.z);  };  /**   * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians.   *   * @param {Cartesian3} first A cartesian to compare.   * @param {Cartesian3} second A cartesian to compare.   * @param {Cartesian3} result The object into which to store the result.   * @returns {Cartesian3} A cartesian with the minimum components.   */  Cartesian3.minimumByComponent = function (first, second, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("first", first);    RuntimeError.Check.typeOf.object("second", second);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.min(first.x, second.x);    result.y = Math.min(first.y, second.y);    result.z = Math.min(first.z, second.z);    return result;  };  /**   * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians.   *   * @param {Cartesian3} first A cartesian to compare.   * @param {Cartesian3} second A cartesian to compare.   * @param {Cartesian3} result The object into which to store the result.   * @returns {Cartesian3} A cartesian with the maximum components.   */  Cartesian3.maximumByComponent = function (first, second, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("first", first);    RuntimeError.Check.typeOf.object("second", second);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.max(first.x, second.x);    result.y = Math.max(first.y, second.y);    result.z = Math.max(first.z, second.z);    return result;  };  /**   * Constrain a value to lie between two values.   *   * @param {Cartesian3} cartesian The value to clamp.   * @param {Cartesian3} min The minimum bound.   * @param {Cartesian3} max The maximum bound.   * @param {Cartesian3} result The object into which to store the result.   * @returns {Cartesian3} The clamped value such that min <= value <= max.   */  Cartesian3.clamp = function (value, min, max, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.typeOf.object("min", min);    RuntimeError.Check.typeOf.object("max", max);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = ComponentDatatype.CesiumMath.clamp(value.x, min.x, max.x);    const y = ComponentDatatype.CesiumMath.clamp(value.y, min.y, max.y);    const z = ComponentDatatype.CesiumMath.clamp(value.z, min.z, max.z);    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Computes the provided Cartesian's squared magnitude.   *   * @param {Cartesian3} cartesian The Cartesian instance whose squared magnitude is to be computed.   * @returns {Number} The squared magnitude.   */  Cartesian3.magnitudeSquared = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return (      cartesian.x * cartesian.x +      cartesian.y * cartesian.y +      cartesian.z * cartesian.z    );  };  /**   * Computes the Cartesian's magnitude (length).   *   * @param {Cartesian3} cartesian The Cartesian instance whose magnitude is to be computed.   * @returns {Number} The magnitude.   */  Cartesian3.magnitude = function (cartesian) {    return Math.sqrt(Cartesian3.magnitudeSquared(cartesian));  };  const distanceScratch$2 = new Cartesian3();  /**   * Computes the distance between two points.   *   * @param {Cartesian3} left The first point to compute the distance from.   * @param {Cartesian3} right The second point to compute the distance to.   * @returns {Number} The distance between two points.   *   * @example   * // Returns 1.0   * const d = Cesium.Cartesian3.distance(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(2.0, 0.0, 0.0));   */  Cartesian3.distance = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian3.subtract(left, right, distanceScratch$2);    return Cartesian3.magnitude(distanceScratch$2);  };  /**   * Computes the squared distance between two points.  Comparing squared distances   * using this function is more efficient than comparing distances using {@link Cartesian3#distance}.   *   * @param {Cartesian3} left The first point to compute the distance from.   * @param {Cartesian3} right The second point to compute the distance to.   * @returns {Number} The distance between two points.   *   * @example   * // Returns 4.0, not 2.0   * const d = Cesium.Cartesian3.distanceSquared(new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(3.0, 0.0, 0.0));   */  Cartesian3.distanceSquared = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian3.subtract(left, right, distanceScratch$2);    return Cartesian3.magnitudeSquared(distanceScratch$2);  };  /**   * Computes the normalized form of the supplied Cartesian.   *   * @param {Cartesian3} cartesian The Cartesian to be normalized.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.normalize = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const magnitude = Cartesian3.magnitude(cartesian);    result.x = cartesian.x / magnitude;    result.y = cartesian.y / magnitude;    result.z = cartesian.z / magnitude;    //>>includeStart('debug', pragmas.debug);    if (isNaN(result.x) || isNaN(result.y) || isNaN(result.z)) {      throw new RuntimeError.DeveloperError("normalized result is not a number");    }    //>>includeEnd('debug');    return result;  };  /**   * Computes the dot (scalar) product of two Cartesians.   *   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @returns {Number} The dot product.   */  Cartesian3.dot = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    return left.x * right.x + left.y * right.y + left.z * right.z;  };  /**   * Computes the componentwise product of two Cartesians.   *   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.multiplyComponents = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x * right.x;    result.y = left.y * right.y;    result.z = left.z * right.z;    return result;  };  /**   * Computes the componentwise quotient of two Cartesians.   *   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.divideComponents = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x / right.x;    result.y = left.y / right.y;    result.z = left.z / right.z;    return result;  };  /**   * Computes the componentwise sum of two Cartesians.   *   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.add = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x + right.x;    result.y = left.y + right.y;    result.z = left.z + right.z;    return result;  };  /**   * Computes the componentwise difference of two Cartesians.   *   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.subtract = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x - right.x;    result.y = left.y - right.y;    result.z = left.z - right.z;    return result;  };  /**   * Multiplies the provided Cartesian componentwise by the provided scalar.   *   * @param {Cartesian3} cartesian The Cartesian to be scaled.   * @param {Number} scalar The scalar to multiply with.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.multiplyByScalar = function (cartesian, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = cartesian.x * scalar;    result.y = cartesian.y * scalar;    result.z = cartesian.z * scalar;    return result;  };  /**   * Divides the provided Cartesian componentwise by the provided scalar.   *   * @param {Cartesian3} cartesian The Cartesian to be divided.   * @param {Number} scalar The scalar to divide by.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.divideByScalar = function (cartesian, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = cartesian.x / scalar;    result.y = cartesian.y / scalar;    result.z = cartesian.z / scalar;    return result;  };  /**   * Negates the provided Cartesian.   *   * @param {Cartesian3} cartesian The Cartesian to be negated.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.negate = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = -cartesian.x;    result.y = -cartesian.y;    result.z = -cartesian.z;    return result;  };  /**   * Computes the absolute value of the provided Cartesian.   *   * @param {Cartesian3} cartesian The Cartesian whose absolute value is to be computed.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.abs = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.abs(cartesian.x);    result.y = Math.abs(cartesian.y);    result.z = Math.abs(cartesian.z);    return result;  };  const lerpScratch$2 = new Cartesian3();  /**   * Computes the linear interpolation or extrapolation at t using the provided cartesians.   *   * @param {Cartesian3} start The value corresponding to t at 0.0.   * @param {Cartesian3} end The value corresponding to t at 1.0.   * @param {Number} t The point along t at which to interpolate.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Cartesian3.lerp = function (start, end, t, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("start", start);    RuntimeError.Check.typeOf.object("end", end);    RuntimeError.Check.typeOf.number("t", t);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    Cartesian3.multiplyByScalar(end, t, lerpScratch$2);    result = Cartesian3.multiplyByScalar(start, 1.0 - t, result);    return Cartesian3.add(lerpScratch$2, result, result);  };  const angleBetweenScratch$1 = new Cartesian3();  const angleBetweenScratch2$1 = new Cartesian3();  /**   * Returns the angle, in radians, between the provided Cartesians.   *   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @returns {Number} The angle between the Cartesians.   */  Cartesian3.angleBetween = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian3.normalize(left, angleBetweenScratch$1);    Cartesian3.normalize(right, angleBetweenScratch2$1);    const cosine = Cartesian3.dot(angleBetweenScratch$1, angleBetweenScratch2$1);    const sine = Cartesian3.magnitude(      Cartesian3.cross(        angleBetweenScratch$1,        angleBetweenScratch2$1,        angleBetweenScratch$1      )    );    return Math.atan2(sine, cosine);  };  const mostOrthogonalAxisScratch$2 = new Cartesian3();  /**   * Returns the axis that is most orthogonal to the provided Cartesian.   *   * @param {Cartesian3} cartesian The Cartesian on which to find the most orthogonal axis.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The most orthogonal axis.   */  Cartesian3.mostOrthogonalAxis = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch$2);    Cartesian3.abs(f, f);    if (f.x <= f.y) {      if (f.x <= f.z) {        result = Cartesian3.clone(Cartesian3.UNIT_X, result);      } else {        result = Cartesian3.clone(Cartesian3.UNIT_Z, result);      }    } else if (f.y <= f.z) {      result = Cartesian3.clone(Cartesian3.UNIT_Y, result);    } else {      result = Cartesian3.clone(Cartesian3.UNIT_Z, result);    }    return result;  };  /**   * Projects vector a onto vector b   * @param {Cartesian3} a The vector that needs projecting   * @param {Cartesian3} b The vector to project onto   * @param {Cartesian3} result The result cartesian   * @returns {Cartesian3} The modified result parameter   */  Cartesian3.projectVector = function (a, b, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("a", a);    RuntimeError.Check.defined("b", b);    RuntimeError.Check.defined("result", result);    //>>includeEnd('debug');    const scalar = Cartesian3.dot(a, b) / Cartesian3.dot(b, b);    return Cartesian3.multiplyByScalar(b, scalar, result);  };  /**   * Compares the provided Cartesians componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartesian3} [left] The first Cartesian.   * @param {Cartesian3} [right] The second Cartesian.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   */  Cartesian3.equals = function (left, right) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        left.x === right.x &&        left.y === right.y &&        left.z === right.z)    );  };  /**   * @private   */  Cartesian3.equalsArray = function (cartesian, array, offset) {    return (      cartesian.x === array[offset] &&      cartesian.y === array[offset + 1] &&      cartesian.z === array[offset + 2]    );  };  /**   * Compares the provided Cartesians componentwise and returns   * <code>true</code> if they pass an absolute or relative tolerance test,   * <code>false</code> otherwise.   *   * @param {Cartesian3} [left] The first Cartesian.   * @param {Cartesian3} [right] The second Cartesian.   * @param {Number} [relativeEpsilon=0] The relative epsilon tolerance to use for equality testing.   * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Cartesian3.equalsEpsilon = function (    left,    right,    relativeEpsilon,    absoluteEpsilon  ) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.x,          right.x,          relativeEpsilon,          absoluteEpsilon        ) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.y,          right.y,          relativeEpsilon,          absoluteEpsilon        ) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.z,          right.z,          relativeEpsilon,          absoluteEpsilon        ))    );  };  /**   * Computes the cross (outer) product of two Cartesians.   *   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The cross product.   */  Cartesian3.cross = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const leftX = left.x;    const leftY = left.y;    const leftZ = left.z;    const rightX = right.x;    const rightY = right.y;    const rightZ = right.z;    const x = leftY * rightZ - leftZ * rightY;    const y = leftZ * rightX - leftX * rightZ;    const z = leftX * rightY - leftY * rightX;    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Computes the midpoint between the right and left Cartesian.   * @param {Cartesian3} left The first Cartesian.   * @param {Cartesian3} right The second Cartesian.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The midpoint.   */  Cartesian3.midpoint = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = (left.x + right.x) * 0.5;    result.y = (left.y + right.y) * 0.5;    result.z = (left.z + right.z) * 0.5;    return result;  };  /**   * Returns a Cartesian3 position from longitude and latitude values given in degrees.   *   * @param {Number} longitude The longitude, in degrees   * @param {Number} latitude The latitude, in degrees   * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The position   *   * @example   * const position = Cesium.Cartesian3.fromDegrees(-115.0, 37.0);   */  Cartesian3.fromDegrees = function (    longitude,    latitude,    height,    ellipsoid,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("longitude", longitude);    RuntimeError.Check.typeOf.number("latitude", latitude);    //>>includeEnd('debug');    longitude = ComponentDatatype.CesiumMath.toRadians(longitude);    latitude = ComponentDatatype.CesiumMath.toRadians(latitude);    return Cartesian3.fromRadians(longitude, latitude, height, ellipsoid, result);  };  let scratchN = new Cartesian3();  let scratchK = new Cartesian3();  const wgs84RadiiSquared = new Cartesian3(    6378137.0 * 6378137.0,    6378137.0 * 6378137.0,    6356752.3142451793 * 6356752.3142451793  );  /**   * Returns a Cartesian3 position from longitude and latitude values given in radians.   *   * @param {Number} longitude The longitude, in radians   * @param {Number} latitude The latitude, in radians   * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The position   *   * @example   * const position = Cesium.Cartesian3.fromRadians(-2.007, 0.645);   */  Cartesian3.fromRadians = function (    longitude,    latitude,    height,    ellipsoid,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("longitude", longitude);    RuntimeError.Check.typeOf.number("latitude", latitude);    //>>includeEnd('debug');    height = defaultValue.defaultValue(height, 0.0);    const radiiSquared = defaultValue.defined(ellipsoid)      ? ellipsoid.radiiSquared      : wgs84RadiiSquared;    const cosLatitude = Math.cos(latitude);    scratchN.x = cosLatitude * Math.cos(longitude);    scratchN.y = cosLatitude * Math.sin(longitude);    scratchN.z = Math.sin(latitude);    scratchN = Cartesian3.normalize(scratchN, scratchN);    Cartesian3.multiplyComponents(radiiSquared, scratchN, scratchK);    const gamma = Math.sqrt(Cartesian3.dot(scratchN, scratchK));    scratchK = Cartesian3.divideByScalar(scratchK, gamma, scratchK);    scratchN = Cartesian3.multiplyByScalar(scratchN, height, scratchN);    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    return Cartesian3.add(scratchK, scratchN, result);  };  /**   * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in degrees.   *   * @param {Number[]} coordinates A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...].   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the coordinates lie.   * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.   * @returns {Cartesian3[]} The array of positions.   *   * @example   * const positions = Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0, -107.0, 33.0]);   */  Cartesian3.fromDegreesArray = function (coordinates, ellipsoid, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("coordinates", coordinates);    if (coordinates.length < 2 || coordinates.length % 2 !== 0) {      throw new RuntimeError.DeveloperError(        "the number of coordinates must be a multiple of 2 and at least 2"      );    }    //>>includeEnd('debug');    const length = coordinates.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 2);    } else {      result.length = length / 2;    }    for (let i = 0; i < length; i += 2) {      const longitude = coordinates[i];      const latitude = coordinates[i + 1];      const index = i / 2;      result[index] = Cartesian3.fromDegrees(        longitude,        latitude,        0,        ellipsoid,        result[index]      );    }    return result;  };  /**   * Returns an array of Cartesian3 positions given an array of longitude and latitude values given in radians.   *   * @param {Number[]} coordinates A list of longitude and latitude values. Values alternate [longitude, latitude, longitude, latitude...].   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the coordinates lie.   * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.   * @returns {Cartesian3[]} The array of positions.   *   * @example   * const positions = Cesium.Cartesian3.fromRadiansArray([-2.007, 0.645, -1.867, .575]);   */  Cartesian3.fromRadiansArray = function (coordinates, ellipsoid, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("coordinates", coordinates);    if (coordinates.length < 2 || coordinates.length % 2 !== 0) {      throw new RuntimeError.DeveloperError(        "the number of coordinates must be a multiple of 2 and at least 2"      );    }    //>>includeEnd('debug');    const length = coordinates.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 2);    } else {      result.length = length / 2;    }    for (let i = 0; i < length; i += 2) {      const longitude = coordinates[i];      const latitude = coordinates[i + 1];      const index = i / 2;      result[index] = Cartesian3.fromRadians(        longitude,        latitude,        0,        ellipsoid,        result[index]      );    }    return result;  };  /**   * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in degrees.   *   * @param {Number[]} coordinates A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...].   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.   * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.   * @returns {Cartesian3[]} The array of positions.   *   * @example   * const positions = Cesium.Cartesian3.fromDegreesArrayHeights([-115.0, 37.0, 100000.0, -107.0, 33.0, 150000.0]);   */  Cartesian3.fromDegreesArrayHeights = function (coordinates, ellipsoid, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("coordinates", coordinates);    if (coordinates.length < 3 || coordinates.length % 3 !== 0) {      throw new RuntimeError.DeveloperError(        "the number of coordinates must be a multiple of 3 and at least 3"      );    }    //>>includeEnd('debug');    const length = coordinates.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 3);    } else {      result.length = length / 3;    }    for (let i = 0; i < length; i += 3) {      const longitude = coordinates[i];      const latitude = coordinates[i + 1];      const height = coordinates[i + 2];      const index = i / 3;      result[index] = Cartesian3.fromDegrees(        longitude,        latitude,        height,        ellipsoid,        result[index]      );    }    return result;  };  /**   * Returns an array of Cartesian3 positions given an array of longitude, latitude and height values where longitude and latitude are given in radians.   *   * @param {Number[]} coordinates A list of longitude, latitude and height values. Values alternate [longitude, latitude, height, longitude, latitude, height...].   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.   * @param {Cartesian3[]} [result] An array of Cartesian3 objects to store the result.   * @returns {Cartesian3[]} The array of positions.   *   * @example   * const positions = Cesium.Cartesian3.fromRadiansArrayHeights([-2.007, 0.645, 100000.0, -1.867, .575, 150000.0]);   */  Cartesian3.fromRadiansArrayHeights = function (coordinates, ellipsoid, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("coordinates", coordinates);    if (coordinates.length < 3 || coordinates.length % 3 !== 0) {      throw new RuntimeError.DeveloperError(        "the number of coordinates must be a multiple of 3 and at least 3"      );    }    //>>includeEnd('debug');    const length = coordinates.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 3);    } else {      result.length = length / 3;    }    for (let i = 0; i < length; i += 3) {      const longitude = coordinates[i];      const latitude = coordinates[i + 1];      const height = coordinates[i + 2];      const index = i / 3;      result[index] = Cartesian3.fromRadians(        longitude,        latitude,        height,        ellipsoid,        result[index]      );    }    return result;  };  /**   * An immutable Cartesian3 instance initialized to (0.0, 0.0, 0.0).   *   * @type {Cartesian3}   * @constant   */  Cartesian3.ZERO = Object.freeze(new Cartesian3(0.0, 0.0, 0.0));  /**   * An immutable Cartesian3 instance initialized to (1.0, 1.0, 1.0).   *   * @type {Cartesian3}   * @constant   */  Cartesian3.ONE = Object.freeze(new Cartesian3(1.0, 1.0, 1.0));  /**   * An immutable Cartesian3 instance initialized to (1.0, 0.0, 0.0).   *   * @type {Cartesian3}   * @constant   */  Cartesian3.UNIT_X = Object.freeze(new Cartesian3(1.0, 0.0, 0.0));  /**   * An immutable Cartesian3 instance initialized to (0.0, 1.0, 0.0).   *   * @type {Cartesian3}   * @constant   */  Cartesian3.UNIT_Y = Object.freeze(new Cartesian3(0.0, 1.0, 0.0));  /**   * An immutable Cartesian3 instance initialized to (0.0, 0.0, 1.0).   *   * @type {Cartesian3}   * @constant   */  Cartesian3.UNIT_Z = Object.freeze(new Cartesian3(0.0, 0.0, 1.0));  /**   * Duplicates this Cartesian3 instance.   *   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.   */  Cartesian3.prototype.clone = function (result) {    return Cartesian3.clone(this, result);  };  /**   * Compares this Cartesian against the provided Cartesian componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartesian3} [right] The right hand side Cartesian.   * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.   */  Cartesian3.prototype.equals = function (right) {    return Cartesian3.equals(this, right);  };  /**   * Compares this Cartesian against the provided Cartesian componentwise and returns   * <code>true</code> if they pass an absolute or relative tolerance test,   * <code>false</code> otherwise.   *   * @param {Cartesian3} [right] The right hand side Cartesian.   * @param {Number} [relativeEpsilon=0] The relative epsilon tolerance to use for equality testing.   * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.   * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.   */  Cartesian3.prototype.equalsEpsilon = function (    right,    relativeEpsilon,    absoluteEpsilon  ) {    return Cartesian3.equalsEpsilon(      this,      right,      relativeEpsilon,      absoluteEpsilon    );  };  /**   * Creates a string representing this Cartesian in the format '(x, y, z)'.   *   * @returns {String} A string representing this Cartesian in the format '(x, y, z)'.   */  Cartesian3.prototype.toString = function () {    return `(${this.x}, ${this.y}, ${this.z})`;  };  const scaleToGeodeticSurfaceIntersection = new Cartesian3();  const scaleToGeodeticSurfaceGradient = new Cartesian3();  /**   * Scales the provided Cartesian position along the geodetic surface normal   * so that it is on the surface of this ellipsoid.  If the position is   * at the center of the ellipsoid, this function returns undefined.   *   * @param {Cartesian3} cartesian The Cartesian position to scale.   * @param {Cartesian3} oneOverRadii One over radii of the ellipsoid.   * @param {Cartesian3} oneOverRadiiSquared One over radii squared of the ellipsoid.   * @param {Number} centerToleranceSquared Tolerance for closeness to the center.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center.   *   * @function scaleToGeodeticSurface   *   * @private   */  function scaleToGeodeticSurface(    cartesian,    oneOverRadii,    oneOverRadiiSquared,    centerToleranceSquared,    result  ) {    //>>includeStart('debug', pragmas.debug);    if (!defaultValue.defined(cartesian)) {      throw new RuntimeError.DeveloperError("cartesian is required.");    }    if (!defaultValue.defined(oneOverRadii)) {      throw new RuntimeError.DeveloperError("oneOverRadii is required.");    }    if (!defaultValue.defined(oneOverRadiiSquared)) {      throw new RuntimeError.DeveloperError("oneOverRadiiSquared is required.");    }    if (!defaultValue.defined(centerToleranceSquared)) {      throw new RuntimeError.DeveloperError("centerToleranceSquared is required.");    }    //>>includeEnd('debug');    const positionX = cartesian.x;    const positionY = cartesian.y;    const positionZ = cartesian.z;    const oneOverRadiiX = oneOverRadii.x;    const oneOverRadiiY = oneOverRadii.y;    const oneOverRadiiZ = oneOverRadii.z;    const x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX;    const y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY;    const z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ;    // Compute the squared ellipsoid norm.    const squaredNorm = x2 + y2 + z2;    const ratio = Math.sqrt(1.0 / squaredNorm);    // As an initial approximation, assume that the radial intersection is the projection point.    const intersection = Cartesian3.multiplyByScalar(      cartesian,      ratio,      scaleToGeodeticSurfaceIntersection    );    // If the position is near the center, the iteration will not converge.    if (squaredNorm < centerToleranceSquared) {      return !isFinite(ratio)        ? undefined        : Cartesian3.clone(intersection, result);    }    const oneOverRadiiSquaredX = oneOverRadiiSquared.x;    const oneOverRadiiSquaredY = oneOverRadiiSquared.y;    const oneOverRadiiSquaredZ = oneOverRadiiSquared.z;    // Use the gradient at the intersection point in place of the true unit normal.    // The difference in magnitude will be absorbed in the multiplier.    const gradient = scaleToGeodeticSurfaceGradient;    gradient.x = intersection.x * oneOverRadiiSquaredX * 2.0;    gradient.y = intersection.y * oneOverRadiiSquaredY * 2.0;    gradient.z = intersection.z * oneOverRadiiSquaredZ * 2.0;    // Compute the initial guess at the normal vector multiplier, lambda.    let lambda =      ((1.0 - ratio) * Cartesian3.magnitude(cartesian)) /      (0.5 * Cartesian3.magnitude(gradient));    let correction = 0.0;    let func;    let denominator;    let xMultiplier;    let yMultiplier;    let zMultiplier;    let xMultiplier2;    let yMultiplier2;    let zMultiplier2;    let xMultiplier3;    let yMultiplier3;    let zMultiplier3;    do {      lambda -= correction;      xMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredX);      yMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredY);      zMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredZ);      xMultiplier2 = xMultiplier * xMultiplier;      yMultiplier2 = yMultiplier * yMultiplier;      zMultiplier2 = zMultiplier * zMultiplier;      xMultiplier3 = xMultiplier2 * xMultiplier;      yMultiplier3 = yMultiplier2 * yMultiplier;      zMultiplier3 = zMultiplier2 * zMultiplier;      func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;      // "denominator" here refers to the use of this expression in the velocity and acceleration      // computations in the sections to follow.      denominator =        x2 * xMultiplier3 * oneOverRadiiSquaredX +        y2 * yMultiplier3 * oneOverRadiiSquaredY +        z2 * zMultiplier3 * oneOverRadiiSquaredZ;      const derivative = -2.0 * denominator;      correction = func / derivative;    } while (Math.abs(func) > ComponentDatatype.CesiumMath.EPSILON12);    if (!defaultValue.defined(result)) {      return new Cartesian3(        positionX * xMultiplier,        positionY * yMultiplier,        positionZ * zMultiplier      );    }    result.x = positionX * xMultiplier;    result.y = positionY * yMultiplier;    result.z = positionZ * zMultiplier;    return result;  }  /**   * A position defined by longitude, latitude, and height.   * @alias Cartographic   * @constructor   *   * @param {Number} [longitude=0.0] The longitude, in radians.   * @param {Number} [latitude=0.0] The latitude, in radians.   * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.   *   * @see Ellipsoid   */  function Cartographic(longitude, latitude, height) {    /**     * The longitude, in radians.     * @type {Number}     * @default 0.0     */    this.longitude = defaultValue.defaultValue(longitude, 0.0);    /**     * The latitude, in radians.     * @type {Number}     * @default 0.0     */    this.latitude = defaultValue.defaultValue(latitude, 0.0);    /**     * The height, in meters, above the ellipsoid.     * @type {Number}     * @default 0.0     */    this.height = defaultValue.defaultValue(height, 0.0);  }  /**   * Creates a new Cartographic instance from longitude and latitude   * specified in radians.   *   * @param {Number} longitude The longitude, in radians.   * @param {Number} latitude The latitude, in radians.   * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided.   */  Cartographic.fromRadians = function (longitude, latitude, height, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("longitude", longitude);    RuntimeError.Check.typeOf.number("latitude", latitude);    //>>includeEnd('debug');    height = defaultValue.defaultValue(height, 0.0);    if (!defaultValue.defined(result)) {      return new Cartographic(longitude, latitude, height);    }    result.longitude = longitude;    result.latitude = latitude;    result.height = height;    return result;  };  /**   * Creates a new Cartographic instance from longitude and latitude   * specified in degrees.  The values in the resulting object will   * be in radians.   *   * @param {Number} longitude The longitude, in degrees.   * @param {Number} latitude The latitude, in degrees.   * @param {Number} [height=0.0] The height, in meters, above the ellipsoid.   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided.   */  Cartographic.fromDegrees = function (longitude, latitude, height, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("longitude", longitude);    RuntimeError.Check.typeOf.number("latitude", latitude);    //>>includeEnd('debug');    longitude = ComponentDatatype.CesiumMath.toRadians(longitude);    latitude = ComponentDatatype.CesiumMath.toRadians(latitude);    return Cartographic.fromRadians(longitude, latitude, height, result);  };  const cartesianToCartographicN$1 = new Cartesian3();  const cartesianToCartographicP$1 = new Cartesian3();  const cartesianToCartographicH$1 = new Cartesian3();  const wgs84OneOverRadii = new Cartesian3(    1.0 / 6378137.0,    1.0 / 6378137.0,    1.0 / 6356752.3142451793  );  const wgs84OneOverRadiiSquared = new Cartesian3(    1.0 / (6378137.0 * 6378137.0),    1.0 / (6378137.0 * 6378137.0),    1.0 / (6356752.3142451793 * 6356752.3142451793)  );  const wgs84CenterToleranceSquared = ComponentDatatype.CesiumMath.EPSILON1;  /**   * Creates a new Cartographic instance from a Cartesian position. The values in the   * resulting object will be in radians.   *   * @param {Cartesian3} cartesian The Cartesian position to convert to cartographic representation.   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.   */  Cartographic.fromCartesian = function (cartesian, ellipsoid, result) {    const oneOverRadii = defaultValue.defined(ellipsoid)      ? ellipsoid.oneOverRadii      : wgs84OneOverRadii;    const oneOverRadiiSquared = defaultValue.defined(ellipsoid)      ? ellipsoid.oneOverRadiiSquared      : wgs84OneOverRadiiSquared;    const centerToleranceSquared = defaultValue.defined(ellipsoid)      ? ellipsoid._centerToleranceSquared      : wgs84CenterToleranceSquared;    //`cartesian is required.` is thrown from scaleToGeodeticSurface    const p = scaleToGeodeticSurface(      cartesian,      oneOverRadii,      oneOverRadiiSquared,      centerToleranceSquared,      cartesianToCartographicP$1    );    if (!defaultValue.defined(p)) {      return undefined;    }    let n = Cartesian3.multiplyComponents(      p,      oneOverRadiiSquared,      cartesianToCartographicN$1    );    n = Cartesian3.normalize(n, n);    const h = Cartesian3.subtract(cartesian, p, cartesianToCartographicH$1);    const longitude = Math.atan2(n.y, n.x);    const latitude = Math.asin(n.z);    const height =      ComponentDatatype.CesiumMath.sign(Cartesian3.dot(h, cartesian)) * Cartesian3.magnitude(h);    if (!defaultValue.defined(result)) {      return new Cartographic(longitude, latitude, height);    }    result.longitude = longitude;    result.latitude = latitude;    result.height = height;    return result;  };  /**   * Creates a new Cartesian3 instance from a Cartographic input. The values in the inputted   * object should be in radians.   *   * @param {Cartographic} cartographic Input to be converted into a Cartesian3 output.   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the position lies.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The position   */  Cartographic.toCartesian = function (cartographic, ellipsoid, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("cartographic", cartographic);    //>>includeEnd('debug');    return Cartesian3.fromRadians(      cartographic.longitude,      cartographic.latitude,      cartographic.height,      ellipsoid,      result    );  };  /**   * Duplicates a Cartographic instance.   *   * @param {Cartographic} cartographic The cartographic to duplicate.   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided. (Returns undefined if cartographic is undefined)   */  Cartographic.clone = function (cartographic, result) {    if (!defaultValue.defined(cartographic)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Cartographic(        cartographic.longitude,        cartographic.latitude,        cartographic.height      );    }    result.longitude = cartographic.longitude;    result.latitude = cartographic.latitude;    result.height = cartographic.height;    return result;  };  /**   * Compares the provided cartographics componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartographic} [left] The first cartographic.   * @param {Cartographic} [right] The second cartographic.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   */  Cartographic.equals = function (left, right) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        left.longitude === right.longitude &&        left.latitude === right.latitude &&        left.height === right.height)    );  };  /**   * Compares the provided cartographics componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Cartographic} [left] The first cartographic.   * @param {Cartographic} [right] The second cartographic.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Cartographic.equalsEpsilon = function (left, right, epsilon) {    epsilon = defaultValue.defaultValue(epsilon, 0);    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        Math.abs(left.longitude - right.longitude) <= epsilon &&        Math.abs(left.latitude - right.latitude) <= epsilon &&        Math.abs(left.height - right.height) <= epsilon)    );  };  /**   * An immutable Cartographic instance initialized to (0.0, 0.0, 0.0).   *   * @type {Cartographic}   * @constant   */  Cartographic.ZERO = Object.freeze(new Cartographic(0.0, 0.0, 0.0));  /**   * Duplicates this instance.   *   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if one was not provided.   */  Cartographic.prototype.clone = function (result) {    return Cartographic.clone(this, result);  };  /**   * Compares the provided against this cartographic componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartographic} [right] The second cartographic.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   */  Cartographic.prototype.equals = function (right) {    return Cartographic.equals(this, right);  };  /**   * Compares the provided against this cartographic componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Cartographic} [right] The second cartographic.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Cartographic.prototype.equalsEpsilon = function (right, epsilon) {    return Cartographic.equalsEpsilon(this, right, epsilon);  };  /**   * Creates a string representing this cartographic in the format '(longitude, latitude, height)'.   *   * @returns {String} A string representing the provided cartographic in the format '(longitude, latitude, height)'.   */  Cartographic.prototype.toString = function () {    return `(${this.longitude}, ${this.latitude}, ${this.height})`;  };  function initialize(ellipsoid, x, y, z) {    x = defaultValue.defaultValue(x, 0.0);    y = defaultValue.defaultValue(y, 0.0);    z = defaultValue.defaultValue(z, 0.0);    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("x", x, 0.0);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("y", y, 0.0);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("z", z, 0.0);    //>>includeEnd('debug');    ellipsoid._radii = new Cartesian3(x, y, z);    ellipsoid._radiiSquared = new Cartesian3(x * x, y * y, z * z);    ellipsoid._radiiToTheFourth = new Cartesian3(      x * x * x * x,      y * y * y * y,      z * z * z * z    );    ellipsoid._oneOverRadii = new Cartesian3(      x === 0.0 ? 0.0 : 1.0 / x,      y === 0.0 ? 0.0 : 1.0 / y,      z === 0.0 ? 0.0 : 1.0 / z    );    ellipsoid._oneOverRadiiSquared = new Cartesian3(      x === 0.0 ? 0.0 : 1.0 / (x * x),      y === 0.0 ? 0.0 : 1.0 / (y * y),      z === 0.0 ? 0.0 : 1.0 / (z * z)    );    ellipsoid._minimumRadius = Math.min(x, y, z);    ellipsoid._maximumRadius = Math.max(x, y, z);    ellipsoid._centerToleranceSquared = ComponentDatatype.CesiumMath.EPSILON1;    if (ellipsoid._radiiSquared.z !== 0) {      ellipsoid._squaredXOverSquaredZ =        ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z;    }  }  /**   * A quadratic surface defined in Cartesian coordinates by the equation   * <code>(x / a)^2 + (y / b)^2 + (z / c)^2 = 1</code>.  Primarily used   * by Cesium to represent the shape of planetary bodies.   *   * Rather than constructing this object directly, one of the provided   * constants is normally used.   * @alias Ellipsoid   * @constructor   *   * @param {Number} [x=0] The radius in the x direction.   * @param {Number} [y=0] The radius in the y direction.   * @param {Number} [z=0] The radius in the z direction.   *   * @exception {DeveloperError} All radii components must be greater than or equal to zero.   *   * @see Ellipsoid.fromCartesian3   * @see Ellipsoid.WGS84   * @see Ellipsoid.UNIT_SPHERE   */  function Ellipsoid(x, y, z) {    this._radii = undefined;    this._radiiSquared = undefined;    this._radiiToTheFourth = undefined;    this._oneOverRadii = undefined;    this._oneOverRadiiSquared = undefined;    this._minimumRadius = undefined;    this._maximumRadius = undefined;    this._centerToleranceSquared = undefined;    this._squaredXOverSquaredZ = undefined;    initialize(this, x, y, z);  }  Object.defineProperties(Ellipsoid.prototype, {    /**     * Gets the radii of the ellipsoid.     * @memberof Ellipsoid.prototype     * @type {Cartesian3}     * @readonly     */    radii: {      get: function () {        return this._radii;      },    },    /**     * Gets the squared radii of the ellipsoid.     * @memberof Ellipsoid.prototype     * @type {Cartesian3}     * @readonly     */    radiiSquared: {      get: function () {        return this._radiiSquared;      },    },    /**     * Gets the radii of the ellipsoid raise to the fourth power.     * @memberof Ellipsoid.prototype     * @type {Cartesian3}     * @readonly     */    radiiToTheFourth: {      get: function () {        return this._radiiToTheFourth;      },    },    /**     * Gets one over the radii of the ellipsoid.     * @memberof Ellipsoid.prototype     * @type {Cartesian3}     * @readonly     */    oneOverRadii: {      get: function () {        return this._oneOverRadii;      },    },    /**     * Gets one over the squared radii of the ellipsoid.     * @memberof Ellipsoid.prototype     * @type {Cartesian3}     * @readonly     */    oneOverRadiiSquared: {      get: function () {        return this._oneOverRadiiSquared;      },    },    /**     * Gets the minimum radius of the ellipsoid.     * @memberof Ellipsoid.prototype     * @type {Number}     * @readonly     */    minimumRadius: {      get: function () {        return this._minimumRadius;      },    },    /**     * Gets the maximum radius of the ellipsoid.     * @memberof Ellipsoid.prototype     * @type {Number}     * @readonly     */    maximumRadius: {      get: function () {        return this._maximumRadius;      },    },  });  /**   * Duplicates an Ellipsoid instance.   *   * @param {Ellipsoid} ellipsoid The ellipsoid to duplicate.   * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new   *                    instance should be created.   * @returns {Ellipsoid} The cloned Ellipsoid. (Returns undefined if ellipsoid is undefined)   */  Ellipsoid.clone = function (ellipsoid, result) {    if (!defaultValue.defined(ellipsoid)) {      return undefined;    }    const radii = ellipsoid._radii;    if (!defaultValue.defined(result)) {      return new Ellipsoid(radii.x, radii.y, radii.z);    }    Cartesian3.clone(radii, result._radii);    Cartesian3.clone(ellipsoid._radiiSquared, result._radiiSquared);    Cartesian3.clone(ellipsoid._radiiToTheFourth, result._radiiToTheFourth);    Cartesian3.clone(ellipsoid._oneOverRadii, result._oneOverRadii);    Cartesian3.clone(ellipsoid._oneOverRadiiSquared, result._oneOverRadiiSquared);    result._minimumRadius = ellipsoid._minimumRadius;    result._maximumRadius = ellipsoid._maximumRadius;    result._centerToleranceSquared = ellipsoid._centerToleranceSquared;    return result;  };  /**   * Computes an Ellipsoid from a Cartesian specifying the radii in x, y, and z directions.   *   * @param {Cartesian3} [cartesian=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions.   * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new   *                    instance should be created.   * @returns {Ellipsoid} A new Ellipsoid instance.   *   * @exception {DeveloperError} All radii components must be greater than or equal to zero.   *   * @see Ellipsoid.WGS84   * @see Ellipsoid.UNIT_SPHERE   */  Ellipsoid.fromCartesian3 = function (cartesian, result) {    if (!defaultValue.defined(result)) {      result = new Ellipsoid();    }    if (!defaultValue.defined(cartesian)) {      return result;    }    initialize(result, cartesian.x, cartesian.y, cartesian.z);    return result;  };  /**   * An Ellipsoid instance initialized to the WGS84 standard.   *   * @type {Ellipsoid}   * @constant   */  Ellipsoid.WGS84 = Object.freeze(    new Ellipsoid(6378137.0, 6378137.0, 6356752.3142451793)  );  /**   * An Ellipsoid instance initialized to radii of (1.0, 1.0, 1.0).   *   * @type {Ellipsoid}   * @constant   */  Ellipsoid.UNIT_SPHERE = Object.freeze(new Ellipsoid(1.0, 1.0, 1.0));  /**   * An Ellipsoid instance initialized to a sphere with the lunar radius.   *   * @type {Ellipsoid}   * @constant   */  Ellipsoid.MOON = Object.freeze(    new Ellipsoid(      ComponentDatatype.CesiumMath.LUNAR_RADIUS,      ComponentDatatype.CesiumMath.LUNAR_RADIUS,      ComponentDatatype.CesiumMath.LUNAR_RADIUS    )  );  /**   * Duplicates an Ellipsoid instance.   *   * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new   *                    instance should be created.   * @returns {Ellipsoid} The cloned Ellipsoid.   */  Ellipsoid.prototype.clone = function (result) {    return Ellipsoid.clone(this, result);  };  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Ellipsoid.packedLength = Cartesian3.packedLength;  /**   * Stores the provided instance into the provided array.   *   * @param {Ellipsoid} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Ellipsoid.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    Cartesian3.pack(value._radii, array, startingIndex);    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Ellipsoid} [result] The object into which to store the result.   * @returns {Ellipsoid} The modified result parameter or a new Ellipsoid instance if one was not provided.   */  Ellipsoid.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    const radii = Cartesian3.unpack(array, startingIndex);    return Ellipsoid.fromCartesian3(radii, result);  };  /**   * Computes the unit vector directed from the center of this ellipsoid toward the provided Cartesian position.   * @function   *   * @param {Cartesian3} cartesian The Cartesian for which to to determine the geocentric normal.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.   */  Ellipsoid.prototype.geocentricSurfaceNormal = Cartesian3.normalize;  /**   * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position.   *   * @param {Cartographic} cartographic The cartographic position for which to to determine the geodetic normal.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.   */  Ellipsoid.prototype.geodeticSurfaceNormalCartographic = function (    cartographic,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartographic", cartographic);    //>>includeEnd('debug');    const longitude = cartographic.longitude;    const latitude = cartographic.latitude;    const cosLatitude = Math.cos(latitude);    const x = cosLatitude * Math.cos(longitude);    const y = cosLatitude * Math.sin(longitude);    const z = Math.sin(latitude);    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    result.x = x;    result.y = y;    result.z = z;    return Cartesian3.normalize(result, result);  };  /**   * Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position.   *   * @param {Cartesian3} cartesian The Cartesian position for which to to determine the surface normal.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided, or undefined if a normal cannot be found.   */  Ellipsoid.prototype.geodeticSurfaceNormal = function (cartesian, result) {    if (      Cartesian3.equalsEpsilon(cartesian, Cartesian3.ZERO, ComponentDatatype.CesiumMath.EPSILON14)    ) {      return undefined;    }    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    result = Cartesian3.multiplyComponents(      cartesian,      this._oneOverRadiiSquared,      result    );    return Cartesian3.normalize(result, result);  };  const cartographicToCartesianNormal = new Cartesian3();  const cartographicToCartesianK = new Cartesian3();  /**   * Converts the provided cartographic to Cartesian representation.   *   * @param {Cartographic} cartographic The cartographic position.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.   *   * @example   * //Create a Cartographic and determine it's Cartesian representation on a WGS84 ellipsoid.   * const position = new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 5000);   * const cartesianPosition = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);   */  Ellipsoid.prototype.cartographicToCartesian = function (cartographic, result) {    //`cartographic is required` is thrown from geodeticSurfaceNormalCartographic.    const n = cartographicToCartesianNormal;    const k = cartographicToCartesianK;    this.geodeticSurfaceNormalCartographic(cartographic, n);    Cartesian3.multiplyComponents(this._radiiSquared, n, k);    const gamma = Math.sqrt(Cartesian3.dot(n, k));    Cartesian3.divideByScalar(k, gamma, k);    Cartesian3.multiplyByScalar(n, cartographic.height, n);    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    return Cartesian3.add(k, n, result);  };  /**   * Converts the provided array of cartographics to an array of Cartesians.   *   * @param {Cartographic[]} cartographics An array of cartographic positions.   * @param {Cartesian3[]} [result] The object onto which to store the result.   * @returns {Cartesian3[]} The modified result parameter or a new Array instance if none was provided.   *   * @example   * //Convert an array of Cartographics and determine their Cartesian representation on a WGS84 ellipsoid.   * const positions = [new Cesium.Cartographic(Cesium.Math.toRadians(21), Cesium.Math.toRadians(78), 0),   *                  new Cesium.Cartographic(Cesium.Math.toRadians(21.321), Cesium.Math.toRadians(78.123), 100),   *                  new Cesium.Cartographic(Cesium.Math.toRadians(21.645), Cesium.Math.toRadians(78.456), 250)];   * const cartesianPositions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(positions);   */  Ellipsoid.prototype.cartographicArrayToCartesianArray = function (    cartographics,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("cartographics", cartographics);    //>>includeEnd('debug')    const length = cartographics.length;    if (!defaultValue.defined(result)) {      result = new Array(length);    } else {      result.length = length;    }    for (let i = 0; i < length; i++) {      result[i] = this.cartographicToCartesian(cartographics[i], result[i]);    }    return result;  };  const cartesianToCartographicN = new Cartesian3();  const cartesianToCartographicP = new Cartesian3();  const cartesianToCartographicH = new Cartesian3();  /**   * Converts the provided cartesian to cartographic representation.   * The cartesian is undefined at the center of the ellipsoid.   *   * @param {Cartesian3} cartesian The Cartesian position to convert to cartographic representation.   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.   *   * @example   * //Create a Cartesian and determine it's Cartographic representation on a WGS84 ellipsoid.   * const position = new Cesium.Cartesian3(17832.12, 83234.52, 952313.73);   * const cartographicPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);   */  Ellipsoid.prototype.cartesianToCartographic = function (cartesian, result) {    //`cartesian is required.` is thrown from scaleToGeodeticSurface    const p = this.scaleToGeodeticSurface(cartesian, cartesianToCartographicP);    if (!defaultValue.defined(p)) {      return undefined;    }    const n = this.geodeticSurfaceNormal(p, cartesianToCartographicN);    const h = Cartesian3.subtract(cartesian, p, cartesianToCartographicH);    const longitude = Math.atan2(n.y, n.x);    const latitude = Math.asin(n.z);    const height =      ComponentDatatype.CesiumMath.sign(Cartesian3.dot(h, cartesian)) * Cartesian3.magnitude(h);    if (!defaultValue.defined(result)) {      return new Cartographic(longitude, latitude, height);    }    result.longitude = longitude;    result.latitude = latitude;    result.height = height;    return result;  };  /**   * Converts the provided array of cartesians to an array of cartographics.   *   * @param {Cartesian3[]} cartesians An array of Cartesian positions.   * @param {Cartographic[]} [result] The object onto which to store the result.   * @returns {Cartographic[]} The modified result parameter or a new Array instance if none was provided.   *   * @example   * //Create an array of Cartesians and determine their Cartographic representation on a WGS84 ellipsoid.   * const positions = [new Cesium.Cartesian3(17832.12, 83234.52, 952313.73),   *                  new Cesium.Cartesian3(17832.13, 83234.53, 952313.73),   *                  new Cesium.Cartesian3(17832.14, 83234.54, 952313.73)]   * const cartographicPositions = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions);   */  Ellipsoid.prototype.cartesianArrayToCartographicArray = function (    cartesians,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("cartesians", cartesians);    //>>includeEnd('debug');    const length = cartesians.length;    if (!defaultValue.defined(result)) {      result = new Array(length);    } else {      result.length = length;    }    for (let i = 0; i < length; ++i) {      result[i] = this.cartesianToCartographic(cartesians[i], result[i]);    }    return result;  };  /**   * Scales the provided Cartesian position along the geodetic surface normal   * so that it is on the surface of this ellipsoid.  If the position is   * at the center of the ellipsoid, this function returns undefined.   *   * @param {Cartesian3} cartesian The Cartesian position to scale.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter, a new Cartesian3 instance if none was provided, or undefined if the position is at the center.   */  Ellipsoid.prototype.scaleToGeodeticSurface = function (cartesian, result) {    return scaleToGeodeticSurface(      cartesian,      this._oneOverRadii,      this._oneOverRadiiSquared,      this._centerToleranceSquared,      result    );  };  /**   * Scales the provided Cartesian position along the geocentric surface normal   * so that it is on the surface of this ellipsoid.   *   * @param {Cartesian3} cartesian The Cartesian position to scale.   * @param {Cartesian3} [result] The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter or a new Cartesian3 instance if none was provided.   */  Ellipsoid.prototype.scaleToGeocentricSurface = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    const positionX = cartesian.x;    const positionY = cartesian.y;    const positionZ = cartesian.z;    const oneOverRadiiSquared = this._oneOverRadiiSquared;    const beta =      1.0 /      Math.sqrt(        positionX * positionX * oneOverRadiiSquared.x +          positionY * positionY * oneOverRadiiSquared.y +          positionZ * positionZ * oneOverRadiiSquared.z      );    return Cartesian3.multiplyByScalar(cartesian, beta, result);  };  /**   * Transforms a Cartesian X, Y, Z position to the ellipsoid-scaled space by multiplying   * its components by the result of {@link Ellipsoid#oneOverRadii}.   *   * @param {Cartesian3} position The position to transform.   * @param {Cartesian3} [result] The position to which to copy the result, or undefined to create and   *        return a new instance.   * @returns {Cartesian3} The position expressed in the scaled space.  The returned instance is the   *          one passed as the result parameter if it is not undefined, or a new instance of it is.   */  Ellipsoid.prototype.transformPositionToScaledSpace = function (    position,    result  ) {    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    return Cartesian3.multiplyComponents(position, this._oneOverRadii, result);  };  /**   * Transforms a Cartesian X, Y, Z position from the ellipsoid-scaled space by multiplying   * its components by the result of {@link Ellipsoid#radii}.   *   * @param {Cartesian3} position The position to transform.   * @param {Cartesian3} [result] The position to which to copy the result, or undefined to create and   *        return a new instance.   * @returns {Cartesian3} The position expressed in the unscaled space.  The returned instance is the   *          one passed as the result parameter if it is not undefined, or a new instance of it is.   */  Ellipsoid.prototype.transformPositionFromScaledSpace = function (    position,    result  ) {    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    return Cartesian3.multiplyComponents(position, this._radii, result);  };  /**   * Compares this Ellipsoid against the provided Ellipsoid componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Ellipsoid} [right] The other Ellipsoid.   * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.   */  Ellipsoid.prototype.equals = function (right) {    return (      this === right ||      (defaultValue.defined(right) && Cartesian3.equals(this._radii, right._radii))    );  };  /**   * Creates a string representing this Ellipsoid in the format '(radii.x, radii.y, radii.z)'.   *   * @returns {String} A string representing this ellipsoid in the format '(radii.x, radii.y, radii.z)'.   */  Ellipsoid.prototype.toString = function () {    return this._radii.toString();  };  /**   * Computes a point which is the intersection of the surface normal with the z-axis.   *   * @param {Cartesian3} position the position. must be on the surface of the ellipsoid.   * @param {Number} [buffer = 0.0] A buffer to subtract from the ellipsoid size when checking if the point is inside the ellipsoid.   *                                In earth case, with common earth datums, there is no need for this buffer since the intersection point is always (relatively) very close to the center.   *                                In WGS84 datum, intersection point is at max z = +-42841.31151331382 (0.673% of z-axis).   *                                Intersection point could be outside the ellipsoid if the ratio of MajorAxis / AxisOfRotation is bigger than the square root of 2   * @param {Cartesian3} [result] The cartesian to which to copy the result, or undefined to create and   *        return a new instance.   * @returns {Cartesian3 | undefined} the intersection point if it's inside the ellipsoid, undefined otherwise   *   * @exception {DeveloperError} position is required.   * @exception {DeveloperError} Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y).   * @exception {DeveloperError} Ellipsoid.radii.z must be greater than 0.   */  Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function (    position,    buffer,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("position", position);    if (      !ComponentDatatype.CesiumMath.equalsEpsilon(        this._radii.x,        this._radii.y,        ComponentDatatype.CesiumMath.EPSILON15      )    ) {      throw new RuntimeError.DeveloperError(        "Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)"      );    }    RuntimeError.Check.typeOf.number.greaterThan("Ellipsoid.radii.z", this._radii.z, 0);    //>>includeEnd('debug');    buffer = defaultValue.defaultValue(buffer, 0.0);    const squaredXOverSquaredZ = this._squaredXOverSquaredZ;    if (!defaultValue.defined(result)) {      result = new Cartesian3();    }    result.x = 0.0;    result.y = 0.0;    result.z = position.z * (1 - squaredXOverSquaredZ);    if (Math.abs(result.z) >= this._radii.z - buffer) {      return undefined;    }    return result;  };  const abscissas = [    0.14887433898163,    0.43339539412925,    0.67940956829902,    0.86506336668898,    0.97390652851717,    0.0,  ];  const weights = [    0.29552422471475,    0.26926671930999,    0.21908636251598,    0.14945134915058,    0.066671344308684,    0.0,  ];  /**   * Compute the 10th order Gauss-Legendre Quadrature of the given definite integral.   *   * @param {Number} a The lower bound for the integration.   * @param {Number} b The upper bound for the integration.   * @param {Ellipsoid~RealValuedScalarFunction} func The function to integrate.   * @returns {Number} The value of the integral of the given function over the given domain.   *   * @private   */  function gaussLegendreQuadrature(a, b, func) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("a", a);    RuntimeError.Check.typeOf.number("b", b);    RuntimeError.Check.typeOf.func("func", func);    //>>includeEnd('debug');    // The range is half of the normal range since the five weights add to one (ten weights add to two).    // The values of the abscissas are multiplied by two to account for this.    const xMean = 0.5 * (b + a);    const xRange = 0.5 * (b - a);    let sum = 0.0;    for (let i = 0; i < 5; i++) {      const dx = xRange * abscissas[i];      sum += weights[i] * (func(xMean + dx) + func(xMean - dx));    }    // Scale the sum to the range of x.    sum *= xRange;    return sum;  }  /**   * A real valued scalar function.   * @callback Ellipsoid~RealValuedScalarFunction   *   * @param {Number} x The value used to evaluate the function.   * @returns {Number} The value of the function at x.   *   * @private   */  /**   * Computes an approximation of the surface area of a rectangle on the surface of an ellipsoid using   * Gauss-Legendre 10th order quadrature.   *   * @param {Rectangle} rectangle The rectangle used for computing the surface area.   * @returns {Number} The approximate area of the rectangle on the surface of this ellipsoid.   */  Ellipsoid.prototype.surfaceArea = function (rectangle) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    const minLongitude = rectangle.west;    let maxLongitude = rectangle.east;    const minLatitude = rectangle.south;    const maxLatitude = rectangle.north;    while (maxLongitude < minLongitude) {      maxLongitude += ComponentDatatype.CesiumMath.TWO_PI;    }    const radiiSquared = this._radiiSquared;    const a2 = radiiSquared.x;    const b2 = radiiSquared.y;    const c2 = radiiSquared.z;    const a2b2 = a2 * b2;    return gaussLegendreQuadrature(minLatitude, maxLatitude, function (lat) {      // phi represents the angle measured from the north pole      // sin(phi) = sin(pi / 2 - lat) = cos(lat), cos(phi) is similar      const sinPhi = Math.cos(lat);      const cosPhi = Math.sin(lat);      return (        Math.cos(lat) *        gaussLegendreQuadrature(minLongitude, maxLongitude, function (lon) {          const cosTheta = Math.cos(lon);          const sinTheta = Math.sin(lon);          return Math.sqrt(            a2b2 * cosPhi * cosPhi +              c2 *                (b2 * cosTheta * cosTheta + a2 * sinTheta * sinTheta) *                sinPhi *                sinPhi          );        })      );    });  };  /**   * A 3x3 matrix, indexable as a column-major order array.   * Constructor parameters are in row-major order for code readability.   * @alias Matrix3   * @constructor   * @implements {ArrayLike<number>}   *   * @param {Number} [column0Row0=0.0] The value for column 0, row 0.   * @param {Number} [column1Row0=0.0] The value for column 1, row 0.   * @param {Number} [column2Row0=0.0] The value for column 2, row 0.   * @param {Number} [column0Row1=0.0] The value for column 0, row 1.   * @param {Number} [column1Row1=0.0] The value for column 1, row 1.   * @param {Number} [column2Row1=0.0] The value for column 2, row 1.   * @param {Number} [column0Row2=0.0] The value for column 0, row 2.   * @param {Number} [column1Row2=0.0] The value for column 1, row 2.   * @param {Number} [column2Row2=0.0] The value for column 2, row 2.   *   * @see Matrix3.fromArray   * @see Matrix3.fromColumnMajorArray   * @see Matrix3.fromRowMajorArray   * @see Matrix3.fromQuaternion   * @see Matrix3.fromHeadingPitchRoll   * @see Matrix3.fromScale   * @see Matrix3.fromUniformScale   * @see Matrix3.fromCrossProduct   * @see Matrix3.fromRotationX   * @see Matrix3.fromRotationY   * @see Matrix3.fromRotationZ   * @see Matrix2   * @see Matrix4   */  function Matrix3(    column0Row0,    column1Row0,    column2Row0,    column0Row1,    column1Row1,    column2Row1,    column0Row2,    column1Row2,    column2Row2  ) {    this[0] = defaultValue.defaultValue(column0Row0, 0.0);    this[1] = defaultValue.defaultValue(column0Row1, 0.0);    this[2] = defaultValue.defaultValue(column0Row2, 0.0);    this[3] = defaultValue.defaultValue(column1Row0, 0.0);    this[4] = defaultValue.defaultValue(column1Row1, 0.0);    this[5] = defaultValue.defaultValue(column1Row2, 0.0);    this[6] = defaultValue.defaultValue(column2Row0, 0.0);    this[7] = defaultValue.defaultValue(column2Row1, 0.0);    this[8] = defaultValue.defaultValue(column2Row2, 0.0);  }  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Matrix3.packedLength = 9;  /**   * Stores the provided instance into the provided array.   *   * @param {Matrix3} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Matrix3.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    array[startingIndex++] = value[0];    array[startingIndex++] = value[1];    array[startingIndex++] = value[2];    array[startingIndex++] = value[3];    array[startingIndex++] = value[4];    array[startingIndex++] = value[5];    array[startingIndex++] = value[6];    array[startingIndex++] = value[7];    array[startingIndex++] = value[8];    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Matrix3} [result] The object into which to store the result.   * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided.   */  Matrix3.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    if (!defaultValue.defined(result)) {      result = new Matrix3();    }    result[0] = array[startingIndex++];    result[1] = array[startingIndex++];    result[2] = array[startingIndex++];    result[3] = array[startingIndex++];    result[4] = array[startingIndex++];    result[5] = array[startingIndex++];    result[6] = array[startingIndex++];    result[7] = array[startingIndex++];    result[8] = array[startingIndex++];    return result;  };  /**   * Flattens an array of Matrix3s into an array of components. The components   * are stored in column-major order.   *   * @param {Matrix3[]} array The array of matrices to pack.   * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 9 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 9) elements.   * @returns {Number[]} The packed array.   */  Matrix3.packArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    const length = array.length;    const resultLength = length * 9;    if (!defaultValue.defined(result)) {      result = new Array(resultLength);    } else if (!Array.isArray(result) && result.length !== resultLength) {      //>>includeStart('debug', pragmas.debug);      throw new RuntimeError.DeveloperError(        "If result is a typed array, it must have exactly array.length * 9 elements"      );      //>>includeEnd('debug');    } else if (result.length !== resultLength) {      result.length = resultLength;    }    for (let i = 0; i < length; ++i) {      Matrix3.pack(array[i], result, i * 9);    }    return result;  };  /**   * Unpacks an array of column-major matrix components into an array of Matrix3s.   *   * @param {Number[]} array The array of components to unpack.   * @param {Matrix3[]} [result] The array onto which to store the result.   * @returns {Matrix3[]} The unpacked array.   */  Matrix3.unpackArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("array.length", array.length, 9);    if (array.length % 9 !== 0) {      throw new RuntimeError.DeveloperError("array length must be a multiple of 9.");    }    //>>includeEnd('debug');    const length = array.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 9);    } else {      result.length = length / 9;    }    for (let i = 0; i < length; i += 9) {      const index = i / 9;      result[index] = Matrix3.unpack(array, i, result[index]);    }    return result;  };  /**   * Duplicates a Matrix3 instance.   *   * @param {Matrix3} matrix The matrix to duplicate.   * @param {Matrix3} [result] The object onto which to store the result.   * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided. (Returns undefined if matrix is undefined)   */  Matrix3.clone = function (matrix, result) {    if (!defaultValue.defined(matrix)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Matrix3(        matrix[0],        matrix[3],        matrix[6],        matrix[1],        matrix[4],        matrix[7],        matrix[2],        matrix[5],        matrix[8]      );    }    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    result[4] = matrix[4];    result[5] = matrix[5];    result[6] = matrix[6];    result[7] = matrix[7];    result[8] = matrix[8];    return result;  };  /**   * Creates a Matrix3 from 9 consecutive elements in an array.   *   * @function   * @param {Number[]} array The array whose 9 consecutive elements correspond to the positions of the matrix.  Assumes column-major order.   * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to first column first row position in the matrix.   * @param {Matrix3} [result] The object onto which to store the result.   * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided.   *   * @example   * // Create the Matrix3:   * // [1.0, 2.0, 3.0]   * // [1.0, 2.0, 3.0]   * // [1.0, 2.0, 3.0]   *   * const v = [1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0];   * const m = Cesium.Matrix3.fromArray(v);   *   * // Create same Matrix3 with using an offset into an array   * const v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0];   * const m2 = Cesium.Matrix3.fromArray(v2, 2);   */  Matrix3.fromArray = Matrix3.unpack;  /**   * Creates a Matrix3 instance from a column-major order array.   *   * @param {Number[]} values The column-major order array.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   */  Matrix3.fromColumnMajorArray = function (values, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("values", values);    //>>includeEnd('debug');    return Matrix3.clone(values, result);  };  /**   * Creates a Matrix3 instance from a row-major order array.   * The resulting matrix will be in column-major order.   *   * @param {Number[]} values The row-major order array.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   */  Matrix3.fromRowMajorArray = function (values, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("values", values);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix3(        values[0],        values[1],        values[2],        values[3],        values[4],        values[5],        values[6],        values[7],        values[8]      );    }    result[0] = values[0];    result[1] = values[3];    result[2] = values[6];    result[3] = values[1];    result[4] = values[4];    result[5] = values[7];    result[6] = values[2];    result[7] = values[5];    result[8] = values[8];    return result;  };  /**   * Computes a 3x3 rotation matrix from the provided quaternion.   *   * @param {Quaternion} quaternion the quaternion to use.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The 3x3 rotation matrix from this quaternion.   */  Matrix3.fromQuaternion = function (quaternion, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("quaternion", quaternion);    //>>includeEnd('debug');    const x2 = quaternion.x * quaternion.x;    const xy = quaternion.x * quaternion.y;    const xz = quaternion.x * quaternion.z;    const xw = quaternion.x * quaternion.w;    const y2 = quaternion.y * quaternion.y;    const yz = quaternion.y * quaternion.z;    const yw = quaternion.y * quaternion.w;    const z2 = quaternion.z * quaternion.z;    const zw = quaternion.z * quaternion.w;    const w2 = quaternion.w * quaternion.w;    const m00 = x2 - y2 - z2 + w2;    const m01 = 2.0 * (xy - zw);    const m02 = 2.0 * (xz + yw);    const m10 = 2.0 * (xy + zw);    const m11 = -x2 + y2 - z2 + w2;    const m12 = 2.0 * (yz - xw);    const m20 = 2.0 * (xz - yw);    const m21 = 2.0 * (yz + xw);    const m22 = -x2 - y2 + z2 + w2;    if (!defaultValue.defined(result)) {      return new Matrix3(m00, m01, m02, m10, m11, m12, m20, m21, m22);    }    result[0] = m00;    result[1] = m10;    result[2] = m20;    result[3] = m01;    result[4] = m11;    result[5] = m21;    result[6] = m02;    result[7] = m12;    result[8] = m22;    return result;  };  /**   * Computes a 3x3 rotation matrix from the provided headingPitchRoll. (see http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles )   *   * @param {HeadingPitchRoll} headingPitchRoll the headingPitchRoll to use.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The 3x3 rotation matrix from this headingPitchRoll.   */  Matrix3.fromHeadingPitchRoll = function (headingPitchRoll, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("headingPitchRoll", headingPitchRoll);    //>>includeEnd('debug');    const cosTheta = Math.cos(-headingPitchRoll.pitch);    const cosPsi = Math.cos(-headingPitchRoll.heading);    const cosPhi = Math.cos(headingPitchRoll.roll);    const sinTheta = Math.sin(-headingPitchRoll.pitch);    const sinPsi = Math.sin(-headingPitchRoll.heading);    const sinPhi = Math.sin(headingPitchRoll.roll);    const m00 = cosTheta * cosPsi;    const m01 = -cosPhi * sinPsi + sinPhi * sinTheta * cosPsi;    const m02 = sinPhi * sinPsi + cosPhi * sinTheta * cosPsi;    const m10 = cosTheta * sinPsi;    const m11 = cosPhi * cosPsi + sinPhi * sinTheta * sinPsi;    const m12 = -sinPhi * cosPsi + cosPhi * sinTheta * sinPsi;    const m20 = -sinTheta;    const m21 = sinPhi * cosTheta;    const m22 = cosPhi * cosTheta;    if (!defaultValue.defined(result)) {      return new Matrix3(m00, m01, m02, m10, m11, m12, m20, m21, m22);    }    result[0] = m00;    result[1] = m10;    result[2] = m20;    result[3] = m01;    result[4] = m11;    result[5] = m21;    result[6] = m02;    result[7] = m12;    result[8] = m22;    return result;  };  /**   * Computes a Matrix3 instance representing a non-uniform scale.   *   * @param {Cartesian3} scale The x, y, and z scale factors.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   *   * @example   * // Creates   * //   [7.0, 0.0, 0.0]   * //   [0.0, 8.0, 0.0]   * //   [0.0, 0.0, 9.0]   * const m = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0));   */  Matrix3.fromScale = function (scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("scale", scale);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix3(scale.x, 0.0, 0.0, 0.0, scale.y, 0.0, 0.0, 0.0, scale.z);    }    result[0] = scale.x;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = scale.y;    result[5] = 0.0;    result[6] = 0.0;    result[7] = 0.0;    result[8] = scale.z;    return result;  };  /**   * Computes a Matrix3 instance representing a uniform scale.   *   * @param {Number} scale The uniform scale factor.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   *   * @example   * // Creates   * //   [2.0, 0.0, 0.0]   * //   [0.0, 2.0, 0.0]   * //   [0.0, 0.0, 2.0]   * const m = Cesium.Matrix3.fromUniformScale(2.0);   */  Matrix3.fromUniformScale = function (scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("scale", scale);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix3(scale, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, scale);    }    result[0] = scale;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = scale;    result[5] = 0.0;    result[6] = 0.0;    result[7] = 0.0;    result[8] = scale;    return result;  };  /**   * Computes a Matrix3 instance representing the cross product equivalent matrix of a Cartesian3 vector.   *   * @param {Cartesian3} vector the vector on the left hand side of the cross product operation.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   *   * @example   * // Creates   * //   [0.0, -9.0,  8.0]   * //   [9.0,  0.0, -7.0]   * //   [-8.0, 7.0,  0.0]   * const m = Cesium.Matrix3.fromCrossProduct(new Cesium.Cartesian3(7.0, 8.0, 9.0));   */  Matrix3.fromCrossProduct = function (vector, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("vector", vector);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix3(        0.0,        -vector.z,        vector.y,        vector.z,        0.0,        -vector.x,        -vector.y,        vector.x,        0.0      );    }    result[0] = 0.0;    result[1] = vector.z;    result[2] = -vector.y;    result[3] = -vector.z;    result[4] = 0.0;    result[5] = vector.x;    result[6] = vector.y;    result[7] = -vector.x;    result[8] = 0.0;    return result;  };  /**   * Creates a rotation matrix around the x-axis.   *   * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   *   * @example   * // Rotate a point 45 degrees counterclockwise around the x-axis.   * const p = new Cesium.Cartesian3(5, 6, 7);   * const m = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(45.0));   * const rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3());   */  Matrix3.fromRotationX = function (angle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("angle", angle);    //>>includeEnd('debug');    const cosAngle = Math.cos(angle);    const sinAngle = Math.sin(angle);    if (!defaultValue.defined(result)) {      return new Matrix3(        1.0,        0.0,        0.0,        0.0,        cosAngle,        -sinAngle,        0.0,        sinAngle,        cosAngle      );    }    result[0] = 1.0;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = cosAngle;    result[5] = sinAngle;    result[6] = 0.0;    result[7] = -sinAngle;    result[8] = cosAngle;    return result;  };  /**   * Creates a rotation matrix around the y-axis.   *   * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   *   * @example   * // Rotate a point 45 degrees counterclockwise around the y-axis.   * const p = new Cesium.Cartesian3(5, 6, 7);   * const m = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(45.0));   * const rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3());   */  Matrix3.fromRotationY = function (angle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("angle", angle);    //>>includeEnd('debug');    const cosAngle = Math.cos(angle);    const sinAngle = Math.sin(angle);    if (!defaultValue.defined(result)) {      return new Matrix3(        cosAngle,        0.0,        sinAngle,        0.0,        1.0,        0.0,        -sinAngle,        0.0,        cosAngle      );    }    result[0] = cosAngle;    result[1] = 0.0;    result[2] = -sinAngle;    result[3] = 0.0;    result[4] = 1.0;    result[5] = 0.0;    result[6] = sinAngle;    result[7] = 0.0;    result[8] = cosAngle;    return result;  };  /**   * Creates a rotation matrix around the z-axis.   *   * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.   * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided.   *   * @example   * // Rotate a point 45 degrees counterclockwise around the z-axis.   * const p = new Cesium.Cartesian3(5, 6, 7);   * const m = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(45.0));   * const rotated = Cesium.Matrix3.multiplyByVector(m, p, new Cesium.Cartesian3());   */  Matrix3.fromRotationZ = function (angle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("angle", angle);    //>>includeEnd('debug');    const cosAngle = Math.cos(angle);    const sinAngle = Math.sin(angle);    if (!defaultValue.defined(result)) {      return new Matrix3(        cosAngle,        -sinAngle,        0.0,        sinAngle,        cosAngle,        0.0,        0.0,        0.0,        1.0      );    }    result[0] = cosAngle;    result[1] = sinAngle;    result[2] = 0.0;    result[3] = -sinAngle;    result[4] = cosAngle;    result[5] = 0.0;    result[6] = 0.0;    result[7] = 0.0;    result[8] = 1.0;    return result;  };  /**   * Creates an Array from the provided Matrix3 instance.   * The array will be in column-major order.   *   * @param {Matrix3} matrix The matrix to use..   * @param {Number[]} [result] The Array onto which to store the result.   * @returns {Number[]} The modified Array parameter or a new Array instance if one was not provided.   */  Matrix3.toArray = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return [        matrix[0],        matrix[1],        matrix[2],        matrix[3],        matrix[4],        matrix[5],        matrix[6],        matrix[7],        matrix[8],      ];    }    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    result[4] = matrix[4];    result[5] = matrix[5];    result[6] = matrix[6];    result[7] = matrix[7];    result[8] = matrix[8];    return result;  };  /**   * Computes the array index of the element at the provided row and column.   *   * @param {Number} column The zero-based index of the column.   * @param {Number} row The zero-based index of the row.   * @returns {Number} The index of the element at the provided row and column.   *   * @exception {DeveloperError} row must be 0, 1, or 2.   * @exception {DeveloperError} column must be 0, 1, or 2.   *   * @example   * const myMatrix = new Cesium.Matrix3();   * const column1Row0Index = Cesium.Matrix3.getElementIndex(1, 0);   * const column1Row0 = myMatrix[column1Row0Index]   * myMatrix[column1Row0Index] = 10.0;   */  Matrix3.getElementIndex = function (column, row) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("row", row, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("row", row, 2);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("column", column, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("column", column, 2);    //>>includeEnd('debug');    return column * 3 + row;  };  /**   * Retrieves a copy of the matrix column at the provided index as a Cartesian3 instance.   *   * @param {Matrix3} matrix The matrix to use.   * @param {Number} index The zero-based index of the column to retrieve.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, or 2.   */  Matrix3.getColumn = function (matrix, index, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 2);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const startIndex = index * 3;    const x = matrix[startIndex];    const y = matrix[startIndex + 1];    const z = matrix[startIndex + 2];    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian3 instance.   *   * @param {Matrix3} matrix The matrix to use.   * @param {Number} index The zero-based index of the column to set.   * @param {Cartesian3} cartesian The Cartesian whose values will be assigned to the specified column.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, or 2.   */  Matrix3.setColumn = function (matrix, index, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 2);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result = Matrix3.clone(matrix, result);    const startIndex = index * 3;    result[startIndex] = cartesian.x;    result[startIndex + 1] = cartesian.y;    result[startIndex + 2] = cartesian.z;    return result;  };  /**   * Retrieves a copy of the matrix row at the provided index as a Cartesian3 instance.   *   * @param {Matrix3} matrix The matrix to use.   * @param {Number} index The zero-based index of the row to retrieve.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, or 2.   */  Matrix3.getRow = function (matrix, index, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 2);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = matrix[index];    const y = matrix[index + 3];    const z = matrix[index + 6];    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian3 instance.   *   * @param {Matrix3} matrix The matrix to use.   * @param {Number} index The zero-based index of the row to set.   * @param {Cartesian3} cartesian The Cartesian whose values will be assigned to the specified row.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, or 2.   */  Matrix3.setRow = function (matrix, index, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 2);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result = Matrix3.clone(matrix, result);    result[index] = cartesian.x;    result[index + 3] = cartesian.y;    result[index + 6] = cartesian.z;    return result;  };  const scaleScratch1$2 = new Cartesian3();  /**   * Computes a new matrix that replaces the scale with the provided scale.   * This assumes the matrix is an affine transformation.   *   * @param {Matrix3} matrix The matrix to use.   * @param {Cartesian3} scale The scale that replaces the scale of the provided matrix.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @see Matrix3.setUniformScale   * @see Matrix3.fromScale   * @see Matrix3.fromUniformScale   * @see Matrix3.multiplyByScale   * @see Matrix3.multiplyByUniformScale   * @see Matrix3.getScale   */  Matrix3.setScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const existingScale = Matrix3.getScale(matrix, scaleScratch1$2);    const scaleRatioX = scale.x / existingScale.x;    const scaleRatioY = scale.y / existingScale.y;    const scaleRatioZ = scale.z / existingScale.z;    result[0] = matrix[0] * scaleRatioX;    result[1] = matrix[1] * scaleRatioX;    result[2] = matrix[2] * scaleRatioX;    result[3] = matrix[3] * scaleRatioY;    result[4] = matrix[4] * scaleRatioY;    result[5] = matrix[5] * scaleRatioY;    result[6] = matrix[6] * scaleRatioZ;    result[7] = matrix[7] * scaleRatioZ;    result[8] = matrix[8] * scaleRatioZ;    return result;  };  const scaleScratch2$2 = new Cartesian3();  /**   * Computes a new matrix that replaces the scale with the provided uniform scale.   * This assumes the matrix is an affine transformation.   *   * @param {Matrix3} matrix The matrix to use.   * @param {Number} scale The uniform scale that replaces the scale of the provided matrix.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @see Matrix3.setScale   * @see Matrix3.fromScale   * @see Matrix3.fromUniformScale   * @see Matrix3.multiplyByScale   * @see Matrix3.multiplyByUniformScale   * @see Matrix3.getScale   */  Matrix3.setUniformScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const existingScale = Matrix3.getScale(matrix, scaleScratch2$2);    const scaleRatioX = scale / existingScale.x;    const scaleRatioY = scale / existingScale.y;    const scaleRatioZ = scale / existingScale.z;    result[0] = matrix[0] * scaleRatioX;    result[1] = matrix[1] * scaleRatioX;    result[2] = matrix[2] * scaleRatioX;    result[3] = matrix[3] * scaleRatioY;    result[4] = matrix[4] * scaleRatioY;    result[5] = matrix[5] * scaleRatioY;    result[6] = matrix[6] * scaleRatioZ;    result[7] = matrix[7] * scaleRatioZ;    result[8] = matrix[8] * scaleRatioZ;    return result;  };  const scratchColumn$2 = new Cartesian3();  /**   * Extracts the non-uniform scale assuming the matrix is an affine transformation.   *   * @param {Matrix3} matrix The matrix.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   *   * @see Matrix3.multiplyByScale   * @see Matrix3.multiplyByUniformScale   * @see Matrix3.fromScale   * @see Matrix3.fromUniformScale   * @see Matrix3.setScale   * @see Matrix3.setUniformScale   */  Matrix3.getScale = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Cartesian3.magnitude(      Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn$2)    );    result.y = Cartesian3.magnitude(      Cartesian3.fromElements(matrix[3], matrix[4], matrix[5], scratchColumn$2)    );    result.z = Cartesian3.magnitude(      Cartesian3.fromElements(matrix[6], matrix[7], matrix[8], scratchColumn$2)    );    return result;  };  const scaleScratch3$2 = new Cartesian3();  /**   * Computes the maximum scale assuming the matrix is an affine transformation.   * The maximum scale is the maximum length of the column vectors.   *   * @param {Matrix3} matrix The matrix.   * @returns {Number} The maximum scale.   */  Matrix3.getMaximumScale = function (matrix) {    Matrix3.getScale(matrix, scaleScratch3$2);    return Cartesian3.maximumComponent(scaleScratch3$2);  };  const scaleScratch4$2 = new Cartesian3();  /**   * Sets the rotation assuming the matrix is an affine transformation.   *   * @param {Matrix3} matrix The matrix.   * @param {Matrix3} rotation The rotation matrix.   * @returns {Matrix3} The modified result parameter.   *   * @see Matrix3.getRotation   */  Matrix3.setRotation = function (matrix, rotation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const scale = Matrix3.getScale(matrix, scaleScratch4$2);    result[0] = rotation[0] * scale.x;    result[1] = rotation[1] * scale.x;    result[2] = rotation[2] * scale.x;    result[3] = rotation[3] * scale.y;    result[4] = rotation[4] * scale.y;    result[5] = rotation[5] * scale.y;    result[6] = rotation[6] * scale.z;    result[7] = rotation[7] * scale.z;    result[8] = rotation[8] * scale.z;    return result;  };  const scaleScratch5$2 = new Cartesian3();  /**   * Extracts the rotation matrix assuming the matrix is an affine transformation.   *   * @param {Matrix3} matrix The matrix.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @see Matrix3.setRotation   */  Matrix3.getRotation = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const scale = Matrix3.getScale(matrix, scaleScratch5$2);    result[0] = matrix[0] / scale.x;    result[1] = matrix[1] / scale.x;    result[2] = matrix[2] / scale.x;    result[3] = matrix[3] / scale.y;    result[4] = matrix[4] / scale.y;    result[5] = matrix[5] / scale.y;    result[6] = matrix[6] / scale.z;    result[7] = matrix[7] / scale.z;    result[8] = matrix[8] / scale.z;    return result;  };  /**   * Computes the product of two matrices.   *   * @param {Matrix3} left The first matrix.   * @param {Matrix3} right The second matrix.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.multiply = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const column0Row0 =      left[0] * right[0] + left[3] * right[1] + left[6] * right[2];    const column0Row1 =      left[1] * right[0] + left[4] * right[1] + left[7] * right[2];    const column0Row2 =      left[2] * right[0] + left[5] * right[1] + left[8] * right[2];    const column1Row0 =      left[0] * right[3] + left[3] * right[4] + left[6] * right[5];    const column1Row1 =      left[1] * right[3] + left[4] * right[4] + left[7] * right[5];    const column1Row2 =      left[2] * right[3] + left[5] * right[4] + left[8] * right[5];    const column2Row0 =      left[0] * right[6] + left[3] * right[7] + left[6] * right[8];    const column2Row1 =      left[1] * right[6] + left[4] * right[7] + left[7] * right[8];    const column2Row2 =      left[2] * right[6] + left[5] * right[7] + left[8] * right[8];    result[0] = column0Row0;    result[1] = column0Row1;    result[2] = column0Row2;    result[3] = column1Row0;    result[4] = column1Row1;    result[5] = column1Row2;    result[6] = column2Row0;    result[7] = column2Row1;    result[8] = column2Row2;    return result;  };  /**   * Computes the sum of two matrices.   *   * @param {Matrix3} left The first matrix.   * @param {Matrix3} right The second matrix.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.add = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = left[0] + right[0];    result[1] = left[1] + right[1];    result[2] = left[2] + right[2];    result[3] = left[3] + right[3];    result[4] = left[4] + right[4];    result[5] = left[5] + right[5];    result[6] = left[6] + right[6];    result[7] = left[7] + right[7];    result[8] = left[8] + right[8];    return result;  };  /**   * Computes the difference of two matrices.   *   * @param {Matrix3} left The first matrix.   * @param {Matrix3} right The second matrix.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.subtract = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = left[0] - right[0];    result[1] = left[1] - right[1];    result[2] = left[2] - right[2];    result[3] = left[3] - right[3];    result[4] = left[4] - right[4];    result[5] = left[5] - right[5];    result[6] = left[6] - right[6];    result[7] = left[7] - right[7];    result[8] = left[8] - right[8];    return result;  };  /**   * Computes the product of a matrix and a column vector.   *   * @param {Matrix3} matrix The matrix.   * @param {Cartesian3} cartesian The column.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Matrix3.multiplyByVector = function (matrix, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const vX = cartesian.x;    const vY = cartesian.y;    const vZ = cartesian.z;    const x = matrix[0] * vX + matrix[3] * vY + matrix[6] * vZ;    const y = matrix[1] * vX + matrix[4] * vY + matrix[7] * vZ;    const z = matrix[2] * vX + matrix[5] * vY + matrix[8] * vZ;    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Computes the product of a matrix and a scalar.   *   * @param {Matrix3} matrix The matrix.   * @param {Number} scalar The number to multiply by.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.multiplyByScalar = function (matrix, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scalar;    result[1] = matrix[1] * scalar;    result[2] = matrix[2] * scalar;    result[3] = matrix[3] * scalar;    result[4] = matrix[4] * scalar;    result[5] = matrix[5] * scalar;    result[6] = matrix[6] * scalar;    result[7] = matrix[7] * scalar;    result[8] = matrix[8] * scalar;    return result;  };  /**   * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix.   *   * @param {Matrix3} matrix The matrix on the left-hand side.   * @param {Number} scale The non-uniform scale on the right-hand side.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   *   * @example   * // Instead of Cesium.Matrix3.multiply(m, Cesium.Matrix3.fromScale(scale), m);   * Cesium.Matrix3.multiplyByScale(m, scale, m);   *   * @see Matrix3.multiplyByUniformScale   * @see Matrix3.fromScale   * @see Matrix3.fromUniformScale   * @see Matrix3.setScale   * @see Matrix3.setUniformScale   * @see Matrix3.getScale   */  Matrix3.multiplyByScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scale.x;    result[1] = matrix[1] * scale.x;    result[2] = matrix[2] * scale.x;    result[3] = matrix[3] * scale.y;    result[4] = matrix[4] * scale.y;    result[5] = matrix[5] * scale.y;    result[6] = matrix[6] * scale.z;    result[7] = matrix[7] * scale.z;    result[8] = matrix[8] * scale.z;    return result;  };  /**   * Computes the product of a matrix times a uniform scale, as if the scale were a scale matrix.   *   * @param {Matrix3} matrix The matrix on the left-hand side.   * @param {Number} scale The uniform scale on the right-hand side.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @example   * // Instead of Cesium.Matrix3.multiply(m, Cesium.Matrix3.fromUniformScale(scale), m);   * Cesium.Matrix3.multiplyByUniformScale(m, scale, m);   *   * @see Matrix3.multiplyByScale   * @see Matrix3.fromScale   * @see Matrix3.fromUniformScale   * @see Matrix3.setScale   * @see Matrix3.setUniformScale   * @see Matrix3.getScale   */  Matrix3.multiplyByUniformScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scale;    result[1] = matrix[1] * scale;    result[2] = matrix[2] * scale;    result[3] = matrix[3] * scale;    result[4] = matrix[4] * scale;    result[5] = matrix[5] * scale;    result[6] = matrix[6] * scale;    result[7] = matrix[7] * scale;    result[8] = matrix[8] * scale;    return result;  };  /**   * Creates a negated copy of the provided matrix.   *   * @param {Matrix3} matrix The matrix to negate.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.negate = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = -matrix[0];    result[1] = -matrix[1];    result[2] = -matrix[2];    result[3] = -matrix[3];    result[4] = -matrix[4];    result[5] = -matrix[5];    result[6] = -matrix[6];    result[7] = -matrix[7];    result[8] = -matrix[8];    return result;  };  /**   * Computes the transpose of the provided matrix.   *   * @param {Matrix3} matrix The matrix to transpose.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.transpose = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const column0Row0 = matrix[0];    const column0Row1 = matrix[3];    const column0Row2 = matrix[6];    const column1Row0 = matrix[1];    const column1Row1 = matrix[4];    const column1Row2 = matrix[7];    const column2Row0 = matrix[2];    const column2Row1 = matrix[5];    const column2Row2 = matrix[8];    result[0] = column0Row0;    result[1] = column0Row1;    result[2] = column0Row2;    result[3] = column1Row0;    result[4] = column1Row1;    result[5] = column1Row2;    result[6] = column2Row0;    result[7] = column2Row1;    result[8] = column2Row2;    return result;  };  function computeFrobeniusNorm(matrix) {    let norm = 0.0;    for (let i = 0; i < 9; ++i) {      const temp = matrix[i];      norm += temp * temp;    }    return Math.sqrt(norm);  }  const rowVal = [1, 0, 0];  const colVal = [2, 2, 1];  function offDiagonalFrobeniusNorm(matrix) {    // Computes the "off-diagonal" Frobenius norm.    // Assumes matrix is symmetric.    let norm = 0.0;    for (let i = 0; i < 3; ++i) {      const temp = matrix[Matrix3.getElementIndex(colVal[i], rowVal[i])];      norm += 2.0 * temp * temp;    }    return Math.sqrt(norm);  }  function shurDecomposition(matrix, result) {    // This routine was created based upon Matrix Computations, 3rd ed., by Golub and Van Loan,    // section 8.4.2 The 2by2 Symmetric Schur Decomposition.    //    // The routine takes a matrix, which is assumed to be symmetric, and    // finds the largest off-diagonal term, and then creates    // a matrix (result) which can be used to help reduce it    const tolerance = ComponentDatatype.CesiumMath.EPSILON15;    let maxDiagonal = 0.0;    let rotAxis = 1;    // find pivot (rotAxis) based on max diagonal of matrix    for (let i = 0; i < 3; ++i) {      const temp = Math.abs(        matrix[Matrix3.getElementIndex(colVal[i], rowVal[i])]      );      if (temp > maxDiagonal) {        rotAxis = i;        maxDiagonal = temp;      }    }    let c = 1.0;    let s = 0.0;    const p = rowVal[rotAxis];    const q = colVal[rotAxis];    if (Math.abs(matrix[Matrix3.getElementIndex(q, p)]) > tolerance) {      const qq = matrix[Matrix3.getElementIndex(q, q)];      const pp = matrix[Matrix3.getElementIndex(p, p)];      const qp = matrix[Matrix3.getElementIndex(q, p)];      const tau = (qq - pp) / 2.0 / qp;      let t;      if (tau < 0.0) {        t = -1.0 / (-tau + Math.sqrt(1.0 + tau * tau));      } else {        t = 1.0 / (tau + Math.sqrt(1.0 + tau * tau));      }      c = 1.0 / Math.sqrt(1.0 + t * t);      s = t * c;    }    result = Matrix3.clone(Matrix3.IDENTITY, result);    result[Matrix3.getElementIndex(p, p)] = result[      Matrix3.getElementIndex(q, q)    ] = c;    result[Matrix3.getElementIndex(q, p)] = s;    result[Matrix3.getElementIndex(p, q)] = -s;    return result;  }  const jMatrix = new Matrix3();  const jMatrixTranspose = new Matrix3();  /**   * Computes the eigenvectors and eigenvalues of a symmetric matrix.   * <p>   * Returns a diagonal matrix and unitary matrix such that:   * <code>matrix = unitary matrix * diagonal matrix * transpose(unitary matrix)</code>   * </p>   * <p>   * The values along the diagonal of the diagonal matrix are the eigenvalues. The columns   * of the unitary matrix are the corresponding eigenvectors.   * </p>   *   * @param {Matrix3} matrix The matrix to decompose into diagonal and unitary matrix. Expected to be symmetric.   * @param {Object} [result] An object with unitary and diagonal properties which are matrices onto which to store the result.   * @returns {Object} An object with unitary and diagonal properties which are the unitary and diagonal matrices, respectively.   *   * @example   * const a = //... symetric matrix   * const result = {   *     unitary : new Cesium.Matrix3(),   *     diagonal : new Cesium.Matrix3()   * };   * Cesium.Matrix3.computeEigenDecomposition(a, result);   *   * const unitaryTranspose = Cesium.Matrix3.transpose(result.unitary, new Cesium.Matrix3());   * const b = Cesium.Matrix3.multiply(result.unitary, result.diagonal, new Cesium.Matrix3());   * Cesium.Matrix3.multiply(b, unitaryTranspose, b); // b is now equal to a   *   * const lambda = Cesium.Matrix3.getColumn(result.diagonal, 0, new Cesium.Cartesian3()).x;  // first eigenvalue   * const v = Cesium.Matrix3.getColumn(result.unitary, 0, new Cesium.Cartesian3());          // first eigenvector   * const c = Cesium.Cartesian3.multiplyByScalar(v, lambda, new Cesium.Cartesian3());        // equal to Cesium.Matrix3.multiplyByVector(a, v)   */  Matrix3.computeEigenDecomposition = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    //>>includeEnd('debug');    // This routine was created based upon Matrix Computations, 3rd ed., by Golub and Van Loan,    // section 8.4.3 The Classical Jacobi Algorithm    const tolerance = ComponentDatatype.CesiumMath.EPSILON20;    const maxSweeps = 10;    let count = 0;    let sweep = 0;    if (!defaultValue.defined(result)) {      result = {};    }    const unitaryMatrix = (result.unitary = Matrix3.clone(      Matrix3.IDENTITY,      result.unitary    ));    const diagMatrix = (result.diagonal = Matrix3.clone(matrix, result.diagonal));    const epsilon = tolerance * computeFrobeniusNorm(diagMatrix);    while (sweep < maxSweeps && offDiagonalFrobeniusNorm(diagMatrix) > epsilon) {      shurDecomposition(diagMatrix, jMatrix);      Matrix3.transpose(jMatrix, jMatrixTranspose);      Matrix3.multiply(diagMatrix, jMatrix, diagMatrix);      Matrix3.multiply(jMatrixTranspose, diagMatrix, diagMatrix);      Matrix3.multiply(unitaryMatrix, jMatrix, unitaryMatrix);      if (++count > 2) {        ++sweep;        count = 0;      }    }    return result;  };  /**   * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements.   *   * @param {Matrix3} matrix The matrix with signed elements.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.abs = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = Math.abs(matrix[0]);    result[1] = Math.abs(matrix[1]);    result[2] = Math.abs(matrix[2]);    result[3] = Math.abs(matrix[3]);    result[4] = Math.abs(matrix[4]);    result[5] = Math.abs(matrix[5]);    result[6] = Math.abs(matrix[6]);    result[7] = Math.abs(matrix[7]);    result[8] = Math.abs(matrix[8]);    return result;  };  /**   * Computes the determinant of the provided matrix.   *   * @param {Matrix3} matrix The matrix to use.   * @returns {Number} The value of the determinant of the matrix.   */  Matrix3.determinant = function (matrix) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    //>>includeEnd('debug');    const m11 = matrix[0];    const m21 = matrix[3];    const m31 = matrix[6];    const m12 = matrix[1];    const m22 = matrix[4];    const m32 = matrix[7];    const m13 = matrix[2];    const m23 = matrix[5];    const m33 = matrix[8];    return (      m11 * (m22 * m33 - m23 * m32) +      m12 * (m23 * m31 - m21 * m33) +      m13 * (m21 * m32 - m22 * m31)    );  };  /**   * Computes the inverse of the provided matrix.   *   * @param {Matrix3} matrix The matrix to invert.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @exception {DeveloperError} matrix is not invertible.   */  Matrix3.inverse = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const m11 = matrix[0];    const m21 = matrix[1];    const m31 = matrix[2];    const m12 = matrix[3];    const m22 = matrix[4];    const m32 = matrix[5];    const m13 = matrix[6];    const m23 = matrix[7];    const m33 = matrix[8];    const determinant = Matrix3.determinant(matrix);    //>>includeStart('debug', pragmas.debug);    if (Math.abs(determinant) <= ComponentDatatype.CesiumMath.EPSILON15) {      throw new RuntimeError.DeveloperError("matrix is not invertible");    }    //>>includeEnd('debug');    result[0] = m22 * m33 - m23 * m32;    result[1] = m23 * m31 - m21 * m33;    result[2] = m21 * m32 - m22 * m31;    result[3] = m13 * m32 - m12 * m33;    result[4] = m11 * m33 - m13 * m31;    result[5] = m12 * m31 - m11 * m32;    result[6] = m12 * m23 - m13 * m22;    result[7] = m13 * m21 - m11 * m23;    result[8] = m11 * m22 - m12 * m21;    const scale = 1.0 / determinant;    return Matrix3.multiplyByScalar(result, scale, result);  };  const scratchTransposeMatrix$1 = new Matrix3();  /**   * Computes the inverse transpose of a matrix.   *   * @param {Matrix3} matrix The matrix to transpose and invert.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   */  Matrix3.inverseTranspose = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    return Matrix3.inverse(      Matrix3.transpose(matrix, scratchTransposeMatrix$1),      result    );  };  /**   * Compares the provided matrices componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Matrix3} [left] The first matrix.   * @param {Matrix3} [right] The second matrix.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   */  Matrix3.equals = function (left, right) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        left[0] === right[0] &&        left[1] === right[1] &&        left[2] === right[2] &&        left[3] === right[3] &&        left[4] === right[4] &&        left[5] === right[5] &&        left[6] === right[6] &&        left[7] === right[7] &&        left[8] === right[8])    );  };  /**   * Compares the provided matrices componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Matrix3} [left] The first matrix.   * @param {Matrix3} [right] The second matrix.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Matrix3.equalsEpsilon = function (left, right, epsilon) {    epsilon = defaultValue.defaultValue(epsilon, 0);    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        Math.abs(left[0] - right[0]) <= epsilon &&        Math.abs(left[1] - right[1]) <= epsilon &&        Math.abs(left[2] - right[2]) <= epsilon &&        Math.abs(left[3] - right[3]) <= epsilon &&        Math.abs(left[4] - right[4]) <= epsilon &&        Math.abs(left[5] - right[5]) <= epsilon &&        Math.abs(left[6] - right[6]) <= epsilon &&        Math.abs(left[7] - right[7]) <= epsilon &&        Math.abs(left[8] - right[8]) <= epsilon)    );  };  /**   * An immutable Matrix3 instance initialized to the identity matrix.   *   * @type {Matrix3}   * @constant   */  Matrix3.IDENTITY = Object.freeze(    new Matrix3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)  );  /**   * An immutable Matrix3 instance initialized to the zero matrix.   *   * @type {Matrix3}   * @constant   */  Matrix3.ZERO = Object.freeze(    new Matrix3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)  );  /**   * The index into Matrix3 for column 0, row 0.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN0ROW0 = 0;  /**   * The index into Matrix3 for column 0, row 1.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN0ROW1 = 1;  /**   * The index into Matrix3 for column 0, row 2.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN0ROW2 = 2;  /**   * The index into Matrix3 for column 1, row 0.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN1ROW0 = 3;  /**   * The index into Matrix3 for column 1, row 1.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN1ROW1 = 4;  /**   * The index into Matrix3 for column 1, row 2.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN1ROW2 = 5;  /**   * The index into Matrix3 for column 2, row 0.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN2ROW0 = 6;  /**   * The index into Matrix3 for column 2, row 1.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN2ROW1 = 7;  /**   * The index into Matrix3 for column 2, row 2.   *   * @type {Number}   * @constant   */  Matrix3.COLUMN2ROW2 = 8;  Object.defineProperties(Matrix3.prototype, {    /**     * Gets the number of items in the collection.     * @memberof Matrix3.prototype     *     * @type {Number}     */    length: {      get: function () {        return Matrix3.packedLength;      },    },  });  /**   * Duplicates the provided Matrix3 instance.   *   * @param {Matrix3} [result] The object onto which to store the result.   * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided.   */  Matrix3.prototype.clone = function (result) {    return Matrix3.clone(this, result);  };  /**   * Compares this matrix to the provided matrix componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Matrix3} [right] The right hand side matrix.   * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.   */  Matrix3.prototype.equals = function (right) {    return Matrix3.equals(this, right);  };  /**   * @private   */  Matrix3.equalsArray = function (matrix, array, offset) {    return (      matrix[0] === array[offset] &&      matrix[1] === array[offset + 1] &&      matrix[2] === array[offset + 2] &&      matrix[3] === array[offset + 3] &&      matrix[4] === array[offset + 4] &&      matrix[5] === array[offset + 5] &&      matrix[6] === array[offset + 6] &&      matrix[7] === array[offset + 7] &&      matrix[8] === array[offset + 8]    );  };  /**   * Compares this matrix to the provided matrix componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Matrix3} [right] The right hand side matrix.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.   */  Matrix3.prototype.equalsEpsilon = function (right, epsilon) {    return Matrix3.equalsEpsilon(this, right, epsilon);  };  /**   * Creates a string representing this Matrix with each row being   * on a separate line and in the format '(column0, column1, column2)'.   *   * @returns {String} A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2)'.   */  Matrix3.prototype.toString = function () {    return (      `(${this[0]}, ${this[3]}, ${this[6]})\n` +      `(${this[1]}, ${this[4]}, ${this[7]})\n` +      `(${this[2]}, ${this[5]}, ${this[8]})`    );  };  /**   * A 4D Cartesian point.   * @alias Cartesian4   * @constructor   *   * @param {Number} [x=0.0] The X component.   * @param {Number} [y=0.0] The Y component.   * @param {Number} [z=0.0] The Z component.   * @param {Number} [w=0.0] The W component.   *   * @see Cartesian2   * @see Cartesian3   * @see Packable   */  function Cartesian4(x, y, z, w) {    /**     * The X component.     * @type {Number}     * @default 0.0     */    this.x = defaultValue.defaultValue(x, 0.0);    /**     * The Y component.     * @type {Number}     * @default 0.0     */    this.y = defaultValue.defaultValue(y, 0.0);    /**     * The Z component.     * @type {Number}     * @default 0.0     */    this.z = defaultValue.defaultValue(z, 0.0);    /**     * The W component.     * @type {Number}     * @default 0.0     */    this.w = defaultValue.defaultValue(w, 0.0);  }  /**   * Creates a Cartesian4 instance from x, y, z and w coordinates.   *   * @param {Number} x The x coordinate.   * @param {Number} y The y coordinate.   * @param {Number} z The z coordinate.   * @param {Number} w The w coordinate.   * @param {Cartesian4} [result] The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided.   */  Cartesian4.fromElements = function (x, y, z, w, result) {    if (!defaultValue.defined(result)) {      return new Cartesian4(x, y, z, w);    }    result.x = x;    result.y = y;    result.z = z;    result.w = w;    return result;  };  /**   * Creates a Cartesian4 instance from a {@link Color}. <code>red</code>, <code>green</code>, <code>blue</code>,   * and <code>alpha</code> map to <code>x</code>, <code>y</code>, <code>z</code>, and <code>w</code>, respectively.   *   * @param {Color} color The source color.   * @param {Cartesian4} [result] The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided.   */  Cartesian4.fromColor = function (color, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("color", color);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Cartesian4(color.red, color.green, color.blue, color.alpha);    }    result.x = color.red;    result.y = color.green;    result.z = color.blue;    result.w = color.alpha;    return result;  };  /**   * Duplicates a Cartesian4 instance.   *   * @param {Cartesian4} cartesian The Cartesian to duplicate.   * @param {Cartesian4} [result] The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided. (Returns undefined if cartesian is undefined)   */  Cartesian4.clone = function (cartesian, result) {    if (!defaultValue.defined(cartesian)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Cartesian4(cartesian.x, cartesian.y, cartesian.z, cartesian.w);    }    result.x = cartesian.x;    result.y = cartesian.y;    result.z = cartesian.z;    result.w = cartesian.w;    return result;  };  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Cartesian4.packedLength = 4;  /**   * Stores the provided instance into the provided array.   *   * @param {Cartesian4} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Cartesian4.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    array[startingIndex++] = value.x;    array[startingIndex++] = value.y;    array[startingIndex++] = value.z;    array[startingIndex] = value.w;    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Cartesian4} [result] The object into which to store the result.   * @returns {Cartesian4}  The modified result parameter or a new Cartesian4 instance if one was not provided.   */  Cartesian4.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    if (!defaultValue.defined(result)) {      result = new Cartesian4();    }    result.x = array[startingIndex++];    result.y = array[startingIndex++];    result.z = array[startingIndex++];    result.w = array[startingIndex];    return result;  };  /**   * Flattens an array of Cartesian4s into an array of components.   *   * @param {Cartesian4[]} array The array of cartesians to pack.   * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 4 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 4) elements.   * @returns {Number[]} The packed array.   */  Cartesian4.packArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    const length = array.length;    const resultLength = length * 4;    if (!defaultValue.defined(result)) {      result = new Array(resultLength);    } else if (!Array.isArray(result) && result.length !== resultLength) {      //>>includeStart('debug', pragmas.debug);      throw new RuntimeError.DeveloperError(        "If result is a typed array, it must have exactly array.length * 4 elements"      );      //>>includeEnd('debug');    } else if (result.length !== resultLength) {      result.length = resultLength;    }    for (let i = 0; i < length; ++i) {      Cartesian4.pack(array[i], result, i * 4);    }    return result;  };  /**   * Unpacks an array of cartesian components into an array of Cartesian4s.   *   * @param {Number[]} array The array of components to unpack.   * @param {Cartesian4[]} [result] The array onto which to store the result.   * @returns {Cartesian4[]} The unpacked array.   */  Cartesian4.unpackArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("array.length", array.length, 4);    if (array.length % 4 !== 0) {      throw new RuntimeError.DeveloperError("array length must be a multiple of 4.");    }    //>>includeEnd('debug');    const length = array.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 4);    } else {      result.length = length / 4;    }    for (let i = 0; i < length; i += 4) {      const index = i / 4;      result[index] = Cartesian4.unpack(array, i, result[index]);    }    return result;  };  /**   * Creates a Cartesian4 from four consecutive elements in an array.   * @function   *   * @param {Number[]} array The array whose four consecutive elements correspond to the x, y, z, and w components, respectively.   * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to the x component.   * @param {Cartesian4} [result] The object onto which to store the result.   * @returns {Cartesian4}  The modified result parameter or a new Cartesian4 instance if one was not provided.   *   * @example   * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0)   * const v = [1.0, 2.0, 3.0, 4.0];   * const p = Cesium.Cartesian4.fromArray(v);   *   * // Create a Cartesian4 with (1.0, 2.0, 3.0, 4.0) using an offset into an array   * const v2 = [0.0, 0.0, 1.0, 2.0, 3.0, 4.0];   * const p2 = Cesium.Cartesian4.fromArray(v2, 2);   */  Cartesian4.fromArray = Cartesian4.unpack;  /**   * Computes the value of the maximum component for the supplied Cartesian.   *   * @param {Cartesian4} cartesian The cartesian to use.   * @returns {Number} The value of the maximum component.   */  Cartesian4.maximumComponent = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return Math.max(cartesian.x, cartesian.y, cartesian.z, cartesian.w);  };  /**   * Computes the value of the minimum component for the supplied Cartesian.   *   * @param {Cartesian4} cartesian The cartesian to use.   * @returns {Number} The value of the minimum component.   */  Cartesian4.minimumComponent = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return Math.min(cartesian.x, cartesian.y, cartesian.z, cartesian.w);  };  /**   * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians.   *   * @param {Cartesian4} first A cartesian to compare.   * @param {Cartesian4} second A cartesian to compare.   * @param {Cartesian4} result The object into which to store the result.   * @returns {Cartesian4} A cartesian with the minimum components.   */  Cartesian4.minimumByComponent = function (first, second, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("first", first);    RuntimeError.Check.typeOf.object("second", second);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.min(first.x, second.x);    result.y = Math.min(first.y, second.y);    result.z = Math.min(first.z, second.z);    result.w = Math.min(first.w, second.w);    return result;  };  /**   * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians.   *   * @param {Cartesian4} first A cartesian to compare.   * @param {Cartesian4} second A cartesian to compare.   * @param {Cartesian4} result The object into which to store the result.   * @returns {Cartesian4} A cartesian with the maximum components.   */  Cartesian4.maximumByComponent = function (first, second, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("first", first);    RuntimeError.Check.typeOf.object("second", second);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.max(first.x, second.x);    result.y = Math.max(first.y, second.y);    result.z = Math.max(first.z, second.z);    result.w = Math.max(first.w, second.w);    return result;  };  /**   * Constrain a value to lie between two values.   *   * @param {Cartesian4} value The value to clamp.   * @param {Cartesian4} min The minimum bound.   * @param {Cartesian4} max The maximum bound.   * @param {Cartesian4} result The object into which to store the result.   * @returns {Cartesian4} The clamped value such that min <= result <= max.   */  Cartesian4.clamp = function (value, min, max, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.typeOf.object("min", min);    RuntimeError.Check.typeOf.object("max", max);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = ComponentDatatype.CesiumMath.clamp(value.x, min.x, max.x);    const y = ComponentDatatype.CesiumMath.clamp(value.y, min.y, max.y);    const z = ComponentDatatype.CesiumMath.clamp(value.z, min.z, max.z);    const w = ComponentDatatype.CesiumMath.clamp(value.w, min.w, max.w);    result.x = x;    result.y = y;    result.z = z;    result.w = w;    return result;  };  /**   * Computes the provided Cartesian's squared magnitude.   *   * @param {Cartesian4} cartesian The Cartesian instance whose squared magnitude is to be computed.   * @returns {Number} The squared magnitude.   */  Cartesian4.magnitudeSquared = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return (      cartesian.x * cartesian.x +      cartesian.y * cartesian.y +      cartesian.z * cartesian.z +      cartesian.w * cartesian.w    );  };  /**   * Computes the Cartesian's magnitude (length).   *   * @param {Cartesian4} cartesian The Cartesian instance whose magnitude is to be computed.   * @returns {Number} The magnitude.   */  Cartesian4.magnitude = function (cartesian) {    return Math.sqrt(Cartesian4.magnitudeSquared(cartesian));  };  const distanceScratch$1 = new Cartesian4();  /**   * Computes the 4-space distance between two points.   *   * @param {Cartesian4} left The first point to compute the distance from.   * @param {Cartesian4} right The second point to compute the distance to.   * @returns {Number} The distance between two points.   *   * @example   * // Returns 1.0   * const d = Cesium.Cartesian4.distance(   *   new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0),   *   new Cesium.Cartesian4(2.0, 0.0, 0.0, 0.0));   */  Cartesian4.distance = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian4.subtract(left, right, distanceScratch$1);    return Cartesian4.magnitude(distanceScratch$1);  };  /**   * Computes the squared distance between two points.  Comparing squared distances   * using this function is more efficient than comparing distances using {@link Cartesian4#distance}.   *   * @param {Cartesian4} left The first point to compute the distance from.   * @param {Cartesian4} right The second point to compute the distance to.   * @returns {Number} The distance between two points.   *   * @example   * // Returns 4.0, not 2.0   * const d = Cesium.Cartesian4.distance(   *   new Cesium.Cartesian4(1.0, 0.0, 0.0, 0.0),   *   new Cesium.Cartesian4(3.0, 0.0, 0.0, 0.0));   */  Cartesian4.distanceSquared = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian4.subtract(left, right, distanceScratch$1);    return Cartesian4.magnitudeSquared(distanceScratch$1);  };  /**   * Computes the normalized form of the supplied Cartesian.   *   * @param {Cartesian4} cartesian The Cartesian to be normalized.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.normalize = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const magnitude = Cartesian4.magnitude(cartesian);    result.x = cartesian.x / magnitude;    result.y = cartesian.y / magnitude;    result.z = cartesian.z / magnitude;    result.w = cartesian.w / magnitude;    //>>includeStart('debug', pragmas.debug);    if (      isNaN(result.x) ||      isNaN(result.y) ||      isNaN(result.z) ||      isNaN(result.w)    ) {      throw new RuntimeError.DeveloperError("normalized result is not a number");    }    //>>includeEnd('debug');    return result;  };  /**   * Computes the dot (scalar) product of two Cartesians.   *   * @param {Cartesian4} left The first Cartesian.   * @param {Cartesian4} right The second Cartesian.   * @returns {Number} The dot product.   */  Cartesian4.dot = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    return (      left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w    );  };  /**   * Computes the componentwise product of two Cartesians.   *   * @param {Cartesian4} left The first Cartesian.   * @param {Cartesian4} right The second Cartesian.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.multiplyComponents = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x * right.x;    result.y = left.y * right.y;    result.z = left.z * right.z;    result.w = left.w * right.w;    return result;  };  /**   * Computes the componentwise quotient of two Cartesians.   *   * @param {Cartesian4} left The first Cartesian.   * @param {Cartesian4} right The second Cartesian.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.divideComponents = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x / right.x;    result.y = left.y / right.y;    result.z = left.z / right.z;    result.w = left.w / right.w;    return result;  };  /**   * Computes the componentwise sum of two Cartesians.   *   * @param {Cartesian4} left The first Cartesian.   * @param {Cartesian4} right The second Cartesian.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.add = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x + right.x;    result.y = left.y + right.y;    result.z = left.z + right.z;    result.w = left.w + right.w;    return result;  };  /**   * Computes the componentwise difference of two Cartesians.   *   * @param {Cartesian4} left The first Cartesian.   * @param {Cartesian4} right The second Cartesian.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.subtract = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x - right.x;    result.y = left.y - right.y;    result.z = left.z - right.z;    result.w = left.w - right.w;    return result;  };  /**   * Multiplies the provided Cartesian componentwise by the provided scalar.   *   * @param {Cartesian4} cartesian The Cartesian to be scaled.   * @param {Number} scalar The scalar to multiply with.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.multiplyByScalar = function (cartesian, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = cartesian.x * scalar;    result.y = cartesian.y * scalar;    result.z = cartesian.z * scalar;    result.w = cartesian.w * scalar;    return result;  };  /**   * Divides the provided Cartesian componentwise by the provided scalar.   *   * @param {Cartesian4} cartesian The Cartesian to be divided.   * @param {Number} scalar The scalar to divide by.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.divideByScalar = function (cartesian, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = cartesian.x / scalar;    result.y = cartesian.y / scalar;    result.z = cartesian.z / scalar;    result.w = cartesian.w / scalar;    return result;  };  /**   * Negates the provided Cartesian.   *   * @param {Cartesian4} cartesian The Cartesian to be negated.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.negate = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = -cartesian.x;    result.y = -cartesian.y;    result.z = -cartesian.z;    result.w = -cartesian.w;    return result;  };  /**   * Computes the absolute value of the provided Cartesian.   *   * @param {Cartesian4} cartesian The Cartesian whose absolute value is to be computed.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.abs = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.abs(cartesian.x);    result.y = Math.abs(cartesian.y);    result.z = Math.abs(cartesian.z);    result.w = Math.abs(cartesian.w);    return result;  };  const lerpScratch$1 = new Cartesian4();  /**   * Computes the linear interpolation or extrapolation at t using the provided cartesians.   *   * @param {Cartesian4} start The value corresponding to t at 0.0.   * @param {Cartesian4}end The value corresponding to t at 1.0.   * @param {Number} t The point along t at which to interpolate.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Cartesian4.lerp = function (start, end, t, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("start", start);    RuntimeError.Check.typeOf.object("end", end);    RuntimeError.Check.typeOf.number("t", t);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    Cartesian4.multiplyByScalar(end, t, lerpScratch$1);    result = Cartesian4.multiplyByScalar(start, 1.0 - t, result);    return Cartesian4.add(lerpScratch$1, result, result);  };  const mostOrthogonalAxisScratch$1 = new Cartesian4();  /**   * Returns the axis that is most orthogonal to the provided Cartesian.   *   * @param {Cartesian4} cartesian The Cartesian on which to find the most orthogonal axis.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The most orthogonal axis.   */  Cartesian4.mostOrthogonalAxis = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const f = Cartesian4.normalize(cartesian, mostOrthogonalAxisScratch$1);    Cartesian4.abs(f, f);    if (f.x <= f.y) {      if (f.x <= f.z) {        if (f.x <= f.w) {          result = Cartesian4.clone(Cartesian4.UNIT_X, result);        } else {          result = Cartesian4.clone(Cartesian4.UNIT_W, result);        }      } else if (f.z <= f.w) {        result = Cartesian4.clone(Cartesian4.UNIT_Z, result);      } else {        result = Cartesian4.clone(Cartesian4.UNIT_W, result);      }    } else if (f.y <= f.z) {      if (f.y <= f.w) {        result = Cartesian4.clone(Cartesian4.UNIT_Y, result);      } else {        result = Cartesian4.clone(Cartesian4.UNIT_W, result);      }    } else if (f.z <= f.w) {      result = Cartesian4.clone(Cartesian4.UNIT_Z, result);    } else {      result = Cartesian4.clone(Cartesian4.UNIT_W, result);    }    return result;  };  /**   * Compares the provided Cartesians componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartesian4} [left] The first Cartesian.   * @param {Cartesian4} [right] The second Cartesian.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   */  Cartesian4.equals = function (left, right) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        left.x === right.x &&        left.y === right.y &&        left.z === right.z &&        left.w === right.w)    );  };  /**   * @private   */  Cartesian4.equalsArray = function (cartesian, array, offset) {    return (      cartesian.x === array[offset] &&      cartesian.y === array[offset + 1] &&      cartesian.z === array[offset + 2] &&      cartesian.w === array[offset + 3]    );  };  /**   * Compares the provided Cartesians componentwise and returns   * <code>true</code> if they pass an absolute or relative tolerance test,   * <code>false</code> otherwise.   *   * @param {Cartesian4} [left] The first Cartesian.   * @param {Cartesian4} [right] The second Cartesian.   * @param {Number} [relativeEpsilon=0] The relative epsilon tolerance to use for equality testing.   * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Cartesian4.equalsEpsilon = function (    left,    right,    relativeEpsilon,    absoluteEpsilon  ) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.x,          right.x,          relativeEpsilon,          absoluteEpsilon        ) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.y,          right.y,          relativeEpsilon,          absoluteEpsilon        ) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.z,          right.z,          relativeEpsilon,          absoluteEpsilon        ) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.w,          right.w,          relativeEpsilon,          absoluteEpsilon        ))    );  };  /**   * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 0.0).   *   * @type {Cartesian4}   * @constant   */  Cartesian4.ZERO = Object.freeze(new Cartesian4(0.0, 0.0, 0.0, 0.0));  /**   * An immutable Cartesian4 instance initialized to (1.0, 1.0, 1.0, 1.0).   *   * @type {Cartesian4}   * @constant   */  Cartesian4.ONE = Object.freeze(new Cartesian4(1.0, 1.0, 1.0, 1.0));  /**   * An immutable Cartesian4 instance initialized to (1.0, 0.0, 0.0, 0.0).   *   * @type {Cartesian4}   * @constant   */  Cartesian4.UNIT_X = Object.freeze(new Cartesian4(1.0, 0.0, 0.0, 0.0));  /**   * An immutable Cartesian4 instance initialized to (0.0, 1.0, 0.0, 0.0).   *   * @type {Cartesian4}   * @constant   */  Cartesian4.UNIT_Y = Object.freeze(new Cartesian4(0.0, 1.0, 0.0, 0.0));  /**   * An immutable Cartesian4 instance initialized to (0.0, 0.0, 1.0, 0.0).   *   * @type {Cartesian4}   * @constant   */  Cartesian4.UNIT_Z = Object.freeze(new Cartesian4(0.0, 0.0, 1.0, 0.0));  /**   * An immutable Cartesian4 instance initialized to (0.0, 0.0, 0.0, 1.0).   *   * @type {Cartesian4}   * @constant   */  Cartesian4.UNIT_W = Object.freeze(new Cartesian4(0.0, 0.0, 0.0, 1.0));  /**   * Duplicates this Cartesian4 instance.   *   * @param {Cartesian4} [result] The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter or a new Cartesian4 instance if one was not provided.   */  Cartesian4.prototype.clone = function (result) {    return Cartesian4.clone(this, result);  };  /**   * Compares this Cartesian against the provided Cartesian componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartesian4} [right] The right hand side Cartesian.   * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.   */  Cartesian4.prototype.equals = function (right) {    return Cartesian4.equals(this, right);  };  /**   * Compares this Cartesian against the provided Cartesian componentwise and returns   * <code>true</code> if they pass an absolute or relative tolerance test,   * <code>false</code> otherwise.   *   * @param {Cartesian4} [right] The right hand side Cartesian.   * @param {Number} [relativeEpsilon=0] The relative epsilon tolerance to use for equality testing.   * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.   * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.   */  Cartesian4.prototype.equalsEpsilon = function (    right,    relativeEpsilon,    absoluteEpsilon  ) {    return Cartesian4.equalsEpsilon(      this,      right,      relativeEpsilon,      absoluteEpsilon    );  };  /**   * Creates a string representing this Cartesian in the format '(x, y, z, w)'.   *   * @returns {String} A string representing the provided Cartesian in the format '(x, y, z, w)'.   */  Cartesian4.prototype.toString = function () {    return `(${this.x}, ${this.y}, ${this.z}, ${this.w})`;  };  // scratchU8Array and scratchF32Array are views into the same buffer  const scratchF32Array = new Float32Array(1);  const scratchU8Array = new Uint8Array(scratchF32Array.buffer);  const testU32 = new Uint32Array([0x11223344]);  const testU8 = new Uint8Array(testU32.buffer);  const littleEndian = testU8[0] === 0x44;  /**   * Packs an arbitrary floating point value to 4 values representable using uint8.   *   * @param {Number} value A floating point number.   * @param {Cartesian4} [result] The Cartesian4 that will contain the packed float.   * @returns {Cartesian4} A Cartesian4 representing the float packed to values in x, y, z, and w.   */  Cartesian4.packFloat = function (value, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("value", value);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Cartesian4();    }    // scratchU8Array and scratchF32Array are views into the same buffer    scratchF32Array[0] = value;    if (littleEndian) {      result.x = scratchU8Array[0];      result.y = scratchU8Array[1];      result.z = scratchU8Array[2];      result.w = scratchU8Array[3];    } else {      // convert from big-endian to little-endian      result.x = scratchU8Array[3];      result.y = scratchU8Array[2];      result.z = scratchU8Array[1];      result.w = scratchU8Array[0];    }    return result;  };  /**   * Unpacks a float packed using Cartesian4.packFloat.   *   * @param {Cartesian4} packedFloat A Cartesian4 containing a float packed to 4 values representable using uint8.   * @returns {Number} The unpacked float.   * @private   */  Cartesian4.unpackFloat = function (packedFloat) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("packedFloat", packedFloat);    //>>includeEnd('debug');    // scratchU8Array and scratchF32Array are views into the same buffer    if (littleEndian) {      scratchU8Array[0] = packedFloat.x;      scratchU8Array[1] = packedFloat.y;      scratchU8Array[2] = packedFloat.z;      scratchU8Array[3] = packedFloat.w;    } else {      // convert from little-endian to big-endian      scratchU8Array[0] = packedFloat.w;      scratchU8Array[1] = packedFloat.z;      scratchU8Array[2] = packedFloat.y;      scratchU8Array[3] = packedFloat.x;    }    return scratchF32Array[0];  };  /**   * A 4x4 matrix, indexable as a column-major order array.   * Constructor parameters are in row-major order for code readability.   * @alias Matrix4   * @constructor   * @implements {ArrayLike<number>}   *   * @param {Number} [column0Row0=0.0] The value for column 0, row 0.   * @param {Number} [column1Row0=0.0] The value for column 1, row 0.   * @param {Number} [column2Row0=0.0] The value for column 2, row 0.   * @param {Number} [column3Row0=0.0] The value for column 3, row 0.   * @param {Number} [column0Row1=0.0] The value for column 0, row 1.   * @param {Number} [column1Row1=0.0] The value for column 1, row 1.   * @param {Number} [column2Row1=0.0] The value for column 2, row 1.   * @param {Number} [column3Row1=0.0] The value for column 3, row 1.   * @param {Number} [column0Row2=0.0] The value for column 0, row 2.   * @param {Number} [column1Row2=0.0] The value for column 1, row 2.   * @param {Number} [column2Row2=0.0] The value for column 2, row 2.   * @param {Number} [column3Row2=0.0] The value for column 3, row 2.   * @param {Number} [column0Row3=0.0] The value for column 0, row 3.   * @param {Number} [column1Row3=0.0] The value for column 1, row 3.   * @param {Number} [column2Row3=0.0] The value for column 2, row 3.   * @param {Number} [column3Row3=0.0] The value for column 3, row 3.   *   * @see Matrix4.fromArray   * @see Matrix4.fromColumnMajorArray   * @see Matrix4.fromRowMajorArray   * @see Matrix4.fromRotationTranslation   * @see Matrix4.fromTranslationQuaternionRotationScale   * @see Matrix4.fromTranslationRotationScale   * @see Matrix4.fromTranslation   * @see Matrix4.fromScale   * @see Matrix4.fromUniformScale   * @see Matrix4.fromRotation   * @see Matrix4.fromCamera   * @see Matrix4.computePerspectiveFieldOfView   * @see Matrix4.computeOrthographicOffCenter   * @see Matrix4.computePerspectiveOffCenter   * @see Matrix4.computeInfinitePerspectiveOffCenter   * @see Matrix4.computeViewportTransformation   * @see Matrix4.computeView   * @see Matrix2   * @see Matrix3   * @see Packable   */  function Matrix4(    column0Row0,    column1Row0,    column2Row0,    column3Row0,    column0Row1,    column1Row1,    column2Row1,    column3Row1,    column0Row2,    column1Row2,    column2Row2,    column3Row2,    column0Row3,    column1Row3,    column2Row3,    column3Row3  ) {    this[0] = defaultValue.defaultValue(column0Row0, 0.0);    this[1] = defaultValue.defaultValue(column0Row1, 0.0);    this[2] = defaultValue.defaultValue(column0Row2, 0.0);    this[3] = defaultValue.defaultValue(column0Row3, 0.0);    this[4] = defaultValue.defaultValue(column1Row0, 0.0);    this[5] = defaultValue.defaultValue(column1Row1, 0.0);    this[6] = defaultValue.defaultValue(column1Row2, 0.0);    this[7] = defaultValue.defaultValue(column1Row3, 0.0);    this[8] = defaultValue.defaultValue(column2Row0, 0.0);    this[9] = defaultValue.defaultValue(column2Row1, 0.0);    this[10] = defaultValue.defaultValue(column2Row2, 0.0);    this[11] = defaultValue.defaultValue(column2Row3, 0.0);    this[12] = defaultValue.defaultValue(column3Row0, 0.0);    this[13] = defaultValue.defaultValue(column3Row1, 0.0);    this[14] = defaultValue.defaultValue(column3Row2, 0.0);    this[15] = defaultValue.defaultValue(column3Row3, 0.0);  }  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Matrix4.packedLength = 16;  /**   * Stores the provided instance into the provided array.   *   * @param {Matrix4} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Matrix4.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    array[startingIndex++] = value[0];    array[startingIndex++] = value[1];    array[startingIndex++] = value[2];    array[startingIndex++] = value[3];    array[startingIndex++] = value[4];    array[startingIndex++] = value[5];    array[startingIndex++] = value[6];    array[startingIndex++] = value[7];    array[startingIndex++] = value[8];    array[startingIndex++] = value[9];    array[startingIndex++] = value[10];    array[startingIndex++] = value[11];    array[startingIndex++] = value[12];    array[startingIndex++] = value[13];    array[startingIndex++] = value[14];    array[startingIndex] = value[15];    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Matrix4} [result] The object into which to store the result.   * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided.   */  Matrix4.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    if (!defaultValue.defined(result)) {      result = new Matrix4();    }    result[0] = array[startingIndex++];    result[1] = array[startingIndex++];    result[2] = array[startingIndex++];    result[3] = array[startingIndex++];    result[4] = array[startingIndex++];    result[5] = array[startingIndex++];    result[6] = array[startingIndex++];    result[7] = array[startingIndex++];    result[8] = array[startingIndex++];    result[9] = array[startingIndex++];    result[10] = array[startingIndex++];    result[11] = array[startingIndex++];    result[12] = array[startingIndex++];    result[13] = array[startingIndex++];    result[14] = array[startingIndex++];    result[15] = array[startingIndex];    return result;  };  /**   * Flattens an array of Matrix4s into an array of components. The components   * are stored in column-major order.   *   * @param {Matrix4[]} array The array of matrices to pack.   * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 16 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 16) elements.   * @returns {Number[]} The packed array.   */  Matrix4.packArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    const length = array.length;    const resultLength = length * 16;    if (!defaultValue.defined(result)) {      result = new Array(resultLength);    } else if (!Array.isArray(result) && result.length !== resultLength) {      //>>includeStart('debug', pragmas.debug);      throw new RuntimeError.DeveloperError(        "If result is a typed array, it must have exactly array.length * 16 elements"      );      //>>includeEnd('debug');    } else if (result.length !== resultLength) {      result.length = resultLength;    }    for (let i = 0; i < length; ++i) {      Matrix4.pack(array[i], result, i * 16);    }    return result;  };  /**   * Unpacks an array of column-major matrix components into an array of Matrix4s.   *   * @param {Number[]} array The array of components to unpack.   * @param {Matrix4[]} [result] The array onto which to store the result.   * @returns {Matrix4[]} The unpacked array.   */  Matrix4.unpackArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("array.length", array.length, 16);    if (array.length % 16 !== 0) {      throw new RuntimeError.DeveloperError("array length must be a multiple of 16.");    }    //>>includeEnd('debug');    const length = array.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 16);    } else {      result.length = length / 16;    }    for (let i = 0; i < length; i += 16) {      const index = i / 16;      result[index] = Matrix4.unpack(array, i, result[index]);    }    return result;  };  /**   * Duplicates a Matrix4 instance.   *   * @param {Matrix4} matrix The matrix to duplicate.   * @param {Matrix4} [result] The object onto which to store the result.   * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided. (Returns undefined if matrix is undefined)   */  Matrix4.clone = function (matrix, result) {    if (!defaultValue.defined(matrix)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Matrix4(        matrix[0],        matrix[4],        matrix[8],        matrix[12],        matrix[1],        matrix[5],        matrix[9],        matrix[13],        matrix[2],        matrix[6],        matrix[10],        matrix[14],        matrix[3],        matrix[7],        matrix[11],        matrix[15]      );    }    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    result[4] = matrix[4];    result[5] = matrix[5];    result[6] = matrix[6];    result[7] = matrix[7];    result[8] = matrix[8];    result[9] = matrix[9];    result[10] = matrix[10];    result[11] = matrix[11];    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  /**   * Creates a Matrix4 from 16 consecutive elements in an array.   * @function   *   * @param {Number[]} array The array whose 16 consecutive elements correspond to the positions of the matrix.  Assumes column-major order.   * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to first column first row position in the matrix.   * @param {Matrix4} [result] The object onto which to store the result.   * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided.   *   * @example   * // Create the Matrix4:   * // [1.0, 2.0, 3.0, 4.0]   * // [1.0, 2.0, 3.0, 4.0]   * // [1.0, 2.0, 3.0, 4.0]   * // [1.0, 2.0, 3.0, 4.0]   *   * const v = [1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0];   * const m = Cesium.Matrix4.fromArray(v);   *   * // Create same Matrix4 with using an offset into an array   * const v2 = [0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0];   * const m2 = Cesium.Matrix4.fromArray(v2, 2);   */  Matrix4.fromArray = Matrix4.unpack;  /**   * Computes a Matrix4 instance from a column-major order array.   *   * @param {Number[]} values The column-major order array.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   */  Matrix4.fromColumnMajorArray = function (values, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("values", values);    //>>includeEnd('debug');    return Matrix4.clone(values, result);  };  /**   * Computes a Matrix4 instance from a row-major order array.   * The resulting matrix will be in column-major order.   *   * @param {Number[]} values The row-major order array.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   */  Matrix4.fromRowMajorArray = function (values, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("values", values);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix4(        values[0],        values[1],        values[2],        values[3],        values[4],        values[5],        values[6],        values[7],        values[8],        values[9],        values[10],        values[11],        values[12],        values[13],        values[14],        values[15]      );    }    result[0] = values[0];    result[1] = values[4];    result[2] = values[8];    result[3] = values[12];    result[4] = values[1];    result[5] = values[5];    result[6] = values[9];    result[7] = values[13];    result[8] = values[2];    result[9] = values[6];    result[10] = values[10];    result[11] = values[14];    result[12] = values[3];    result[13] = values[7];    result[14] = values[11];    result[15] = values[15];    return result;  };  /**   * Computes a Matrix4 instance from a Matrix3 representing the rotation   * and a Cartesian3 representing the translation.   *   * @param {Matrix3} rotation The upper left portion of the matrix representing the rotation.   * @param {Cartesian3} [translation=Cartesian3.ZERO] The upper right portion of the matrix representing the translation.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   */  Matrix4.fromRotationTranslation = function (rotation, translation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rotation", rotation);    //>>includeEnd('debug');    translation = defaultValue.defaultValue(translation, Cartesian3.ZERO);    if (!defaultValue.defined(result)) {      return new Matrix4(        rotation[0],        rotation[3],        rotation[6],        translation.x,        rotation[1],        rotation[4],        rotation[7],        translation.y,        rotation[2],        rotation[5],        rotation[8],        translation.z,        0.0,        0.0,        0.0,        1.0      );    }    result[0] = rotation[0];    result[1] = rotation[1];    result[2] = rotation[2];    result[3] = 0.0;    result[4] = rotation[3];    result[5] = rotation[4];    result[6] = rotation[5];    result[7] = 0.0;    result[8] = rotation[6];    result[9] = rotation[7];    result[10] = rotation[8];    result[11] = 0.0;    result[12] = translation.x;    result[13] = translation.y;    result[14] = translation.z;    result[15] = 1.0;    return result;  };  /**   * Computes a Matrix4 instance from a translation, rotation, and scale (TRS)   * representation with the rotation represented as a quaternion.   *   * @param {Cartesian3} translation The translation transformation.   * @param {Quaternion} rotation The rotation transformation.   * @param {Cartesian3} scale The non-uniform scale transformation.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   *   * @example   * const result = Cesium.Matrix4.fromTranslationQuaternionRotationScale(   *   new Cesium.Cartesian3(1.0, 2.0, 3.0), // translation   *   Cesium.Quaternion.IDENTITY,           // rotation   *   new Cesium.Cartesian3(7.0, 8.0, 9.0), // scale   *   result);   */  Matrix4.fromTranslationQuaternionRotationScale = function (    translation,    rotation,    scale,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("translation", translation);    RuntimeError.Check.typeOf.object("rotation", rotation);    RuntimeError.Check.typeOf.object("scale", scale);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Matrix4();    }    const scaleX = scale.x;    const scaleY = scale.y;    const scaleZ = scale.z;    const x2 = rotation.x * rotation.x;    const xy = rotation.x * rotation.y;    const xz = rotation.x * rotation.z;    const xw = rotation.x * rotation.w;    const y2 = rotation.y * rotation.y;    const yz = rotation.y * rotation.z;    const yw = rotation.y * rotation.w;    const z2 = rotation.z * rotation.z;    const zw = rotation.z * rotation.w;    const w2 = rotation.w * rotation.w;    const m00 = x2 - y2 - z2 + w2;    const m01 = 2.0 * (xy - zw);    const m02 = 2.0 * (xz + yw);    const m10 = 2.0 * (xy + zw);    const m11 = -x2 + y2 - z2 + w2;    const m12 = 2.0 * (yz - xw);    const m20 = 2.0 * (xz - yw);    const m21 = 2.0 * (yz + xw);    const m22 = -x2 - y2 + z2 + w2;    result[0] = m00 * scaleX;    result[1] = m10 * scaleX;    result[2] = m20 * scaleX;    result[3] = 0.0;    result[4] = m01 * scaleY;    result[5] = m11 * scaleY;    result[6] = m21 * scaleY;    result[7] = 0.0;    result[8] = m02 * scaleZ;    result[9] = m12 * scaleZ;    result[10] = m22 * scaleZ;    result[11] = 0.0;    result[12] = translation.x;    result[13] = translation.y;    result[14] = translation.z;    result[15] = 1.0;    return result;  };  /**   * Creates a Matrix4 instance from a {@link TranslationRotationScale} instance.   *   * @param {TranslationRotationScale} translationRotationScale The instance.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   */  Matrix4.fromTranslationRotationScale = function (    translationRotationScale,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("translationRotationScale", translationRotationScale);    //>>includeEnd('debug');    return Matrix4.fromTranslationQuaternionRotationScale(      translationRotationScale.translation,      translationRotationScale.rotation,      translationRotationScale.scale,      result    );  };  /**   * Creates a Matrix4 instance from a Cartesian3 representing the translation.   *   * @param {Cartesian3} translation The upper right portion of the matrix representing the translation.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   *   * @see Matrix4.multiplyByTranslation   */  Matrix4.fromTranslation = function (translation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("translation", translation);    //>>includeEnd('debug');    return Matrix4.fromRotationTranslation(Matrix3.IDENTITY, translation, result);  };  /**   * Computes a Matrix4 instance representing a non-uniform scale.   *   * @param {Cartesian3} scale The x, y, and z scale factors.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   *   * @example   * // Creates   * //   [7.0, 0.0, 0.0, 0.0]   * //   [0.0, 8.0, 0.0, 0.0]   * //   [0.0, 0.0, 9.0, 0.0]   * //   [0.0, 0.0, 0.0, 1.0]   * const m = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0));   */  Matrix4.fromScale = function (scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("scale", scale);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix4(        scale.x,        0.0,        0.0,        0.0,        0.0,        scale.y,        0.0,        0.0,        0.0,        0.0,        scale.z,        0.0,        0.0,        0.0,        0.0,        1.0      );    }    result[0] = scale.x;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = 0.0;    result[5] = scale.y;    result[6] = 0.0;    result[7] = 0.0;    result[8] = 0.0;    result[9] = 0.0;    result[10] = scale.z;    result[11] = 0.0;    result[12] = 0.0;    result[13] = 0.0;    result[14] = 0.0;    result[15] = 1.0;    return result;  };  /**   * Computes a Matrix4 instance representing a uniform scale.   *   * @param {Number} scale The uniform scale factor.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   *   * @example   * // Creates   * //   [2.0, 0.0, 0.0, 0.0]   * //   [0.0, 2.0, 0.0, 0.0]   * //   [0.0, 0.0, 2.0, 0.0]   * //   [0.0, 0.0, 0.0, 1.0]   * const m = Cesium.Matrix4.fromUniformScale(2.0);   */  Matrix4.fromUniformScale = function (scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("scale", scale);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix4(        scale,        0.0,        0.0,        0.0,        0.0,        scale,        0.0,        0.0,        0.0,        0.0,        scale,        0.0,        0.0,        0.0,        0.0,        1.0      );    }    result[0] = scale;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = 0.0;    result[5] = scale;    result[6] = 0.0;    result[7] = 0.0;    result[8] = 0.0;    result[9] = 0.0;    result[10] = scale;    result[11] = 0.0;    result[12] = 0.0;    result[13] = 0.0;    result[14] = 0.0;    result[15] = 1.0;    return result;  };  /**   * Creates a rotation matrix.   *   * @param {Matrix3} rotation The rotation matrix.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   */  Matrix4.fromRotation = function (rotation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rotation", rotation);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Matrix4();    }    result[0] = rotation[0];    result[1] = rotation[1];    result[2] = rotation[2];    result[3] = 0.0;    result[4] = rotation[3];    result[5] = rotation[4];    result[6] = rotation[5];    result[7] = 0.0;    result[8] = rotation[6];    result[9] = rotation[7];    result[10] = rotation[8];    result[11] = 0.0;    result[12] = 0.0;    result[13] = 0.0;    result[14] = 0.0;    result[15] = 1.0;    return result;  };  const fromCameraF = new Cartesian3();  const fromCameraR = new Cartesian3();  const fromCameraU = new Cartesian3();  /**   * Computes a Matrix4 instance from a Camera.   *   * @param {Camera} camera The camera to use.   * @param {Matrix4} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix4} The modified result parameter, or a new Matrix4 instance if one was not provided.   */  Matrix4.fromCamera = function (camera, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("camera", camera);    //>>includeEnd('debug');    const position = camera.position;    const direction = camera.direction;    const up = camera.up;    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("camera.position", position);    RuntimeError.Check.typeOf.object("camera.direction", direction);    RuntimeError.Check.typeOf.object("camera.up", up);    //>>includeEnd('debug');    Cartesian3.normalize(direction, fromCameraF);    Cartesian3.normalize(      Cartesian3.cross(fromCameraF, up, fromCameraR),      fromCameraR    );    Cartesian3.normalize(      Cartesian3.cross(fromCameraR, fromCameraF, fromCameraU),      fromCameraU    );    const sX = fromCameraR.x;    const sY = fromCameraR.y;    const sZ = fromCameraR.z;    const fX = fromCameraF.x;    const fY = fromCameraF.y;    const fZ = fromCameraF.z;    const uX = fromCameraU.x;    const uY = fromCameraU.y;    const uZ = fromCameraU.z;    const positionX = position.x;    const positionY = position.y;    const positionZ = position.z;    const t0 = sX * -positionX + sY * -positionY + sZ * -positionZ;    const t1 = uX * -positionX + uY * -positionY + uZ * -positionZ;    const t2 = fX * positionX + fY * positionY + fZ * positionZ;    // The code below this comment is an optimized    // version of the commented lines.    // Rather that create two matrices and then multiply,    // we just bake in the multiplcation as part of creation.    // const rotation = new Matrix4(    //                 sX,  sY,  sZ, 0.0,    //                 uX,  uY,  uZ, 0.0,    //                -fX, -fY, -fZ, 0.0,    //                 0.0,  0.0,  0.0, 1.0);    // const translation = new Matrix4(    //                 1.0, 0.0, 0.0, -position.x,    //                 0.0, 1.0, 0.0, -position.y,    //                 0.0, 0.0, 1.0, -position.z,    //                 0.0, 0.0, 0.0, 1.0);    // return rotation.multiply(translation);    if (!defaultValue.defined(result)) {      return new Matrix4(        sX,        sY,        sZ,        t0,        uX,        uY,        uZ,        t1,        -fX,        -fY,        -fZ,        t2,        0.0,        0.0,        0.0,        1.0      );    }    result[0] = sX;    result[1] = uX;    result[2] = -fX;    result[3] = 0.0;    result[4] = sY;    result[5] = uY;    result[6] = -fY;    result[7] = 0.0;    result[8] = sZ;    result[9] = uZ;    result[10] = -fZ;    result[11] = 0.0;    result[12] = t0;    result[13] = t1;    result[14] = t2;    result[15] = 1.0;    return result;  };  /**   * Computes a Matrix4 instance representing a perspective transformation matrix.   *   * @param {Number} fovY The field of view along the Y axis in radians.   * @param {Number} aspectRatio The aspect ratio.   * @param {Number} near The distance to the near plane in meters.   * @param {Number} far The distance to the far plane in meters.   * @param {Matrix4} result The object in which the result will be stored.   * @returns {Matrix4} The modified result parameter.   *   * @exception {DeveloperError} fovY must be in (0, PI].   * @exception {DeveloperError} aspectRatio must be greater than zero.   * @exception {DeveloperError} near must be greater than zero.   * @exception {DeveloperError} far must be greater than zero.   */  Matrix4.computePerspectiveFieldOfView = function (    fovY,    aspectRatio,    near,    far,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number.greaterThan("fovY", fovY, 0.0);    RuntimeError.Check.typeOf.number.lessThan("fovY", fovY, Math.PI);    RuntimeError.Check.typeOf.number.greaterThan("near", near, 0.0);    RuntimeError.Check.typeOf.number.greaterThan("far", far, 0.0);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const bottom = Math.tan(fovY * 0.5);    const column1Row1 = 1.0 / bottom;    const column0Row0 = column1Row1 / aspectRatio;    const column2Row2 = (far + near) / (near - far);    const column3Row2 = (2.0 * far * near) / (near - far);    result[0] = column0Row0;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = 0.0;    result[5] = column1Row1;    result[6] = 0.0;    result[7] = 0.0;    result[8] = 0.0;    result[9] = 0.0;    result[10] = column2Row2;    result[11] = -1.0;    result[12] = 0.0;    result[13] = 0.0;    result[14] = column3Row2;    result[15] = 0.0;    return result;  };  /**   * Computes a Matrix4 instance representing an orthographic transformation matrix.   *   * @param {Number} left The number of meters to the left of the camera that will be in view.   * @param {Number} right The number of meters to the right of the camera that will be in view.   * @param {Number} bottom The number of meters below of the camera that will be in view.   * @param {Number} top The number of meters above of the camera that will be in view.   * @param {Number} near The distance to the near plane in meters.   * @param {Number} far The distance to the far plane in meters.   * @param {Matrix4} result The object in which the result will be stored.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.computeOrthographicOffCenter = function (    left,    right,    bottom,    top,    near,    far,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("left", left);    RuntimeError.Check.typeOf.number("right", right);    RuntimeError.Check.typeOf.number("bottom", bottom);    RuntimeError.Check.typeOf.number("top", top);    RuntimeError.Check.typeOf.number("near", near);    RuntimeError.Check.typeOf.number("far", far);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    let a = 1.0 / (right - left);    let b = 1.0 / (top - bottom);    let c = 1.0 / (far - near);    const tx = -(right + left) * a;    const ty = -(top + bottom) * b;    const tz = -(far + near) * c;    a *= 2.0;    b *= 2.0;    c *= -2.0;    result[0] = a;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = 0.0;    result[5] = b;    result[6] = 0.0;    result[7] = 0.0;    result[8] = 0.0;    result[9] = 0.0;    result[10] = c;    result[11] = 0.0;    result[12] = tx;    result[13] = ty;    result[14] = tz;    result[15] = 1.0;    return result;  };  /**   * Computes a Matrix4 instance representing an off center perspective transformation.   *   * @param {Number} left The number of meters to the left of the camera that will be in view.   * @param {Number} right The number of meters to the right of the camera that will be in view.   * @param {Number} bottom The number of meters below of the camera that will be in view.   * @param {Number} top The number of meters above of the camera that will be in view.   * @param {Number} near The distance to the near plane in meters.   * @param {Number} far The distance to the far plane in meters.   * @param {Matrix4} result The object in which the result will be stored.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.computePerspectiveOffCenter = function (    left,    right,    bottom,    top,    near,    far,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("left", left);    RuntimeError.Check.typeOf.number("right", right);    RuntimeError.Check.typeOf.number("bottom", bottom);    RuntimeError.Check.typeOf.number("top", top);    RuntimeError.Check.typeOf.number("near", near);    RuntimeError.Check.typeOf.number("far", far);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const column0Row0 = (2.0 * near) / (right - left);    const column1Row1 = (2.0 * near) / (top - bottom);    const column2Row0 = (right + left) / (right - left);    const column2Row1 = (top + bottom) / (top - bottom);    const column2Row2 = -(far + near) / (far - near);    const column2Row3 = -1.0;    const column3Row2 = (-2.0 * far * near) / (far - near);    result[0] = column0Row0;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = 0.0;    result[5] = column1Row1;    result[6] = 0.0;    result[7] = 0.0;    result[8] = column2Row0;    result[9] = column2Row1;    result[10] = column2Row2;    result[11] = column2Row3;    result[12] = 0.0;    result[13] = 0.0;    result[14] = column3Row2;    result[15] = 0.0;    return result;  };  /**   * Computes a Matrix4 instance representing an infinite off center perspective transformation.   *   * @param {Number} left The number of meters to the left of the camera that will be in view.   * @param {Number} right The number of meters to the right of the camera that will be in view.   * @param {Number} bottom The number of meters below of the camera that will be in view.   * @param {Number} top The number of meters above of the camera that will be in view.   * @param {Number} near The distance to the near plane in meters.   * @param {Matrix4} result The object in which the result will be stored.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.computeInfinitePerspectiveOffCenter = function (    left,    right,    bottom,    top,    near,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("left", left);    RuntimeError.Check.typeOf.number("right", right);    RuntimeError.Check.typeOf.number("bottom", bottom);    RuntimeError.Check.typeOf.number("top", top);    RuntimeError.Check.typeOf.number("near", near);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const column0Row0 = (2.0 * near) / (right - left);    const column1Row1 = (2.0 * near) / (top - bottom);    const column2Row0 = (right + left) / (right - left);    const column2Row1 = (top + bottom) / (top - bottom);    const column2Row2 = -1.0;    const column2Row3 = -1.0;    const column3Row2 = -2.0 * near;    result[0] = column0Row0;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = 0.0;    result[5] = column1Row1;    result[6] = 0.0;    result[7] = 0.0;    result[8] = column2Row0;    result[9] = column2Row1;    result[10] = column2Row2;    result[11] = column2Row3;    result[12] = 0.0;    result[13] = 0.0;    result[14] = column3Row2;    result[15] = 0.0;    return result;  };  /**   * Computes a Matrix4 instance that transforms from normalized device coordinates to window coordinates.   *   * @param {Object} [viewport = { x : 0.0, y : 0.0, width : 0.0, height : 0.0 }] The viewport's corners as shown in Example 1.   * @param {Number} [nearDepthRange=0.0] The near plane distance in window coordinates.   * @param {Number} [farDepthRange=1.0] The far plane distance in window coordinates.   * @param {Matrix4} [result] The object in which the result will be stored.   * @returns {Matrix4} The modified result parameter.   *   * @example   * // Create viewport transformation using an explicit viewport and depth range.   * const m = Cesium.Matrix4.computeViewportTransformation({   *     x : 0.0,   *     y : 0.0,   *     width : 1024.0,   *     height : 768.0   * }, 0.0, 1.0, new Cesium.Matrix4());   */  Matrix4.computeViewportTransformation = function (    viewport,    nearDepthRange,    farDepthRange,    result  ) {    if (!defaultValue.defined(result)) {      result = new Matrix4();    }    viewport = defaultValue.defaultValue(viewport, defaultValue.defaultValue.EMPTY_OBJECT);    const x = defaultValue.defaultValue(viewport.x, 0.0);    const y = defaultValue.defaultValue(viewport.y, 0.0);    const width = defaultValue.defaultValue(viewport.width, 0.0);    const height = defaultValue.defaultValue(viewport.height, 0.0);    nearDepthRange = defaultValue.defaultValue(nearDepthRange, 0.0);    farDepthRange = defaultValue.defaultValue(farDepthRange, 1.0);    const halfWidth = width * 0.5;    const halfHeight = height * 0.5;    const halfDepth = (farDepthRange - nearDepthRange) * 0.5;    const column0Row0 = halfWidth;    const column1Row1 = halfHeight;    const column2Row2 = halfDepth;    const column3Row0 = x + halfWidth;    const column3Row1 = y + halfHeight;    const column3Row2 = nearDepthRange + halfDepth;    const column3Row3 = 1.0;    result[0] = column0Row0;    result[1] = 0.0;    result[2] = 0.0;    result[3] = 0.0;    result[4] = 0.0;    result[5] = column1Row1;    result[6] = 0.0;    result[7] = 0.0;    result[8] = 0.0;    result[9] = 0.0;    result[10] = column2Row2;    result[11] = 0.0;    result[12] = column3Row0;    result[13] = column3Row1;    result[14] = column3Row2;    result[15] = column3Row3;    return result;  };  /**   * Computes a Matrix4 instance that transforms from world space to view space.   *   * @param {Cartesian3} position The position of the camera.   * @param {Cartesian3} direction The forward direction.   * @param {Cartesian3} up The up direction.   * @param {Cartesian3} right The right direction.   * @param {Matrix4} result The object in which the result will be stored.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.computeView = function (position, direction, up, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("position", position);    RuntimeError.Check.typeOf.object("direction", direction);    RuntimeError.Check.typeOf.object("up", up);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = right.x;    result[1] = up.x;    result[2] = -direction.x;    result[3] = 0.0;    result[4] = right.y;    result[5] = up.y;    result[6] = -direction.y;    result[7] = 0.0;    result[8] = right.z;    result[9] = up.z;    result[10] = -direction.z;    result[11] = 0.0;    result[12] = -Cartesian3.dot(right, position);    result[13] = -Cartesian3.dot(up, position);    result[14] = Cartesian3.dot(direction, position);    result[15] = 1.0;    return result;  };  /**   * Computes an Array from the provided Matrix4 instance.   * The array will be in column-major order.   *   * @param {Matrix4} matrix The matrix to use..   * @param {Number[]} [result] The Array onto which to store the result.   * @returns {Number[]} The modified Array parameter or a new Array instance if one was not provided.   *   * @example   * //create an array from an instance of Matrix4   * // m = [10.0, 14.0, 18.0, 22.0]   * //     [11.0, 15.0, 19.0, 23.0]   * //     [12.0, 16.0, 20.0, 24.0]   * //     [13.0, 17.0, 21.0, 25.0]   * const a = Cesium.Matrix4.toArray(m);   *   * // m remains the same   * //creates a = [10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0]   */  Matrix4.toArray = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return [        matrix[0],        matrix[1],        matrix[2],        matrix[3],        matrix[4],        matrix[5],        matrix[6],        matrix[7],        matrix[8],        matrix[9],        matrix[10],        matrix[11],        matrix[12],        matrix[13],        matrix[14],        matrix[15],      ];    }    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    result[4] = matrix[4];    result[5] = matrix[5];    result[6] = matrix[6];    result[7] = matrix[7];    result[8] = matrix[8];    result[9] = matrix[9];    result[10] = matrix[10];    result[11] = matrix[11];    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  /**   * Computes the array index of the element at the provided row and column.   *   * @param {Number} row The zero-based index of the row.   * @param {Number} column The zero-based index of the column.   * @returns {Number} The index of the element at the provided row and column.   *   * @exception {DeveloperError} row must be 0, 1, 2, or 3.   * @exception {DeveloperError} column must be 0, 1, 2, or 3.   *   * @example   * const myMatrix = new Cesium.Matrix4();   * const column1Row0Index = Cesium.Matrix4.getElementIndex(1, 0);   * const column1Row0 = myMatrix[column1Row0Index];   * myMatrix[column1Row0Index] = 10.0;   */  Matrix4.getElementIndex = function (column, row) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("row", row, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("row", row, 3);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("column", column, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("column", column, 3);    //>>includeEnd('debug');    return column * 4 + row;  };  /**   * Retrieves a copy of the matrix column at the provided index as a Cartesian4 instance.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Number} index The zero-based index of the column to retrieve.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, 2, or 3.   *   * @example   * //returns a Cartesian4 instance with values from the specified column   * // m = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [18.0, 19.0, 20.0, 21.0]   * //     [22.0, 23.0, 24.0, 25.0]   *   * //Example 1: Creates an instance of Cartesian   * const a = Cesium.Matrix4.getColumn(m, 2, new Cesium.Cartesian4());   *   * @example   * //Example 2: Sets values for Cartesian instance   * const a = new Cesium.Cartesian4();   * Cesium.Matrix4.getColumn(m, 2, a);   *   * // a.x = 12.0; a.y = 16.0; a.z = 20.0; a.w = 24.0;   */  Matrix4.getColumn = function (matrix, index, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 3);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const startIndex = index * 4;    const x = matrix[startIndex];    const y = matrix[startIndex + 1];    const z = matrix[startIndex + 2];    const w = matrix[startIndex + 3];    result.x = x;    result.y = y;    result.z = z;    result.w = w;    return result;  };  /**   * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian4 instance.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Number} index The zero-based index of the column to set.   * @param {Cartesian4} cartesian The Cartesian whose values will be assigned to the specified column.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, 2, or 3.   *   * @example   * //creates a new Matrix4 instance with new column values from the Cartesian4 instance   * // m = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [18.0, 19.0, 20.0, 21.0]   * //     [22.0, 23.0, 24.0, 25.0]   *   * const a = Cesium.Matrix4.setColumn(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4());   *   * // m remains the same   * // a = [10.0, 11.0, 99.0, 13.0]   * //     [14.0, 15.0, 98.0, 17.0]   * //     [18.0, 19.0, 97.0, 21.0]   * //     [22.0, 23.0, 96.0, 25.0]   */  Matrix4.setColumn = function (matrix, index, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 3);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result = Matrix4.clone(matrix, result);    const startIndex = index * 4;    result[startIndex] = cartesian.x;    result[startIndex + 1] = cartesian.y;    result[startIndex + 2] = cartesian.z;    result[startIndex + 3] = cartesian.w;    return result;  };  /**   * Retrieves a copy of the matrix row at the provided index as a Cartesian4 instance.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Number} index The zero-based index of the row to retrieve.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, 2, or 3.   *   * @example   * //returns a Cartesian4 instance with values from the specified column   * // m = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [18.0, 19.0, 20.0, 21.0]   * //     [22.0, 23.0, 24.0, 25.0]   *   * //Example 1: Returns an instance of Cartesian   * const a = Cesium.Matrix4.getRow(m, 2, new Cesium.Cartesian4());   *   * @example   * //Example 2: Sets values for a Cartesian instance   * const a = new Cesium.Cartesian4();   * Cesium.Matrix4.getRow(m, 2, a);   *   * // a.x = 18.0; a.y = 19.0; a.z = 20.0; a.w = 21.0;   */  Matrix4.getRow = function (matrix, index, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 3);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = matrix[index];    const y = matrix[index + 4];    const z = matrix[index + 8];    const w = matrix[index + 12];    result.x = x;    result.y = y;    result.z = z;    result.w = w;    return result;  };  /**   * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian4 instance.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Number} index The zero-based index of the row to set.   * @param {Cartesian4} cartesian The Cartesian whose values will be assigned to the specified row.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @exception {DeveloperError} index must be 0, 1, 2, or 3.   *   * @example   * //create a new Matrix4 instance with new row values from the Cartesian4 instance   * // m = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [18.0, 19.0, 20.0, 21.0]   * //     [22.0, 23.0, 24.0, 25.0]   *   * const a = Cesium.Matrix4.setRow(m, 2, new Cesium.Cartesian4(99.0, 98.0, 97.0, 96.0), new Cesium.Matrix4());   *   * // m remains the same   * // a = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [99.0, 98.0, 97.0, 96.0]   * //     [22.0, 23.0, 24.0, 25.0]   */  Matrix4.setRow = function (matrix, index, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 3);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result = Matrix4.clone(matrix, result);    result[index] = cartesian.x;    result[index + 4] = cartesian.y;    result[index + 8] = cartesian.z;    result[index + 12] = cartesian.w;    return result;  };  /**   * Computes a new matrix that replaces the translation in the rightmost column of the provided   * matrix with the provided translation. This assumes the matrix is an affine transformation.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Cartesian3} translation The translation that replaces the translation of the provided matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.setTranslation = function (matrix, translation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("translation", translation);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    result[4] = matrix[4];    result[5] = matrix[5];    result[6] = matrix[6];    result[7] = matrix[7];    result[8] = matrix[8];    result[9] = matrix[9];    result[10] = matrix[10];    result[11] = matrix[11];    result[12] = translation.x;    result[13] = translation.y;    result[14] = translation.z;    result[15] = matrix[15];    return result;  };  const scaleScratch1$1 = new Cartesian3();  /**   * Computes a new matrix that replaces the scale with the provided scale.   * This assumes the matrix is an affine transformation.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Cartesian3} scale The scale that replaces the scale of the provided matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @see Matrix4.setUniformScale   * @see Matrix4.fromScale   * @see Matrix4.fromUniformScale   * @see Matrix4.multiplyByScale   * @see Matrix4.multiplyByUniformScale   * @see Matrix4.getScale   */  Matrix4.setScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const existingScale = Matrix4.getScale(matrix, scaleScratch1$1);    const scaleRatioX = scale.x / existingScale.x;    const scaleRatioY = scale.y / existingScale.y;    const scaleRatioZ = scale.z / existingScale.z;    result[0] = matrix[0] * scaleRatioX;    result[1] = matrix[1] * scaleRatioX;    result[2] = matrix[2] * scaleRatioX;    result[3] = matrix[3];    result[4] = matrix[4] * scaleRatioY;    result[5] = matrix[5] * scaleRatioY;    result[6] = matrix[6] * scaleRatioY;    result[7] = matrix[7];    result[8] = matrix[8] * scaleRatioZ;    result[9] = matrix[9] * scaleRatioZ;    result[10] = matrix[10] * scaleRatioZ;    result[11] = matrix[11];    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  const scaleScratch2$1 = new Cartesian3();  /**   * Computes a new matrix that replaces the scale with the provided uniform scale.   * This assumes the matrix is an affine transformation.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Number} scale The uniform scale that replaces the scale of the provided matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @see Matrix4.setScale   * @see Matrix4.fromScale   * @see Matrix4.fromUniformScale   * @see Matrix4.multiplyByScale   * @see Matrix4.multiplyByUniformScale   * @see Matrix4.getScale   */  Matrix4.setUniformScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const existingScale = Matrix4.getScale(matrix, scaleScratch2$1);    const scaleRatioX = scale / existingScale.x;    const scaleRatioY = scale / existingScale.y;    const scaleRatioZ = scale / existingScale.z;    result[0] = matrix[0] * scaleRatioX;    result[1] = matrix[1] * scaleRatioX;    result[2] = matrix[2] * scaleRatioX;    result[3] = matrix[3];    result[4] = matrix[4] * scaleRatioY;    result[5] = matrix[5] * scaleRatioY;    result[6] = matrix[6] * scaleRatioY;    result[7] = matrix[7];    result[8] = matrix[8] * scaleRatioZ;    result[9] = matrix[9] * scaleRatioZ;    result[10] = matrix[10] * scaleRatioZ;    result[11] = matrix[11];    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  const scratchColumn$1 = new Cartesian3();  /**   * Extracts the non-uniform scale assuming the matrix is an affine transformation.   *   * @param {Matrix4} matrix The matrix.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter   *   * @see Matrix4.multiplyByScale   * @see Matrix4.multiplyByUniformScale   * @see Matrix4.fromScale   * @see Matrix4.fromUniformScale   * @see Matrix4.setScale   * @see Matrix4.setUniformScale   */  Matrix4.getScale = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Cartesian3.magnitude(      Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn$1)    );    result.y = Cartesian3.magnitude(      Cartesian3.fromElements(matrix[4], matrix[5], matrix[6], scratchColumn$1)    );    result.z = Cartesian3.magnitude(      Cartesian3.fromElements(matrix[8], matrix[9], matrix[10], scratchColumn$1)    );    return result;  };  const scaleScratch3$1 = new Cartesian3();  /**   * Computes the maximum scale assuming the matrix is an affine transformation.   * The maximum scale is the maximum length of the column vectors in the upper-left   * 3x3 matrix.   *   * @param {Matrix4} matrix The matrix.   * @returns {Number} The maximum scale.   */  Matrix4.getMaximumScale = function (matrix) {    Matrix4.getScale(matrix, scaleScratch3$1);    return Cartesian3.maximumComponent(scaleScratch3$1);  };  const scaleScratch4$1 = new Cartesian3();  /**   * Sets the rotation assuming the matrix is an affine transformation.   *   * @param {Matrix4} matrix The matrix.   * @param {Matrix4} rotation The rotation matrix.   * @returns {Matrix4} The modified result parameter.   *   * @see Matrix4.fromRotation   * @see Matrix4.getRotation   */  Matrix4.setRotation = function (matrix, rotation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const scale = Matrix4.getScale(matrix, scaleScratch4$1);    result[0] = rotation[0] * scale.x;    result[1] = rotation[1] * scale.x;    result[2] = rotation[2] * scale.x;    result[3] = matrix[3];    result[4] = rotation[3] * scale.y;    result[5] = rotation[4] * scale.y;    result[6] = rotation[5] * scale.y;    result[7] = matrix[7];    result[8] = rotation[6] * scale.z;    result[9] = rotation[7] * scale.z;    result[10] = rotation[8] * scale.z;    result[11] = matrix[11];    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  const scaleScratch5$1 = new Cartesian3();  /**   * Extracts the rotation matrix assuming the matrix is an affine transformation.   *   * @param {Matrix4} matrix The matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @see Matrix4.setRotation   * @see Matrix4.fromRotation   */  Matrix4.getRotation = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const scale = Matrix4.getScale(matrix, scaleScratch5$1);    result[0] = matrix[0] / scale.x;    result[1] = matrix[1] / scale.x;    result[2] = matrix[2] / scale.x;    result[3] = matrix[4] / scale.y;    result[4] = matrix[5] / scale.y;    result[5] = matrix[6] / scale.y;    result[6] = matrix[8] / scale.z;    result[7] = matrix[9] / scale.z;    result[8] = matrix[10] / scale.z;    return result;  };  /**   * Computes the product of two matrices.   *   * @param {Matrix4} left The first matrix.   * @param {Matrix4} right The second matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.multiply = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const left0 = left[0];    const left1 = left[1];    const left2 = left[2];    const left3 = left[3];    const left4 = left[4];    const left5 = left[5];    const left6 = left[6];    const left7 = left[7];    const left8 = left[8];    const left9 = left[9];    const left10 = left[10];    const left11 = left[11];    const left12 = left[12];    const left13 = left[13];    const left14 = left[14];    const left15 = left[15];    const right0 = right[0];    const right1 = right[1];    const right2 = right[2];    const right3 = right[3];    const right4 = right[4];    const right5 = right[5];    const right6 = right[6];    const right7 = right[7];    const right8 = right[8];    const right9 = right[9];    const right10 = right[10];    const right11 = right[11];    const right12 = right[12];    const right13 = right[13];    const right14 = right[14];    const right15 = right[15];    const column0Row0 =      left0 * right0 + left4 * right1 + left8 * right2 + left12 * right3;    const column0Row1 =      left1 * right0 + left5 * right1 + left9 * right2 + left13 * right3;    const column0Row2 =      left2 * right0 + left6 * right1 + left10 * right2 + left14 * right3;    const column0Row3 =      left3 * right0 + left7 * right1 + left11 * right2 + left15 * right3;    const column1Row0 =      left0 * right4 + left4 * right5 + left8 * right6 + left12 * right7;    const column1Row1 =      left1 * right4 + left5 * right5 + left9 * right6 + left13 * right7;    const column1Row2 =      left2 * right4 + left6 * right5 + left10 * right6 + left14 * right7;    const column1Row3 =      left3 * right4 + left7 * right5 + left11 * right6 + left15 * right7;    const column2Row0 =      left0 * right8 + left4 * right9 + left8 * right10 + left12 * right11;    const column2Row1 =      left1 * right8 + left5 * right9 + left9 * right10 + left13 * right11;    const column2Row2 =      left2 * right8 + left6 * right9 + left10 * right10 + left14 * right11;    const column2Row3 =      left3 * right8 + left7 * right9 + left11 * right10 + left15 * right11;    const column3Row0 =      left0 * right12 + left4 * right13 + left8 * right14 + left12 * right15;    const column3Row1 =      left1 * right12 + left5 * right13 + left9 * right14 + left13 * right15;    const column3Row2 =      left2 * right12 + left6 * right13 + left10 * right14 + left14 * right15;    const column3Row3 =      left3 * right12 + left7 * right13 + left11 * right14 + left15 * right15;    result[0] = column0Row0;    result[1] = column0Row1;    result[2] = column0Row2;    result[3] = column0Row3;    result[4] = column1Row0;    result[5] = column1Row1;    result[6] = column1Row2;    result[7] = column1Row3;    result[8] = column2Row0;    result[9] = column2Row1;    result[10] = column2Row2;    result[11] = column2Row3;    result[12] = column3Row0;    result[13] = column3Row1;    result[14] = column3Row2;    result[15] = column3Row3;    return result;  };  /**   * Computes the sum of two matrices.   *   * @param {Matrix4} left The first matrix.   * @param {Matrix4} right The second matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.add = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = left[0] + right[0];    result[1] = left[1] + right[1];    result[2] = left[2] + right[2];    result[3] = left[3] + right[3];    result[4] = left[4] + right[4];    result[5] = left[5] + right[5];    result[6] = left[6] + right[6];    result[7] = left[7] + right[7];    result[8] = left[8] + right[8];    result[9] = left[9] + right[9];    result[10] = left[10] + right[10];    result[11] = left[11] + right[11];    result[12] = left[12] + right[12];    result[13] = left[13] + right[13];    result[14] = left[14] + right[14];    result[15] = left[15] + right[15];    return result;  };  /**   * Computes the difference of two matrices.   *   * @param {Matrix4} left The first matrix.   * @param {Matrix4} right The second matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.subtract = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = left[0] - right[0];    result[1] = left[1] - right[1];    result[2] = left[2] - right[2];    result[3] = left[3] - right[3];    result[4] = left[4] - right[4];    result[5] = left[5] - right[5];    result[6] = left[6] - right[6];    result[7] = left[7] - right[7];    result[8] = left[8] - right[8];    result[9] = left[9] - right[9];    result[10] = left[10] - right[10];    result[11] = left[11] - right[11];    result[12] = left[12] - right[12];    result[13] = left[13] - right[13];    result[14] = left[14] - right[14];    result[15] = left[15] - right[15];    return result;  };  /**   * Computes the product of two matrices assuming the matrices are affine transformation matrices,   * where the upper left 3x3 elements are any matrix, and   * the upper three elements in the fourth column are the translation.   * The bottom row is assumed to be [0, 0, 0, 1].   * The matrix is not verified to be in the proper form.   * This method is faster than computing the product for general 4x4   * matrices using {@link Matrix4.multiply}.   *   * @param {Matrix4} left The first matrix.   * @param {Matrix4} right The second matrix.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @example   * const m1 = new Cesium.Matrix4(1.0, 6.0, 7.0, 0.0, 2.0, 5.0, 8.0, 0.0, 3.0, 4.0, 9.0, 0.0, 0.0, 0.0, 0.0, 1.0);   * const m2 = Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3(1.0, 1.0, 1.0));   * const m3 = Cesium.Matrix4.multiplyTransformation(m1, m2, new Cesium.Matrix4());   */  Matrix4.multiplyTransformation = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const left0 = left[0];    const left1 = left[1];    const left2 = left[2];    const left4 = left[4];    const left5 = left[5];    const left6 = left[6];    const left8 = left[8];    const left9 = left[9];    const left10 = left[10];    const left12 = left[12];    const left13 = left[13];    const left14 = left[14];    const right0 = right[0];    const right1 = right[1];    const right2 = right[2];    const right4 = right[4];    const right5 = right[5];    const right6 = right[6];    const right8 = right[8];    const right9 = right[9];    const right10 = right[10];    const right12 = right[12];    const right13 = right[13];    const right14 = right[14];    const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2;    const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2;    const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2;    const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6;    const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6;    const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6;    const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10;    const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10;    const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10;    const column3Row0 =      left0 * right12 + left4 * right13 + left8 * right14 + left12;    const column3Row1 =      left1 * right12 + left5 * right13 + left9 * right14 + left13;    const column3Row2 =      left2 * right12 + left6 * right13 + left10 * right14 + left14;    result[0] = column0Row0;    result[1] = column0Row1;    result[2] = column0Row2;    result[3] = 0.0;    result[4] = column1Row0;    result[5] = column1Row1;    result[6] = column1Row2;    result[7] = 0.0;    result[8] = column2Row0;    result[9] = column2Row1;    result[10] = column2Row2;    result[11] = 0.0;    result[12] = column3Row0;    result[13] = column3Row1;    result[14] = column3Row2;    result[15] = 1.0;    return result;  };  /**   * Multiplies a transformation matrix (with a bottom row of <code>[0.0, 0.0, 0.0, 1.0]</code>)   * by a 3x3 rotation matrix.  This is an optimization   * for <code>Matrix4.multiply(m, Matrix4.fromRotationTranslation(rotation), m);</code> with less allocations and arithmetic operations.   *   * @param {Matrix4} matrix The matrix on the left-hand side.   * @param {Matrix3} rotation The 3x3 rotation matrix on the right-hand side.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @example   * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromRotationTranslation(rotation), m);   * Cesium.Matrix4.multiplyByMatrix3(m, rotation, m);   */  Matrix4.multiplyByMatrix3 = function (matrix, rotation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("rotation", rotation);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const left0 = matrix[0];    const left1 = matrix[1];    const left2 = matrix[2];    const left4 = matrix[4];    const left5 = matrix[5];    const left6 = matrix[6];    const left8 = matrix[8];    const left9 = matrix[9];    const left10 = matrix[10];    const right0 = rotation[0];    const right1 = rotation[1];    const right2 = rotation[2];    const right4 = rotation[3];    const right5 = rotation[4];    const right6 = rotation[5];    const right8 = rotation[6];    const right9 = rotation[7];    const right10 = rotation[8];    const column0Row0 = left0 * right0 + left4 * right1 + left8 * right2;    const column0Row1 = left1 * right0 + left5 * right1 + left9 * right2;    const column0Row2 = left2 * right0 + left6 * right1 + left10 * right2;    const column1Row0 = left0 * right4 + left4 * right5 + left8 * right6;    const column1Row1 = left1 * right4 + left5 * right5 + left9 * right6;    const column1Row2 = left2 * right4 + left6 * right5 + left10 * right6;    const column2Row0 = left0 * right8 + left4 * right9 + left8 * right10;    const column2Row1 = left1 * right8 + left5 * right9 + left9 * right10;    const column2Row2 = left2 * right8 + left6 * right9 + left10 * right10;    result[0] = column0Row0;    result[1] = column0Row1;    result[2] = column0Row2;    result[3] = 0.0;    result[4] = column1Row0;    result[5] = column1Row1;    result[6] = column1Row2;    result[7] = 0.0;    result[8] = column2Row0;    result[9] = column2Row1;    result[10] = column2Row2;    result[11] = 0.0;    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  /**   * Multiplies a transformation matrix (with a bottom row of <code>[0.0, 0.0, 0.0, 1.0]</code>)   * by an implicit translation matrix defined by a {@link Cartesian3}.  This is an optimization   * for <code>Matrix4.multiply(m, Matrix4.fromTranslation(position), m);</code> with less allocations and arithmetic operations.   *   * @param {Matrix4} matrix The matrix on the left-hand side.   * @param {Cartesian3} translation The translation on the right-hand side.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @example   * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromTranslation(position), m);   * Cesium.Matrix4.multiplyByTranslation(m, position, m);   */  Matrix4.multiplyByTranslation = function (matrix, translation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("translation", translation);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = translation.x;    const y = translation.y;    const z = translation.z;    const tx = x * matrix[0] + y * matrix[4] + z * matrix[8] + matrix[12];    const ty = x * matrix[1] + y * matrix[5] + z * matrix[9] + matrix[13];    const tz = x * matrix[2] + y * matrix[6] + z * matrix[10] + matrix[14];    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    result[4] = matrix[4];    result[5] = matrix[5];    result[6] = matrix[6];    result[7] = matrix[7];    result[8] = matrix[8];    result[9] = matrix[9];    result[10] = matrix[10];    result[11] = matrix[11];    result[12] = tx;    result[13] = ty;    result[14] = tz;    result[15] = matrix[15];    return result;  };  /**   * Multiplies an affine transformation matrix (with a bottom row of <code>[0.0, 0.0, 0.0, 1.0]</code>)   * by an implicit non-uniform scale matrix. This is an optimization   * for <code>Matrix4.multiply(m, Matrix4.fromUniformScale(scale), m);</code>, where   * <code>m</code> must be an affine matrix.   * This function performs fewer allocations and arithmetic operations.   *   * @param {Matrix4} matrix The affine matrix on the left-hand side.   * @param {Cartesian3} scale The non-uniform scale on the right-hand side.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   *   * @example   * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromScale(scale), m);   * Cesium.Matrix4.multiplyByScale(m, scale, m);   *   * @see Matrix4.multiplyByUniformScale   * @see Matrix4.fromScale   * @see Matrix4.fromUniformScale   * @see Matrix4.setScale   * @see Matrix4.setUniformScale   * @see Matrix4.getScale   */  Matrix4.multiplyByScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const scaleX = scale.x;    const scaleY = scale.y;    const scaleZ = scale.z;    // Faster than Cartesian3.equals    if (scaleX === 1.0 && scaleY === 1.0 && scaleZ === 1.0) {      return Matrix4.clone(matrix, result);    }    result[0] = scaleX * matrix[0];    result[1] = scaleX * matrix[1];    result[2] = scaleX * matrix[2];    result[3] = matrix[3];    result[4] = scaleY * matrix[4];    result[5] = scaleY * matrix[5];    result[6] = scaleY * matrix[6];    result[7] = matrix[7];    result[8] = scaleZ * matrix[8];    result[9] = scaleZ * matrix[9];    result[10] = scaleZ * matrix[10];    result[11] = matrix[11];    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  /**   * Computes the product of a matrix times a uniform scale, as if the scale were a scale matrix.   *   * @param {Matrix4} matrix The matrix on the left-hand side.   * @param {Number} scale The uniform scale on the right-hand side.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @example   * // Instead of Cesium.Matrix4.multiply(m, Cesium.Matrix4.fromUniformScale(scale), m);   * Cesium.Matrix4.multiplyByUniformScale(m, scale, m);   *   * @see Matrix4.multiplyByScale   * @see Matrix4.fromScale   * @see Matrix4.fromUniformScale   * @see Matrix4.setScale   * @see Matrix4.setUniformScale   * @see Matrix4.getScale   */  Matrix4.multiplyByUniformScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scale;    result[1] = matrix[1] * scale;    result[2] = matrix[2] * scale;    result[3] = matrix[3];    result[4] = matrix[4] * scale;    result[5] = matrix[5] * scale;    result[6] = matrix[6] * scale;    result[7] = matrix[7];    result[8] = matrix[8] * scale;    result[9] = matrix[9] * scale;    result[10] = matrix[10] * scale;    result[11] = matrix[11];    result[12] = matrix[12];    result[13] = matrix[13];    result[14] = matrix[14];    result[15] = matrix[15];    return result;  };  /**   * Computes the product of a matrix and a column vector.   *   * @param {Matrix4} matrix The matrix.   * @param {Cartesian4} cartesian The vector.   * @param {Cartesian4} result The object onto which to store the result.   * @returns {Cartesian4} The modified result parameter.   */  Matrix4.multiplyByVector = function (matrix, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const vX = cartesian.x;    const vY = cartesian.y;    const vZ = cartesian.z;    const vW = cartesian.w;    const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12] * vW;    const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13] * vW;    const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14] * vW;    const w = matrix[3] * vX + matrix[7] * vY + matrix[11] * vZ + matrix[15] * vW;    result.x = x;    result.y = y;    result.z = z;    result.w = w;    return result;  };  /**   * Computes the product of a matrix and a {@link Cartesian3}.  This is equivalent to calling {@link Matrix4.multiplyByVector}   * with a {@link Cartesian4} with a <code>w</code> component of zero.   *   * @param {Matrix4} matrix The matrix.   * @param {Cartesian3} cartesian The point.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   *   * @example   * const p = new Cesium.Cartesian3(1.0, 2.0, 3.0);   * const result = Cesium.Matrix4.multiplyByPointAsVector(matrix, p, new Cesium.Cartesian3());   * // A shortcut for   * //   Cartesian3 p = ...   * //   Cesium.Matrix4.multiplyByVector(matrix, new Cesium.Cartesian4(p.x, p.y, p.z, 0.0), result);   */  Matrix4.multiplyByPointAsVector = function (matrix, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const vX = cartesian.x;    const vY = cartesian.y;    const vZ = cartesian.z;    const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ;    const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ;    const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ;    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Computes the product of a matrix and a {@link Cartesian3}. This is equivalent to calling {@link Matrix4.multiplyByVector}   * with a {@link Cartesian4} with a <code>w</code> component of 1, but returns a {@link Cartesian3} instead of a {@link Cartesian4}.   *   * @param {Matrix4} matrix The matrix.   * @param {Cartesian3} cartesian The point.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   *   * @example   * const p = new Cesium.Cartesian3(1.0, 2.0, 3.0);   * const result = Cesium.Matrix4.multiplyByPoint(matrix, p, new Cesium.Cartesian3());   */  Matrix4.multiplyByPoint = function (matrix, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const vX = cartesian.x;    const vY = cartesian.y;    const vZ = cartesian.z;    const x = matrix[0] * vX + matrix[4] * vY + matrix[8] * vZ + matrix[12];    const y = matrix[1] * vX + matrix[5] * vY + matrix[9] * vZ + matrix[13];    const z = matrix[2] * vX + matrix[6] * vY + matrix[10] * vZ + matrix[14];    result.x = x;    result.y = y;    result.z = z;    return result;  };  /**   * Computes the product of a matrix and a scalar.   *   * @param {Matrix4} matrix The matrix.   * @param {Number} scalar The number to multiply by.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @example   * //create a Matrix4 instance which is a scaled version of the supplied Matrix4   * // m = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [18.0, 19.0, 20.0, 21.0]   * //     [22.0, 23.0, 24.0, 25.0]   *   * const a = Cesium.Matrix4.multiplyByScalar(m, -2, new Cesium.Matrix4());   *   * // m remains the same   * // a = [-20.0, -22.0, -24.0, -26.0]   * //     [-28.0, -30.0, -32.0, -34.0]   * //     [-36.0, -38.0, -40.0, -42.0]   * //     [-44.0, -46.0, -48.0, -50.0]   */  Matrix4.multiplyByScalar = function (matrix, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scalar;    result[1] = matrix[1] * scalar;    result[2] = matrix[2] * scalar;    result[3] = matrix[3] * scalar;    result[4] = matrix[4] * scalar;    result[5] = matrix[5] * scalar;    result[6] = matrix[6] * scalar;    result[7] = matrix[7] * scalar;    result[8] = matrix[8] * scalar;    result[9] = matrix[9] * scalar;    result[10] = matrix[10] * scalar;    result[11] = matrix[11] * scalar;    result[12] = matrix[12] * scalar;    result[13] = matrix[13] * scalar;    result[14] = matrix[14] * scalar;    result[15] = matrix[15] * scalar;    return result;  };  /**   * Computes a negated copy of the provided matrix.   *   * @param {Matrix4} matrix The matrix to negate.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @example   * //create a new Matrix4 instance which is a negation of a Matrix4   * // m = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [18.0, 19.0, 20.0, 21.0]   * //     [22.0, 23.0, 24.0, 25.0]   *   * const a = Cesium.Matrix4.negate(m, new Cesium.Matrix4());   *   * // m remains the same   * // a = [-10.0, -11.0, -12.0, -13.0]   * //     [-14.0, -15.0, -16.0, -17.0]   * //     [-18.0, -19.0, -20.0, -21.0]   * //     [-22.0, -23.0, -24.0, -25.0]   */  Matrix4.negate = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = -matrix[0];    result[1] = -matrix[1];    result[2] = -matrix[2];    result[3] = -matrix[3];    result[4] = -matrix[4];    result[5] = -matrix[5];    result[6] = -matrix[6];    result[7] = -matrix[7];    result[8] = -matrix[8];    result[9] = -matrix[9];    result[10] = -matrix[10];    result[11] = -matrix[11];    result[12] = -matrix[12];    result[13] = -matrix[13];    result[14] = -matrix[14];    result[15] = -matrix[15];    return result;  };  /**   * Computes the transpose of the provided matrix.   *   * @param {Matrix4} matrix The matrix to transpose.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @example   * //returns transpose of a Matrix4   * // m = [10.0, 11.0, 12.0, 13.0]   * //     [14.0, 15.0, 16.0, 17.0]   * //     [18.0, 19.0, 20.0, 21.0]   * //     [22.0, 23.0, 24.0, 25.0]   *   * const a = Cesium.Matrix4.transpose(m, new Cesium.Matrix4());   *   * // m remains the same   * // a = [10.0, 14.0, 18.0, 22.0]   * //     [11.0, 15.0, 19.0, 23.0]   * //     [12.0, 16.0, 20.0, 24.0]   * //     [13.0, 17.0, 21.0, 25.0]   */  Matrix4.transpose = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const matrix1 = matrix[1];    const matrix2 = matrix[2];    const matrix3 = matrix[3];    const matrix6 = matrix[6];    const matrix7 = matrix[7];    const matrix11 = matrix[11];    result[0] = matrix[0];    result[1] = matrix[4];    result[2] = matrix[8];    result[3] = matrix[12];    result[4] = matrix1;    result[5] = matrix[5];    result[6] = matrix[9];    result[7] = matrix[13];    result[8] = matrix2;    result[9] = matrix6;    result[10] = matrix[10];    result[11] = matrix[14];    result[12] = matrix3;    result[13] = matrix7;    result[14] = matrix11;    result[15] = matrix[15];    return result;  };  /**   * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements.   *   * @param {Matrix4} matrix The matrix with signed elements.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.abs = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = Math.abs(matrix[0]);    result[1] = Math.abs(matrix[1]);    result[2] = Math.abs(matrix[2]);    result[3] = Math.abs(matrix[3]);    result[4] = Math.abs(matrix[4]);    result[5] = Math.abs(matrix[5]);    result[6] = Math.abs(matrix[6]);    result[7] = Math.abs(matrix[7]);    result[8] = Math.abs(matrix[8]);    result[9] = Math.abs(matrix[9]);    result[10] = Math.abs(matrix[10]);    result[11] = Math.abs(matrix[11]);    result[12] = Math.abs(matrix[12]);    result[13] = Math.abs(matrix[13]);    result[14] = Math.abs(matrix[14]);    result[15] = Math.abs(matrix[15]);    return result;  };  /**   * Compares the provided matrices componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Matrix4} [left] The first matrix.   * @param {Matrix4} [right] The second matrix.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   *   * @example   * //compares two Matrix4 instances   *   * // a = [10.0, 14.0, 18.0, 22.0]   * //     [11.0, 15.0, 19.0, 23.0]   * //     [12.0, 16.0, 20.0, 24.0]   * //     [13.0, 17.0, 21.0, 25.0]   *   * // b = [10.0, 14.0, 18.0, 22.0]   * //     [11.0, 15.0, 19.0, 23.0]   * //     [12.0, 16.0, 20.0, 24.0]   * //     [13.0, 17.0, 21.0, 25.0]   *   * if(Cesium.Matrix4.equals(a,b)) {   *      console.log("Both matrices are equal");   * } else {   *      console.log("They are not equal");   * }   *   * //Prints "Both matrices are equal" on the console   */  Matrix4.equals = function (left, right) {    // Given that most matrices will be transformation matrices, the elements    // are tested in order such that the test is likely to fail as early    // as possible.  I _think_ this is just as friendly to the L1 cache    // as testing in index order.  It is certainty faster in practice.    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        // Translation        left[12] === right[12] &&        left[13] === right[13] &&        left[14] === right[14] &&        // Rotation/scale        left[0] === right[0] &&        left[1] === right[1] &&        left[2] === right[2] &&        left[4] === right[4] &&        left[5] === right[5] &&        left[6] === right[6] &&        left[8] === right[8] &&        left[9] === right[9] &&        left[10] === right[10] &&        // Bottom row        left[3] === right[3] &&        left[7] === right[7] &&        left[11] === right[11] &&        left[15] === right[15])    );  };  /**   * Compares the provided matrices componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Matrix4} [left] The first matrix.   * @param {Matrix4} [right] The second matrix.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   *   * @example   * //compares two Matrix4 instances   *   * // a = [10.5, 14.5, 18.5, 22.5]   * //     [11.5, 15.5, 19.5, 23.5]   * //     [12.5, 16.5, 20.5, 24.5]   * //     [13.5, 17.5, 21.5, 25.5]   *   * // b = [10.0, 14.0, 18.0, 22.0]   * //     [11.0, 15.0, 19.0, 23.0]   * //     [12.0, 16.0, 20.0, 24.0]   * //     [13.0, 17.0, 21.0, 25.0]   *   * if(Cesium.Matrix4.equalsEpsilon(a,b,0.1)){   *      console.log("Difference between both the matrices is less than 0.1");   * } else {   *      console.log("Difference between both the matrices is not less than 0.1");   * }   *   * //Prints "Difference between both the matrices is not less than 0.1" on the console   */  Matrix4.equalsEpsilon = function (left, right, epsilon) {    epsilon = defaultValue.defaultValue(epsilon, 0);    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        Math.abs(left[0] - right[0]) <= epsilon &&        Math.abs(left[1] - right[1]) <= epsilon &&        Math.abs(left[2] - right[2]) <= epsilon &&        Math.abs(left[3] - right[3]) <= epsilon &&        Math.abs(left[4] - right[4]) <= epsilon &&        Math.abs(left[5] - right[5]) <= epsilon &&        Math.abs(left[6] - right[6]) <= epsilon &&        Math.abs(left[7] - right[7]) <= epsilon &&        Math.abs(left[8] - right[8]) <= epsilon &&        Math.abs(left[9] - right[9]) <= epsilon &&        Math.abs(left[10] - right[10]) <= epsilon &&        Math.abs(left[11] - right[11]) <= epsilon &&        Math.abs(left[12] - right[12]) <= epsilon &&        Math.abs(left[13] - right[13]) <= epsilon &&        Math.abs(left[14] - right[14]) <= epsilon &&        Math.abs(left[15] - right[15]) <= epsilon)    );  };  /**   * Gets the translation portion of the provided matrix, assuming the matrix is an affine transformation matrix.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Cartesian3} result The object onto which to store the result.   * @returns {Cartesian3} The modified result parameter.   */  Matrix4.getTranslation = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = matrix[12];    result.y = matrix[13];    result.z = matrix[14];    return result;  };  /**   * Gets the upper left 3x3 matrix of the provided matrix.   *   * @param {Matrix4} matrix The matrix to use.   * @param {Matrix3} result The object onto which to store the result.   * @returns {Matrix3} The modified result parameter.   *   * @example   * // returns a Matrix3 instance from a Matrix4 instance   *   * // m = [10.0, 14.0, 18.0, 22.0]   * //     [11.0, 15.0, 19.0, 23.0]   * //     [12.0, 16.0, 20.0, 24.0]   * //     [13.0, 17.0, 21.0, 25.0]   *   * const b = new Cesium.Matrix3();   * Cesium.Matrix4.getMatrix3(m,b);   *   * // b = [10.0, 14.0, 18.0]   * //     [11.0, 15.0, 19.0]   * //     [12.0, 16.0, 20.0]   */  Matrix4.getMatrix3 = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[4];    result[4] = matrix[5];    result[5] = matrix[6];    result[6] = matrix[8];    result[7] = matrix[9];    result[8] = matrix[10];    return result;  };  const scratchInverseRotation = new Matrix3();  const scratchMatrix3Zero = new Matrix3();  const scratchBottomRow = new Cartesian4();  const scratchExpectedBottomRow = new Cartesian4(0.0, 0.0, 0.0, 1.0);  /**   * Computes the inverse of the provided matrix using Cramers Rule.   * If the determinant is zero, the matrix can not be inverted, and an exception is thrown.   * If the matrix is a proper rigid transformation, it is more efficient   * to invert it with {@link Matrix4.inverseTransformation}.   *   * @param {Matrix4} matrix The matrix to invert.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   *   * @exception {RuntimeError} matrix is not invertible because its determinate is zero.   */  Matrix4.inverse = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    //    // Ported from:    //   ftp://download.intel.com/design/PentiumIII/sml/24504301.pdf    //    const src0 = matrix[0];    const src1 = matrix[4];    const src2 = matrix[8];    const src3 = matrix[12];    const src4 = matrix[1];    const src5 = matrix[5];    const src6 = matrix[9];    const src7 = matrix[13];    const src8 = matrix[2];    const src9 = matrix[6];    const src10 = matrix[10];    const src11 = matrix[14];    const src12 = matrix[3];    const src13 = matrix[7];    const src14 = matrix[11];    const src15 = matrix[15];    // calculate pairs for first 8 elements (cofactors)    let tmp0 = src10 * src15;    let tmp1 = src11 * src14;    let tmp2 = src9 * src15;    let tmp3 = src11 * src13;    let tmp4 = src9 * src14;    let tmp5 = src10 * src13;    let tmp6 = src8 * src15;    let tmp7 = src11 * src12;    let tmp8 = src8 * src14;    let tmp9 = src10 * src12;    let tmp10 = src8 * src13;    let tmp11 = src9 * src12;    // calculate first 8 elements (cofactors)    const dst0 =      tmp0 * src5 +      tmp3 * src6 +      tmp4 * src7 -      (tmp1 * src5 + tmp2 * src6 + tmp5 * src7);    const dst1 =      tmp1 * src4 +      tmp6 * src6 +      tmp9 * src7 -      (tmp0 * src4 + tmp7 * src6 + tmp8 * src7);    const dst2 =      tmp2 * src4 +      tmp7 * src5 +      tmp10 * src7 -      (tmp3 * src4 + tmp6 * src5 + tmp11 * src7);    const dst3 =      tmp5 * src4 +      tmp8 * src5 +      tmp11 * src6 -      (tmp4 * src4 + tmp9 * src5 + tmp10 * src6);    const dst4 =      tmp1 * src1 +      tmp2 * src2 +      tmp5 * src3 -      (tmp0 * src1 + tmp3 * src2 + tmp4 * src3);    const dst5 =      tmp0 * src0 +      tmp7 * src2 +      tmp8 * src3 -      (tmp1 * src0 + tmp6 * src2 + tmp9 * src3);    const dst6 =      tmp3 * src0 +      tmp6 * src1 +      tmp11 * src3 -      (tmp2 * src0 + tmp7 * src1 + tmp10 * src3);    const dst7 =      tmp4 * src0 +      tmp9 * src1 +      tmp10 * src2 -      (tmp5 * src0 + tmp8 * src1 + tmp11 * src2);    // calculate pairs for second 8 elements (cofactors)    tmp0 = src2 * src7;    tmp1 = src3 * src6;    tmp2 = src1 * src7;    tmp3 = src3 * src5;    tmp4 = src1 * src6;    tmp5 = src2 * src5;    tmp6 = src0 * src7;    tmp7 = src3 * src4;    tmp8 = src0 * src6;    tmp9 = src2 * src4;    tmp10 = src0 * src5;    tmp11 = src1 * src4;    // calculate second 8 elements (cofactors)    const dst8 =      tmp0 * src13 +      tmp3 * src14 +      tmp4 * src15 -      (tmp1 * src13 + tmp2 * src14 + tmp5 * src15);    const dst9 =      tmp1 * src12 +      tmp6 * src14 +      tmp9 * src15 -      (tmp0 * src12 + tmp7 * src14 + tmp8 * src15);    const dst10 =      tmp2 * src12 +      tmp7 * src13 +      tmp10 * src15 -      (tmp3 * src12 + tmp6 * src13 + tmp11 * src15);    const dst11 =      tmp5 * src12 +      tmp8 * src13 +      tmp11 * src14 -      (tmp4 * src12 + tmp9 * src13 + tmp10 * src14);    const dst12 =      tmp2 * src10 +      tmp5 * src11 +      tmp1 * src9 -      (tmp4 * src11 + tmp0 * src9 + tmp3 * src10);    const dst13 =      tmp8 * src11 +      tmp0 * src8 +      tmp7 * src10 -      (tmp6 * src10 + tmp9 * src11 + tmp1 * src8);    const dst14 =      tmp6 * src9 +      tmp11 * src11 +      tmp3 * src8 -      (tmp10 * src11 + tmp2 * src8 + tmp7 * src9);    const dst15 =      tmp10 * src10 +      tmp4 * src8 +      tmp9 * src9 -      (tmp8 * src9 + tmp11 * src10 + tmp5 * src8);    // calculate determinant    let det = src0 * dst0 + src1 * dst1 + src2 * dst2 + src3 * dst3;    if (Math.abs(det) < ComponentDatatype.CesiumMath.EPSILON21) {      // Special case for a zero scale matrix that can occur, for example,      // when a model's node has a [0, 0, 0] scale.      if (        Matrix3.equalsEpsilon(          Matrix4.getMatrix3(matrix, scratchInverseRotation),          scratchMatrix3Zero,          ComponentDatatype.CesiumMath.EPSILON7        ) &&        Cartesian4.equals(          Matrix4.getRow(matrix, 3, scratchBottomRow),          scratchExpectedBottomRow        )      ) {        result[0] = 0.0;        result[1] = 0.0;        result[2] = 0.0;        result[3] = 0.0;        result[4] = 0.0;        result[5] = 0.0;        result[6] = 0.0;        result[7] = 0.0;        result[8] = 0.0;        result[9] = 0.0;        result[10] = 0.0;        result[11] = 0.0;        result[12] = -matrix[12];        result[13] = -matrix[13];        result[14] = -matrix[14];        result[15] = 1.0;        return result;      }      throw new RuntimeError.RuntimeError(        "matrix is not invertible because its determinate is zero."      );    }    // calculate matrix inverse    det = 1.0 / det;    result[0] = dst0 * det;    result[1] = dst1 * det;    result[2] = dst2 * det;    result[3] = dst3 * det;    result[4] = dst4 * det;    result[5] = dst5 * det;    result[6] = dst6 * det;    result[7] = dst7 * det;    result[8] = dst8 * det;    result[9] = dst9 * det;    result[10] = dst10 * det;    result[11] = dst11 * det;    result[12] = dst12 * det;    result[13] = dst13 * det;    result[14] = dst14 * det;    result[15] = dst15 * det;    return result;  };  /**   * Computes the inverse of the provided matrix assuming it is a proper rigid matrix,   * where the upper left 3x3 elements are a rotation matrix,   * and the upper three elements in the fourth column are the translation.   * The bottom row is assumed to be [0, 0, 0, 1].   * The matrix is not verified to be in the proper form.   * This method is faster than computing the inverse for a general 4x4   * matrix using {@link Matrix4.inverse}.   *   * @param {Matrix4} matrix The matrix to invert.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.inverseTransformation = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    //This function is an optimized version of the below 4 lines.    //const rT = Matrix3.transpose(Matrix4.getMatrix3(matrix));    //const rTN = Matrix3.negate(rT);    //const rTT = Matrix3.multiplyByVector(rTN, Matrix4.getTranslation(matrix));    //return Matrix4.fromRotationTranslation(rT, rTT, result);    const matrix0 = matrix[0];    const matrix1 = matrix[1];    const matrix2 = matrix[2];    const matrix4 = matrix[4];    const matrix5 = matrix[5];    const matrix6 = matrix[6];    const matrix8 = matrix[8];    const matrix9 = matrix[9];    const matrix10 = matrix[10];    const vX = matrix[12];    const vY = matrix[13];    const vZ = matrix[14];    const x = -matrix0 * vX - matrix1 * vY - matrix2 * vZ;    const y = -matrix4 * vX - matrix5 * vY - matrix6 * vZ;    const z = -matrix8 * vX - matrix9 * vY - matrix10 * vZ;    result[0] = matrix0;    result[1] = matrix4;    result[2] = matrix8;    result[3] = 0.0;    result[4] = matrix1;    result[5] = matrix5;    result[6] = matrix9;    result[7] = 0.0;    result[8] = matrix2;    result[9] = matrix6;    result[10] = matrix10;    result[11] = 0.0;    result[12] = x;    result[13] = y;    result[14] = z;    result[15] = 1.0;    return result;  };  const scratchTransposeMatrix = new Matrix4();  /**   * Computes the inverse transpose of a matrix.   *   * @param {Matrix4} matrix The matrix to transpose and invert.   * @param {Matrix4} result The object onto which to store the result.   * @returns {Matrix4} The modified result parameter.   */  Matrix4.inverseTranspose = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    return Matrix4.inverse(      Matrix4.transpose(matrix, scratchTransposeMatrix),      result    );  };  /**   * An immutable Matrix4 instance initialized to the identity matrix.   *   * @type {Matrix4}   * @constant   */  Matrix4.IDENTITY = Object.freeze(    new Matrix4(      1.0,      0.0,      0.0,      0.0,      0.0,      1.0,      0.0,      0.0,      0.0,      0.0,      1.0,      0.0,      0.0,      0.0,      0.0,      1.0    )  );  /**   * An immutable Matrix4 instance initialized to the zero matrix.   *   * @type {Matrix4}   * @constant   */  Matrix4.ZERO = Object.freeze(    new Matrix4(      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0,      0.0    )  );  /**   * The index into Matrix4 for column 0, row 0.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN0ROW0 = 0;  /**   * The index into Matrix4 for column 0, row 1.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN0ROW1 = 1;  /**   * The index into Matrix4 for column 0, row 2.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN0ROW2 = 2;  /**   * The index into Matrix4 for column 0, row 3.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN0ROW3 = 3;  /**   * The index into Matrix4 for column 1, row 0.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN1ROW0 = 4;  /**   * The index into Matrix4 for column 1, row 1.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN1ROW1 = 5;  /**   * The index into Matrix4 for column 1, row 2.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN1ROW2 = 6;  /**   * The index into Matrix4 for column 1, row 3.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN1ROW3 = 7;  /**   * The index into Matrix4 for column 2, row 0.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN2ROW0 = 8;  /**   * The index into Matrix4 for column 2, row 1.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN2ROW1 = 9;  /**   * The index into Matrix4 for column 2, row 2.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN2ROW2 = 10;  /**   * The index into Matrix4 for column 2, row 3.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN2ROW3 = 11;  /**   * The index into Matrix4 for column 3, row 0.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN3ROW0 = 12;  /**   * The index into Matrix4 for column 3, row 1.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN3ROW1 = 13;  /**   * The index into Matrix4 for column 3, row 2.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN3ROW2 = 14;  /**   * The index into Matrix4 for column 3, row 3.   *   * @type {Number}   * @constant   */  Matrix4.COLUMN3ROW3 = 15;  Object.defineProperties(Matrix4.prototype, {    /**     * Gets the number of items in the collection.     * @memberof Matrix4.prototype     *     * @type {Number}     */    length: {      get: function () {        return Matrix4.packedLength;      },    },  });  /**   * Duplicates the provided Matrix4 instance.   *   * @param {Matrix4} [result] The object onto which to store the result.   * @returns {Matrix4} The modified result parameter or a new Matrix4 instance if one was not provided.   */  Matrix4.prototype.clone = function (result) {    return Matrix4.clone(this, result);  };  /**   * Compares this matrix to the provided matrix componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Matrix4} [right] The right hand side matrix.   * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.   */  Matrix4.prototype.equals = function (right) {    return Matrix4.equals(this, right);  };  /**   * @private   */  Matrix4.equalsArray = function (matrix, array, offset) {    return (      matrix[0] === array[offset] &&      matrix[1] === array[offset + 1] &&      matrix[2] === array[offset + 2] &&      matrix[3] === array[offset + 3] &&      matrix[4] === array[offset + 4] &&      matrix[5] === array[offset + 5] &&      matrix[6] === array[offset + 6] &&      matrix[7] === array[offset + 7] &&      matrix[8] === array[offset + 8] &&      matrix[9] === array[offset + 9] &&      matrix[10] === array[offset + 10] &&      matrix[11] === array[offset + 11] &&      matrix[12] === array[offset + 12] &&      matrix[13] === array[offset + 13] &&      matrix[14] === array[offset + 14] &&      matrix[15] === array[offset + 15]    );  };  /**   * Compares this matrix to the provided matrix componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Matrix4} [right] The right hand side matrix.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.   */  Matrix4.prototype.equalsEpsilon = function (right, epsilon) {    return Matrix4.equalsEpsilon(this, right, epsilon);  };  /**   * Computes a string representing this Matrix with each row being   * on a separate line and in the format '(column0, column1, column2, column3)'.   *   * @returns {String} A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1, column2, column3)'.   */  Matrix4.prototype.toString = function () {    return (      `(${this[0]}, ${this[4]}, ${this[8]}, ${this[12]})\n` +      `(${this[1]}, ${this[5]}, ${this[9]}, ${this[13]})\n` +      `(${this[2]}, ${this[6]}, ${this[10]}, ${this[14]})\n` +      `(${this[3]}, ${this[7]}, ${this[11]}, ${this[15]})`    );  };  /**   * A two dimensional region specified as longitude and latitude coordinates.   *   * @alias Rectangle   * @constructor   *   * @param {Number} [west=0.0] The westernmost longitude, in radians, in the range [-Pi, Pi].   * @param {Number} [south=0.0] The southernmost latitude, in radians, in the range [-Pi/2, Pi/2].   * @param {Number} [east=0.0] The easternmost longitude, in radians, in the range [-Pi, Pi].   * @param {Number} [north=0.0] The northernmost latitude, in radians, in the range [-Pi/2, Pi/2].   *   * @see Packable   */  function Rectangle(west, south, east, north) {    /**     * The westernmost longitude in radians in the range [-Pi, Pi].     *     * @type {Number}     * @default 0.0     */    this.west = defaultValue.defaultValue(west, 0.0);    /**     * The southernmost latitude in radians in the range [-Pi/2, Pi/2].     *     * @type {Number}     * @default 0.0     */    this.south = defaultValue.defaultValue(south, 0.0);    /**     * The easternmost longitude in radians in the range [-Pi, Pi].     *     * @type {Number}     * @default 0.0     */    this.east = defaultValue.defaultValue(east, 0.0);    /**     * The northernmost latitude in radians in the range [-Pi/2, Pi/2].     *     * @type {Number}     * @default 0.0     */    this.north = defaultValue.defaultValue(north, 0.0);  }  Object.defineProperties(Rectangle.prototype, {    /**     * Gets the width of the rectangle in radians.     * @memberof Rectangle.prototype     * @type {Number}     * @readonly     */    width: {      get: function () {        return Rectangle.computeWidth(this);      },    },    /**     * Gets the height of the rectangle in radians.     * @memberof Rectangle.prototype     * @type {Number}     * @readonly     */    height: {      get: function () {        return Rectangle.computeHeight(this);      },    },  });  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Rectangle.packedLength = 4;  /**   * Stores the provided instance into the provided array.   *   * @param {Rectangle} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Rectangle.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    array[startingIndex++] = value.west;    array[startingIndex++] = value.south;    array[startingIndex++] = value.east;    array[startingIndex] = value.north;    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Rectangle} [result] The object into which to store the result.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if one was not provided.   */  Rectangle.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    if (!defaultValue.defined(result)) {      result = new Rectangle();    }    result.west = array[startingIndex++];    result.south = array[startingIndex++];    result.east = array[startingIndex++];    result.north = array[startingIndex];    return result;  };  /**   * Computes the width of a rectangle in radians.   * @param {Rectangle} rectangle The rectangle to compute the width of.   * @returns {Number} The width.   */  Rectangle.computeWidth = function (rectangle) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    let east = rectangle.east;    const west = rectangle.west;    if (east < west) {      east += ComponentDatatype.CesiumMath.TWO_PI;    }    return east - west;  };  /**   * Computes the height of a rectangle in radians.   * @param {Rectangle} rectangle The rectangle to compute the height of.   * @returns {Number} The height.   */  Rectangle.computeHeight = function (rectangle) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    return rectangle.north - rectangle.south;  };  /**   * Creates a rectangle given the boundary longitude and latitude in degrees.   *   * @param {Number} [west=0.0] The westernmost longitude in degrees in the range [-180.0, 180.0].   * @param {Number} [south=0.0] The southernmost latitude in degrees in the range [-90.0, 90.0].   * @param {Number} [east=0.0] The easternmost longitude in degrees in the range [-180.0, 180.0].   * @param {Number} [north=0.0] The northernmost latitude in degrees in the range [-90.0, 90.0].   * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.   *   * @example   * const rectangle = Cesium.Rectangle.fromDegrees(0.0, 20.0, 10.0, 30.0);   */  Rectangle.fromDegrees = function (west, south, east, north, result) {    west = ComponentDatatype.CesiumMath.toRadians(defaultValue.defaultValue(west, 0.0));    south = ComponentDatatype.CesiumMath.toRadians(defaultValue.defaultValue(south, 0.0));    east = ComponentDatatype.CesiumMath.toRadians(defaultValue.defaultValue(east, 0.0));    north = ComponentDatatype.CesiumMath.toRadians(defaultValue.defaultValue(north, 0.0));    if (!defaultValue.defined(result)) {      return new Rectangle(west, south, east, north);    }    result.west = west;    result.south = south;    result.east = east;    result.north = north;    return result;  };  /**   * Creates a rectangle given the boundary longitude and latitude in radians.   *   * @param {Number} [west=0.0] The westernmost longitude in radians in the range [-Math.PI, Math.PI].   * @param {Number} [south=0.0] The southernmost latitude in radians in the range [-Math.PI/2, Math.PI/2].   * @param {Number} [east=0.0] The easternmost longitude in radians in the range [-Math.PI, Math.PI].   * @param {Number} [north=0.0] The northernmost latitude in radians in the range [-Math.PI/2, Math.PI/2].   * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.   *   * @example   * const rectangle = Cesium.Rectangle.fromRadians(0.0, Math.PI/4, Math.PI/8, 3*Math.PI/4);   */  Rectangle.fromRadians = function (west, south, east, north, result) {    if (!defaultValue.defined(result)) {      return new Rectangle(west, south, east, north);    }    result.west = defaultValue.defaultValue(west, 0.0);    result.south = defaultValue.defaultValue(south, 0.0);    result.east = defaultValue.defaultValue(east, 0.0);    result.north = defaultValue.defaultValue(north, 0.0);    return result;  };  /**   * Creates the smallest possible Rectangle that encloses all positions in the provided array.   *   * @param {Cartographic[]} cartographics The list of Cartographic instances.   * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.   */  Rectangle.fromCartographicArray = function (cartographics, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("cartographics", cartographics);    //>>includeEnd('debug');    let west = Number.MAX_VALUE;    let east = -Number.MAX_VALUE;    let westOverIDL = Number.MAX_VALUE;    let eastOverIDL = -Number.MAX_VALUE;    let south = Number.MAX_VALUE;    let north = -Number.MAX_VALUE;    for (let i = 0, len = cartographics.length; i < len; i++) {      const position = cartographics[i];      west = Math.min(west, position.longitude);      east = Math.max(east, position.longitude);      south = Math.min(south, position.latitude);      north = Math.max(north, position.latitude);      const lonAdjusted =        position.longitude >= 0          ? position.longitude          : position.longitude + ComponentDatatype.CesiumMath.TWO_PI;      westOverIDL = Math.min(westOverIDL, lonAdjusted);      eastOverIDL = Math.max(eastOverIDL, lonAdjusted);    }    if (east - west > eastOverIDL - westOverIDL) {      west = westOverIDL;      east = eastOverIDL;      if (east > ComponentDatatype.CesiumMath.PI) {        east = east - ComponentDatatype.CesiumMath.TWO_PI;      }      if (west > ComponentDatatype.CesiumMath.PI) {        west = west - ComponentDatatype.CesiumMath.TWO_PI;      }    }    if (!defaultValue.defined(result)) {      return new Rectangle(west, south, east, north);    }    result.west = west;    result.south = south;    result.east = east;    result.north = north;    return result;  };  /**   * Creates the smallest possible Rectangle that encloses all positions in the provided array.   *   * @param {Cartesian3[]} cartesians The list of Cartesian instances.   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid the cartesians are on.   * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.   */  Rectangle.fromCartesianArray = function (cartesians, ellipsoid, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("cartesians", cartesians);    //>>includeEnd('debug');    ellipsoid = defaultValue.defaultValue(ellipsoid, Ellipsoid.WGS84);    let west = Number.MAX_VALUE;    let east = -Number.MAX_VALUE;    let westOverIDL = Number.MAX_VALUE;    let eastOverIDL = -Number.MAX_VALUE;    let south = Number.MAX_VALUE;    let north = -Number.MAX_VALUE;    for (let i = 0, len = cartesians.length; i < len; i++) {      const position = ellipsoid.cartesianToCartographic(cartesians[i]);      west = Math.min(west, position.longitude);      east = Math.max(east, position.longitude);      south = Math.min(south, position.latitude);      north = Math.max(north, position.latitude);      const lonAdjusted =        position.longitude >= 0          ? position.longitude          : position.longitude + ComponentDatatype.CesiumMath.TWO_PI;      westOverIDL = Math.min(westOverIDL, lonAdjusted);      eastOverIDL = Math.max(eastOverIDL, lonAdjusted);    }    if (east - west > eastOverIDL - westOverIDL) {      west = westOverIDL;      east = eastOverIDL;      if (east > ComponentDatatype.CesiumMath.PI) {        east = east - ComponentDatatype.CesiumMath.TWO_PI;      }      if (west > ComponentDatatype.CesiumMath.PI) {        west = west - ComponentDatatype.CesiumMath.TWO_PI;      }    }    if (!defaultValue.defined(result)) {      return new Rectangle(west, south, east, north);    }    result.west = west;    result.south = south;    result.east = east;    result.north = north;    return result;  };  /**   * Duplicates a Rectangle.   *   * @param {Rectangle} rectangle The rectangle to clone.   * @param {Rectangle} [result] The object onto which to store the result, or undefined if a new instance should be created.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided. (Returns undefined if rectangle is undefined)   */  Rectangle.clone = function (rectangle, result) {    if (!defaultValue.defined(rectangle)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Rectangle(        rectangle.west,        rectangle.south,        rectangle.east,        rectangle.north      );    }    result.west = rectangle.west;    result.south = rectangle.south;    result.east = rectangle.east;    result.north = rectangle.north;    return result;  };  /**   * Compares the provided Rectangles componentwise and returns   * <code>true</code> if they pass an absolute or relative tolerance test,   * <code>false</code> otherwise.   *   * @param {Rectangle} [left] The first Rectangle.   * @param {Rectangle} [right] The second Rectangle.   * @param {Number} [absoluteEpsilon=0] The absolute epsilon tolerance to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Rectangle.equalsEpsilon = function (left, right, absoluteEpsilon) {    absoluteEpsilon = defaultValue.defaultValue(absoluteEpsilon, 0);    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        Math.abs(left.west - right.west) <= absoluteEpsilon &&        Math.abs(left.south - right.south) <= absoluteEpsilon &&        Math.abs(left.east - right.east) <= absoluteEpsilon &&        Math.abs(left.north - right.north) <= absoluteEpsilon)    );  };  /**   * Duplicates this Rectangle.   *   * @param {Rectangle} [result] The object onto which to store the result.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.   */  Rectangle.prototype.clone = function (result) {    return Rectangle.clone(this, result);  };  /**   * Compares the provided Rectangle with this Rectangle componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Rectangle} [other] The Rectangle to compare.   * @returns {Boolean} <code>true</code> if the Rectangles are equal, <code>false</code> otherwise.   */  Rectangle.prototype.equals = function (other) {    return Rectangle.equals(this, other);  };  /**   * Compares the provided rectangles and returns <code>true</code> if they are equal,   * <code>false</code> otherwise.   *   * @param {Rectangle} [left] The first Rectangle.   * @param {Rectangle} [right] The second Rectangle.   * @returns {Boolean} <code>true</code> if left and right are equal; otherwise <code>false</code>.   */  Rectangle.equals = function (left, right) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        left.west === right.west &&        left.south === right.south &&        left.east === right.east &&        left.north === right.north)    );  };  /**   * Compares the provided Rectangle with this Rectangle componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Rectangle} [other] The Rectangle to compare.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if the Rectangles are within the provided epsilon, <code>false</code> otherwise.   */  Rectangle.prototype.equalsEpsilon = function (other, epsilon) {    return Rectangle.equalsEpsilon(this, other, epsilon);  };  /**   * Checks a Rectangle's properties and throws if they are not in valid ranges.   *   * @param {Rectangle} rectangle The rectangle to validate   *   * @exception {DeveloperError} <code>north</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].   * @exception {DeveloperError} <code>south</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].   * @exception {DeveloperError} <code>east</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].   * @exception {DeveloperError} <code>west</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].   */  Rectangle.validate = function (rectangle) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    const north = rectangle.north;    RuntimeError.Check.typeOf.number.greaterThanOrEquals(      "north",      north,      -ComponentDatatype.CesiumMath.PI_OVER_TWO    );    RuntimeError.Check.typeOf.number.lessThanOrEquals("north", north, ComponentDatatype.CesiumMath.PI_OVER_TWO);    const south = rectangle.south;    RuntimeError.Check.typeOf.number.greaterThanOrEquals(      "south",      south,      -ComponentDatatype.CesiumMath.PI_OVER_TWO    );    RuntimeError.Check.typeOf.number.lessThanOrEquals("south", south, ComponentDatatype.CesiumMath.PI_OVER_TWO);    const west = rectangle.west;    RuntimeError.Check.typeOf.number.greaterThanOrEquals("west", west, -Math.PI);    RuntimeError.Check.typeOf.number.lessThanOrEquals("west", west, Math.PI);    const east = rectangle.east;    RuntimeError.Check.typeOf.number.greaterThanOrEquals("east", east, -Math.PI);    RuntimeError.Check.typeOf.number.lessThanOrEquals("east", east, Math.PI);    //>>includeEnd('debug');  };  /**   * Computes the southwest corner of a rectangle.   *   * @param {Rectangle} rectangle The rectangle for which to find the corner   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.   */  Rectangle.southwest = function (rectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Cartographic(rectangle.west, rectangle.south);    }    result.longitude = rectangle.west;    result.latitude = rectangle.south;    result.height = 0.0;    return result;  };  /**   * Computes the northwest corner of a rectangle.   *   * @param {Rectangle} rectangle The rectangle for which to find the corner   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.   */  Rectangle.northwest = function (rectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Cartographic(rectangle.west, rectangle.north);    }    result.longitude = rectangle.west;    result.latitude = rectangle.north;    result.height = 0.0;    return result;  };  /**   * Computes the northeast corner of a rectangle.   *   * @param {Rectangle} rectangle The rectangle for which to find the corner   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.   */  Rectangle.northeast = function (rectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Cartographic(rectangle.east, rectangle.north);    }    result.longitude = rectangle.east;    result.latitude = rectangle.north;    result.height = 0.0;    return result;  };  /**   * Computes the southeast corner of a rectangle.   *   * @param {Rectangle} rectangle The rectangle for which to find the corner   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.   */  Rectangle.southeast = function (rectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Cartographic(rectangle.east, rectangle.south);    }    result.longitude = rectangle.east;    result.latitude = rectangle.south;    result.height = 0.0;    return result;  };  /**   * Computes the center of a rectangle.   *   * @param {Rectangle} rectangle The rectangle for which to find the center   * @param {Cartographic} [result] The object onto which to store the result.   * @returns {Cartographic} The modified result parameter or a new Cartographic instance if none was provided.   */  Rectangle.center = function (rectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    let east = rectangle.east;    const west = rectangle.west;    if (east < west) {      east += ComponentDatatype.CesiumMath.TWO_PI;    }    const longitude = ComponentDatatype.CesiumMath.negativePiToPi((west + east) * 0.5);    const latitude = (rectangle.south + rectangle.north) * 0.5;    if (!defaultValue.defined(result)) {      return new Cartographic(longitude, latitude);    }    result.longitude = longitude;    result.latitude = latitude;    result.height = 0.0;    return result;  };  /**   * Computes the intersection of two rectangles.  This function assumes that the rectangle's coordinates are   * latitude and longitude in radians and produces a correct intersection, taking into account the fact that   * the same angle can be represented with multiple values as well as the wrapping of longitude at the   * anti-meridian.  For a simple intersection that ignores these factors and can be used with projected   * coordinates, see {@link Rectangle.simpleIntersection}.   *   * @param {Rectangle} rectangle On rectangle to find an intersection   * @param {Rectangle} otherRectangle Another rectangle to find an intersection   * @param {Rectangle} [result] The object onto which to store the result.   * @returns {Rectangle|undefined} The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection.   */  Rectangle.intersection = function (rectangle, otherRectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    RuntimeError.Check.typeOf.object("otherRectangle", otherRectangle);    //>>includeEnd('debug');    let rectangleEast = rectangle.east;    let rectangleWest = rectangle.west;    let otherRectangleEast = otherRectangle.east;    let otherRectangleWest = otherRectangle.west;    if (rectangleEast < rectangleWest && otherRectangleEast > 0.0) {      rectangleEast += ComponentDatatype.CesiumMath.TWO_PI;    } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0.0) {      otherRectangleEast += ComponentDatatype.CesiumMath.TWO_PI;    }    if (rectangleEast < rectangleWest && otherRectangleWest < 0.0) {      otherRectangleWest += ComponentDatatype.CesiumMath.TWO_PI;    } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0.0) {      rectangleWest += ComponentDatatype.CesiumMath.TWO_PI;    }    const west = ComponentDatatype.CesiumMath.negativePiToPi(      Math.max(rectangleWest, otherRectangleWest)    );    const east = ComponentDatatype.CesiumMath.negativePiToPi(      Math.min(rectangleEast, otherRectangleEast)    );    if (      (rectangle.west < rectangle.east ||        otherRectangle.west < otherRectangle.east) &&      east <= west    ) {      return undefined;    }    const south = Math.max(rectangle.south, otherRectangle.south);    const north = Math.min(rectangle.north, otherRectangle.north);    if (south >= north) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Rectangle(west, south, east, north);    }    result.west = west;    result.south = south;    result.east = east;    result.north = north;    return result;  };  /**   * Computes a simple intersection of two rectangles.  Unlike {@link Rectangle.intersection}, this function   * does not attempt to put the angular coordinates into a consistent range or to account for crossing the   * anti-meridian.  As such, it can be used for rectangles where the coordinates are not simply latitude   * and longitude (i.e. projected coordinates).   *   * @param {Rectangle} rectangle On rectangle to find an intersection   * @param {Rectangle} otherRectangle Another rectangle to find an intersection   * @param {Rectangle} [result] The object onto which to store the result.   * @returns {Rectangle|undefined} The modified result parameter, a new Rectangle instance if none was provided or undefined if there is no intersection.   */  Rectangle.simpleIntersection = function (rectangle, otherRectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    RuntimeError.Check.typeOf.object("otherRectangle", otherRectangle);    //>>includeEnd('debug');    const west = Math.max(rectangle.west, otherRectangle.west);    const south = Math.max(rectangle.south, otherRectangle.south);    const east = Math.min(rectangle.east, otherRectangle.east);    const north = Math.min(rectangle.north, otherRectangle.north);    if (south >= north || west >= east) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Rectangle(west, south, east, north);    }    result.west = west;    result.south = south;    result.east = east;    result.north = north;    return result;  };  /**   * Computes a rectangle that is the union of two rectangles.   *   * @param {Rectangle} rectangle A rectangle to enclose in rectangle.   * @param {Rectangle} otherRectangle A rectangle to enclose in a rectangle.   * @param {Rectangle} [result] The object onto which to store the result.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.   */  Rectangle.union = function (rectangle, otherRectangle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    RuntimeError.Check.typeOf.object("otherRectangle", otherRectangle);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Rectangle();    }    let rectangleEast = rectangle.east;    let rectangleWest = rectangle.west;    let otherRectangleEast = otherRectangle.east;    let otherRectangleWest = otherRectangle.west;    if (rectangleEast < rectangleWest && otherRectangleEast > 0.0) {      rectangleEast += ComponentDatatype.CesiumMath.TWO_PI;    } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0.0) {      otherRectangleEast += ComponentDatatype.CesiumMath.TWO_PI;    }    if (rectangleEast < rectangleWest && otherRectangleWest < 0.0) {      otherRectangleWest += ComponentDatatype.CesiumMath.TWO_PI;    } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0.0) {      rectangleWest += ComponentDatatype.CesiumMath.TWO_PI;    }    const west = ComponentDatatype.CesiumMath.negativePiToPi(      Math.min(rectangleWest, otherRectangleWest)    );    const east = ComponentDatatype.CesiumMath.negativePiToPi(      Math.max(rectangleEast, otherRectangleEast)    );    result.west = west;    result.south = Math.min(rectangle.south, otherRectangle.south);    result.east = east;    result.north = Math.max(rectangle.north, otherRectangle.north);    return result;  };  /**   * Computes a rectangle by enlarging the provided rectangle until it contains the provided cartographic.   *   * @param {Rectangle} rectangle A rectangle to expand.   * @param {Cartographic} cartographic A cartographic to enclose in a rectangle.   * @param {Rectangle} [result] The object onto which to store the result.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if one was not provided.   */  Rectangle.expand = function (rectangle, cartographic, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    RuntimeError.Check.typeOf.object("cartographic", cartographic);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Rectangle();    }    result.west = Math.min(rectangle.west, cartographic.longitude);    result.south = Math.min(rectangle.south, cartographic.latitude);    result.east = Math.max(rectangle.east, cartographic.longitude);    result.north = Math.max(rectangle.north, cartographic.latitude);    return result;  };  /**   * Returns true if the cartographic is on or inside the rectangle, false otherwise.   *   * @param {Rectangle} rectangle The rectangle   * @param {Cartographic} cartographic The cartographic to test.   * @returns {Boolean} true if the provided cartographic is inside the rectangle, false otherwise.   */  Rectangle.contains = function (rectangle, cartographic) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    RuntimeError.Check.typeOf.object("cartographic", cartographic);    //>>includeEnd('debug');    let longitude = cartographic.longitude;    const latitude = cartographic.latitude;    const west = rectangle.west;    let east = rectangle.east;    if (east < west) {      east += ComponentDatatype.CesiumMath.TWO_PI;      if (longitude < 0.0) {        longitude += ComponentDatatype.CesiumMath.TWO_PI;      }    }    return (      (longitude > west ||        ComponentDatatype.CesiumMath.equalsEpsilon(longitude, west, ComponentDatatype.CesiumMath.EPSILON14)) &&      (longitude < east ||        ComponentDatatype.CesiumMath.equalsEpsilon(longitude, east, ComponentDatatype.CesiumMath.EPSILON14)) &&      latitude >= rectangle.south &&      latitude <= rectangle.north    );  };  const subsampleLlaScratch = new Cartographic();  /**   * Samples a rectangle so that it includes a list of Cartesian points suitable for passing to   * {@link BoundingSphere#fromPoints}.  Sampling is necessary to account   * for rectangles that cover the poles or cross the equator.   *   * @param {Rectangle} rectangle The rectangle to subsample.   * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid to use.   * @param {Number} [surfaceHeight=0.0] The height of the rectangle above the ellipsoid.   * @param {Cartesian3[]} [result] The array of Cartesians onto which to store the result.   * @returns {Cartesian3[]} The modified result parameter or a new Array of Cartesians instances if none was provided.   */  Rectangle.subsample = function (rectangle, ellipsoid, surfaceHeight, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    //>>includeEnd('debug');    ellipsoid = defaultValue.defaultValue(ellipsoid, Ellipsoid.WGS84);    surfaceHeight = defaultValue.defaultValue(surfaceHeight, 0.0);    if (!defaultValue.defined(result)) {      result = [];    }    let length = 0;    const north = rectangle.north;    const south = rectangle.south;    const east = rectangle.east;    const west = rectangle.west;    const lla = subsampleLlaScratch;    lla.height = surfaceHeight;    lla.longitude = west;    lla.latitude = north;    result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);    length++;    lla.longitude = east;    result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);    length++;    lla.latitude = south;    result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);    length++;    lla.longitude = west;    result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);    length++;    if (north < 0.0) {      lla.latitude = north;    } else if (south > 0.0) {      lla.latitude = south;    } else {      lla.latitude = 0.0;    }    for (let i = 1; i < 8; ++i) {      lla.longitude = -Math.PI + i * ComponentDatatype.CesiumMath.PI_OVER_TWO;      if (Rectangle.contains(rectangle, lla)) {        result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);        length++;      }    }    if (lla.latitude === 0.0) {      lla.longitude = west;      result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);      length++;      lla.longitude = east;      result[length] = ellipsoid.cartographicToCartesian(lla, result[length]);      length++;    }    result.length = length;    return result;  };  /**   * Computes a subsection of a rectangle from normalized coordinates in the range [0.0, 1.0].   *   * @param {Rectangle} rectangle The rectangle to subsection.   * @param {Number} westLerp The west interpolation factor in the range [0.0, 1.0]. Must be less than or equal to eastLerp.   * @param {Number} southLerp The south interpolation factor in the range [0.0, 1.0]. Must be less than or equal to northLerp.   * @param {Number} eastLerp The east interpolation factor in the range [0.0, 1.0]. Must be greater than or equal to westLerp.   * @param {Number} northLerp The north interpolation factor in the range [0.0, 1.0]. Must be greater than or equal to southLerp.   * @param {Rectangle} [result] The object onto which to store the result.   * @returns {Rectangle} The modified result parameter or a new Rectangle instance if none was provided.   */  Rectangle.subsection = function (    rectangle,    westLerp,    southLerp,    eastLerp,    northLerp,    result  ) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("rectangle", rectangle);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("westLerp", westLerp, 0.0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("westLerp", westLerp, 1.0);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("southLerp", southLerp, 0.0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("southLerp", southLerp, 1.0);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("eastLerp", eastLerp, 0.0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("eastLerp", eastLerp, 1.0);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("northLerp", northLerp, 0.0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("northLerp", northLerp, 1.0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("westLerp", westLerp, eastLerp);    RuntimeError.Check.typeOf.number.lessThanOrEquals("southLerp", southLerp, northLerp);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      result = new Rectangle();    }    // This function doesn't use CesiumMath.lerp because it has floating point precision problems    // when the start and end values are the same but the t changes.    if (rectangle.west <= rectangle.east) {      const width = rectangle.east - rectangle.west;      result.west = rectangle.west + westLerp * width;      result.east = rectangle.west + eastLerp * width;    } else {      const width = ComponentDatatype.CesiumMath.TWO_PI + rectangle.east - rectangle.west;      result.west = ComponentDatatype.CesiumMath.negativePiToPi(rectangle.west + westLerp * width);      result.east = ComponentDatatype.CesiumMath.negativePiToPi(rectangle.west + eastLerp * width);    }    const height = rectangle.north - rectangle.south;    result.south = rectangle.south + southLerp * height;    result.north = rectangle.south + northLerp * height;    // Fix floating point precision problems when t = 1    if (westLerp === 1.0) {      result.west = rectangle.east;    }    if (eastLerp === 1.0) {      result.east = rectangle.east;    }    if (southLerp === 1.0) {      result.south = rectangle.north;    }    if (northLerp === 1.0) {      result.north = rectangle.north;    }    return result;  };  /**   * The largest possible rectangle.   *   * @type {Rectangle}   * @constant   */  Rectangle.MAX_VALUE = Object.freeze(    new Rectangle(      -Math.PI,      -ComponentDatatype.CesiumMath.PI_OVER_TWO,      Math.PI,      ComponentDatatype.CesiumMath.PI_OVER_TWO    )  );  /**   * A 2D Cartesian point.   * @alias Cartesian2   * @constructor   *   * @param {Number} [x=0.0] The X component.   * @param {Number} [y=0.0] The Y component.   *   * @see Cartesian3   * @see Cartesian4   * @see Packable   */  function Cartesian2(x, y) {    /**     * The X component.     * @type {Number}     * @default 0.0     */    this.x = defaultValue.defaultValue(x, 0.0);    /**     * The Y component.     * @type {Number}     * @default 0.0     */    this.y = defaultValue.defaultValue(y, 0.0);  }  /**   * Creates a Cartesian2 instance from x and y coordinates.   *   * @param {Number} x The x coordinate.   * @param {Number} y The y coordinate.   * @param {Cartesian2} [result] The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.   */  Cartesian2.fromElements = function (x, y, result) {    if (!defaultValue.defined(result)) {      return new Cartesian2(x, y);    }    result.x = x;    result.y = y;    return result;  };  /**   * Duplicates a Cartesian2 instance.   *   * @param {Cartesian2} cartesian The Cartesian to duplicate.   * @param {Cartesian2} [result] The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided. (Returns undefined if cartesian is undefined)   */  Cartesian2.clone = function (cartesian, result) {    if (!defaultValue.defined(cartesian)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Cartesian2(cartesian.x, cartesian.y);    }    result.x = cartesian.x;    result.y = cartesian.y;    return result;  };  /**   * Creates a Cartesian2 instance from an existing Cartesian3.  This simply takes the   * x and y properties of the Cartesian3 and drops z.   * @function   *   * @param {Cartesian3} cartesian The Cartesian3 instance to create a Cartesian2 instance from.   * @param {Cartesian2} [result] The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.   */  Cartesian2.fromCartesian3 = Cartesian2.clone;  /**   * Creates a Cartesian2 instance from an existing Cartesian4.  This simply takes the   * x and y properties of the Cartesian4 and drops z and w.   * @function   *   * @param {Cartesian4} cartesian The Cartesian4 instance to create a Cartesian2 instance from.   * @param {Cartesian2} [result] The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.   */  Cartesian2.fromCartesian4 = Cartesian2.clone;  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Cartesian2.packedLength = 2;  /**   * Stores the provided instance into the provided array.   *   * @param {Cartesian2} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Cartesian2.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    array[startingIndex++] = value.x;    array[startingIndex] = value.y;    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Cartesian2} [result] The object into which to store the result.   * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.   */  Cartesian2.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    if (!defaultValue.defined(result)) {      result = new Cartesian2();    }    result.x = array[startingIndex++];    result.y = array[startingIndex];    return result;  };  /**   * Flattens an array of Cartesian2s into an array of components.   *   * @param {Cartesian2[]} array The array of cartesians to pack.   * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 2 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 2) elements.   * @returns {Number[]} The packed array.   */  Cartesian2.packArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    const length = array.length;    const resultLength = length * 2;    if (!defaultValue.defined(result)) {      result = new Array(resultLength);    } else if (!Array.isArray(result) && result.length !== resultLength) {      //>>includeStart('debug', pragmas.debug);      throw new RuntimeError.DeveloperError(        "If result is a typed array, it must have exactly array.length * 2 elements"      );      //>>includeEnd('debug');    } else if (result.length !== resultLength) {      result.length = resultLength;    }    for (let i = 0; i < length; ++i) {      Cartesian2.pack(array[i], result, i * 2);    }    return result;  };  /**   * Unpacks an array of cartesian components into an array of Cartesian2s.   *   * @param {Number[]} array The array of components to unpack.   * @param {Cartesian2[]} [result] The array onto which to store the result.   * @returns {Cartesian2[]} The unpacked array.   */  Cartesian2.unpackArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("array.length", array.length, 2);    if (array.length % 2 !== 0) {      throw new RuntimeError.DeveloperError("array length must be a multiple of 2.");    }    //>>includeEnd('debug');    const length = array.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 2);    } else {      result.length = length / 2;    }    for (let i = 0; i < length; i += 2) {      const index = i / 2;      result[index] = Cartesian2.unpack(array, i, result[index]);    }    return result;  };  /**   * Creates a Cartesian2 from two consecutive elements in an array.   * @function   *   * @param {Number[]} array The array whose two consecutive elements correspond to the x and y components, respectively.   * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to the x component.   * @param {Cartesian2} [result] The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.   *   * @example   * // Create a Cartesian2 with (1.0, 2.0)   * const v = [1.0, 2.0];   * const p = Cesium.Cartesian2.fromArray(v);   *   * // Create a Cartesian2 with (1.0, 2.0) using an offset into an array   * const v2 = [0.0, 0.0, 1.0, 2.0];   * const p2 = Cesium.Cartesian2.fromArray(v2, 2);   */  Cartesian2.fromArray = Cartesian2.unpack;  /**   * Computes the value of the maximum component for the supplied Cartesian.   *   * @param {Cartesian2} cartesian The cartesian to use.   * @returns {Number} The value of the maximum component.   */  Cartesian2.maximumComponent = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return Math.max(cartesian.x, cartesian.y);  };  /**   * Computes the value of the minimum component for the supplied Cartesian.   *   * @param {Cartesian2} cartesian The cartesian to use.   * @returns {Number} The value of the minimum component.   */  Cartesian2.minimumComponent = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return Math.min(cartesian.x, cartesian.y);  };  /**   * Compares two Cartesians and computes a Cartesian which contains the minimum components of the supplied Cartesians.   *   * @param {Cartesian2} first A cartesian to compare.   * @param {Cartesian2} second A cartesian to compare.   * @param {Cartesian2} result The object into which to store the result.   * @returns {Cartesian2} A cartesian with the minimum components.   */  Cartesian2.minimumByComponent = function (first, second, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("first", first);    RuntimeError.Check.typeOf.object("second", second);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.min(first.x, second.x);    result.y = Math.min(first.y, second.y);    return result;  };  /**   * Compares two Cartesians and computes a Cartesian which contains the maximum components of the supplied Cartesians.   *   * @param {Cartesian2} first A cartesian to compare.   * @param {Cartesian2} second A cartesian to compare.   * @param {Cartesian2} result The object into which to store the result.   * @returns {Cartesian2} A cartesian with the maximum components.   */  Cartesian2.maximumByComponent = function (first, second, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("first", first);    RuntimeError.Check.typeOf.object("second", second);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.max(first.x, second.x);    result.y = Math.max(first.y, second.y);    return result;  };  /**   * Constrain a value to lie between two values.   *   * @param {Cartesian2} value The value to clamp.   * @param {Cartesian2} min The minimum bound.   * @param {Cartesian2} max The maximum bound.   * @param {Cartesian2} result The object into which to store the result.   * @returns {Cartesian2} The clamped value such that min <= result <= max.   */  Cartesian2.clamp = function (value, min, max, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.typeOf.object("min", min);    RuntimeError.Check.typeOf.object("max", max);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = ComponentDatatype.CesiumMath.clamp(value.x, min.x, max.x);    const y = ComponentDatatype.CesiumMath.clamp(value.y, min.y, max.y);    result.x = x;    result.y = y;    return result;  };  /**   * Computes the provided Cartesian's squared magnitude.   *   * @param {Cartesian2} cartesian The Cartesian instance whose squared magnitude is to be computed.   * @returns {Number} The squared magnitude.   */  Cartesian2.magnitudeSquared = function (cartesian) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    //>>includeEnd('debug');    return cartesian.x * cartesian.x + cartesian.y * cartesian.y;  };  /**   * Computes the Cartesian's magnitude (length).   *   * @param {Cartesian2} cartesian The Cartesian instance whose magnitude is to be computed.   * @returns {Number} The magnitude.   */  Cartesian2.magnitude = function (cartesian) {    return Math.sqrt(Cartesian2.magnitudeSquared(cartesian));  };  const distanceScratch = new Cartesian2();  /**   * Computes the distance between two points.   *   * @param {Cartesian2} left The first point to compute the distance from.   * @param {Cartesian2} right The second point to compute the distance to.   * @returns {Number} The distance between two points.   *   * @example   * // Returns 1.0   * const d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(2.0, 0.0));   */  Cartesian2.distance = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian2.subtract(left, right, distanceScratch);    return Cartesian2.magnitude(distanceScratch);  };  /**   * Computes the squared distance between two points.  Comparing squared distances   * using this function is more efficient than comparing distances using {@link Cartesian2#distance}.   *   * @param {Cartesian2} left The first point to compute the distance from.   * @param {Cartesian2} right The second point to compute the distance to.   * @returns {Number} The distance between two points.   *   * @example   * // Returns 4.0, not 2.0   * const d = Cesium.Cartesian2.distance(new Cesium.Cartesian2(1.0, 0.0), new Cesium.Cartesian2(3.0, 0.0));   */  Cartesian2.distanceSquared = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian2.subtract(left, right, distanceScratch);    return Cartesian2.magnitudeSquared(distanceScratch);  };  /**   * Computes the normalized form of the supplied Cartesian.   *   * @param {Cartesian2} cartesian The Cartesian to be normalized.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.normalize = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const magnitude = Cartesian2.magnitude(cartesian);    result.x = cartesian.x / magnitude;    result.y = cartesian.y / magnitude;    //>>includeStart('debug', pragmas.debug);    if (isNaN(result.x) || isNaN(result.y)) {      throw new RuntimeError.DeveloperError("normalized result is not a number");    }    //>>includeEnd('debug');    return result;  };  /**   * Computes the dot (scalar) product of two Cartesians.   *   * @param {Cartesian2} left The first Cartesian.   * @param {Cartesian2} right The second Cartesian.   * @returns {Number} The dot product.   */  Cartesian2.dot = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    return left.x * right.x + left.y * right.y;  };  /**   * Computes the magnitude of the cross product that would result from implicitly setting the Z coordinate of the input vectors to 0   *   * @param {Cartesian2} left The first Cartesian.   * @param {Cartesian2} right The second Cartesian.   * @returns {Number} The cross product.   */  Cartesian2.cross = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    return left.x * right.y - left.y * right.x;  };  /**   * Computes the componentwise product of two Cartesians.   *   * @param {Cartesian2} left The first Cartesian.   * @param {Cartesian2} right The second Cartesian.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.multiplyComponents = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x * right.x;    result.y = left.y * right.y;    return result;  };  /**   * Computes the componentwise quotient of two Cartesians.   *   * @param {Cartesian2} left The first Cartesian.   * @param {Cartesian2} right The second Cartesian.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.divideComponents = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x / right.x;    result.y = left.y / right.y;    return result;  };  /**   * Computes the componentwise sum of two Cartesians.   *   * @param {Cartesian2} left The first Cartesian.   * @param {Cartesian2} right The second Cartesian.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.add = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x + right.x;    result.y = left.y + right.y;    return result;  };  /**   * Computes the componentwise difference of two Cartesians.   *   * @param {Cartesian2} left The first Cartesian.   * @param {Cartesian2} right The second Cartesian.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.subtract = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = left.x - right.x;    result.y = left.y - right.y;    return result;  };  /**   * Multiplies the provided Cartesian componentwise by the provided scalar.   *   * @param {Cartesian2} cartesian The Cartesian to be scaled.   * @param {Number} scalar The scalar to multiply with.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.multiplyByScalar = function (cartesian, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = cartesian.x * scalar;    result.y = cartesian.y * scalar;    return result;  };  /**   * Divides the provided Cartesian componentwise by the provided scalar.   *   * @param {Cartesian2} cartesian The Cartesian to be divided.   * @param {Number} scalar The scalar to divide by.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.divideByScalar = function (cartesian, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = cartesian.x / scalar;    result.y = cartesian.y / scalar;    return result;  };  /**   * Negates the provided Cartesian.   *   * @param {Cartesian2} cartesian The Cartesian to be negated.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.negate = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = -cartesian.x;    result.y = -cartesian.y;    return result;  };  /**   * Computes the absolute value of the provided Cartesian.   *   * @param {Cartesian2} cartesian The Cartesian whose absolute value is to be computed.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.abs = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Math.abs(cartesian.x);    result.y = Math.abs(cartesian.y);    return result;  };  const lerpScratch = new Cartesian2();  /**   * Computes the linear interpolation or extrapolation at t using the provided cartesians.   *   * @param {Cartesian2} start The value corresponding to t at 0.0.   * @param {Cartesian2} end The value corresponding to t at 1.0.   * @param {Number} t The point along t at which to interpolate.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Cartesian2.lerp = function (start, end, t, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("start", start);    RuntimeError.Check.typeOf.object("end", end);    RuntimeError.Check.typeOf.number("t", t);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    Cartesian2.multiplyByScalar(end, t, lerpScratch);    result = Cartesian2.multiplyByScalar(start, 1.0 - t, result);    return Cartesian2.add(lerpScratch, result, result);  };  const angleBetweenScratch = new Cartesian2();  const angleBetweenScratch2 = new Cartesian2();  /**   * Returns the angle, in radians, between the provided Cartesians.   *   * @param {Cartesian2} left The first Cartesian.   * @param {Cartesian2} right The second Cartesian.   * @returns {Number} The angle between the Cartesians.   */  Cartesian2.angleBetween = function (left, right) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    //>>includeEnd('debug');    Cartesian2.normalize(left, angleBetweenScratch);    Cartesian2.normalize(right, angleBetweenScratch2);    return ComponentDatatype.CesiumMath.acosClamped(      Cartesian2.dot(angleBetweenScratch, angleBetweenScratch2)    );  };  const mostOrthogonalAxisScratch = new Cartesian2();  /**   * Returns the axis that is most orthogonal to the provided Cartesian.   *   * @param {Cartesian2} cartesian The Cartesian on which to find the most orthogonal axis.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The most orthogonal axis.   */  Cartesian2.mostOrthogonalAxis = function (cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const f = Cartesian2.normalize(cartesian, mostOrthogonalAxisScratch);    Cartesian2.abs(f, f);    if (f.x <= f.y) {      result = Cartesian2.clone(Cartesian2.UNIT_X, result);    } else {      result = Cartesian2.clone(Cartesian2.UNIT_Y, result);    }    return result;  };  /**   * Compares the provided Cartesians componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartesian2} [left] The first Cartesian.   * @param {Cartesian2} [right] The second Cartesian.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   */  Cartesian2.equals = function (left, right) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        left.x === right.x &&        left.y === right.y)    );  };  /**   * @private   */  Cartesian2.equalsArray = function (cartesian, array, offset) {    return cartesian.x === array[offset] && cartesian.y === array[offset + 1];  };  /**   * Compares the provided Cartesians componentwise and returns   * <code>true</code> if they pass an absolute or relative tolerance test,   * <code>false</code> otherwise.   *   * @param {Cartesian2} [left] The first Cartesian.   * @param {Cartesian2} [right] The second Cartesian.   * @param {Number} [relativeEpsilon=0] The relative epsilon tolerance to use for equality testing.   * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Cartesian2.equalsEpsilon = function (    left,    right,    relativeEpsilon,    absoluteEpsilon  ) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.x,          right.x,          relativeEpsilon,          absoluteEpsilon        ) &&        ComponentDatatype.CesiumMath.equalsEpsilon(          left.y,          right.y,          relativeEpsilon,          absoluteEpsilon        ))    );  };  /**   * An immutable Cartesian2 instance initialized to (0.0, 0.0).   *   * @type {Cartesian2}   * @constant   */  Cartesian2.ZERO = Object.freeze(new Cartesian2(0.0, 0.0));  /**   * An immutable Cartesian2 instance initialized to (1.0, 1.0).   *   * @type {Cartesian2}   * @constant   */  Cartesian2.ONE = Object.freeze(new Cartesian2(1.0, 1.0));  /**   * An immutable Cartesian2 instance initialized to (1.0, 0.0).   *   * @type {Cartesian2}   * @constant   */  Cartesian2.UNIT_X = Object.freeze(new Cartesian2(1.0, 0.0));  /**   * An immutable Cartesian2 instance initialized to (0.0, 1.0).   *   * @type {Cartesian2}   * @constant   */  Cartesian2.UNIT_Y = Object.freeze(new Cartesian2(0.0, 1.0));  /**   * Duplicates this Cartesian2 instance.   *   * @param {Cartesian2} [result] The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter or a new Cartesian2 instance if one was not provided.   */  Cartesian2.prototype.clone = function (result) {    return Cartesian2.clone(this, result);  };  /**   * Compares this Cartesian against the provided Cartesian componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Cartesian2} [right] The right hand side Cartesian.   * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.   */  Cartesian2.prototype.equals = function (right) {    return Cartesian2.equals(this, right);  };  /**   * Compares this Cartesian against the provided Cartesian componentwise and returns   * <code>true</code> if they pass an absolute or relative tolerance test,   * <code>false</code> otherwise.   *   * @param {Cartesian2} [right] The right hand side Cartesian.   * @param {Number} [relativeEpsilon=0] The relative epsilon tolerance to use for equality testing.   * @param {Number} [absoluteEpsilon=relativeEpsilon] The absolute epsilon tolerance to use for equality testing.   * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.   */  Cartesian2.prototype.equalsEpsilon = function (    right,    relativeEpsilon,    absoluteEpsilon  ) {    return Cartesian2.equalsEpsilon(      this,      right,      relativeEpsilon,      absoluteEpsilon    );  };  /**   * Creates a string representing this Cartesian in the format '(x, y)'.   *   * @returns {String} A string representing the provided Cartesian in the format '(x, y)'.   */  Cartesian2.prototype.toString = function () {    return `(${this.x}, ${this.y})`;  };  /**   * A 2x2 matrix, indexable as a column-major order array.   * Constructor parameters are in row-major order for code readability.   * @alias Matrix2   * @constructor   * @implements {ArrayLike<number>}   *   * @param {Number} [column0Row0=0.0] The value for column 0, row 0.   * @param {Number} [column1Row0=0.0] The value for column 1, row 0.   * @param {Number} [column0Row1=0.0] The value for column 0, row 1.   * @param {Number} [column1Row1=0.0] The value for column 1, row 1.   *   * @see Matrix2.fromArray   * @see Matrix2.fromColumnMajorArray   * @see Matrix2.fromRowMajorArray   * @see Matrix2.fromScale   * @see Matrix2.fromUniformScale   * @see Matrix2.fromRotation   * @see Matrix3   * @see Matrix4   */  function Matrix2(column0Row0, column1Row0, column0Row1, column1Row1) {    this[0] = defaultValue.defaultValue(column0Row0, 0.0);    this[1] = defaultValue.defaultValue(column0Row1, 0.0);    this[2] = defaultValue.defaultValue(column1Row0, 0.0);    this[3] = defaultValue.defaultValue(column1Row1, 0.0);  }  /**   * The number of elements used to pack the object into an array.   * @type {Number}   */  Matrix2.packedLength = 4;  /**   * Stores the provided instance into the provided array.   *   * @param {Matrix2} value The value to pack.   * @param {Number[]} array The array to pack into.   * @param {Number} [startingIndex=0] The index into the array at which to start packing the elements.   *   * @returns {Number[]} The array that was packed into   */  Matrix2.pack = function (value, array, startingIndex) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("value", value);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    array[startingIndex++] = value[0];    array[startingIndex++] = value[1];    array[startingIndex++] = value[2];    array[startingIndex++] = value[3];    return array;  };  /**   * Retrieves an instance from a packed array.   *   * @param {Number[]} array The packed array.   * @param {Number} [startingIndex=0] The starting index of the element to be unpacked.   * @param {Matrix2} [result] The object into which to store the result.   * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided.   */  Matrix2.unpack = function (array, startingIndex, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    startingIndex = defaultValue.defaultValue(startingIndex, 0);    if (!defaultValue.defined(result)) {      result = new Matrix2();    }    result[0] = array[startingIndex++];    result[1] = array[startingIndex++];    result[2] = array[startingIndex++];    result[3] = array[startingIndex++];    return result;  };  /**   * Flattens an array of Matrix2s into an array of components. The components   * are stored in column-major order.   *   * @param {Matrix2[]} array The array of matrices to pack.   * @param {Number[]} [result] The array onto which to store the result. If this is a typed array, it must have array.length * 4 components, else a {@link DeveloperError} will be thrown. If it is a regular array, it will be resized to have (array.length * 4) elements.   * @returns {Number[]} The packed array.   */  Matrix2.packArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    //>>includeEnd('debug');    const length = array.length;    const resultLength = length * 4;    if (!defaultValue.defined(result)) {      result = new Array(resultLength);    } else if (!Array.isArray(result) && result.length !== resultLength) {      //>>includeStart('debug', pragmas.debug);      throw new RuntimeError.DeveloperError(        "If result is a typed array, it must have exactly array.length * 4 elements"      );      //>>includeEnd('debug');    } else if (result.length !== resultLength) {      result.length = resultLength;    }    for (let i = 0; i < length; ++i) {      Matrix2.pack(array[i], result, i * 4);    }    return result;  };  /**   * Unpacks an array of column-major matrix components into an array of Matrix2s.   *   * @param {Number[]} array The array of components to unpack.   * @param {Matrix2[]} [result] The array onto which to store the result.   * @returns {Matrix2[]} The unpacked array.   */  Matrix2.unpackArray = function (array, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("array", array);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("array.length", array.length, 4);    if (array.length % 4 !== 0) {      throw new RuntimeError.DeveloperError("array length must be a multiple of 4.");    }    //>>includeEnd('debug');    const length = array.length;    if (!defaultValue.defined(result)) {      result = new Array(length / 4);    } else {      result.length = length / 4;    }    for (let i = 0; i < length; i += 4) {      const index = i / 4;      result[index] = Matrix2.unpack(array, i, result[index]);    }    return result;  };  /**   * Duplicates a Matrix2 instance.   *   * @param {Matrix2} matrix The matrix to duplicate.   * @param {Matrix2} [result] The object onto which to store the result.   * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided. (Returns undefined if matrix is undefined)   */  Matrix2.clone = function (matrix, result) {    if (!defaultValue.defined(matrix)) {      return undefined;    }    if (!defaultValue.defined(result)) {      return new Matrix2(matrix[0], matrix[2], matrix[1], matrix[3]);    }    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    return result;  };  /**   * Creates a Matrix2 from 4 consecutive elements in an array.   *   * @function   * @param {Number[]} array The array whose 4 consecutive elements correspond to the positions of the matrix.  Assumes column-major order.   * @param {Number} [startingIndex=0] The offset into the array of the first element, which corresponds to first column first row position in the matrix.   * @param {Matrix2} [result] The object onto which to store the result.   * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided.   *   * @example   * // Create the Matrix2:   * // [1.0, 2.0]   * // [1.0, 2.0]   *   * const v = [1.0, 1.0, 2.0, 2.0];   * const m = Cesium.Matrix2.fromArray(v);   *   * // Create same Matrix2 with using an offset into an array   * const v2 = [0.0, 0.0, 1.0, 1.0, 2.0, 2.0];   * const m2 = Cesium.Matrix2.fromArray(v2, 2);   */  Matrix2.fromArray = Matrix2.unpack;  /**   * Creates a Matrix2 instance from a column-major order array.   *   * @param {Number[]} values The column-major order array.   * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.   */  Matrix2.fromColumnMajorArray = function (values, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("values", values);    //>>includeEnd('debug');    return Matrix2.clone(values, result);  };  /**   * Creates a Matrix2 instance from a row-major order array.   * The resulting matrix will be in column-major order.   *   * @param {Number[]} values The row-major order array.   * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.   */  Matrix2.fromRowMajorArray = function (values, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.defined("values", values);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix2(values[0], values[1], values[2], values[3]);    }    result[0] = values[0];    result[1] = values[2];    result[2] = values[1];    result[3] = values[3];    return result;  };  /**   * Computes a Matrix2 instance representing a non-uniform scale.   *   * @param {Cartesian2} scale The x and y scale factors.   * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.   *   * @example   * // Creates   * //   [7.0, 0.0]   * //   [0.0, 8.0]   * const m = Cesium.Matrix2.fromScale(new Cesium.Cartesian2(7.0, 8.0));   */  Matrix2.fromScale = function (scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("scale", scale);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix2(scale.x, 0.0, 0.0, scale.y);    }    result[0] = scale.x;    result[1] = 0.0;    result[2] = 0.0;    result[3] = scale.y;    return result;  };  /**   * Computes a Matrix2 instance representing a uniform scale.   *   * @param {Number} scale The uniform scale factor.   * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.   *   * @example   * // Creates   * //   [2.0, 0.0]   * //   [0.0, 2.0]   * const m = Cesium.Matrix2.fromUniformScale(2.0);   */  Matrix2.fromUniformScale = function (scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("scale", scale);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return new Matrix2(scale, 0.0, 0.0, scale);    }    result[0] = scale;    result[1] = 0.0;    result[2] = 0.0;    result[3] = scale;    return result;  };  /**   * Creates a rotation matrix.   *   * @param {Number} angle The angle, in radians, of the rotation.  Positive angles are counterclockwise.   * @param {Matrix2} [result] The object in which the result will be stored, if undefined a new instance will be created.   * @returns {Matrix2} The modified result parameter, or a new Matrix2 instance if one was not provided.   *   * @example   * // Rotate a point 45 degrees counterclockwise.   * const p = new Cesium.Cartesian2(5, 6);   * const m = Cesium.Matrix2.fromRotation(Cesium.Math.toRadians(45.0));   * const rotated = Cesium.Matrix2.multiplyByVector(m, p, new Cesium.Cartesian2());   */  Matrix2.fromRotation = function (angle, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number("angle", angle);    //>>includeEnd('debug');    const cosAngle = Math.cos(angle);    const sinAngle = Math.sin(angle);    if (!defaultValue.defined(result)) {      return new Matrix2(cosAngle, -sinAngle, sinAngle, cosAngle);    }    result[0] = cosAngle;    result[1] = sinAngle;    result[2] = -sinAngle;    result[3] = cosAngle;    return result;  };  /**   * Creates an Array from the provided Matrix2 instance.   * The array will be in column-major order.   *   * @param {Matrix2} matrix The matrix to use..   * @param {Number[]} [result] The Array onto which to store the result.   * @returns {Number[]} The modified Array parameter or a new Array instance if one was not provided.   */  Matrix2.toArray = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    //>>includeEnd('debug');    if (!defaultValue.defined(result)) {      return [matrix[0], matrix[1], matrix[2], matrix[3]];    }    result[0] = matrix[0];    result[1] = matrix[1];    result[2] = matrix[2];    result[3] = matrix[3];    return result;  };  /**   * Computes the array index of the element at the provided row and column.   *   * @param {Number} row The zero-based index of the row.   * @param {Number} column The zero-based index of the column.   * @returns {Number} The index of the element at the provided row and column.   *   * @exception {DeveloperError} row must be 0 or 1.   * @exception {DeveloperError} column must be 0 or 1.   *   * @example   * const myMatrix = new Cesium.Matrix2();   * const column1Row0Index = Cesium.Matrix2.getElementIndex(1, 0);   * const column1Row0 = myMatrix[column1Row0Index]   * myMatrix[column1Row0Index] = 10.0;   */  Matrix2.getElementIndex = function (column, row) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("row", row, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("row", row, 1);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("column", column, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("column", column, 1);    //>>includeEnd('debug');    return column * 2 + row;  };  /**   * Retrieves a copy of the matrix column at the provided index as a Cartesian2 instance.   *   * @param {Matrix2} matrix The matrix to use.   * @param {Number} index The zero-based index of the column to retrieve.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   *   * @exception {DeveloperError} index must be 0 or 1.   */  Matrix2.getColumn = function (matrix, index, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 1);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const startIndex = index * 2;    const x = matrix[startIndex];    const y = matrix[startIndex + 1];    result.x = x;    result.y = y;    return result;  };  /**   * Computes a new matrix that replaces the specified column in the provided matrix with the provided Cartesian2 instance.   *   * @param {Matrix2} matrix The matrix to use.   * @param {Number} index The zero-based index of the column to set.   * @param {Cartesian2} cartesian The Cartesian whose values will be assigned to the specified column.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   *   * @exception {DeveloperError} index must be 0 or 1.   */  Matrix2.setColumn = function (matrix, index, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 1);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result = Matrix2.clone(matrix, result);    const startIndex = index * 2;    result[startIndex] = cartesian.x;    result[startIndex + 1] = cartesian.y;    return result;  };  /**   * Retrieves a copy of the matrix row at the provided index as a Cartesian2 instance.   *   * @param {Matrix2} matrix The matrix to use.   * @param {Number} index The zero-based index of the row to retrieve.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   *   * @exception {DeveloperError} index must be 0 or 1.   */  Matrix2.getRow = function (matrix, index, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 1);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = matrix[index];    const y = matrix[index + 2];    result.x = x;    result.y = y;    return result;  };  /**   * Computes a new matrix that replaces the specified row in the provided matrix with the provided Cartesian2 instance.   *   * @param {Matrix2} matrix The matrix to use.   * @param {Number} index The zero-based index of the row to set.   * @param {Cartesian2} cartesian The Cartesian whose values will be assigned to the specified row.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   *   * @exception {DeveloperError} index must be 0 or 1.   */  Matrix2.setRow = function (matrix, index, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number.greaterThanOrEquals("index", index, 0);    RuntimeError.Check.typeOf.number.lessThanOrEquals("index", index, 1);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result = Matrix2.clone(matrix, result);    result[index] = cartesian.x;    result[index + 2] = cartesian.y;    return result;  };  const scaleScratch1 = new Cartesian2();  /**   * Computes a new matrix that replaces the scale with the provided scale.   * This assumes the matrix is an affine transformation.   *   * @param {Matrix2} matrix The matrix to use.   * @param {Cartesian2} scale The scale that replaces the scale of the provided matrix.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   *   * @see Matrix2.setUniformScale   * @see Matrix2.fromScale   * @see Matrix2.fromUniformScale   * @see Matrix2.multiplyByScale   * @see Matrix2.multiplyByUniformScale   * @see Matrix2.getScale   */  Matrix2.setScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const existingScale = Matrix2.getScale(matrix, scaleScratch1);    const scaleRatioX = scale.x / existingScale.x;    const scaleRatioY = scale.y / existingScale.y;    result[0] = matrix[0] * scaleRatioX;    result[1] = matrix[1] * scaleRatioX;    result[2] = matrix[2] * scaleRatioY;    result[3] = matrix[3] * scaleRatioY;    return result;  };  const scaleScratch2 = new Cartesian2();  /**   * Computes a new matrix that replaces the scale with the provided uniform scale.   * This assumes the matrix is an affine transformation.   *   * @param {Matrix2} matrix The matrix to use.   * @param {Number} scale The uniform scale that replaces the scale of the provided matrix.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   *   * @see Matrix2.setScale   * @see Matrix2.fromScale   * @see Matrix2.fromUniformScale   * @see Matrix2.multiplyByScale   * @see Matrix2.multiplyByUniformScale   * @see Matrix2.getScale   */  Matrix2.setUniformScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const existingScale = Matrix2.getScale(matrix, scaleScratch2);    const scaleRatioX = scale / existingScale.x;    const scaleRatioY = scale / existingScale.y;    result[0] = matrix[0] * scaleRatioX;    result[1] = matrix[1] * scaleRatioX;    result[2] = matrix[2] * scaleRatioY;    result[3] = matrix[3] * scaleRatioY;    return result;  };  const scratchColumn = new Cartesian2();  /**   * Extracts the non-uniform scale assuming the matrix is an affine transformation.   *   * @param {Matrix2} matrix The matrix.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   *   * @see Matrix2.multiplyByScale   * @see Matrix2.multiplyByUniformScale   * @see Matrix2.fromScale   * @see Matrix2.fromUniformScale   * @see Matrix2.setScale   * @see Matrix2.setUniformScale   */  Matrix2.getScale = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result.x = Cartesian2.magnitude(      Cartesian2.fromElements(matrix[0], matrix[1], scratchColumn)    );    result.y = Cartesian2.magnitude(      Cartesian2.fromElements(matrix[2], matrix[3], scratchColumn)    );    return result;  };  const scaleScratch3 = new Cartesian2();  /**   * Computes the maximum scale assuming the matrix is an affine transformation.   * The maximum scale is the maximum length of the column vectors.   *   * @param {Matrix2} matrix The matrix.   * @returns {Number} The maximum scale.   */  Matrix2.getMaximumScale = function (matrix) {    Matrix2.getScale(matrix, scaleScratch3);    return Cartesian2.maximumComponent(scaleScratch3);  };  const scaleScratch4 = new Cartesian2();  /**   * Sets the rotation assuming the matrix is an affine transformation.   *   * @param {Matrix2} matrix The matrix.   * @param {Matrix2} rotation The rotation matrix.   * @returns {Matrix2} The modified result parameter.   *   * @see Matrix2.fromRotation   * @see Matrix2.getRotation   */  Matrix2.setRotation = function (matrix, rotation, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const scale = Matrix2.getScale(matrix, scaleScratch4);    result[0] = rotation[0] * scale.x;    result[1] = rotation[1] * scale.x;    result[2] = rotation[2] * scale.y;    result[3] = rotation[3] * scale.y;    return result;  };  const scaleScratch5 = new Cartesian2();  /**   * Extracts the rotation matrix assuming the matrix is an affine transformation.   *   * @param {Matrix2} matrix The matrix.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   *   * @see Matrix2.setRotation   * @see Matrix2.fromRotation   */  Matrix2.getRotation = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const scale = Matrix2.getScale(matrix, scaleScratch5);    result[0] = matrix[0] / scale.x;    result[1] = matrix[1] / scale.x;    result[2] = matrix[2] / scale.y;    result[3] = matrix[3] / scale.y;    return result;  };  /**   * Computes the product of two matrices.   *   * @param {Matrix2} left The first matrix.   * @param {Matrix2} right The second matrix.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   */  Matrix2.multiply = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const column0Row0 = left[0] * right[0] + left[2] * right[1];    const column1Row0 = left[0] * right[2] + left[2] * right[3];    const column0Row1 = left[1] * right[0] + left[3] * right[1];    const column1Row1 = left[1] * right[2] + left[3] * right[3];    result[0] = column0Row0;    result[1] = column0Row1;    result[2] = column1Row0;    result[3] = column1Row1;    return result;  };  /**   * Computes the sum of two matrices.   *   * @param {Matrix2} left The first matrix.   * @param {Matrix2} right The second matrix.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   */  Matrix2.add = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = left[0] + right[0];    result[1] = left[1] + right[1];    result[2] = left[2] + right[2];    result[3] = left[3] + right[3];    return result;  };  /**   * Computes the difference of two matrices.   *   * @param {Matrix2} left The first matrix.   * @param {Matrix2} right The second matrix.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   */  Matrix2.subtract = function (left, right, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("left", left);    RuntimeError.Check.typeOf.object("right", right);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = left[0] - right[0];    result[1] = left[1] - right[1];    result[2] = left[2] - right[2];    result[3] = left[3] - right[3];    return result;  };  /**   * Computes the product of a matrix and a column vector.   *   * @param {Matrix2} matrix The matrix.   * @param {Cartesian2} cartesian The column.   * @param {Cartesian2} result The object onto which to store the result.   * @returns {Cartesian2} The modified result parameter.   */  Matrix2.multiplyByVector = function (matrix, cartesian, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("cartesian", cartesian);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const x = matrix[0] * cartesian.x + matrix[2] * cartesian.y;    const y = matrix[1] * cartesian.x + matrix[3] * cartesian.y;    result.x = x;    result.y = y;    return result;  };  /**   * Computes the product of a matrix and a scalar.   *   * @param {Matrix2} matrix The matrix.   * @param {Number} scalar The number to multiply by.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   */  Matrix2.multiplyByScalar = function (matrix, scalar, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scalar", scalar);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scalar;    result[1] = matrix[1] * scalar;    result[2] = matrix[2] * scalar;    result[3] = matrix[3] * scalar;    return result;  };  /**   * Computes the product of a matrix times a (non-uniform) scale, as if the scale were a scale matrix.   *   * @param {Matrix2} matrix The matrix on the left-hand side.   * @param {Number} scale The non-uniform scale on the right-hand side.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   *   *   * @example   * // Instead of Cesium.Matrix2.multiply(m, Cesium.Matrix2.fromScale(scale), m);   * Cesium.Matrix2.multiplyByScale(m, scale, m);   *   * @see Matrix2.multiplyByUniformScale   * @see Matrix2.fromScale   * @see Matrix2.fromUniformScale   * @see Matrix2.setScale   * @see Matrix2.setUniformScale   * @see Matrix2.getScale   */  Matrix2.multiplyByScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scale.x;    result[1] = matrix[1] * scale.x;    result[2] = matrix[2] * scale.y;    result[3] = matrix[3] * scale.y;    return result;  };  /**   * Computes the product of a matrix times a uniform scale, as if the scale were a scale matrix.   *   * @param {Matrix2} matrix The matrix on the left-hand side.   * @param {Number} scale The uniform scale on the right-hand side.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   *   * @example   * // Instead of Cesium.Matrix2.multiply(m, Cesium.Matrix2.fromUniformScale(scale), m);   * Cesium.Matrix2.multiplyByUniformScale(m, scale, m);   *   * @see Matrix2.multiplyByScale   * @see Matrix2.fromScale   * @see Matrix2.fromUniformScale   * @see Matrix2.setScale   * @see Matrix2.setUniformScale   * @see Matrix2.getScale   */  Matrix2.multiplyByUniformScale = function (matrix, scale, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.number("scale", scale);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = matrix[0] * scale;    result[1] = matrix[1] * scale;    result[2] = matrix[2] * scale;    result[3] = matrix[3] * scale;    return result;  };  /**   * Creates a negated copy of the provided matrix.   *   * @param {Matrix2} matrix The matrix to negate.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   */  Matrix2.negate = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = -matrix[0];    result[1] = -matrix[1];    result[2] = -matrix[2];    result[3] = -matrix[3];    return result;  };  /**   * Computes the transpose of the provided matrix.   *   * @param {Matrix2} matrix The matrix to transpose.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   */  Matrix2.transpose = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    const column0Row0 = matrix[0];    const column0Row1 = matrix[2];    const column1Row0 = matrix[1];    const column1Row1 = matrix[3];    result[0] = column0Row0;    result[1] = column0Row1;    result[2] = column1Row0;    result[3] = column1Row1;    return result;  };  /**   * Computes a matrix, which contains the absolute (unsigned) values of the provided matrix's elements.   *   * @param {Matrix2} matrix The matrix with signed elements.   * @param {Matrix2} result The object onto which to store the result.   * @returns {Matrix2} The modified result parameter.   */  Matrix2.abs = function (matrix, result) {    //>>includeStart('debug', pragmas.debug);    RuntimeError.Check.typeOf.object("matrix", matrix);    RuntimeError.Check.typeOf.object("result", result);    //>>includeEnd('debug');    result[0] = Math.abs(matrix[0]);    result[1] = Math.abs(matrix[1]);    result[2] = Math.abs(matrix[2]);    result[3] = Math.abs(matrix[3]);    return result;  };  /**   * Compares the provided matrices componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Matrix2} [left] The first matrix.   * @param {Matrix2} [right] The second matrix.   * @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise.   */  Matrix2.equals = function (left, right) {    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        left[0] === right[0] &&        left[1] === right[1] &&        left[2] === right[2] &&        left[3] === right[3])    );  };  /**   * @private   */  Matrix2.equalsArray = function (matrix, array, offset) {    return (      matrix[0] === array[offset] &&      matrix[1] === array[offset + 1] &&      matrix[2] === array[offset + 2] &&      matrix[3] === array[offset + 3]    );  };  /**   * Compares the provided matrices componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Matrix2} [left] The first matrix.   * @param {Matrix2} [right] The second matrix.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if left and right are within the provided epsilon, <code>false</code> otherwise.   */  Matrix2.equalsEpsilon = function (left, right, epsilon) {    epsilon = defaultValue.defaultValue(epsilon, 0);    return (      left === right ||      (defaultValue.defined(left) &&        defaultValue.defined(right) &&        Math.abs(left[0] - right[0]) <= epsilon &&        Math.abs(left[1] - right[1]) <= epsilon &&        Math.abs(left[2] - right[2]) <= epsilon &&        Math.abs(left[3] - right[3]) <= epsilon)    );  };  /**   * An immutable Matrix2 instance initialized to the identity matrix.   *   * @type {Matrix2}   * @constant   */  Matrix2.IDENTITY = Object.freeze(new Matrix2(1.0, 0.0, 0.0, 1.0));  /**   * An immutable Matrix2 instance initialized to the zero matrix.   *   * @type {Matrix2}   * @constant   */  Matrix2.ZERO = Object.freeze(new Matrix2(0.0, 0.0, 0.0, 0.0));  /**   * The index into Matrix2 for column 0, row 0.   *   * @type {Number}   * @constant   *   * @example   * const matrix = new Cesium.Matrix2();   * matrix[Cesium.Matrix2.COLUMN0ROW0] = 5.0; // set column 0, row 0 to 5.0   */  Matrix2.COLUMN0ROW0 = 0;  /**   * The index into Matrix2 for column 0, row 1.   *   * @type {Number}   * @constant   *   * @example   * const matrix = new Cesium.Matrix2();   * matrix[Cesium.Matrix2.COLUMN0ROW1] = 5.0; // set column 0, row 1 to 5.0   */  Matrix2.COLUMN0ROW1 = 1;  /**   * The index into Matrix2 for column 1, row 0.   *   * @type {Number}   * @constant   *   * @example   * const matrix = new Cesium.Matrix2();   * matrix[Cesium.Matrix2.COLUMN1ROW0] = 5.0; // set column 1, row 0 to 5.0   */  Matrix2.COLUMN1ROW0 = 2;  /**   * The index into Matrix2 for column 1, row 1.   *   * @type {Number}   * @constant   *   * @example   * const matrix = new Cesium.Matrix2();   * matrix[Cesium.Matrix2.COLUMN1ROW1] = 5.0; // set column 1, row 1 to 5.0   */  Matrix2.COLUMN1ROW1 = 3;  Object.defineProperties(Matrix2.prototype, {    /**     * Gets the number of items in the collection.     * @memberof Matrix2.prototype     *     * @type {Number}     */    length: {      get: function () {        return Matrix2.packedLength;      },    },  });  /**   * Duplicates the provided Matrix2 instance.   *   * @param {Matrix2} [result] The object onto which to store the result.   * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided.   */  Matrix2.prototype.clone = function (result) {    return Matrix2.clone(this, result);  };  /**   * Compares this matrix to the provided matrix componentwise and returns   * <code>true</code> if they are equal, <code>false</code> otherwise.   *   * @param {Matrix2} [right] The right hand side matrix.   * @returns {Boolean} <code>true</code> if they are equal, <code>false</code> otherwise.   */  Matrix2.prototype.equals = function (right) {    return Matrix2.equals(this, right);  };  /**   * Compares this matrix to the provided matrix componentwise and returns   * <code>true</code> if they are within the provided epsilon,   * <code>false</code> otherwise.   *   * @param {Matrix2} [right] The right hand side matrix.   * @param {Number} [epsilon=0] The epsilon to use for equality testing.   * @returns {Boolean} <code>true</code> if they are within the provided epsilon, <code>false</code> otherwise.   */  Matrix2.prototype.equalsEpsilon = function (right, epsilon) {    return Matrix2.equalsEpsilon(this, right, epsilon);  };  /**   * Creates a string representing this Matrix with each row being   * on a separate line and in the format '(column0, column1)'.   *   * @returns {String} A string representing the provided Matrix with each row being on a separate line and in the format '(column0, column1)'.   */  Matrix2.prototype.toString = function () {    return `(${this[0]}, ${this[2]})\n` + `(${this[1]}, ${this[3]})`;  };  exports.Cartesian2 = Cartesian2;  exports.Cartesian3 = Cartesian3;  exports.Cartesian4 = Cartesian4;  exports.Cartographic = Cartographic;  exports.Ellipsoid = Ellipsoid;  exports.Matrix2 = Matrix2;  exports.Matrix3 = Matrix3;  exports.Matrix4 = Matrix4;  exports.Rectangle = Rectangle;}));
 |