{"mappings": "AAEQ,GAAIA,UAAQ,EACRC,kBAAkB,sBCH9BC,QAAO,iBAAkB,SAAUC,GAO/B,QAASC,GAAOC,GACZ,MAAOC,MAAKC,UAAUF,GAS1B,QAASG,GAAOH,GACZ,MAAOC,MAAKG,MAAMJ,GAgBtB,QAASK,GAAKC,EAAKC,EAAKC,GAGpB,IAAK,GAAIC,GAFLC,EAAQH,EAAII,MAAM,KAClBC,EAAMN,EACKI,EAAMG,SAAWJ,EAAOC,EAAMI,UAAW,CACpD,KAAIL,IAAQG,IAMR,MAAOJ,EAJP,IADAI,EAAMA,EAAIH,IACLC,EAAMG,OACP,MAAOD,GAMnB,MAAOJ,GAWX,QAASO,GAAQT,EAAKC,EAAKS,GAGvB,IAAK,GAAIP,GAFLC,EAAQH,EAAII,MAAM,KAClBC,EAAMN,EACKI,EAAMG,SAAWJ,EAAOC,EAAMI,UACzC,GAAIL,IAAQG,IAAOF,EAAMG,OACrBD,EAAMA,EAAIH,OADd,CAKA,IAAKC,EAAMG,OAEP,YADAD,EAAIH,GAAQO,EAKhBJ,GAAMA,EAAIH,OAIlB,OACIV,OAAQA,EACRI,OAAQA,EACRE,KAAMA,EACNU,QAASA,KC3EjBlB,OAAO,kBAAmB,SAAUC,GAUhC,QAASmB,GAAKC,EAAQC,EAAYC,GAE9BC,IAEAH,EAASA,GAAUI,CAGnB,IAAIC,GAAMC,EAAEC,WAGRC,EAAKF,EAAE,UAAUG,SAASC,EAAW,KAAOT,GAAc,IAwB9D,OArBAU,GAAWH,EAAGI,KAAKC,SAAU,WAAYC,UAAWd,EAAQe,IAAK,EAAGC,KAAM,EAAGC,SAAU,WAIvFC,EAAKC,GAAG,SAAUN,GAGlBA,IAEAO,EAAMC,QAAQb,GAGdA,EAAGc,MAAM,SAAUC,GACflB,EAAImB,QAAQD,GACRrB,GACAC,MAMDE,EAAIoB,UAQf,QAAStB,GAAOuB,GACZ,MAAKf,IACLO,EAAKS,IAAI,SAAUd,GAEfa,GACAf,EAASiB,SAASC,QAAS,GAAIC,GAK5BxB,EAAEyB,KAAKpB,GAAUqB,KAAK,WACrBrB,GAAUA,EAASR,SACvBQ,EAAW,QAXf,OAeJ,QAASE,KACAF,IAILA,EAASsB,OACTtB,EAASC,KAAKsB,MAAOd,EAAM,GAAGe,YAAaC,OAAQhB,EAAM,GAAGiB,eAC5D1B,EAASZ,QA1Eb,GAOIY,GAPAP,EAAU,IACVM,EAAW,YACXoB,EAAgB,IAEhBQ,EAAOhC,EAAEiC,UACTnB,EAAQd,EAAEgC,EAAK,GAAGE,MAClBtB,EAAOZ,EAAEmC,OAwEb,QACI1C,KAAMA,EACNI,OAAQA,KC/EhBxB,OAAO,mBAAoB,SAASC,GAClC,GAAI8D,GAAaC,EAAcC,EAAUC,EAASC,EAAYC,EAAUC,EAAUC,CAsElF,OArEAA,GAAK,SAASC,GAYZ,GAAIC,GAAGC,CAEP,QADAA,EAAaX,OAAOW,YAAcX,OAAOY,eAIzCF,EAAIC,EAAWF,GACRC,IAAMA,EAAEG,UAAW,KAHjB,GAKXV,EAAW,WAKT,MAAOC,MAAaG,KAEtBN,EAAc,WAKZ,MAAOO,GAAG,6BAEZH,EAAa,WAKX,MAAOG,GAAG,4BAEZJ,EAAU,WAKR,MAAOI,GAAG,4EAEZD,EAAW,WAKT,MAAOC,GAAG,2EAEZF,EAAW,WAKT,MAAOE,GAAG,2DAA6DA,EAAG,mDAE5EN,EAAe,WAKb,MAAOM,GAAG,wCAGVA,GAAIA,EACJL,SAAUA,EACVF,YAAaA,EACbI,WAAYA,EACZD,QAASA,EACTG,SAAUA,EACVD,SAAUA,EACVJ,aAAcA,KCvFlBhE,OAAO,gBAAiB,SAAUC,GAuC9B,QAAS2E,GAAQC,EAAKC,GAElB,MAAOC,GAAapD,EAAEqD,IAAIH,GAAMC,GAGpC,QAASC,GAAaE,EAAUH,GAC5B,GAAIpD,GAAMC,EAAEC,UAGZ,OAAyB,aAArBqD,EAASC,SACTD,EAAS5B,KAAK,SAAU8B,GAEpB,MADA/D,GAAK+D,EAAGL,GAASzB,KAAK3B,EAAImB,SACnBnB,EAAIoB,YAERpB,EAAIoB,YAKf1B,EAAKgE,EAAWN,GAAUA,GAASzB,KAAK,WAEpC4B,EAAS5B,KAAK,SAAU8B,GAEpBE,EAAaC,KAAKH,GAClBjD,IACAR,EAAImB,QAAQb,KACbuD,KAAK,SAAUJ,GAEdE,EAAaC,KAAKE,KAClBxD,EAASF,SAAS2D,EAAc,UAChCvD,IACAR,EAAIgE,OAAO1D,OAKZN,EAAIoB,WAIf,QAASsC,GAAWN,GAChB,GAAIa,GAAIhE,EAAEiE,UAAWC,EAAUf,MAE/B,OAAO,yCAA2Ca,EAAEG,aAC9C,6BAA+BH,EAAEI,gBACjC,aAGV,QAASP,KAEL,MAAO,eAAiBC,EAAc,yJAEUA,EAAc,kGAMlE,QAASrE,GAAK4E,EAASlB,GAEnB,GAAIpD,GAAMC,EAAEC,UAQZ,IALAqE,EAAWtE,EAAEiE,UAAWC,EAAUf,MAGlCoB,IAEIC,EACA,MAAOC,GAAUJ,EAGrB,IAAIK,GAAcvB,EAAQuB,aAAe5D,CAWzC,IAVAT,EAAWsE,EAAMN,EAASP,EAAaY,GAGnCvB,EAAQuB,aACRrE,EAAS7B,KAAK,cAAe2E,EAAQuB,aAGzCrE,EAASC,IAAI,QAAS6C,EAAQvB,QAGzBuB,EAAQyB,YAAa,CACtB,GAAIC,GAAKC,CACL3B,GAAQ4B,eACRF,GAAO,IAAM1B,EAAQ4B,aAIzB,IAAIf,GAAIgB,EAAQvF,KAAK6E,EAAS5E,OAAQmF,EAAIP,EAASW,aAG/CX,GAASW,cACTjB,EAAEtC,KAAK6C,GAoBf,MAfAhE,KAEI4C,EAAQ+B,wBACRnF,EAAImB,QAAQb,GAIZiE,EAAShD,SACTA,EAAQ,OAAQjB,GAIpBL,EAAEyB,KAAKpB,GAAUqB,KAAK3B,EAAImB,SAGnBnB,EAAIoB,UAGf,QAASZ,KACL,GAAKF,IAAYmE,EAAjB,CACA,GAAI5C,GAAQvB,EAASuB,QACjBE,EAASzB,EAASyB,SAElBpB,EAAO,EACPD,EAAM,CAEV,IAAIJ,EAAS7B,KAAK,eAAgB,CAC9B,GAAIkG,GAAcrE,EAAS7B,KAAK,eAE5B2G,EAAkBT,EAAY5C,SAC9BsD,EAAiBV,EAAY9C,OAGjCnB,GAAO0E,EAAkB,EAAOrD,EAAS,EAG/B,EAANrB,IACAA,EAAM,IAGVC,EAAQ0E,EAAiB,EAAMxD,EAAQ,MAGpC,CAEH,GAAIyD,GAAYzE,EAAKyE,YACjBC,EAAa1E,EAAK0E,aAClBC,EAAcpD,OAAOqD,YAAc5E,EAAKgB,QACxC6D,EAAetD,OAAOuD,aAAe9E,EAAKkB,QAG9CrB,GAAM4E,EAAaI,EAAe,EAAO3D,EAAS,EAGxCuD,EAAN5E,IACAA,EAAM4E,EAAY,IAGtB3E,EAAO4E,EAAcC,EAAc,EAAM3D,EAAQ,EAIrDvB,EAASC,KACLG,IAAKA,EACLC,KAAMA,IAGVyB,OAAOwD,WAAWC,EAAiB,KAGvC,QAASjB,GAAMN,EAASwB,EAAYnB,GAChC,GAAIoB,GAAI9F,EAAEqE,GAAS5E,OAEfsG,EAAM/F,EAAE,UAAUG,SAAS0F,EAAa,MAAQvB,EAAS0B,UAAY,IAWzE,OATAtC,GAAeoC,EAAEG,KAAK,UAAUC,SAAS/F,SAAS2D,EAAc,YAEhEiC,EAAII,OAAOzC,GACXgB,EAAYyB,OAAOJ,GAInBA,EAAIK,SAAS,IAAMtC,EAAc,SAAU,QAASuC,GAE7CN,EAOX,QAASzE,GAAQgF,EAAMpG,GACnB,MAAKA,IAGLA,EAAGC,SAAS,aAEC,SAATmG,GACApG,EAAGI,KAAKiG,aAAc,QAAShF,QAAS,IACnC9B,OACA6B,SAASiF,aAAc,EAAGhF,QAAW,GAAIiF,GAGrC,SAATF,GACApG,EACKoB,SAASiF,aAAc,OAAQhF,QAAW,GAAIiF,GAIhDxG,EAAEyB,KAAKvB,GAAIwB,KAAK,WACnBxB,EAAGuG,YAAY,gBAlBHzG,EAAEyB,OA0BtB,QAAS8C,GAAMmC,GACX,IAAKrG,EAAU,MAAOL,GAAEyB,MAExB,IAAI+C,EAAU,MAAOmC,IAErBC,IAEA,IAAIxH,GAAMiB,CAEVO,GAAKS,IAAI,SAAUd,EAGnB,IAAIyD,GAAIgB,EAAQnF,QAAQ6G,GAAQpC,EAAShD,QAQzC,OALIgD,GAAShD,UAAYoF,GACrBpF,EAAQ,OAAQlC,GAIbY,EAAEyB,KAAKuC,EAAG5E,GAAKsC,KAAK,WAEvB1B,EAAE,aAAa2B,OAEX2C,GAAYA,EAASC,OACrBD,EAASC,MAAMnF,GAEnBA,EAAIyH,QACJ,IAAInC,GAAcrE,EAAS7B,KAAK,cAEhCkF,GAAerD,EAAWiE,EAAWlF,EAAM,KAGvCsF,GACAA,EAAY7E,WAWxB,QAAS8G,KAEL,GAAIvH,GAAMiB,CAmBV,OAlBIiE,IAAYA,EAASC,OAAOD,EAASC,MAAMnF,GAC/CA,EAAIS,SAGJ6D,EAAerD,EAAWiE,EAAWlF,EAAM,KAG3C0H,IAEAhG,EAAM2F,YAAY,qBAIdM,IACAjG,EAAMuE,UAAU0B,GAChBA,EAAqB,MAGlB/G,EAAEyB,OASb,QAASgD,GAAUJ,GAcf,MAZA0C,GAAqBjG,EAAMuE,YAG3B2B,IAGA3G,EAAWsE,EAAMN,EAAS4C,EAAmBnG,GAE7CA,EAAMX,SAAS,qBAGfW,EAAMuE,UAAU,GACTrF,EAAEyB,KAAKpB,GAKlB,QAASyG,KAELI,EAAiBzH,OAGjByH,EAAmB,KAGvB,QAASF,KACLE,EAAmBpG,EAAMqG,SAAS,YAAYxF,OAIlD,QAASiE,KACL,GAAIwB,GAAKpH,EAAEqH,GAAGC,mBACTjH,IAAa+G,GAGlBA,EAAG/G,GAAU,GAIjB,QAASkH,KACLC,GAAU,EAENnH,GAAUA,EAASF,SAAS,qBAGpC,QAASyG,KACLY,GAAU,EAENnH,GAAUA,EAASoG,YAAY,qBAIvC,QAASJ,GAAepF,GACpBA,EAAEwG,iBACFxG,EAAEyG,0BAEF,IAAIC,GAAI3H,EAAEiB,EAAE2G,cACRJ,IAAWG,EAAEE,SAAS,aAE1BtD,IAvYJ,GA6BIlE,GAAUiE,EAAUZ,EAAc8D,EA8TlCN,EA3VAlC,EAAU1G,EAAQ,mBAClBwJ,EAASxJ,EAAQ,oBAEjBwB,EAAU,IAEVoE,GACA5C,SAAS,EACTM,MAAO,IACPqD,cAAc,EACdd,aAAc,aACdY,aAAc,GACdR,MAAO,KACPyB,SAAU,GACV5B,gBAAiB,GACjB1E,OAAQI,EACR8E,aAAa,EACbF,aAAa,GAGbI,EAAgB,qBAChBhB,EAAc,aACdmD,EAAqB,oBAErBT,EAAqB,IAGrB5F,EAAOZ,EAAEmC,QACTrB,EAAQd,EAAE,QAKV+H,EAAU,cAAgB9F,UAE1BuC,EAAWsD,EAAOvF,UAkSlBwE,EAAqB,IAwEpBgB,IACDnH,EAAKC,GAAG,SAAUN,EAItB,IAAIyH,IACAzD,MAAOA,EACP9E,KAAMA,EACNwD,QAASA,EACTG,aAAcA,EACd7C,SAAUA,EACVgH,KAAMA,EACNX,OAAQA,EAiBZ,OATAzE,QAAO8F,KAAKC,MAAQF,EAMpB7F,OAAO8F,KAAKC,MAAMC,WAAa5H,EAGxByH,ICzaX3J,OAAO,yBAA0B,SAASC,GAQxC,GAAI8J,EA0HJ,OAzHAA,GAAU,WAcR,QAASA,KACPC,KAAKC,QAdP,GAAIC,GAAOC,CAqHX,OAnHAD,GAAQ,EAERC,EAAU,WAMR,MADAD,IAAS,EACF,MAAQA,GAOjBH,EAAQK,UAAU5H,GAAK,SAAS6H,EAAMC,GAKpC,OAAKA,IAGCD,IAAQL,MAAKC,OACjBD,KAAKC,KAAKI,OAERL,KAAKO,kBAAkBF,EAAMC,GAAY,GAN7C,QASKA,EAASE,OACZF,EAASE,KAAOL,KAElBH,KAAKC,KAAKI,GAAMI,KAAKH,GACdN,OAGTD,EAAQK,UAAUM,IAAM,SAASL,EAAMC,GAKrC,GAAIK,GAASC,CAUb,OATAA,GAAOZ,KACPW,EAAU,WAER,MADAL,GAASO,MAAMb,KAAMc,WACdF,EAAK5H,IAAIqH,EAAMC,IAEnBA,EAASE,OACZF,EAASE,KAAOL,KAElBQ,EAAQH,KAAOF,EAASE,KACjBR,KAAKxH,GAAG6H,EAAMM,IAGvBZ,EAAQK,UAAUpH,IAAM,SAASqH,EAAMC,GAUrC,GAAIS,EACJ,OAAKT,IAILS,EAAMf,KAAKO,kBAAkBF,EAAMC,GAC/BS,EAAM,IACRf,KAAKC,KAAKI,GAAMW,OAAOD,EAAK,GAEvBf,iBAPEA,MAAKC,KAAKI,IAUrBN,EAAQK,UAAUa,QAAU,SAASZ,GAKnC,GAAI5C,GAAGyD,EAAGC,EAAKC,CACf,IAAMf,IAAQL,MAAKC,KAAnB,CAIA,IADAmB,EAAMpB,KAAKC,KAAKI,GACXa,EAAI,EAAGC,EAAMC,EAAIpK,OAAYmK,EAAJD,EAASA,IACrCzD,EAAI2D,EAAIF,GACRzD,EAAEoD,MAAMb,KAAMqB,MAAMjB,UAAUkB,MAAMC,KAAKT,UAAW,GAEtD,OAAOd,QAGTD,EAAQK,UAAUG,kBAAoB,SAASF,EAAMC,GAKnD,GAAI7C,GAAGyD,EAAGH,EAAKI,EAAKC,CACpB,MAAMf,IAAQL,MAAKC,MACjB,MAAO,EAGT,KADAmB,EAAMpB,KAAKC,KAAKI,GACXU,EAAMG,EAAI,EAAGC,EAAMC,EAAIpK,OAAYmK,EAAJD,EAASH,IAAQG,EAAG,CAEtD,GADAzD,EAAI2D,EAAIL,GACJtD,IAAM6C,EACR,MAAOS,EAET,IAAItD,EAAE+C,MAAQ/C,EAAE+C,OAASF,EAASE,KAChC,MAAOO,GAGX,MAAO,IAGFhB,MAIPA,QAASA,ICnIb,IAAInE,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,eACbP,SAAWA,KAEbtL,QAAO,eAAgB,SAASC,GAC9B,GAAI6L,GAAMC,CAyNV,OAxNAA,GAAK9L,EAAQ,0BAKb6L,EAAO,SAAUE,GAGf,QAASF,GAAKhH,GACG,MAAXA,IACFA,MAEFkF,KAAKlF,QAAUA,EACXkF,KAAKiC,iBACPjC,KAAKlF,QAAUnD,EAAEiE,UAAWoE,KAAKiC,eAAgBnH,IAEnDgH,EAAKF,UAAUF,YAAYb,MAAMb,KAAMc,WACvCd,KAAKkC,cACLlC,KAAKnI,GAAKiD,EAAQjD,GACbmI,KAAKnI,GAGRmI,KAAKlF,QAAUnD,EAAEiE,UAAWoE,KAAKiC,eAAgBjC,KAAKnI,GAAG1B,OAAQ2E,GAFjEkF,KAAKnI,GAAKmI,KAAKmC,WAIbnC,KAAKoC,aACPpC,KAAKqC,SACLrC,KAAK1D,SA2LT,MA/MAV,QAAOkG,EAAME,GAwBbF,EAAK1B,UAAUgC,YAAa,EAE5BN,EAAK1B,UAAUiC,OAAS,WACtB,MAAO,OAGTP,EAAK1B,UAAU9D,MAAQ,WAOrB,MANI0D,MAAKsC,OACPtC,KAAKnI,GAAG0K,KAAKvC,KAAKsC,OAEhBtC,KAAKrC,UACPqC,KAAKnI,GAAGC,SAASkI,KAAKrC,UAEpBqC,KAAKwC,OACAxC,KAAKjC,SAASiC,KAAKyC,eAAezC,KAAKwC,SADhD,QAKFV,EAAK1B,UAAU5I,OAAS,WAOtB,MANIwI,MAAK0C,cACP1C,KAAK0C,eAEH1C,KAAKnI,IACPmI,KAAKnI,GAAGL,SAEHwI,KAAK2C,SAAU,GAGxBb,EAAK1B,UAAUwC,KAAO,SAASC,GAC7B,MAAO7C,MAAKnI,GAAG+K,KAAKC,IAGtBf,EAAK1B,UAAUrC,SAAW,SAASyE,GACjC,GAAI5J,GAAGkK,EAAG3B,EAAK4B,CAEf,KADAA,KACKD,EAAI,EAAG3B,EAAMqB,EAAOxL,OAAYmK,EAAJ2B,EAASA,IACxClK,EAAI4J,EAAOM,GACXC,EAAQtC,KAAKT,KAAKnI,GAAGW,GAAGI,EAAEyH,KAAMzH,EAAEiK,SAAUjK,EAAE+H,SAEhD,OAAOoC,IAGTjB,EAAK1B,UAAU4C,WAAa,SAASR,GACnC,GAAI5J,GAAGkK,EAAG3B,EAAK4B,CAEf,KADAA,KACKD,EAAI,EAAG3B,EAAMqB,EAAOxL,OAAYmK,EAAJ2B,EAASA,IACxClK,EAAI4J,EAAOM,GACXC,EAAQtC,KAAKT,KAAKnI,GAAGmB,IAAIJ,EAAEyH,KAAMzH,EAAEiK,SAAUjK,EAAE+H,SAEjD,OAAOoC,IAGTjB,EAAK1B,UAAU+B,SAAW,WAKxB,GAAIc,GAAKC,EAAGC,EAAON,CACnB,IAAI7C,KAAKoD,iBAAkB,CAKzB,GAJAP,EAAWQ,EAAEC,OAAOtD,KAAM,oBAC1BmD,EAAQxL,EAAEkL,GACVK,EAAIC,EAAM7H,OACV2H,EAAME,EAAMhN,KAAK,UAAY,IACxB+M,EACH,KAAM,iDAAmDL,EAAW,GAEtE,OAAOlL,GAAE,SAASG,SAASmL,GAAKnF,OAAOoF,KAI3CpB,EAAK1B,UAAUqC,eAAiB,SAASc,GAKvC,GAAIC,GAAcC,EAAGC,CACrB,OAAKH,IAGLC,EAAe,SAAUG,GACvB,MAAO,UAASjN,EAAKkN,GACnB,GAAIjD,GAASN,EAAMe,EAAKyB,CAGxB,IAFAzB,EAAM1K,EAAII,MAAM,KAAMuJ,EAAOe,EAAI,GAAIyB,EAAW,GAAKzB,EAAIpK,OAASsK,MAAMC,KAAKH,EAAK,MAClFT,EAAUgD,EAAMC,IACXjD,EACH,KAAM,eAAiBiD,EAAc,qBAAuBD,CAE9D,QACEtD,KAAMA,EACNwC,SAAUA,EAASgB,KAAK,KACxBlD,QAAShJ,EAAEmM,MAAMnD,EAASgD,MAG7B3D,MACI,WACL,GAAI+C,EACJA,KACA,KAAKU,IAAKF,GACRG,EAAIH,EAAUE,GACdV,EAAQtC,KAAK+C,EAAaC,EAAGC,GAE/B,OAAOX,WAIXjB,EAAK1B,UAAU2D,YAAc,SAASC,EAAUC,GAC9C,GAAIC,EAYJ,OAXsB,OAAlBD,IACFA,GAAiB,GAUfjE,KAAKmE,YAAYH,GAArB,QAGAhE,KAAKkC,WAAW8B,IAAY,EAC5BE,EAAI,SAAUP,GACZ,MAAO,YACL,MAAIA,GAAM9L,GACD8L,EAAM9L,GAAGC,SAAS,MAAQkM,GADnC,SAIDhE,MACCiE,EACK3G,WAAW4G,EAAG,IAEdA,MAIXpC,EAAK1B,UAAUgE,eAAiB,SAASJ,GAQvC,MAAKhE,MAAKmE,YAAYH,UAGfhE,MAAKkC,WAAW8B,GACnBhE,KAAKnI,GACAmI,KAAKnI,GAAGuG,YAAY,MAAQ4F,GADrC,QAJA,QASFlC,EAAK1B,UAAU+D,YAAc,SAASH,GAWpC,MAAOA,KAAYhE,MAAKkC,YAG1BJ,EAAK1B,UAAUiE,UAAY,WAKzB,GAAInD,EACJ,OAAO,YACL,GAAI6B,EACJA,KACA,KAAK7B,IAAKlB,MAAKkC,WACba,EAAQtC,KAAKS,EAEf,OAAO6B,IACNxB,KAAKvB,OAGH8B,GAENC,EAAGhC,UAEJ+B,KAAMA,KC/NV9L,OAAO,oBAAqB,SAASC,GACnC,GAAIqO,GAAYC,EAAaC,EAAaC,EAAQC,EAAKC,CAuDvD,OAtDAL,GAAa,EACbC,EAAc,gBACdE,EAAS,WAEP,MADAH,IAAc,EACP,eAAiBA,GAE1BI,EAAM/M,MACNgN,EAAoB,SAAS/L,GAC3B,GAAI6K,GAAGvI,CAEP,QADAA,EAAQtC,EAAEgM,cAAc1J,QAIxBuI,EAAIvI,EAAMqJ,GACNd,EACKiB,EAAIzD,QAAQwC,EAAGvI,GADxB,QAJA,QAQFvD,EAAEmC,QAAQtB,GAAG,WAAYmM,GACzBH,EAAc,WACZ,QAASA,GAAYlE,GACnBN,KAAK6E,GAAKJ,IACVC,EAAIlM,GAAGwH,KAAK6E,GAAIvE,GA6BlB,MA1BAkE,GAAYpE,UAAUK,KAAO,SAASvF,GACpC,GAAI4J,EAKJ,IAJa,MAAT5J,IACFA,MAEFA,EAAMqJ,GAAevE,KAAK6E,GACrBE,QAAQC,UAGb,IAEE,GADAF,EAAU1O,KAAKC,UAAU0O,QAAQ7J,OAC7B9E,KAAKC,UAAU6E,KAAW4J,EAC5B,MAEF,OAAOC,SAAQC,UAAU9J,EAAOtB,SAASqL,MAAOrL,SAASsL,SAASC,MAClE,MAAOC,MAGXZ,EAAYpE,UAAUiF,IAAM,WAC1B,MAAO,OAGTb,EAAYpE,UAAU5I,OAAS,WAC7B,MAAOkN,GAAI1L,IAAIgH,KAAK6E,KAGfL,MAIPc,UAAW,SAAShF,GAClB,MAAO,IAAIkE,GAAYlE,MCtD7B,IAAIiF,MAAO,SAASvG,EAAIwG,GAAK,MAAO,YAAY,MAAOxG,GAAG6B,MAAM2E,EAAI1E,aAClElF,OAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GAClRG,WAAaE,cAEf7L,QAAO,0BAA2B,SAASC,GACzC,GAAIwP,GAAWV,EAASlF,EAAO6F,CAiI/B,OAhIA7F,GAAQ5J,EAAQ,iBAChByP,EAAOzP,EAAQ,gBACf8O,EAAU9O,EAAQ,qBAOlBwP,EAAY,SAAUzD,GAOpB,QAASyD,GAAUE,EAAM7K,GACvBkF,KAAKnF,IAAM8K,EACX3F,KAAK4F,iBAAmBL,KAAKvF,KAAK4F,iBAAkB5F,MACpDyF,EAAU7D,UAAUF,YAAYH,KAAKvB,KAAMlF,GACvCkF,KAAK6F,gBACP7F,KAAK8F,cAAgBf,EAAQO,UAAU,SAAU3B,GAC/C,MAAO,UAAS/K,EAAGsC,GACjB,MAAIA,IAASA,EAAM6K,KACVpC,EAAMzH,QADf,SAID8D,QAEDA,KAAKgG,SACPhG,KAAKiG,aApBT,GAAIC,EAmHJ,OAjHAtK,QAAO6J,EAAWzD,GAElBkE,KAoBAT,EAAUrF,UAAUgC,YAAa,EAEjCqD,EAAUrF,UAAU4F,SAAU,EAE9BP,EAAUrF,UAAUhJ,KAAO,SAAS+O,GAClC,GAAIjK,EAQJ,OAPAA,GAAQvE,EAAEmM,MAAM9D,KAAKoG,QAASpG,MAC1BA,KAAKgG,UACPG,EAAexO,EAAEiE,WACfiB,wBAAwB,EACxBX,MAAOA,GACNiK,IAEEtG,EAAM9E,aAAaiF,KAAKiG,aAAcE,GAAcE,OAAOrG,KAAK4F,mBAGzEH,EAAUrF,UAAUwF,iBAAmB,SAAS/N,GAgB9C,MATImI,MAAK6F,eACP7F,KAAK8F,cAAcrF,MACjBsF,MAAM,IAGV/F,KAAKnI,GAAKA,EACVmI,KAAK1D,QACL0D,KAAKsG,mBACLtG,KAAKqC,SACExC,EAAM3H,YAGfuN,EAAUrF,UAAUlE,MAAQ,SAASmC,GACnC,MAAOwB,GAAM3D,MAAMmC,IAGrBoH,EAAUrF,UAAUgG,QAAU,WAK5B,MAAOpG,MAAKuG,QAAS,GAGvBd,EAAUrF,UAAUkG,iBAAmB,WACrC,MAAO,OAGTb,EAAUrF,UAAU6F,WAAa,WAK/B,GAAI3C,EACJ,OAAItD,MAAKwG,eACA7O,EAAEyB,KAAK4G,KAAKwG,iBAErBlD,EAAStD,KAAKyG,eACVzG,KAAKgG,SACP1C,EAAOjK,KAAK,SAAUsK,GACpB,MAAO,UAAS3H,GACd,MAAO2H,GAAM6C,eAAiBxK,IAE/BgE,OAEEsD,IAGTmC,EAAUrF,UAAUqG,aAAe,WAKjC,GAAIpG,EACJ,OAAKL,MAAKgG,QAG+B,MAAlCE,EAAc7F,EAAOL,KAAKnF,KAAeqL,EAAc7F,GAAQ6F,EAAc7F,GAAQ1I,EAAEqD,IAAIgF,KAAKnF,KAF9FlD,EAAEqD,IAAIgF,KAAKnF,MAKtB4K,EAAUiB,WAAa,SAAS7L,GAK9B,MAAOqL,GAAcrL,GAAOlD,EAAEqD,IAAIH,IAG7B4K,GAENC,EAAK5D,OAEN2D,UAAWA,KC5IfzP,OAAO,kBAAmB,SAAUC,GAQhC,QAAS0Q,GAAUC,GACf,MAAc,QAAVA,EAAuB,KACvBvF,MAAMwF,QAAQD,GAAeA,EAAME,SAC/BF,GAwNZ,QAASG,GAAWtQ,GAChB,GAAI0E,KACJ,KAAK,GAAIsI,KAAKhN,GACV0E,EAAEsF,KAAKgD,EAEX,OAAOtI,GAkJX,QAAS6L,GAAMC,EAAOC,EAAKC,GACvB,GAAIhM,KAEC+L,KACDA,EAAMD,EACNA,EAAQ,EAGZ,KAAK,GAAI/F,GAAI+F,EAAWC,EAAJhG,EAASA,IACrBiG,EACAhM,EAAEsF,KAAK0G,EAAOC,QAAQC,EAAcnG,IAEpC/F,EAAEsF,KAAKS,EAIf,OAAO/F,GAzYX,GAAImM,GAASjG,MAAMjB,UAIfmH,GAAY,CAehBD,GAAO9P,OAAS,SAAUgQ,GAEtB,IAAK,GADDZ,GAAQD,EAAUa,GACbtG,EAAI,EAAGA,EAAI0F,EAAM5P,OAAQkK,IAAK,CACnC,GAAIH,GAAMf,KAAKyH,QAAQb,EAAM1F,GAC7B,IAAW,IAAPH,EAAW,MAAOf,KACtBA,MAAKgB,OAAOD,EAAK,GAErB,MAAOf,OASXsH,EAAOI,SAAW,SAAUC,GACxB,MAAO3H,MAAKxI,OAAOwI,KAAK4H,MAAMD,KAQlCL,EAAOO,OAAS,SAAUC,EAAM/G,GAC5Bf,KAAKgB,OAAOD,EAAK,EAAG+G,IASxBR,EAAOS,aAAe,SAAUD,EAAME,GAClC,GAAIjH,GAAMf,KAAKyH,QAAQO,EAEvB,OAAW,IAAPjH,MACAf,MAAKS,KAAKqH,OAId9H,MAAK6H,OAAOC,EAAM/G,IAQtBuG,EAAOW,YAAc,SAAUH,EAAME,GACjC,GAAIjH,GAAMf,KAAKyH,QAAQO,EAEvB,OAAW,IAAPjH,GAAcA,EAAM,EAAKf,KAAKhJ,WAC9BgJ,MAAKS,KAAKqH,OAId9H,MAAK6H,OAAOC,EAAM/G,EAAM,IAQ5BuG,EAAOR,MAAQQ,EAAOhG,MAQtBgG,EAAOY,SAAW,SAAUJ,GACxB,MAA6B,IAAtB9H,KAAKyH,QAAQK,IASxBR,EAAOa,MAAQ,SAAUC,GACrB,MAAOpI,MAAK8G,QAAQtP,OAAO4Q,IAQ/B/G,MAAMsF,UAAYA,EAQlBW,EAAOe,KAAO,SAAUC,GACpB,GAAIC,GAAMD,EAAStI,KAAKsI,OAAOA,GAAUtI,IACzC,OAAOuI,GAAIA,EAAIvR,OAAS,IAS5BsQ,EAAOkB,MAAQ,SAAUF,GACrB,GAAIC,GAAMD,EAAStI,KAAKsI,OAAOA,GAAUtI,IACzC,OAAOuI,GAAI,IAWfjB,EAAOmB,QAAU,SAAUX,GACvB,OAAQ9H,KAAKkI,SAASJ,IAAS9H,KAAKS,KAAKqH,IAQ7CR,EAAOoB,OAAS,WACZ,GAAIxH,GAAIyH,KAAKC,OAAO5I,KAAKhJ,OAAS,GAAK2R,KAAKD,SAC5C,OAAO1I,MAAKkB,IAQhBoG,EAAOuB,OAAS,WAEZ,IAAK,GADD1N,MACK+F,EAAI,EAAGA,EAAIlB,KAAKhJ,OAAQkK,IAAK,CAClC,GAAIrJ,GAAKmI,KAAKkB,GACVH,EAAMf,KAAKyH,QAAQ5P,EACnBkJ,GAAM,IAAYG,EAANH,GAChB5F,EAAEsF,KAAK5I,GAEX,MAAOsD,IAGXmM,EAAOwB,IAAM,SAAUC,GAEnB,IAAK,GADDpN,GAAI,EACCuF,EAAI,EAAGA,EAAIlB,KAAKhJ,OAAQkK,IAEzBvF,GADAoN,EACKA,EAAK/I,KAAKkB,IAEVlB,KAAKkB,EAGlB,OAAOvF,IAQX2L,EAAO0B,QAAU,WAEb,IAAK,GADD7N,MACK+F,EAAI,EAAGA,EAAIlB,KAAKhJ,OAAQkK,IAAK,CAClC,GAAIvF,GAAIqE,KAAKkB,EACTG,OAAMwF,QAAQlL,GACdA,EAAEqN,UAAUC,QAAQ,SAAU/H,GAC1B/F,EAAEsF,KAAKS,KAGX/F,EAAEsF,KAAK9E,GAGf,MAAOR,IAWXkG,MAAM6H,SAAW,SAAUC,GAEvB,IAAKA,IAAUA,EAAMnS,OAAQ,QAG7B,KAAK,GADDsM,MACKpC,EAAI,EAAGA,EAAIiI,EAAMnS,OAAQkK,IAC9BoC,EAAO6F,EAAMjI,KAAM,CAEvB,OAAOoC,IAaPiE,IAEKlG,MAAMwF,UACPxF,MAAMwF,QAAU,SAAUuC,GACtB,MAAOA,IACa,gBAAV,IACiB,gBAAhBA,GAAU,QACM,kBAAhBA,GAAU,SAAsBA,EAAIC,qBAAqB,YAMvE/B,EAAOG,UACRH,EAAOG,QAAU,SAAU6B,GACvB,GAAInI,GAAMnB,KAAKhJ,SAAW,EAEtBuS,EAAOC,OAAO1I,UAAU,KAAO,CAOnC,KANAyI,EAAe,EAAPA,EACFZ,KAAKc,KAAKF,GACVZ,KAAKe,MAAMH,GACN,EAAPA,IACAA,GAAQpI,GAEEA,EAAPoI,EAAYA,IACf,GAAIA,IAAQvJ,OACRA,KAAKuJ,KAAUD,EACf,MAAOC,EAEf,OAAO,KAKVjC,EAAOqC,OACRrC,EAAOqC,KAAO,SAAU3K,EAAI4K,GACxB,IAAK5K,EAAI,OAAO,CAChB4K,GAAQA,GAAS9P,MAEjB,KAAK,GAAIoH,GAAI,EAAGA,EAAIlB,KAAKhJ,OAAQkK,IAC7B,GAAIlC,EAAGuC,KAAKqI,EAAO5J,KAAKkB,GAAIA,GAAI,OAAO,CAG3C,QAAO,IAKVoG,EAAO2B,UACR3B,EAAO2B,QAAU,SAAUjK,EAAI4K,GAC3B,IAAK,GAAI1I,GAAI,EAAGC,EAAMnB,KAAKhJ,OAAYmK,EAAJD,IAAWA,EAC1ClC,EAAGuC,KAAKqI,GAAS5J,KAAMA,KAAKkB,GAAIA,EAAGlB,QAM1CsH,EAAOgB,SACRhB,EAAOgB,OAAS,SAAUtJ,EAAI4K,GAC1B,GAAIC,KACJ,KAAK7K,EAAI,MAAO6K,EAChBD,GAAQA,GAAS9P,MAEjB,KAAK,GAAIoH,GAAI,EAAGA,EAAIlB,KAAKhJ,OAAQkK,IAAK,CAClC,GAAIwC,GAAI1D,KAAKkB,EACTlC,GAAGuC,KAAKqI,EAAOlG,EAAGxC,IAClB2I,EAAIpJ,KAAKiD,GAIjB,MAAOmG,KAIVvC,EAAOwC,QACRxC,EAAOwC,MAAQ,SAAU9K,EAAI4K,GACzB,IAAK5K,EAAI,OAAO,CAChB4K,GAAQA,GAAS9P,MAEjB,KAAK,GAAIoH,GAAI,EAAGA,EAAIlB,KAAKhJ,OAAQkK,IAC7B,IAAKlC,EAAGuC,KAAKqI,EAAO5J,KAAKkB,GAAIA,GAAI,OAAO,CAG5C,QAAO,IAIVoG,EAAOyC,MACRzC,EAAOyC,IAAM,SAAU/K,EAAI4K,GACvB,IAAK5K,EAAI,MAAOgB,KAChB4J,GAAQA,GAAS9P,MAEjB,KAAK,GADD+P,MACK3I,EAAI,EAAGA,EAAIlB,KAAKhJ,OAAQkK,IAC7B2I,EAAIpJ,KAAKzB,EAAGuC,KAAKqI,EAAO5J,KAAKkB,GAAIA,GAGrC,OAAO2I,MAUnBvC,EAAO0C,IAAM1C,EAAOqC,KAIpBrC,EAAO2C,IAAM3C,EAAOwC,MAIpBxC,EAAO4C,KAAO5C,EAAO2B,QAIrB3B,EAAOM,MAAQN,EAAOgB,OAIlB,UAAYxO,UACX,UAAW,QAAS,OAAQ,OAAOmP,QAAQ,SAAUxF,GAClD0G,OAAOnL,GAAGyE,GAAK6D,EAAO7D,IAO9B,IAAI4D,GAAe,QA6BnB,QACI6B,SAAS7H,MAAM6H,SACfkB,KAAKrD,EACLC,MAAMA,KChZdhR,OAAO,gBAAiB,SAAUC,GAC9B,YAcA,SAASoU,GAAKC,EAAKC,EAAQC,EAAaC,GACpCF,EAASA,MAGT5S,EAAEiE,OAAO2O,GAASG,OAAQC,KAE1B,IAAIhP,GAAIhE,EAAEiE,QACNf,IAAKyP,EACLrM,KAAM,OACN2M,QAASJ,EACTrU,KAAMoU,GACPE,GAECI,EAAIlT,EAAEmT,KAAKnP,GAEX4F,EAAOsJ,EAAEE,KAAKC,EAAeC,EAkBjC,OAfA1J,GAAKqJ,QAAUrJ,EAAKlI,KACpBkI,EAAK6D,MAAQ7D,EAAKhG,KAClBgG,EAAK2J,SAAW3J,EAAK8E,OAIrB9E,EAAK4J,MAAQN,EAAEM,MACf5J,EAAK6J,iBAAmBP,EAAEO,iBAC1B7J,EAAK8J,sBAAwBR,EAAEQ,sBAC/B9J,EAAK+J,kBAAoBT,EAAES,kBAGvBd,GACAjJ,EAAKlI,KAAKmR,GAEPjJ,EAGX,QAAS0J,GAAoBM,EAAOC,EAAYpG,GAC5C,GAAI1N,GAAMC,EAAEC,UAOZ,OALmB,UAAf4T,EACA9T,EAAIgE,OAAO8P,EAAYD,EAAOnG,GAE9B1N,EAAIgE,OAAO+P,EAAuBF,EAAOnG,GAEtC1N,EAYX,QAASsT,GAAc7U,EAAMuV,EAAYH,GAErC,GAAI7T,GAAMC,EAAEC,UAoBZ,SAlBKzB,GAAQA,IAASA,EAAKwV,SACvBjU,EAAImB,QAAQ1C,EAAMuV,EAAYH,GAI9BpV,EAAKwV,SACe,YAAhBxV,EAAKwV,QACLjU,EAAImB,QAAQ1C,EAAKmN,OAAQoI,EAAYH,GAGrB,UAAhBpV,EAAKwV,QACLjU,EAAIgE,OAAOvF,EAAKyV,SAAWH,EAAuBtV,EAAMuV,EAAYH,IAOrE7T,EAIX,QAASmU,GAASvB,EAAKC,EAAQuB,GAC3B,GAAIpU,GAAMC,EAAEC,WACRsJ,EAAI6K,IACJ1L,EAAOa,EAAEqB,KAAK,OAElByJ,GAAiB3L,EAAM3I,GAEvB6S,EAAS5S,EAAEiE,UAAW2O,GAAS0B,WAAc5L,IAG7C6L,EAAK5B,EAAKC,EAAQlK,EAAMyL,EAExB,IAAIjB,GAAInT,EAAIoB,SAMZ,OAJA+R,GAAEM,MAAQ,WACNzT,EAAIgE,OAAO,UAGRmP,EAGX,QAASmB,GAAiB3L,EAAM3I,GACtB,SAAWoC,UACbA,OAAOqS,UAIXrS,OAAOqS,MAAM9L,GAAQ,SAAUlK,KAEtBA,GAAQA,IAASA,EAAKwV,SACvBjU,EAAImB,QAAQ1C,GAIZA,EAAKwV,SACe,YAAhBxV,EAAKwV,QACLjU,EAAImB,QAAQ1C,EAAKmN,QAGD,UAAhBnN,EAAKwV,QACLjU,EAAIgE,OAAOvF,EAAKyV,QAASzV,KAMrCuB,EAAI2O,OAAO,iBACAvM,QAAOqS,MAAM9L,KAiB5B,QAAS0L,KAEL,GAAI1L,GAAO,kBAAoB+L,EAE3BP,EAAWlU,EAAE,aACZM,IAAIoU,GACJ9J,KAAK,OAAQlC,EAKlB,OAHA1I,GAAEiC,SAASC,MAAMiE,OAAO+N,GAGjBA,EAgBX,QAASlB,GAAMvB,GAMX,MALIA,KACAsB,EAAStB,GAIS,kBAAXsB,GACAA,IAGJA,EAIX,QAASwB,GAAK5B,EAAKC,EAAQ+B,EAAaJ,GACpC3B,EAAS5S,EAAEiE,QAAQ8O,OAAUC,KAAUJ,GAElC2B,IACDA,EAAOvU,EAAE,WACJM,IAAIoU,GACJE,SAAS9T,IAIlByT,EAAK3J,MACDiK,OAAQ,OAERC,OAAQH,EAERI,OAAQpC,EACRqC,QAAS,uBAGb,KAAK,GAAIlJ,KAAK8G,GACV5S,EAAE,YAAY4K,MACVlC,KAAMoD,EACNxF,KAAM,WAELsO,SAASL,GACT9C,IAAImB,EAAO9G,GAGpByI,GAAKU,SAGT,QAASC,GAAavC,EAAKC,EAAQ+B,EAAaQ,EAAUC,GACtDA,EAAgBA,GAAiB,IAEjC,IAAIC,GAAS,mBAAqBZ,EAE9B1U,EAAMC,EAAEC,UAEZoU,GAAiBgB,EAAQtV,EAEzB,IAAIuV,KAOJ,OANAA,GAAKF,GAAiBC,EAEtBzC,EAAS5S,EAAEiE,OAAOqR,EAAM1C,GAExB2B,EAAK5B,EAAKC,EAAQ+B,EAAaQ,GAExBpV,EAtPX,GAAI+T,GAAwB,2BACxBhT,EAAQd,EAAE,QAiJV0U,GACAa,WAAc,SACd3T,MAAS,EACTE,OAAU,EACVvB,SAAY,WACZG,KAAQ,KACRD,IAAO,MAIPgU,EAAY,EAsBZ1B,EAAS,EAwEb,QACIC,MAAOA,EACPN,KAAMA,EACN8C,OAAQtB,EACRK,KAAMA,EACNW,aAAcA,ICjQtB,IAAIjR,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,2BAA4B,SAASC,GAC1C,GAAImX,GAAmBC,EAAYC,EAAWC,CA6D9C,OA5DAF,MACAC,EAAY,WACV,QAASA,GAAUE,GACjBxN,KAAKyN,MAAQD,EAQf,MAJAF,GAAUlN,UAAUsN,SAAW,WAC7B,KAAM,kBAGDJ,KAGTF,EAAoB,SAAUpL,GAO5B,QAASoL,KACPA,EAAkBxL,UAAUF,YAAYb,MAAMb,KAAMc,WACpDd,KAAK4L,QAAU5L,KAAKyN,MAAM3S,QAAQ6S,SAC9B3N,KAAK4L,WAAY,IACnB5L,KAAK4L,QAAUgC,GAVnB,GAAIA,EAwBJ,OAtBAhS,QAAOwR,EAAmBpL,GAE1B4L,EAA2B,yBAU3BR,EAAkBhN,UAAUsN,SAAW,WACrC,MAAI1N,MAAKyN,MAAMI,UACN7N,KAAK4L,QADd,QAKFwB,EAAkBU,aAAe,SAASL,GACxC,MAAOA,GAAM3S,QAAQ6S,UAGhBP,GAENE,GACHD,EAAW5M,KAAK2M,GAChBG,EAAY,SAASQ,GAOnB,GAAI7M,GAAGC,EAAKmC,EAAQ0K,CAEpB,KADA1K,KACKpC,EAAI,EAAGC,EAAMkM,EAAWrW,OAAYmK,EAAJD,EAASA,IAC5C8M,EAAiBX,EAAWnM,GACxB8M,EAAeF,aAAaC,IAC9BzK,EAAO7C,KAAK,GAAIuN,GAAeD,GAGnC,OAAOzK,KAGPiK,UAAWA,IClEf,IAAI3R,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,0BAA2B,SAASC,GACzC,GAAIgY,GAAWC,EAAYC,CAqO3B,OApOAA,GAAKlY,EAAQ,gBACbiY,EAAajY,EAAQ,gBACrBgY,EAAY,SAAUjM,GAGpB,QAASiM,KACP,MAAOA,GAAUrM,UAAUF,YAAYb,MAAMb,KAAMc,WA2NrD,MA9NAlF,QAAOqS,EAAWjM,GAMlBiM,EAAU7N,UAAUiC,OAAS,WAQ3B,MAPArC,MAAKK,KAAOL,KAAKlF,QAAQuF,MAAQL,KAAKnI,GAAG0K,KAAK,QAC9CvC,KAAK6E,GAAK7E,KAAKlF,QAAQ+J,IAAM7E,KAAKnI,GAAG0K,KAAK,MAC1CvC,KAAKnI,GAAG0K,MACNlC,KAAQL,KAAKK,KACbwE,GAAM7E,KAAK6E,KAEb7E,KAAKoO,iBAAiBpO,KAAKnI,IACpBmI,KAAKqO,mBAGdJ,EAAU7N,UAAUgO,iBAAmB,SAASE,GAU9C,MALAA,GAAQ9V,GAAG,QAAS,SAAUmL,GAC5B,MAAO,UAAS/K,GACd,MAAO+K,GAAM4K,aAAa3V,KAE3BoH,OACIsO,EAAQ9V,GAAG,OAAQ,SAAUmL,GAClC,MAAO,UAAS/K,GACd,MAAO+K,GAAM6K,YAAY5V,KAE1BoH,QAGLiO,EAAU7N,UAAUiO,gBAAkB,WAKpC,MAAOrO,MAAKkO,WAAaA,EAAWX,UAAUvN,OAGhDiO,EAAU7N,UAAUmO,aAAe,SAAS3V,GAC1C,MAAOoH,MAAK+D,YAAY,WAG1BkK,EAAU7N,UAAUoO,YAAc,SAAS5V,GACzC,MAAOoH,MAAKoE,eAAe,WAG7B6J,EAAU7N,UAAUqO,UAAY,WAU9B,MALIzO,MAAK6N,UACP7N,KAAK+D,YAAY,SAEjB/D,KAAKoE,eAAe,SAEfpE,KAAK0O,YAGdT,EAAU7N,UAAUuO,cAAgB,WAKlC,GAAIvJ,EAGJ,OAFApF,MAAK0O,WACLtJ,EAAQpF,KAAK0N,WACTtI,GACFpF,KAAK4O,WAAWxJ,IACT,IAEF,GAGT6I,EAAU7N,UAAUsN,SAAW,WAS7B,GAAItI,GAAOlE,EAAGC,EAAKC,EAAKsC,CAExB,KADAtC,EAAMpB,KAAKkO,WACNhN,EAAI,EAAGC,EAAMC,EAAIpK,OAAYmK,EAAJD,EAASA,IAGrC,GAFAwC,EAAItC,EAAIF,GACRkE,EAAQ1B,EAAEgK,WAER,MAAOtI,IAKb6I,EAAU7N,UAAUjJ,MAAQ,WAK1B,MAAOQ,GAAEkX,KAAK7O,KAAKnI,GAAGuR,QAGxB6E,EAAU7N,UAAUyN,QAAU,WAK5B,OAAQ7N,KAAK7I,SAGf8W,EAAU7N,UAAU0O,UAAY,WAU9B,MAAOnX,GAAE,IAAMqI,KAAK6E,GAAK,WAG3BoJ,EAAU7N,UAAUwO,WAAa,SAAShD,GAUxC,MAFA5L,MAAK+D,YAAY,WACjB/D,KAAKiB,QAAQ,UAAWjB,MACjBA,KAAK8O,YAAY1X,OAAO2X,KAAKnD,IAGtCqC,EAAU7N,UAAUsO,SAAW,WAO7B,MAFA1O,MAAKoE,eAAe,WACpBpE,KAAKiB,QAAQ,QAASjB,MACfA,KAAK8O,YAAYxV,QAG1B2U,EAAU7N,UAAU4O,OAAS,WAK3B,MAAOhP,MAAKoE,eAAe,aAG7B6J,EAAU7N,UAAU6O,QAAU,WAK5B,MAAOjP,MAAK+D,YAAY,aAG1BkK,EAAU7N,UAAU8O,MAAQ,WAK1B,MAAOlP,MAAKnI,GAAGqX,SAGjBjB,EAAUkB,OAAS,SAAStX,GAc1B,GAAIqJ,GAAG4G,EAAM3G,EAAKiO,CAGlB,KAFAvX,EAAKF,EAAEE,GACPuX,EAAYnB,EAAUmB,UACjBlO,EAAI,EAAGC,EAAMiO,EAAUpY,OAAYmK,EAAJD,EAASA,IAE3C,GADA4G,EAAOsH,EAAUlO,GACbrJ,EAAGwX,GAAGvH,EAAKjF,UACb,MAAO,IAAIiF,GAAKwH,UACdzX,GAAIA,GAKV,MADA0X,SAAQnK,MAAM,4BAA6BvN,GACrC,wCAA0CA,GAGlDoW,EAAUmB,aAEVnB,EAAUuB,SAAW,SAAS3M,EAAUyM,GAWtC,MAAOrB,GAAUmB,UAAU3O,MACzBoC,SAAUA,EACVyM,SAAUA,KAIPrB,GAENE,EAAGrM,OAEJmM,UAAWA,IC1Of,IAAIrS,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,qCAAsC,SAASC,GACpD,GAAIwZ,GAAqBC,EAAeC,CAoExC,OAnEAF,GAAsB,6GACtBE,EAAK1Z,EAAQ,2BACbyZ,EAAgB,SAAU1N,GAGxB,QAAS0N,KACP,MAAOA,GAAc9N,UAAUF,YAAYb,MAAMb,KAAMc,WAyDzD,MA5DAlF,QAAO8T,EAAe1N,GAMtB0N,EAActP,UAAUgO,iBAAmB,WAOzC,MANAsB,GAAc9N,UAAUwM,iBAAiBvN,MAAMb,KAAMc,WACrDd,KAAKnI,GAAGW,GAAG,cAAe,SAAUmL,GAClC,MAAO,UAAS/K,GACd,MAAO+K,GAAMiM,QAAQhX,KAEtBoH,OACIA,KAAKnI,GAAGW,GAAG,YAAa,SAAUmL,GACvC,MAAO,UAAS/K,GACd,MAAO+K,GAAMkM,uBAAuBjX,KAErCoH,QAGL0P,EAActP,UAAUwP,QAAU,SAAShX,GAQzC,MAAOoH,MAAKyO,aAGdiB,EAActP,UAAUyP,uBAAyB,SAASjX,GAQxD,MAAOoH,MAAKyO,aAGdiB,EAActP,UAAU6O,QAAU,WAMhC,MADAS,GAAc9N,UAAUqN,QAAQpO,MAAMb,KAAMc,WACrCd,KAAKnI,GAAG0K,KAAK,YAAY,IAGlCmN,EAActP,UAAU4O,OAAS,WAM/B,MADAU,GAAc9N,UAAUoN,OAAOnO,MAAMb,KAAMc,WACpCd,KAAKnI,GAAGiY,WAAW,aAGrBJ,GAENC,EAAG1B,WACN0B,EAAG1B,UAAUuB,SAASC,EAAqBC,IAEzCA,cAAeA,ICzEnB,IAAI9T,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,yCAA0C,SAASC,GACxD,GAAI8Z,GAAmBN,EAAqBE,CAsB5C,OArBAF,GAAsB,uBACtBE,EAAK1Z,EAAQ,2BACb8Z,EAAoB,SAAU/N,GAG5B,QAAS+N,KACP,MAAOA,GAAkBnO,UAAUF,YAAYb,MAAMb,KAAMc,WAW7D,MAdAlF,QAAOmU,EAAmB/N,GAM1B+N,EAAkB3P,UAAUjJ,MAAQ,WAKlC,MAAO6I,MAAKnI,GAAGwX,GAAG,aAGbU,GAENJ,EAAG1B,WACN0B,EAAG1B,UAAUuB,SAASC,EAAqBM,IAEzCA,kBAAmBA,IC3BvB,IAAInU,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,sCAAuC,SAASC,GACrD,GAAIwZ,GAAqBO,EAAgBL,CA2CzC,OA1CAF,GAAsB,sBACtBE,EAAK1Z,EAAQ,2BACb+Z,EAAiB,SAAUhO,GAGzB,QAASgO,KACP,MAAOA,GAAepO,UAAUF,YAAYb,MAAMb,KAAMc,WAgC1D,MAnCAlF,QAAOoU,EAAgBhO,GAMvBgO,EAAe5P,UAAUjJ,MAAQ,WAK/B,MAAO6I,MAAKnI,GAAG+K,KAAK,uBAAuBwG,OAG7C4G,EAAe5P,UAAUgO,iBAAmB,WAC1C,GAAI6B,EAaJ,OAZAD,GAAepO,UAAUwM,iBAAiBvN,MAAMb,KAAMc,WACtDmP,EAASjQ,KAAKnI,GAAG+K,KAAK,eACtBqN,EAAOzX,GAAG,QAAS,SAAUmL,GAC3B,MAAO,UAAS/K,GACd,MAAO+K,GAAM4K,aAAa3V,KAE3BoH,OACHiQ,EAAOzX,GAAG,OAAQ,SAAUmL,GAC1B,MAAO,UAAS/K,GACd,MAAO+K,GAAM6K,YAAY5V,KAE1BoH,OACIiQ,EAAOzX,GAAG,SAAU,SAAUmL,GACnC,MAAO,UAAS/K,GACd,MAAO+K,GAAM8K,cAEdzO,QAGEgQ,GAENL,EAAG1B,WACN0B,EAAG1B,UAAUuB,SAASC,EAAqBO,IAEzCA,eAAgBA,IChDpB,IAAIpU,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,uCAAwC,SAASC,GACtD,GAAIwZ,GAAqBS,EAAiBP,CAoC1C,OAnCAF,GAAsB,qBACtBE,EAAK1Z,EAAQ,2BACbia,EAAkB,SAAUlO,GAG1B,QAASkO,KACP,MAAOA,GAAgBtO,UAAUF,YAAYb,MAAMb,KAAMc,WAyB3D,MA5BAlF,QAAOsU,EAAiBlO,GAMxBkO,EAAgB9P,UAAUgO,iBAAmB,WAC3C,MAAO8B,GAAgBtO,UAAUwM,iBAAiBvN,MAAMb,KAAMc,YAGhEoP,EAAgB9P,UAAU6O,QAAU,WAMlC,MADAiB,GAAgBtO,UAAUqN,QAAQpO,MAAMb,KAAMc,WACvCd,KAAKnI,GAAG0K,KAAK,YAAY,IAGlC2N,EAAgB9P,UAAU4O,OAAS,WAMjC,MADAkB,GAAgBtO,UAAUoN,OAAOnO,MAAMb,KAAMc,WACtCd,KAAKnI,GAAGiY,WAAW,aAGrBI,GAENP,EAAG1B,WACN0B,EAAG1B,UAAUuB,SAASC,EAAqBS,IAEzCA,gBAAiBA,KChCrBla,OAAO,uBAAwB,SAASC,GACtC,GAAI0Z,EAMJ,OALAA,GAAK1Z,EAAQ,eACbA,EAAQ,0BACRA,EAAQ,8BACRA,EAAQ,2BACRA,EAAQ,6BAENgY,UAAW0B,EAAG1B,YCjBlB,IAAIrS,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,eACb4F,WAAaA,SAAW,SAASK,GAAQ,IAAK,GAAI5G,GAAI,EAAGiP,EAAInQ,KAAKhJ,OAAYmZ,EAAJjP,EAAOA,IAAO,GAAIA,IAAKlB,OAAQA,KAAKkB,KAAO4G,EAAM,MAAO5G,EAAK,OAAO,GAEhJlL,QAAO,yBAA0B,SAASC,GACxC,GAAIma,GAAiBC,EAAU9H,EAAKoH,EAAIlQ,EAAQ6Q,EAAMnC,CAwbtD,OAvbA5F,GAAMtS,EAAQ,mBACdkY,EAAKlY,EAAQ,gBACbqa,EAAOra,EAAQ,iBACf0Z,EAAK1Z,EAAQ,YACbwJ,EAASxJ,EAAQ,oBACjBoa,EAAW,SAAUrO,GAKnB,QAASqO,KACP,MAAOA,GAASzO,UAAUF,YAAYb,MAAMb,KAAMc,WALpD,GAAIyP,GAAoBC,CAqZxB,OAnZA5U,QAAOyU,EAAUrO,GAMjBwO,EAAyB,oCAEzBD,EAAqB,aAErBF,EAASjQ,UAAUzC,SAAW,YAE9B0S,EAASjQ,UAAU6B,gBACjBwO,eAAgB,iBAChBC,cAAe,cACfC,eAAgB,OAChBC,uBAAwB,kCACxBC,cAAe,KAGjBR,EAASjQ,UAAUiC,OAAS,WAQ1B,MAHArC,MAAK8Q,cACL9Q,KAAK+Q,oBACL/Q,KAAKgR,SAAWhR,KAAK4C,KAAK2N,GAAoBjX,OACzC0G,KAAKlF,QAAQ4R,OAAlB,OACS1M,KAAKlF,QAAQ4R,OAAS1M,KAAKnI,GAAG0K,KAAK,WAI9C8N,EAASjQ,UAAU0Q,YAAc,WAK/B,GAAIjZ,GAAIiL,EAAG3B,EAAKC,EAAK6P,CAIrB,KAHAjR,KAAKkR,UACL9P,EAAMpB,KAAK4C,KAAK5C,KAAKlF,QAAQ4V,eAC7BO,KACKnO,EAAI,EAAG3B,EAAMC,EAAIpK,OAAYmK,EAAJ2B,EAASA,IACrCjL,EAAKuJ,EAAI0B,GACTmO,EAASxQ,KAAKT,KAAKkR,OAAOzQ,KAAK,GAAIkP,GAAG1B,UAAUkB,OAAOtX,IAEzD,OAAOoZ,IAGTZ,EAASjQ,UAAU2Q,kBAAoB,WAWrC,MANA/Q,MAAKmR,aAAenR,KAAK4C,KAAK4N,GAC1BxQ,KAAKlF,QAAQsW,WACfpR,KAAKqR,iBAAiBrR,KAAKlF,QAAQsW,YAEnCpR,KAAKlF,QAAQsW,WAAazZ,EAAEkX,KAAK7O,KAAKqR,oBAEjCrR,KAAKmR,aAAaxY,MAAM,SAAUgL,GACvC,MAAO,UAAS/K,GACd,MAAO+K,GAAM2N,sBAAsB1Y,KAEpCoH,QAGLqQ,EAASjQ,UAAUkR,sBAAwB,SAAS1Y,GAOlD,MAFAA,GAAE2Y,kBACF3Y,EAAEwG,iBACKY,KAAK4M,UAGdyD,EAASjQ,UAAUwM,OAAS,WAQ1B,MAAI5M,MAAKmE,YAAY,aAAenE,KAAKmE,YAAY,eAC5C,EAELnE,KAAKwR,gBACPxR,KAAKyR,eACE,IAEF,GAGTpB,EAASjQ,UAAUsR,MAAQ,WAOzB,MAFA1R,MAAK2R,UACL3R,KAAK4R,aACE5R,KAAKnI,GAAG,GAAG6Z,SAGpBrB,EAASjQ,UAAUqR,YAAc,WAK/B,GAAI5G,GAAGN,EAAQ1P,CAQf,QAPAmF,KAAK+D,YAAY,cACjB/D,KAAKiB,QAAQ,cAAejB,MAC5BA,KAAKqR,iBAAiBrR,KAAKlF,QAAQ2V,gBACnCzQ,KAAKiP,UACL1E,EAASvK,KAAK6R,SACdhX,EAAMmF,KAAKlF,QAAQ4R,OACnB7B,EAAIlT,EAAEC,WACEoI,KAAKlF,QAAQ6V,gBACnB,IAAK,OACH9F,EAAIyF,EAAKjG,KAAKxP,EAAK0P,EACnB,MACF,KAAK,OACH+F,EAAKpE,KAAKrR,EAAK0P,EACf,MACF,KAAK,SACHM,EAAIyF,EAAKnD,OAAOtS,EAAK0P,EACrB,MACF,SACE,KAAM,uBAAyBvK,KAAKlF,QAAQ6V,eAYhD,MAVA9F,GAAExR,KAAK,SAAUsK,GACf,MAAO,UAASL,GACd,MAAOK,GAAMmO,oBAAoBxO,KAElCtD,OACH6K,EAAEtP,KAAK,SAAUoI,GACf,MAAO,UAASyB,EAAOjP,GACrB,MAAOwN,GAAMoO,iBAAiB3M,EAAOjP,KAEtC6J,OACI6K,EAAE/R,WAGXuX,EAASjQ,UAAU0R,oBAAsB,SAASxO,GAUhD,MADAtD,MAAKsD,OAASA,EACPhG,WAAW,SAAUqG,GAC1B,MAAO,YAEL,MADAA,GAAM1C,QAAQ,UAAW0C,EAAOL,GACzBK,EAAMgO,YAEd3R,MAAOA,KAAKlF,QAAQ+V,gBAGzBR,EAASjQ,UAAU2R,iBAAmB,SAAS3M,EAAOjP,GAUpD,MADA6J,MAAKsD,OAAS,KACPhG,WAAW,SAAUqG,GAC1B,MAAO,YAKL,MAJAA,GAAMqO,OAAS,GAAI5B,GACnBzM,EAAMsO,oBAAoB7M,EAAOjP,EAAMwN,EAAMqO,QAC7CrO,EAAM1C,QAAQ,OAAQ0C,EAAOA,EAAMyB,OACnCzB,EAAMuO,aACCvO,EAAMgO,YAEd3R,MAAOA,KAAKlF,QAAQ+V,gBAGzBR,EAASjQ,UAAU6R,oBAAsB,SAASrG,EAASzV,EAAMgc,GAU/D,MAAOA,GAAiBC,IAAI,eAAgBxG,EAAS,iBAGvDyE,EAASjQ,UAAUuR,QAAU,WAQ3B,MAHA3R,MAAKoE,eAAe,cACpBpE,KAAKiB,QAAQ,iBAAkBjB,MAC/BA,KAAKqR,iBAAiBrR,KAAKlF,QAAQsW,YAC5BpR,KAAKgP,UAGdqB,EAASjQ,UAAUiR,iBAAmB,SAAStC,GAK7C,MAAI/O,MAAKmR,aAAa9B,GAAG,SACnBN,EACK/O,KAAKmR,aAAa/H,IAAI2F,GAExB/O,KAAKmR,aAAa/H,MAEvB2F,EACK/O,KAAKmR,aAAapC,KAAKA,GAEzB/O,KAAKmR,aAAapC,QAG3BsB,EAASjQ,UAAUyR,OAAS,WAK1B,GAAIQ,GAAGvP,EAAG3B,EAAKC,EAAKyQ,CAGpB,KAFAA,EAASla,EAAEiE,UAAWoE,KAAKlF,QAAQwX,aACnClR,EAAMpB,KAAKkR,OACNpO,EAAI,EAAG3B,EAAMC,EAAIpK,OAAYmK,EAAJ2B,EAASA,IACrCuP,EAAIjR,EAAI0B,GACR+O,EAAOQ,EAAEhS,MAAQgS,EAAElb,OAErB,OAAO0a,IAGTxB,EAASjQ,UAAUoR,aAAe,WAQhC,GAAI/D,GAAO1K,CAgBX,OAfA/C,MAAKgS,OAAS,GAAI5B,GAClBpQ,KAAK0N,SAAS1N,KAAKkR,OAAQlR,KAAKgS,QAChCjP,EAAU,WACR,GAAID,GAAG3B,EAAKC,EAAK6P,CAGjB,KAFA7P,EAAMpB,KAAKkR,OACXD,KACKnO,EAAI,EAAG3B,EAAMC,EAAIpK,OAAYmK,EAAJ2B,EAASA,IACrC2K,EAAQrM,EAAI0B,GACZmO,EAASxQ,KAAKgN,EAAMkB,gBAEtB,OAAOsC,IACN1P,KAAKvB,MACJyH,QAAQlG,KAAKwB,GAAS,IAAU,GAClC/C,KAAKgS,OAAOI,IAAI,mBAAoBpS,KAAKlF,QAAQ8V,wBAE/C5Q,KAAKgS,OAAOhb,QACdgJ,KAAKiB,QAAQ,UAAWjB,MACxBA,KAAK+D,YAAY,WACjB/D,KAAKkS,cACE,IAEPlS,KAAKiB,QAAQ,QAASjB,MACtBA,KAAKoE,eAAe,WACpBpE,KAAK4R,cACE,IAIXvB,EAASjQ,UAAUsN,SAAW,SAASwD,EAAQqB,GAS7C,MAAO,OAGTlC,EAASjQ,UAAU8R,WAAa,WAK9B,GAAItZ,GAAGsK,EAAGJ,EAAG3B,EAAKC,CAGlB,KAFA8B,EAAI,GACJ9B,EAAMpB,KAAKgS,OAAOA,OACblP,EAAI,EAAG3B,EAAMC,EAAIpK,OAAYmK,EAAJ2B,EAASA,IACrClK,EAAIwI,EAAI0B,GACJlK,EAAE4Z,cACJtP,GAAK,MAAQtK,EAAE4Z,YAAc,OAGjC,OAAItP,GACKlD,KAAKgR,SAAS1V,KAAK4H,GAAG9L,OAD/B,QAKFiZ,EAASjQ,UAAUqS,SAAW,SAAS7G,GAUrC,MAFA5L,MAAKgS,OAAS,GAAI5B,GAClBpQ,KAAKgS,OAAOI,IAAI,SAAUxG,GACnB5L,KAAKkS,cAGd7B,EAASjQ,UAAUwR,WAAa,WAK9B,MAAO5R,MAAKgR,SAAS1X,QAGvB+W,EAASjQ,UAAU6O,QAAU,WAU3B,GAAIoD,GAAGvP,EAAG3B,EAAKC,CAGf,KAFApB,KAAK+D,YAAY,YACjB3C,EAAMpB,KAAKkR,OACNpO,EAAI,EAAG3B,EAAMC,EAAIpK,OAAYmK,EAAJ2B,EAASA,IACrCuP,EAAIjR,EAAI0B,GACRuP,EAAEpD,SAEJ,OAAOjP,MAAKmR,aAAarZ,SAAS,gBAGpCuY,EAASjQ,UAAU4O,OAAS,WAU1B,GAAIqD,GAAGvP,EAAG3B,EAAKC,CAGf,KAFApB,KAAKoE,eAAe,YACpBhD,EAAMpB,KAAKkR,OACNpO,EAAI,EAAG3B,EAAMC,EAAIpK,OAAYmK,EAAJ2B,EAASA,IACrCuP,EAAIjR,EAAI0B,GACRuP,EAAErD,QAEJ,OAAOhP,MAAKmR,aAAa/S,YAAY,gBAGvCiS,EAASjQ,UAAUqN,MAAQ,SAASiF,GAKlC,MAAO1S,MAAKkR,OAAO5I,OAAO,SAASpH,GACjC,MAAOA,GAAEb,OAASqS,IACjB,IAGLrC,EAASjQ,UAAU8O,MAAQ,SAASwD,GAClC,GAAItR,GAAKuR,CAcT,OAbiB,OAAbD,IACFA,EAAY,MAYVjT,EAAOvF,UAAX,OAGIwY,EACsC,OAAhCtR,EAAMpB,KAAKyN,MAAMiF,IAAsBtR,EAAI8N,QAAU,OAE3B,OAA1ByD,EAAO3S,KAAKkR,OAAO,IAAcyB,EAAKzD,QAAU,QAIrDmB,GAENlC,EAAGrM,MACNsO,EAAkB,WAChB,QAASA,KACPpQ,KAAK4S,QAoBP,MAjBAxC,GAAgBhQ,UAAUgS,IAAM,SAAS/R,EAAMmS,EAAavU,GAS1D,MARY,OAARA,IACFA,EAAO,MAET+B,KAAKgS,OAAOvR,MACVJ,KAAMA,EACNmS,YAAaA,EACbvU,KAAMA,IAED+B,KAAKhJ,QAAU,GAGxBoZ,EAAgBhQ,UAAUwS,MAAQ,WAEhC,MADA5S,MAAKgS,UACEhS,KAAKhJ,OAAS,GAGhBoZ,MAIPC,SAAUA,IC9bd,IAAIzU,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,gCAAiC,SAASC,GAC/C,GAAI4c,GAAgBlD,CAkDpB,OAjDAA,GAAK1Z,EAAQ,0BACb4c,EAAiB,SAAU7Q,GAGzB,QAAS6Q,KACPA,EAAejR,UAAUF,YAAYb,MAAMb,KAAMc,WACjDd,KAAKlF,QAAQ8V,uBAAyB,GAwCxC,MA5CAhV,QAAOiX,EAAgB7Q,GAOvB6Q,EAAezS,UAAU6R,oBAAsB,SAASa,EAAcC,EAAWC,GAU/E,GAAIvF,GAAOwF,EAAc/R,EAAGC,EAAK0J,EAAGqI,EAASC,EAAU/R,CACvD,QAAQ0R,GACN,IAAK,UAGH,IAFAK,EAAWJ,EAAUK,KACrBH,EAAe,GACV/R,EAAI,EAAGC,EAAMgS,EAASnc,OAAYmK,EAAJD,EAASA,IAC1C2J,EAAIsI,EAASjS,GACbuM,EAAQ5C,EAAE,GAAIqI,EAAUrI,EAAE,GACO,OAA5BzJ,EAAMpB,KAAKyN,MAAMA,KACpBrM,EAAIwN,WAAWsE,GAEjBD,EAAeA,GAAgBC,CAEjC,OAAOF,GAAgBZ,IAAI,WAAW,EACxC,KAAK,cACH,MAAOY,GAAgBZ,IAAI,cAAe,6CAC5C,KAAK,WACH,MAAOY,GAAgBZ,IAAI,WAAY,6BACzC,KAAK,cACH,MAAOY,GAAgBZ,IAAI,cAAe,0CAA2C,eACnF3F,OAAQ,SAEZ,SACE,MAAOuG,GAAgBZ,IAAI,SAAU,6CAIpCS,GAENlD,EAAGU,WAEJwC,eAAgBA,ICvDpB,IAAIjX,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,+BAAgC,SAASC,GAC9C,GAAIod,GAAe1D,CA6CnB,OA5CAA,GAAK1Z,EAAQ,0BACbod,EAAgB,SAAUrR,GAGxB,QAASqR,KACPA,EAAczR,UAAUF,YAAYb,MAAMb,KAAMc,WAChDd,KAAKlF,QAAQ8V,uBAAyB,GAmCxC,MAvCAhV,QAAOyX,EAAerR,GAOtBqR,EAAcjT,UAAU6R,oBAAsB,SAASa,EAAcC,EAAWC,GAU9E,OAAQF,GACN,IAAK,cACH,MAAOE,GAAgBZ,IAAI,cAAe,6CAC5C,KAAK,cACH,MAAOY,GAAgBZ,IAAI,cAAe,0BAA2B,eACnE3F,OAAQ,SAEZ,KAAK,SACH,MAAOuG,GAAgBZ,IAAI,SAAU,iBAAkB,eACrD3F,OAAQ,SAEZ,KAAK,WACH,MAAOuG,GAAgBZ,IAAI,WAAY,6BACzC,KAAK,cACH,MAAOY,GAAgBZ,IAAI,cAAe,4CAA6C,eACrF3F,OAAQ,SAEZ,SACE,MAAOuG,GAAgBZ,IAAI,SAAU,6CAIpCiB,GAEN1D,EAAGU,WAEJgD,cAAeA,KCnDnBrd,OAAO,oBAAqB,SAASC,GAcjC,QAASkR,GAAOmM,EAAQC,GAEpB,IAAK,GADDC,GAAI1S,UAAU,GACTI,EAAI,EAAGA,EAAIJ,UAAU9J,OAAS,EAAGkK,IAAK,CAC3C,GAAIuS,GAAM,GAAIC,QAAO,MAAQxS,EAAI,MAAO,KACxCsS,GAAIA,EAAEpM,QAAQqM,EAAK3S,UAAUI,EAAI,IAGrC,MAAOsS,GAnBX,GAAIlM,GAASqM,OAAOvT,SAyBpB,OAFAkH,GAAOH,OAASA,GAGZA,OAAQA,KC5BhBnR,OAAO,iBAAkB,SAAUC,GAmC/B,QAAS2d,GAAM/Y,EAAKtB,EAAOE,EAAQsT,GAgB/B,QAAS8G,GAAa1d,GAElB,GAAoB,YAAhBuB,EAAIwD,QAAR,CAWA,OANK/E,GAAwB,gBAATA,IAEhBuB,EAAIgE,OAAO,WAIPvF,EAAKwV,QACT,IAAK,UACDjU,EAAImB,QAAQ1C,EAAKmN,OACjB,MACJ,KAAK,QACD5L,EAAIgE,OAAOvF,EAAKyV,QAChB,MACJ,SACIlU,EAAIgE,OAAOoY,SAIZha,QAAOkT,IAxClB,IAAKnS,EACD,KAAM,sBAIVkS,GAAgBA,GAAiB,IAGjC,IAAIrV,GAAMC,EAAEC,WAGRoV,EAAS,eAAiB+G,CAiC9Bja,QAAOkT,GAAU6G,CAGjB,IAAIG,GAASC,EAASpZ,EAAKkS,EAAeC,GAKtCkH,EAASC,EAAUH,EAAQza,EAAOE,EAAQ,WAC1Coa,GAAclI,OAAQ,QAASC,QAASwI,MAIxCtb,EAAUpB,EAAIoB,SAOlB,OAJAA,GAAQqS,MAAQ,WACZkJ,EAASH,EAAQxc,IAGdoB,EAoBX,QAASmb,GAASpZ,EAAKkS,EAAeC,GAElC,GAAIsH,GAAKvH,EAAgB,IAAMC,CAG/B,OAA6B,KAAzBnS,EAAI4M,QAAQ,SACL5M,EAAIuM,QAAQ,QAASkN,GAKP,KAArBzZ,EAAI4M,QAAQ,KAEL5M,EAAM,IAAMyZ,EAEZzZ,EAAM,IAAMyZ,EAa3B,QAASH,GAAUtZ,EAAKtB,EAAOE,EAAQ8a,EAASC,GAC5C,GAAIZ,GAAQ9Z,OAAO2a,KAAK5Z,EAAK2Z,GAAa,GAAIE,EAAcnb,EAAOE,IAG/Dkb,EAAWC,YAAY,aAEnBhB,GAAUA,EAAMrN,UAMpBsO,cAAcF,GAGdJ,MACD,GAEH,OAAOX,GAQX,QAASS,GAASH,EAAQxc,GAEtB,GAAoB,YAAhBA,EAAIwD,QAKR,IACIgZ,EAAOhY,QACT,MAAOtD,KAWb,QAAS8b,GAAcnb,EAAOE,GAC1B,MAAOqb,GAAI3N,OAAO,6CAA8C5N,EAAOE,GAlM3E,GAAIqb,GAAM7e,EAAQ,qBAEd6d,EAAe,UACfM,EAAe,eAyGfL,EAAc,CA0FlB,QACIU,KAAMb,EACNO,UAAWA,ICxMnB,IAAIvY,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC;AAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,qCAAsC,SAASC,GACpD,GAAI8e,GAAqBnB,EAAOzF,CAsKhC,OArKAA,GAAKlY,EAAQ,gBACb2d,EAAQ3d,EAAQ,kBAChB8e,EAAsB,SAAU/S,GAK9B,QAAS+S,KACP,MAAOA,GAAoBnT,UAAUF,YAAYb,MAAMb,KAAMc,WAL/D,GAAIkU,EA+JJ,OA7JApZ,QAAOmZ,EAAqB/S,GAM5BgT,GACEzb,MAAO,IACPE,OAAQ,KAGVsb,EAAoB3U,UAAUzC,SAAW,0BAEzCoX,EAAoB3U,UAAUoC,QAC5B7J,MAAS,oBAGXoc,EAAoB3U,UAAU6B,gBAC5BwO,eAAgB,iBAChBwE,WAAY,sBAGdF,EAAoB3U,UAAUiC,OAAS,WAKrC,MADArC,MAAKkV,SAAWlV,KAAK4C,KAAK,iBACtB5C,KAAKlF,QAAQiU,KACR/O,KAAKkV,SAASnG,KAAK/O,KAAKlF,QAAQiU,MAEhC/O,KAAKlF,QAAQiU,KAAOpX,EAAEkX,KAAK7O,KAAKkV,SAASnG,SAIpDgG,EAAoB3U,UAAU+U,iBAAmB,SAASvc,GAKxD,MAAIoH,MAAKmE,YAAY,aAAenE,KAAKmE,YAAY,cAArD,QAGAnE,KAAK+D,YAAY,cACjB/D,KAAKiB,QAAQ,eAAgBjB,MAC7BA,KAAKiP,UACLjP,KAAKkV,SAASnG,KAAK/O,KAAKlF,QAAQ2V,gBAChCzQ,KAAK4T,MAAQA,EAAMa,KAAKzU,KAAKoV,cAAeJ,EAAWzb,MAAOyb,EAAWvb,QACzEuG,KAAK4T,MAAMva,KAAK,SAAUsK,GACxB,MAAO,UAASxI,GACd,MAAOwI,GAAM0R,gBAAgBla,KAE9B6E,OACIA,KAAK4T,MAAMrY,KAAK,SAAUoI,GAC/B,MAAO,UAASxI,GACd,MAAOwI,GAAM2R,cAAcna,KAE5B6E,SAGL+U,EAAoB3U,UAAUgV,YAAc,WAU1C,GAAI7K,GAAQgL,EAAO1a,CAenB,OAdA0P,GAAS5S,EAAEiE,UAAWoE,KAAKlF,QAAQ0a,eAC/BxV,KAAKlF,QAAQ2a,WACflL,EAAsB,cAAIvK,KAAKlF,QAAQ2a,UAErCzV,KAAKlF,QAAQ4a,gBACfnL,EAAgB,QAAIvK,KAAKlF,QAAQ4a,eAEnCH,EAAQ5d,EAAEge,MAAMpL,GAChB1P,EAAMmF,KAAKlF,QAAQma,WAEjBpa,GADEA,EAAI4M,QAAQ,KAAO,EACd,IAEA,IAEF5M,EAAM0a,GAGfR,EAAoB3U,UAAUiV,gBAAkB,SAAS/R,GAKvD,GAAIsS,EAQJ,OANEA,GADEtS,EAAOuS,OACK,SAEA,QAEhB7V,KAAKiB,QAAQ,UAAWjB,KAAM4V,EAAatS,GAC3CtD,KAAKiB,QAAQ2U,EAAa5V,KAAMsD,GACzBtD,KAAK2R,WAGdoD,EAAoB3U,UAAUkV,cAAgB,SAAS1J,GAKrD,OAAQA,GACN,IAAK,eACL,IAAK,YACH5L,KAAKiB,QAAQ,SAAUjB,KACvB,MACF,SACEA,KAAKiB,QAAQ,OAAQjB,KAAM4L,GAE/B,MAAO5L,MAAK2R,WAGdoD,EAAoB3U,UAAUuR,QAAU,WAUtC,MAJA3R,MAAKkV,SAASnG,KAAK/O,KAAKlF,QAAQiU,MAChC/O,KAAKoE,eAAe,cACpBpE,KAAKiB,QAAQ,kBAAmBjB,MAChCA,KAAKgP,SACEhP,KAAK4T,MAAMzI,SAGpB4J,EAAoB3U,UAAU4O,OAAS,WAKrC,MAAOhP,MAAKoE,eAAe,aAG7B2Q,EAAoB3U,UAAU6O,QAAU,WAKtC,MAAOjP,MAAK+D,YAAY,aAG1BgR,EAAoB3U,UAAUsC,aAAe,WAK3C,GAAItB,EACJ,OAA6B,QAArBA,EAAMpB,KAAK4T,OAAiBxS,EAAI+J,QAAU,QAG7C4J,GAEN5G,EAAGrM,OAEJiT,oBAAqBA,KC3JzB/e,OAAO,oBAAqB,SAASC,GACnC,GAAI6f,GAAkBC,EAAeC,EAAiBC,CA+DtD,OA9DAH,GAAmB,IACnBC,KACAE,EAAQ,SAAS5V,EAAM6V,EAAOrN,GAC5B,GAAIsN,GAAWze,EAAKhB,CAqBpB,IApBa,MAATwf,IACFA,MAEY,MAAVrN,IACFA,GAAS,GAeXsN,EAAYrc,OAAOqc,WACd9V,IAAS8V,EAAUF,MAEtB,YADAngB,SAAWyZ,QAAQnK,MAAM,0DAI3B,IADA8Q,EAAQve,EAAEiE,OAAOoa,IAAmBE,GAChCrN,GAAU/O,OAAO1D,KAAM,CAEzB,GADAM,EAAM2J,EAAO,IAAOjK,KAAKC,UAAU6f,GAC/Bxf,IAAOqf,GACT,MAEFA,GAAcrf,IAAO,EAMvB,MAJAgB,GAAMC,EAAEC,WACR9B,SAAWyZ,QAAQ6G,IAAI,WAAY,cAAe/V,EAAM6V,EAAOrN,GAC/DsN,EAAUF,MAAM5V,EAAM6V,EAAOxe,EAAImB,SACjCyE,WAAW5F,EAAIgE,OAAQoa,GAChBpe,EAAIoB,WAEbkd,EAAkB,WAQhB,GAAIne,GAAIwe,EAAKnV,EAAGxK,EAAKyK,EAAK0Q,CAG1B,KAFAA,KACAwE,EAAM1e,EAAE,uBACHuJ,EAAI,EAAGC,EAAMkV,EAAIrf,OAAYmK,EAAJD,EAASA,IACrCrJ,EAAKwe,EAAInV,GACTxK,EAAMmB,EAAGye,aAAa,OAClB5f,IACFmb,EAAO,WAAanb,GAAOmB,EAAGye,aAAa,WAG/C,OAAOzE,KAGPoE,MAAOA,EACPM,GAAIP,IClFR,IAAIpa,QAAS,SAAS4F,EAAO3D,GAA+F,QAAS4D,KAASzB,KAAK0B,YAAcF,EAA1H,IAAK,GAAI9K,KAAOmH,GAAc8D,QAAQJ,KAAK1D,EAAQnH,KAAM8K,EAAM9K,GAAOmH,EAAOnH,GAA2J,OAArG+K,GAAKrB,UAAYvC,EAAOuC,UAAWoB,EAAMpB,UAAY,GAAIqB,GAAQD,EAAMI,UAAY/D,EAAOuC,UAAkBoB,GACpRG,WAAaE,cAEf7L,QAAO,uBAAwB,SAASC,GACtC,GAAIugB,GAAkBC,EAA2BC,EAAgBC,EAAeC,EAAWC,EAAKC,EAAYC,EAAKC,EAAIC,EAAQC,EAAK9f,CA2SlI,OA1SA4f,GAAK/gB,EAAQ,2BACbihB,EAAMjhB,EAAQ,oBACd8gB,EAAM9gB,EAAQ,mBACd4gB,EAAM5gB,EAAQ,yBACdghB,EAAShhB,EAAQ,qBACjBugB,EAAmB,yBACf1gB,UACF0gB,GAAoB,OAAShN,OAAO,GAAI2N,QAE1CR,GACEhZ,SAAU,yBACVpE,MAAO,IACPqD,cAAc,EACdF,aAAc,uBAEhB+Z,EAA4B,OAC5BC,EAAiB,SAAU1U,GA6BzB,QAAS0U,GAAe5b,GAMtB4b,EAAe9U,UAAUF,YAAYH,KAAKvB,KAAMwW,EAAkB1b,GAClEkF,KAAK9E,MAAQ8E,KAAKlF,QAAQI,MAnC5B,GAAIkc,EAiPJ,OA/OAxb,QAAO8a,EAAgB1U,GAEvBoV,GACEC,iBAAkB,qBAWpBX,EAAetW,UAAU4F,SAAU,EAEnC0Q,EAAetW,UAAUyF,eAAgB,EAEzC6Q,EAAetW,UAAUoC,QACvB8U,sBAAuB,wBAGzBZ,EAAetW,UAAU6B,gBACvB/G,MAAO,UAaTwb,EAAetW,UAAUiC,OAAS,WAKhC,GAAIoT,GAAU8B,EAASC,CAwDvB,OAvDA/B,GAAWzV,KAAKlF,QAAQ2a,SACxB+B,GACEC,cAAiBhC,GAEnB8B,EAAUvX,KAAK0X,iBACXH,IACFC,EAAsB,QAAID,GAE5BvX,KAAK2X,UAAY,GAAIZ,GAAI1D,eACvBxb,GAAImI,KAAK4C,KAAK,iBAEhB5C,KAAK2X,UAAUnf,GAAG,UAAW,SAAUmL,GACrC,MAAO,UAAS0O,EAAG/O,GACjB,MAAOK,GAAMiU,UAAU,QAAStU,KAEjCtD,OACHA,KAAK6X,WAAa,GAAIX,GAAIrE,gBACxBhb,GAAImI,KAAK4C,KAAK,gBACd0P,YAAakF,IAEfxX,KAAK6X,WAAWrf,GAAG,UAAW,SAAUmL,GACtC,MAAO,UAAS0O,EAAG/O,GACjB,MAAOK,GAAMiU,UAAU,SAAUtU,KAElCtD,OACHA,KAAK8X,gBAAkB,GAAIjB,GAAI9B,qBAC7Bld,GAAImI,KAAK4C,KAAK,yCACd6S,SAAUA,EACVC,cAAe6B,IAEjBvX,KAAK8X,gBAAgBtf,GAAG,UAAW,SAAUmL,GAC3C,MAAO,UAAS0O,EAAGpU,EAAMqF,GACvB,MAAOK,GAAMiU,UAAU3Z,EAAMqF,KAE9BtD,OAAOxH,GAAG,OAAQ,SAAUmL,GAC7B,MAAO,UAASoU,EAAKC,GACnB,MAAOrU,GAAMsU,iBAAiBD,KAE/BhY,OACHA,KAAKkY,eAAiB,GAAIrB,GAAI9B,qBAC5Bld,GAAImI,KAAK4C,KAAK,wCACd6S,SAAUA,EACVC,cAAe6B,IAEjBvX,KAAKkY,eAAe1f,GAAG,UAAW,SAAUmL,GAC1C,MAAO,UAAS0O,EAAGpU,EAAMqF,GACvB,MAAOK,GAAMiU,UAAU3Z,EAAMqF,KAE9BtD,OAAOxH,GAAG,OAAQ,SAAUmL,GAC7B,MAAO,UAASoU,EAAKC,GACnB,MAAOrU,GAAMwU,gBAAgBH,KAE9BhY,OACHA,KAAKoY,SAASpY,KAAK9E,OACnB8E,KAAKqY,kBAAkBrY,KAAK2X,UAAW3X,KAAKkY,gBACrClY,KAAKqY,kBAAkBrY,KAAK6X,WAAY7X,KAAK8X,kBAGtDpB,EAAetW,UAAUsX,eAAiB,WAKxC,MAAO/f,GAAE,qCAAqC4K,KAAK,UAGrDmU,EAAetW,UAAUiY,kBAAoB,SAASnM,EAAMoM,GAwB1D,MAlBApM,GAAK1T,GAAG,cAAe,SAAUmL,GAC/B,MAAO,UAAS0O,GAEd,MADAiG,GAAUrJ,UACHtL,EAAMI,YAAY,WAAW,KAErC/D,OACHkM,EAAK1T,GAAG,iBAAkB,SAAUmL,GAClC,MAAO,UAAS0O,GAEd,MADAiG,GAAUtJ,SACHrL,EAAMS,eAAe,aAE7BpE,OACHsY,EAAU9f,GAAG,eAAgB,SAAUmL,GACrC,MAAO,UAAS0O,GAEd,MADAnG,GAAK+C,UACEtL,EAAMI,YAAY,WAAW,KAErC/D,OACIsY,EAAU9f,GAAG,kBAAmB,SAAUmL,GAC/C,MAAO,UAAS0O,GAEd,MADAnG,GAAK8C,SACErL,EAAMS,eAAe,aAE7BpE,QAGL0W,EAAetW,UAAUgY,SAAW,SAASld,GAU3C,MAHA8E,MAAKoE,eAAepE,KAAK9E,OACzB8E,KAAK+D,YAAY7I,GACjB8E,KAAK9E,MAAQA,EACC,UAAVA,EACK8E,KAAK2X,UAAUzI,QAEflP,KAAK6X,WAAW3I,SAI3BwH,EAAetW,UAAUmY,qBAAuB,SAAS3f,GAKvD,GAAIsC,EAEJ,OADAA,GAAQvD,EAAEiB,EAAE2G,eAAepJ,KAAK,UAC5B+E,EACK8E,KAAKoY,SAASld,GADvB,QAKFwb,EAAetW,UAAUhJ,KAAO,WAE9B,MADAsf,GAAe9U,UAAUxK,KAAKmK,KAAKvB,KAAM2W,GACrC7c,OAAO0e,GACFA,GAAG,OAAQ,WAAY,2BADhC,QAKF9B,EAAetW,UAAUwX,UAAY,SAAS3Z,EAAMqF,GASlD,GAAInI,EACJ,KAAI6E,KAAKuG,OAGT,MAAIvG,MAAKlF,QAAQ8c,UACR5X,KAAKlF,QAAQ8c,UAAU5X,KAAM/B,EAAMqF,IAE5C3L,EAAE,QAAQ2B,OACN0G,KAAKlF,QAAQ2d,WACR7e,SAASsL,SAASwT,UAEzBvd,EAAImI,EAAOqV,cAAgBlC,EACjB,gCAANtb,IACFA,EAAI,QAECvB,SAASsL,SAAW/J,KAI/Bub,EAAetW,UAAU+X,gBAAkB,SAASH,GAKlD,MAAOhY,MAAK4Y,cAAcZ,EAAKhY,KAAK2X,YAGtCjB,EAAetW,UAAU6X,iBAAmB,SAASD,GAKnD,MAAOhY,MAAK4Y,cAAcZ,EAAKhY,KAAK6X,aAGtCnB,EAAetW,UAAUwY,cAAgB,SAASZ,EAAK9L,GAKrD,GAAI9G,EAKJ,OAJAA,GAAQ,yCACI,aAAR4S,IACF5S,EAAQ,gCAEH8G,EAAKuG,SAASrN,IAGvBsR,EAAetW,UAAUgG,QAAU,WAGjC,MAFAsQ,GAAe9U,UAAUwE,QAAQvF,MAAMb,KAAMc,WAC7Cd,KAAK8X,gBAAgBtgB,SACdwI,KAAKkY,eAAe1gB,UAGtBkf,GAENM,EAAGvR,WACNrO,EAAO,SAASS,EAAIiD,GAClB,GAAIN,GAAGiQ,CAeP,OAde,OAAX3P,IACFA,MAUF2P,EAAO9S,EAAEiE,UAAW/D,EAAG1B,OAAQ2E,GAC/BN,EAAI,GAAIkc,GAAejM,GACvBjQ,EAAEpD,OACKoD,GAETsc,EAAa,WAKX,GAAItc,EAEJ,OADAA,GAAIZ,SAASif,OAAOC,MAAM,+BACnBte,GAAKA,EAAExD,QAAU,GAE1B4f,EAAY,WAOV,MANAjf,GAAE,qBAAqBa,GAAG,QAAS,SAASI,GAC1C,GAAI0G,EAGJ,OAFA1G,GAAEwG,iBACFE,EAAI3H,EAAEiB,EAAE2G,eACDnI,EAAKkI,KAEP0X,EAAGvR,UAAUiB,WAAW8P,IAEjC7e,EAAEif,IAEAF,eAAgBA,EAChBtf,KAAMA,EACN0f,WAAYA,KCnThB9gB,OAAO,iBAAkB,SAAUC,GAc/B,QAAS8iB,GAAOriB,GACZsiB,EAAOC,kBAAkBviB,GAb7B,GAAIsiB,GAASlf,OAAOkf,MAgBpB,QACID,OAAQA,KAMhBnZ,KAAKsZ,QAAQ,+BAEb/M,MAAMgN,sBAAwB,SAAUC,GACpCJ,OAAOC,kBAAkBG,IAG7BjN,MAAMgN,sBAAsB/Y,WACxBiZ,gBAAiB,WACb,MAAO,UAkBXC,YAAa,SAAUC,GACnB,GAAIC,IAAQ,EACRC,EAAS,GACTC,EAAWV,OAAOU,SAASH,EAAOI,OAYtC,OAVKX,QAAOY,mBAAmBL,EAAOI,QAE1BX,OAAOa,YAAYN,EAAOO,KAE1Bd,OAAOe,eAAeR,EAAOS,UAAWT,EAAOU,UAGvDT,GAAQ,EAFRC,EAAS,uBAFTA,EAAS,eAFTA,EAAS,+BASJD,MAAOA,EAAOC,OAAQA,EAAQC,SAAUA,IAerDQ,+BAAgC,SAAUX,EAAQY,EAAiBC,GAC/D,GAAIC,GAAcra,KAAKsZ,YAAYC,EAC/Bc,GAAYb,MACZR,OAAOsB,YAAYf,EAAQ,SAAU5N,EAAQ4O,GACzC,GAAIA,EAASnV,MACTgV,EAAgBG,EAASnV,MAAMwG,aAC5B,CACH,GAAI4O,IACAC,aAAcF,EAAa,GAG/BJ,GAAgBK,MAIxBJ,EAAgBC,EAAYZ,UC/FxCzjB,OAAO,iBAAkB,SAAUC,GAgE/B,QAASykB,GAAmBra,GACxBA,EAAOA,EAAK+G,QAAQ,OAAQ,OAAQA,QAAQ,OAAQ,MACpD,IAAIuT,GAAS,SAAWta,EAAO,YAC3Bua,EAAQ,GAAIlH,QAAOiH,GACnB5X,EAAU6X,EAAMC,KAAK/gB,OAAOoL,SAAS4V,OACzC,OAAgB,QAAZ/X,EACO,GAGAgY,mBAAmBhY,EAAQ,GAAGqE,QAAQ,MAAO,MAgB5D,QAAS6P,GAAO+D,EAAWC,EAAYC,GACnC,IAAKF,EACD,MAAOrjB,GAAEyB,MAIb,IAAI6T,KAEAkO,KACAlO,EAAKmO,eAAiBD,EAG1B,IAAIjF,GAAQve,EAAEiE,OAAOqR,EAAMgO,MAG3B,OAAOhF,GAAMoF,EAASL,EAAW9E,EAAOgF,GAnG5C,GAAIG,GAAS,YAGTpF,EAAQ9J,MAAM8K,OAAOhB,MAGrBqF,GACAC,oBAAqB,sBACrBC,8BAA+B,gCAC/BC,2BAA4B,6BAC5BC,+BAAgC,iCAChCC,yBAA0B,2BAC1BC,oBAAqB,sBACrBC,oBAAqB,sBACrBC,4BAA6B,8BAC7BC,0BAA2B,4BAC3BC,2BAA4B,+BAC5BC,0CAA2C,4CAC3CC,2BAA4B,6BAC5BC,gBAAiB,kBAEjBC,oBAAqB,0BACrBC,sBAAuB,4BACvBC,qBAAsB,2BAGtBC,uBAAwB,yBACxBC,qBAAsB,uBACtBC,kBAAmB,oBACnBC,oBAAqB,sBAGrBC,oBAAqB,sBACrBC,iBAAkB,mBAClBC,kBAAmB,oBAInBC,qBAAsB,uBACtBC,kCAAmC,oCACnCC,oCAAqC,yCACrCC,yBAA0B,gCAC1BC,yBAA0B,2BAC1BC,yBAA0B,2BAC1BC,4BAA6B,8BAC7BC,8BAA+B,gCAG/BC,kCAAmC,qCA0BnCnC,EAAiBT,EAAmB,OAAS,KA6BjD,QACIzD,OAAQA,EACRqE,OAAQA,EACR7B,OAAQ0B,KC3GhB,WAMI,GAAIoC,GAAOvd,KAGPwd,EAAqBD,EAAKla,EAG1Boa,KAGAC,EAAarc,MAAMjB,UAAWud,EAAWC,OAAOxd,UAAWyd,EAAYC,SAAS1d,UAIhFK,EAAOid,EAAWjd,KAClBa,EAAQoc,EAAWpc,MACnByc,EAASL,EAAWK,OACpBC,EAAWL,EAASK,SACpBnc,EAAiB8b,EAAS9b,eAK1Boc,EAAgBP,EAAWzU,QAC3BiV,EAAYR,EAAW3T,IACvBoU,EAAeT,EAAWU,OAC1BC,EAAoBX,EAAWY,YAC/BC,EAAeb,EAAWpV,OAC1BkW,EAAcd,EAAW5T,MACzB2U,EAAaf,EAAW/T,KACxB+U,EAAgBhB,EAAWjW,QAC3BkX,EAAoBjB,EAAWkB,YAC/BC,EAAgBxd,MAAMwF,QACtBiY,EAAalB,OAAOxT,KACpB2U,EAAalB,EAAUtY,KAGvBlC,EAAI,SAAU5M,GACd,MAAIA,aAAe4M,GAAU5M,EACvBuJ,eAAgBqD,QACtBrD,KAAKgf,SAAWvoB,GADiB,GAAI4M,GAAE5M,GAQpB,oBAAZwoB,UACe,mBAAXtf,SAA0BA,OAAOsf,UACxCA,QAAUtf,OAAOsf,QAAU5b,GAE/B4b,QAAQ5b,EAAIA,IAEZka,EAAKla,EAAIA,EACTka,EAAK2B,YAAc7b,GAIvBA,EAAE8b,QAAU,OAQZ,IAAIjV,GAAO7G,EAAE6G,KAAO7G,EAAE4F,QAAU,SAAUxS,EAAK2oB,EAAUC,GACrD,GAAW,MAAP5oB,EACJ,GAAIwnB,GAAiBxnB,EAAIwS,UAAYgV,EACjCxnB,EAAIwS,QAAQmW,EAAUC,OACnB,IAAI5oB,EAAIO,UAAYP,EAAIO,QAC3B,IAAK,GAAIkK,GAAI,EAAGlK,EAASP,EAAIO,OAAYA,EAAJkK,EAAYA,IAC7C,GAAIke,EAAS7d,KAAK8d,EAAS5oB,EAAIyK,GAAIA,EAAGzK,KAASgnB,EAAS,WAI5D,KAAK,GADDrT,GAAO/G,EAAE+G,KAAK3T,GACTyK,EAAI,EAAGlK,EAASoT,EAAKpT,OAAYA,EAAJkK,EAAYA,IAC9C,GAAIke,EAAS7d,KAAK8d,EAAS5oB,EAAI2T,EAAKlJ,IAAKkJ,EAAKlJ,GAAIzK,KAASgnB,EAAS,OAOhFpa,GAAE0G,IAAM1G,EAAEic,QAAU,SAAU7oB,EAAK2oB,EAAUC,GACzC,GAAItc,KACJ,OAAW,OAAPtM,EAAoBsM,EACpBmb,GAAaznB,EAAIsT,MAAQmU,EAAkBznB,EAAIsT,IAAIqV,EAAUC,IACjEnV,EAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GAC9Bzc,EAAQtC,KAAK2e,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,MAE/Czc,GAGX,IAAI0c,GAAc,6CAIlBpc,GAAE+a,OAAS/a,EAAEqc,MAAQrc,EAAEsc,OAAS,SAAUlpB,EAAK2oB,EAAUQ,EAAMP,GAC3D,GAAIQ,GAAU/e,UAAU9J,OAAS,CAEjC,IADW,MAAPP,IAAaA,MACb0nB,GAAgB1nB,EAAI2nB,SAAWD,EAE/B,MADIkB,KAASD,EAAW/b,EAAEkC,KAAK6Z,EAAUC,IAClCQ,EAAUppB,EAAI2nB,OAAOgB,EAAUQ,GAAQnpB,EAAI2nB,OAAOgB,EAU7D,IARAlV,EAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GACzBK,EAIDD,EAAOR,EAAS7d,KAAK8d,EAASO,EAAMzoB,EAAOooB,EAAOC,IAHlDI,EAAOzoB,EACP0oB,GAAU,MAKbA,EAAS,KAAM,IAAIC,WAAUL,EAClC,OAAOG,IAKXvc,EAAEib,YAAcjb,EAAE0c,MAAQ,SAAUtpB,EAAK2oB,EAAUQ,EAAMP,GACrD,GAAIQ,GAAU/e,UAAU9J,OAAS,CAEjC,IADW,MAAPP,IAAaA,MACb4nB,GAAqB5nB,EAAI6nB,cAAgBD,EAEzC,MADIgB,KAASD,EAAW/b,EAAEkC,KAAK6Z,EAAUC,IAClCQ,EAAUppB,EAAI6nB,YAAYc,EAAUQ,GAAQnpB,EAAI6nB,YAAYc,EAEvE,IAAIpoB,GAASP,EAAIO,MACjB,IAAIA,KAAYA,EAAQ,CACpB,GAAIoT,GAAO/G,EAAE+G,KAAK3T,EAClBO,GAASoT,EAAKpT,OAWlB,GATAkT,EAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GAC9BD,EAAQnV,EAAOA,IAAOpT,KAAYA,EAC7B6oB,EAIDD,EAAOR,EAAS7d,KAAK8d,EAASO,EAAMnpB,EAAI8oB,GAAQA,EAAOC,IAHvDI,EAAOnpB,EAAI8oB,GACXM,GAAU,MAKbA,EAAS,KAAM,IAAIC,WAAUL,EAClC,OAAOG,IAIXvc,EAAET,KAAOS,EAAE2c,OAAS,SAAUvpB,EAAK2oB,EAAUC,GACzC,GAAI/b,EAOJ,OANA0G,GAAIvT,EAAK,SAAUU,EAAOooB,EAAOC,GAC7B,MAAIJ,GAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,IACrClc,EAASnM,GACF,GAFX,SAKGmM,GAMXD,EAAEiF,OAASjF,EAAE4c,OAAS,SAAUxpB,EAAK2oB,EAAUC,GAC3C,GAAItc,KACJ,OAAW,OAAPtM,EAAoBsM,EACpBwb,GAAgB9nB,EAAI6R,SAAWiW,EAAqB9nB,EAAI6R,OAAO8W,EAAUC,IAC7EnV,EAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GAC1BJ,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,IAAOzc,EAAQtC,KAAKtJ,KAE1D4L,IAIXM,EAAE3H,OAAS,SAAUjF,EAAK2oB,EAAUC,GAChC,MAAOhc,GAAEiF,OAAO7R,EAAK,SAAUU,EAAOooB,EAAOC,GACzC,OAAQJ,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,IAC9CH,IAMPhc,EAAEyG,MAAQzG,EAAE4G,IAAM,SAAUxT,EAAK2oB,EAAUC,GACvCD,IAAaA,EAAW/b,EAAE6c,SAC1B,IAAI5c,IAAS,CACb,OAAW,OAAP7M,EAAoB6M,EACpBkb,GAAe/nB,EAAIqT,QAAU0U,EAAoB/nB,EAAIqT,MAAMsV,EAAUC,IACzEnV,EAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GAC9B,OAAMlc,EAASA,GAAU8b,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,IAA9D,OAA6E/B,MAExEna,GAMb,IAAI0G,GAAM3G,EAAEsG,KAAOtG,EAAE2G,IAAM,SAAUvT,EAAK2oB,EAAUC,GAChDD,IAAaA,EAAW/b,EAAE6c,SAC1B,IAAI5c,IAAS,CACb,OAAW,OAAP7M,EAAoB6M,EACpBmb,GAAchoB,EAAIkT,OAAS8U,EAAmBhoB,EAAIkT,KAAKyV,EAAUC,IACrEnV,EAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GAC9B,MAAIlc,KAAWA,EAAS8b,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,IAAe/B,EAA5E,WAEKna,GAKbD,GAAE6E,SAAW7E,EAAE8c,QAAU,SAAU1pB,EAAKgW,GACpC,MAAW,OAAPhW,GAAoB,EACpBioB,GAAiBjoB,EAAIgR,UAAYiX,EAA6C,IAAvBjoB,EAAIgR,QAAQgF,GAChEzC,EAAIvT,EAAK,SAAUU,GACtB,MAAOA,KAAUsV,KAKzBpJ,EAAE+c,OAAS,SAAU3pB,EAAK+V,GACtB,GAAI6T,GAAO/e,EAAMC,KAAKT,UAAW,GAC7Bwf,EAASjd,EAAEkd,WAAW/T,EAC1B,OAAOnJ,GAAE0G,IAAItT,EAAK,SAAUU,GACxB,OAAQmpB,EAAS9T,EAASrV,EAAMqV,IAAS3L,MAAM1J,EAAOkpB,MAK9Dhd,EAAEmd,MAAQ,SAAU/pB,EAAKC,GACrB,MAAO2M,GAAE0G,IAAItT,EAAK,SAAUU,GACxB,MAAOA,GAAMT,MAMrB2M,EAAEuE,MAAQ,SAAUnR,EAAK6L,EAAOkG,GAC5B,MAAInF,GAAEwK,QAAQvL,GAAekG,EAAQ,UAC9BnF,EAAEmF,EAAQ,OAAS,UAAU/R,EAAK,SAAUU,GAC/C,IAAK,GAAIT,KAAO4L,GACZ,GAAIA,EAAM5L,KAASS,EAAMT,GAAM,OAAO,CAE1C,QAAO,KAMf2M,EAAEod,UAAY,SAAUhqB,EAAK6L,GACzB,MAAOe,GAAEuE,MAAMnR,EAAK6L,GAAO,IAM/Be,EAAEqd,IAAM,SAAUjqB,EAAK2oB,EAAUC,GAC7B,IAAKD,GAAY/b,EAAEwD,QAAQpQ,IAAQA,EAAI,MAAQA,EAAI,IAAMA,EAAIO,OAAS,MAClE,MAAO2R,MAAK+X,IAAI7f,MAAM8H,KAAMlS,EAEhC,KAAK2oB,GAAY/b,EAAEwK,QAAQpX,GAAM,QAAQkqB,EAAAA,EACzC,IAAIrd,IAAUsd,WAAWD,EAAAA,GAAUxpB,QAAQwpB,EAAAA,GAK3C,OAJAzW,GAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GAC9B,GAAIoB,GAAWxB,EAAWA,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,GAAQroB,CACvEypB,GAAWtd,EAAOsd,WAAatd,GAAUnM,MAAOA,EAAOypB,SAAUA,MAE9Dtd,EAAOnM,OAIlBkM,EAAEwd,IAAM,SAAUpqB,EAAK2oB,EAAUC,GAC7B,IAAKD,GAAY/b,EAAEwD,QAAQpQ,IAAQA,EAAI,MAAQA,EAAI,IAAMA,EAAIO,OAAS,MAClE,MAAO2R,MAAKkY,IAAIhgB,MAAM8H,KAAMlS,EAEhC,KAAK2oB,GAAY/b,EAAEwK,QAAQpX,GAAM,MAAOkqB,GAAAA,CACxC,IAAIrd,IAAUsd,SAAUD,EAAAA,EAAUxpB,MAAOwpB,EAAAA,EAKzC,OAJAzW,GAAKzT,EAAK,SAAUU,EAAOooB,EAAOC,GAC9B,GAAIoB,GAAWxB,EAAWA,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,GAAQroB,CACvEypB,GAAWtd,EAAOsd,WAAatd,GAAUnM,MAAOA,EAAOypB,SAAUA,MAE9Dtd,EAAOnM,OAKlBkM,EAAEyd,QAAU,SAAUrqB,GAClB,GAAIsqB,GACAxB,EAAQ,EACRyB,IAMJ,OALA9W,GAAKzT,EAAK,SAAUU,GAChB4pB,EAAO1d,EAAEqF,OAAO6W,KAChByB,EAASzB,EAAQ,GAAKyB,EAASD,GAC/BC,EAASD,GAAQ5pB,IAEd6pB,GAMX3d,EAAE4d,OAAS,SAAUxqB,EAAKyqB,EAAGC,GACzB,MAAIrgB,WAAU9J,OAAS,GAAKmqB,EACjB1qB,EAAI4M,EAAEqF,OAAOjS,EAAIO,OAAS,IAE9BqM,EAAEyd,QAAQrqB,GAAK6K,MAAM,EAAGqH,KAAK+X,IAAI,EAAGQ,IAI/C,IAAIE,GAAiB,SAAUjqB,GAC3B,MAAOkM,GAAEkd,WAAWppB,GAASA,EAAQ,SAAUV,GAC3C,MAAOA,GAAIU,IAKnBkM,GAAEge,OAAS,SAAU5qB,EAAKU,EAAOkoB,GAC7B,GAAID,GAAWgC,EAAejqB,EAC9B,OAAOkM,GAAEmd,MAAMnd,EAAE0G,IAAItT,EAAK,SAAUU,EAAOooB,EAAOC,GAC9C,OACIroB,MAAOA,EACPooB,MAAOA,EACP+B,SAAUlC,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAOC,MAEpD+B,KAAK,SAAUlpB,EAAMmpB,GACpB,GAAIC,GAAIppB,EAAKipB,SACTI,EAAIF,EAAMF,QACd,IAAIG,IAAMC,EAAG,CACT,GAAID,EAAIC,GAAW,SAAND,EAAc,MAAO,EAClC,IAAQC,EAAJD,GAAe,SAANC,EAAc,MAAO,GAEtC,MAAOrpB,GAAKknB,MAAQiC,EAAMjC,QAC1B,SAIR,IAAIoC,GAAQ,SAAUC,GAClB,MAAO,UAAUnrB,EAAKU,EAAOkoB,GACzB,GAAI/b,MACA8b,EAAoB,MAATjoB,EAAgBkM,EAAE6c,SAAWkB,EAAejqB,EAK3D,OAJA+S,GAAKzT,EAAK,SAAUU,EAAOooB,GACvB,GAAI7oB,GAAM0oB,EAAS7d,KAAK8d,EAASloB,EAAOooB,EAAO9oB,EAC/CmrB,GAASte,EAAQ5M,EAAKS,KAEnBmM,GAMfD,GAAEwe,QAAUF,EAAM,SAAUre,EAAQ5M,EAAKS,IACpCkM,EAAEye,IAAIxe,EAAQ5M,GAAO4M,EAAO5M,GAAQ4M,EAAO5M,OAAY+J,KAAKtJ,KAKjEkM,EAAE0e,QAAUJ,EAAM,SAAUre,EAAQ5M,EAAKS,GACrCmM,EAAO5M,GAAOS,IAMlBkM,EAAE2e,QAAUL,EAAM,SAAUre,EAAQ5M,GAChC2M,EAAEye,IAAIxe,EAAQ5M,GAAO4M,EAAO5M,KAAS4M,EAAO5M,GAAO,IAKvD2M,EAAE4e,YAAc,SAAU9Y,EAAO1S,EAAK2oB,EAAUC,GAC5CD,EAAuB,MAAZA,EAAmB/b,EAAE6c,SAAWkB,EAAehC,EAG1D,KAFA,GAAIjoB,GAAQioB,EAAS7d,KAAK8d,EAAS5oB,GAC/ByrB,EAAM,EAAGC,EAAOhZ,EAAMnS,OACbmrB,EAAND,GAAY,CACf,GAAIE,GAAOF,EAAMC,IAAU,CAC3B/C,GAAS7d,KAAK8d,EAASlW,EAAMiZ,IAAQjrB,EAAQ+qB,EAAME,EAAM,EAAID,EAAOC,EAExE,MAAOF,IAIX7e,EAAEgf,QAAU,SAAU5rB,GAClB,MAAKA,GACD4M,EAAEwD,QAAQpQ,GAAa6K,EAAMC,KAAK9K,GAClCA,EAAIO,UAAYP,EAAIO,OAAeqM,EAAE0G,IAAItT,EAAK4M,EAAE6c,UAC7C7c,EAAEwO,OAAOpb,OAIpB4M,EAAEif,KAAO,SAAU7rB,GACf,MAAW,OAAPA,EAAoB,EAChBA,EAAIO,UAAYP,EAAIO,OAAUP,EAAIO,OAASqM,EAAE+G,KAAK3T,GAAKO,QASnEqM,EAAEmF,MAAQnF,EAAEkf,KAAOlf,EAAEmf,KAAO,SAAUrZ,EAAO+X,EAAGC,GAC5C,MAAa,OAAThY,EAAsB,OACb,MAAL+X,GAAcC,EAAQhY,EAAM,GAAK7H,EAAMC,KAAK4H,EAAO,EAAG+X,IAOlE7d,EAAEwc,QAAU,SAAU1W,EAAO+X,EAAGC,GAC5B,MAAO7f,GAAMC,KAAK4H,EAAO,EAAGA,EAAMnS,QAAgB,MAALkqB,GAAcC,EAAQ,EAAID,KAK3E7d,EAAEgF,KAAO,SAAUc,EAAO+X,EAAGC,GACzB,MAAa,OAAThY,EAAsB,OAChB,MAAL+X,GAAcC,EACRhY,EAAMA,EAAMnS,OAAS,GAErBsK,EAAMC,KAAK4H,EAAOR,KAAK+X,IAAIvX,EAAMnS,OAASkqB,EAAG,KAQ5D7d,EAAEof,KAAOpf,EAAEqf,KAAOrf,EAAEsf,KAAO,SAAUxZ,EAAO+X,EAAGC,GAC3C,MAAO7f,GAAMC,KAAK4H,EAAa,MAAL+X,GAAcC,EAAQ,EAAID,IAIxD7d,EAAEuf,QAAU,SAAUzZ,GAClB,MAAO9F,GAAEiF,OAAOa,EAAO9F,EAAE6c,UAI7B,IAAIlX,GAAU,SAAUxB,EAAOqb,EAASC,GACpC,MAAID,IAAWxf,EAAEyG,MAAMtC,EAAOnE,EAAEwD,SACrBkX,EAAOld,MAAMiiB,EAAQtb,IAEhC0C,EAAK1C,EAAO,SAAUrQ,GACdkM,EAAEwD,QAAQ1P,IAAUkM,EAAE0f,YAAY5rB,GAClC0rB,EAAUpiB,EAAKI,MAAMiiB,EAAQ3rB,GAAS6R,EAAQ7R,EAAO0rB,EAASC,GAE9DA,EAAOriB,KAAKtJ,KAGb2rB,GAIXzf,GAAE2F,QAAU,SAAUG,EAAO0Z,GACzB,MAAO7Z,GAAQG,EAAO0Z,OAI1Bxf,EAAE2f,QAAU,SAAU7Z,GAClB,MAAO9F,GAAE4f,WAAW9Z,EAAO7H,EAAMC,KAAKT,UAAW,KAMrDuC,EAAE6f,KAAO7f,EAAEwF,OAAS,SAAUM,EAAOga,EAAU/D,EAAUC,GACjDhc,EAAEkd,WAAW4C,KACb9D,EAAUD,EACVA,EAAW+D,EACXA,GAAW,EAEf,IAAItD,GAAUT,EAAW/b,EAAE0G,IAAIZ,EAAOiW,EAAUC,GAAWlW,EACvDpG,KACAqgB,IAOJ,OANAlZ,GAAK2V,EAAS,SAAU1oB,EAAOooB,IACvB4D,EAAa5D,GAAS6D,EAAKA,EAAKpsB,OAAS,KAAOG,EAAUkM,EAAE6E,SAASkb,EAAMjsB,MAC3EisB,EAAK3iB,KAAKtJ,GACV4L,EAAQtC,KAAK0I,EAAMoW,OAGpBxc,GAKXM,EAAEggB,MAAQ,WACN,MAAOhgB,GAAE6f,KAAK7f,EAAE2F,QAAQlI,WAAW,KAKvCuC,EAAEigB,aAAe,SAAUna,GACvB,GAAIsZ,GAAOnhB,EAAMC,KAAKT,UAAW,EACjC,OAAOuC,GAAEiF,OAAOjF,EAAE6f,KAAK/Z,GAAQ,SAAUrB,GACrC,MAAOzE,GAAEyG,MAAM2Y,EAAM,SAAUc,GAC3B,MAAOlgB,GAAEoE,QAAQ8b,EAAOzb,IAAS,OAO7CzE,EAAE4f,WAAa,SAAU9Z,GACrB,GAAIsZ,GAAO1E,EAAOld,MAAM6c,EAAYpc,EAAMC,KAAKT,UAAW,GAC1D,OAAOuC,GAAEiF,OAAOa,EAAO,SAAUhS,GAC7B,OAAQkM,EAAE6E,SAASua,EAAMtrB,MAMjCkM,EAAEmgB,IAAM,WAGJ,IAAK,GAFDxsB,GAASqM,EAAEqd,IAAIrd,EAAEmd,MAAM1f,UAAW,UAAUid,OAAO,IACnDhb,EAAU,GAAI1B,OAAMrK,GACfkK,EAAI,EAAOlK,EAAJkK,EAAYA,IACxB6B,EAAQ7B,GAAKmC,EAAEmd,MAAM1f,UAAW,GAAKI,EAEzC,OAAO6B,IAMXM,EAAEogB,OAAS,SAAUjE,EAAM3N,GACvB,GAAY,MAAR2N,EAAc,QAElB,KAAK,GADDlc,MACKpC,EAAI,EAAGlK,EAASwoB,EAAKxoB,OAAYA,EAAJkK,EAAYA,IAC1C2Q,EACAvO,EAAOkc,EAAKte,IAAM2Q,EAAO3Q,GAEzBoC,EAAOkc,EAAKte,GAAG,IAAMse,EAAKte,GAAG,EAGrC,OAAOoC,IASXD,EAAEoE,QAAU,SAAU0B,EAAOrB,EAAMqb,GAC/B,GAAa,MAATha,EAAe,MAAO,EAC1B,IAAIjI,GAAI,EAAGlK,EAASmS,EAAMnS,MAC1B,IAAImsB,EAAU,CACV,GAAuB,gBAAZA,GAIP,MADAjiB,GAAImC,EAAE4e,YAAY9Y,EAAOrB,GAClBqB,EAAMjI,KAAO4G,EAAO5G,EAAI,EAH/BA,GAAgB,EAAXiiB,EAAexa,KAAK+X,IAAI,EAAG1pB,EAASmsB,GAAYA,EAM7D,GAAIzE,GAAiBvV,EAAM1B,UAAYiX,EAAe,MAAOvV,GAAM1B,QAAQK,EAAMqb,EACjF,MAAWnsB,EAAJkK,EAAYA,IAAK,GAAIiI,EAAMjI,KAAO4G,EAAM,MAAO5G,EACtD,OAAO,IAIXmC,EAAEub,YAAc,SAAUzV,EAAOrB,EAAMyB,GACnC,GAAa,MAATJ,EAAe,MAAO,EAC1B,IAAIua,GAAmB,MAARna,CACf,IAAIoV,GAAqBxV,EAAMyV,cAAgBD,EAC3C,MAAO+E,GAAWva,EAAMyV,YAAY9W,EAAMyB,GAAQJ,EAAMyV,YAAY9W,EAGxE,KADA,GAAI5G,GAAKwiB,EAAWna,EAAOJ,EAAMnS,OAC1BkK,KAAK,GAAIiI,EAAMjI,KAAO4G,EAAM,MAAO5G,EAC1C,OAAO,IAMXmC,EAAE2D,MAAQ,SAAUC,EAAO0c,EAAMC,GACzB9iB,UAAU9J,QAAU,IACpB2sB,EAAO1c,GAAS,EAChBA,EAAQ,GAEZ2c,EAAO9iB,UAAU,IAAM,CAMvB,KAJA,GAAI9J,GAAS2R,KAAK+X,IAAI/X,KAAKc,MAAMka,EAAO1c,GAAS2c,GAAO,GACpD7iB,EAAM,EACNiG,EAAQ,GAAI3F,OAAMrK,GAETA,EAAN+J,GACHiG,EAAMjG,KAASkG,EACfA,GAAS2c,CAGb,OAAO5c,GAOX,IAAIvF,GAAO,YAMX4B,GAAEkC,KAAO,SAAUwD,EAAMsW,GACrB,GAAIgB,GAAMwD,CACV,IAAI9E,GAAchW,EAAKxD,OAASwZ,EAAY,MAAOA,GAAWle,MAAMkI,EAAMzH,EAAMC,KAAKT,UAAW,GAChG,KAAKuC,EAAEkd,WAAWxX,GAAO,KAAM,IAAI+W,UAEnC,OADAO,GAAO/e,EAAMC,KAAKT,UAAW,GACtB+iB,EAAQ,WACX,KAAM7jB,eAAgB6jB,IAAQ,MAAO9a,GAAKlI,MAAMwe,EAASgB,EAAKtC,OAAOzc,EAAMC,KAAKT,YAChFW,GAAKrB,UAAY2I,EAAK3I,SACtB,IAAIQ,GAAO,GAAIa,EACfA,GAAKrB,UAAY,IACjB,IAAIkD,GAASyF,EAAKlI,MAAMD,EAAMyf,EAAKtC,OAAOzc,EAAMC,KAAKT,YACrD,OAAI8c,QAAOta,KAAYA,EAAeA,EAC/B1C,IAMfyC,EAAEygB,QAAU,SAAU/a,GAClB,GAAIsX,GAAO/e,EAAMC,KAAKT,UAAW,EACjC,OAAO,YACH,MAAOiI,GAAKlI,MAAMb,KAAMqgB,EAAKtC,OAAOzc,EAAMC,KAAKT,eAMvDuC,EAAE0gB,QAAU,SAAUttB,GAClB,GAAIutB,GAAQ1iB,EAAMC,KAAKT,UAAW,EAClC,IAAqB,IAAjBkjB,EAAMhtB,OAAc,KAAM,IAAIitB,OAAM,wCAIxC,OAHA/Z,GAAK8Z,EAAO,SAAU3R,GAClB5b,EAAI4b,GAAKhP,EAAEkC,KAAK9O,EAAI4b,GAAI5b,KAErBA,GAIX4M,EAAE6gB,QAAU,SAAUnb,EAAMob,GACxB,GAAIvE,KAEJ,OADAuE,KAAWA,EAAS9gB,EAAE6c,UACf,WACH,GAAIxpB,GAAMytB,EAAOtjB,MAAMb,KAAMc,UAC7B,OAAOuC,GAAEye,IAAIlC,EAAMlpB,GAAOkpB,EAAKlpB,GAAQkpB,EAAKlpB,GAAOqS,EAAKlI,MAAMb,KAAMc,aAM5EuC,EAAE+gB,MAAQ,SAAUrb,EAAMsb,GACtB,GAAIhE,GAAO/e,EAAMC,KAAKT,UAAW,EACjC,OAAOxD,YAAW,WACd,MAAOyL,GAAKlI,MAAM,KAAMwf,IACzBgE,IAKPhhB,EAAEihB,MAAQ,SAAUvb,GAChB,MAAO1F,GAAE+gB,MAAMvjB,MAAMwC,GAAI0F,EAAM,GAAGgV,OAAOzc,EAAMC,KAAKT,UAAW,MAQnEuC,EAAEkhB,SAAW,SAAUxb,EAAMsb,EAAMvpB,GAC/B,GAAIukB,GAASgB,EAAM/c,EACfkhB,EAAU,KACVC,EAAW,CACf3pB,KAAYA,KACZ,IAAI4pB,GAAQ,WACRD,EAAW3pB,EAAQ6pB,WAAY,EAAQ,EAAI,GAAIxN,MAC/CqN,EAAU,KACVlhB,EAASyF,EAAKlI,MAAMwe,EAASgB,GAEjC,OAAO,YACH,GAAIuE,GAAM,GAAIzN,KACTsN,IAAY3pB,EAAQ6pB,WAAY,IAAOF,EAAWG,EACvD,IAAIC,GAAYR,GAAQO,EAAMH,EAW9B,OAVApF,GAAUrf,KACVqgB,EAAOvf,UACU,GAAb+jB,GACAC,aAAaN,GACbA,EAAU,KACVC,EAAWG,EACXthB,EAASyF,EAAKlI,MAAMwe,EAASgB,IACrBmE,GAAW1pB,EAAQiqB,YAAa,IACxCP,EAAUlnB,WAAWonB,EAAOG,IAEzBvhB,IAQfD,EAAE2hB,SAAW,SAAUjc,EAAMsb,EAAMY,GAC/B,GAAIT,GAASnE,EAAMhB,EAAS6F,EAAW5hB,CACvC,OAAO,YACH+b,EAAUrf,KACVqgB,EAAOvf,UACPokB,EAAY,GAAI/N,KAChB,IAAIuN,GAAQ,WACR,GAAIrc,GAAO,GAAK8O,MAAU+N,CACfb,GAAPhc,EACAmc,EAAUlnB,WAAWonB,EAAOL,EAAOhc,IAEnCmc,EAAU,KACLS,IAAW3hB,EAASyF,EAAKlI,MAAMwe,EAASgB,MAGjD8E,EAAUF,IAAcT,CAK5B,OAJKA,KACDA,EAAUlnB,WAAWonB,EAAOL,IAE5Bc,IAAS7hB,EAASyF,EAAKlI,MAAMwe,EAASgB,IACnC/c,IAMfD,EAAE6X,KAAO,SAAUnS,GACf,GAAiB6W,GAAbwF,GAAM,CACV,OAAO,YACH,MAAIA,GAAYxF,GAChBwF,GAAM,EACNxF,EAAO7W,EAAKlI,MAAMb,KAAMc,WACxBiI,EAAO,KACA6W,KAOfvc,EAAEzF,KAAO,SAAUmL,EAAMsc,GACrB,MAAO,YACH,GAAIhF,IAAQtX,EAEZ,OADAtI,GAAKI,MAAMwf,EAAMvf,WACVukB,EAAQxkB,MAAMb,KAAMqgB,KAMnChd,EAAEiiB,QAAU,WACR,GAAItB,GAAQljB,SACZ,OAAO,YAEH,IAAK,GADDuf,GAAOvf,UACFI,EAAI8iB,EAAMhtB,OAAS,EAAGkK,GAAK,EAAGA,IACnCmf,GAAQ2D,EAAM9iB,GAAGL,MAAMb,KAAMqgB,GAEjC,OAAOA,GAAK,KAKpBhd,EAAEkiB,MAAQ,SAAUC,EAAOzc,GACvB,MAAO,YACH,QAAMyc,EAAQ,EACHzc,EAAKlI,MAAMb,KAAMc,WAD5B,SAWRuC,EAAE+G,KAAO0U,GAAc,SAAUroB,GACzB,GAAIA,IAAQmnB,OAAOnnB,GAAM,KAAM,IAAIqpB,WAAU,iBAC7C,IAAI1V,KACJ,KAAK,GAAI1T,KAAOD,GAAS4M,EAAEye,IAAIrrB,EAAKC,IAAM0T,EAAK3J,KAAK/J,EACpD,OAAO0T,IAIf/G,EAAEwO,OAAS,SAAUpb,GAIjB,IAAK,GAHD2T,GAAO/G,EAAE+G,KAAK3T,GACdO,EAASoT,EAAKpT,OACd6a,EAAS,GAAIxQ,OAAMrK,GACdkK,EAAI,EAAOlK,EAAJkK,EAAYA,IACxB2Q,EAAO3Q,GAAKzK,EAAI2T,EAAKlJ,GAEzB,OAAO2Q,IAIXxO,EAAEoiB,MAAQ,SAAUhvB,GAIhB,IAAK,GAHD2T,GAAO/G,EAAE+G,KAAK3T,GACdO,EAASoT,EAAKpT,OACdyuB,EAAQ,GAAIpkB,OAAMrK,GACbkK,EAAI,EAAOlK,EAAJkK,EAAYA,IACxBukB,EAAMvkB,IAAMkJ,EAAKlJ,GAAIzK,EAAI2T,EAAKlJ,IAElC,OAAOukB,IAIXpiB,EAAEqiB,OAAS,SAAUjvB,GAGjB,IAAK,GAFD6M,MACA8G,EAAO/G,EAAE+G,KAAK3T,GACTyK,EAAI,EAAGlK,EAASoT,EAAKpT,OAAYA,EAAJkK,EAAYA,IAC9CoC,EAAO7M,EAAI2T,EAAKlJ,KAAOkJ,EAAKlJ,EAEhC,OAAOoC,IAKXD,EAAEsiB,UAAYtiB,EAAEuiB,QAAU,SAAUnvB,GAChC,GAAIovB,KACJ,KAAK,GAAInvB,KAAOD,GACR4M,EAAEkd,WAAW9pB,EAAIC,KAAOmvB,EAAMplB,KAAK/J,EAE3C,OAAOmvB,GAAMtE,QAIjBle,EAAEzH,OAAS,SAAUnF,GAQjB,MAPAyT,GAAK5I,EAAMC,KAAKT,UAAW,GAAI,SAAUglB,GACrC,GAAIA,EACA,IAAK,GAAIC,KAAQD,GACbrvB,EAAIsvB,GAAQD,EAAOC,KAIxBtvB,GAIX4M,EAAE2iB,KAAO,SAAUvvB,GACf,GAAIwvB,MACA7b,EAAO2T,EAAOld,MAAM6c,EAAYpc,EAAMC,KAAKT,UAAW,GAI1D,OAHAoJ,GAAKE,EAAM,SAAU1T,GACbA,IAAOD,KAAKwvB,EAAKvvB,GAAOD,EAAIC,MAE7BuvB,GAIX5iB,EAAE6iB,KAAO,SAAUzvB,GACf,GAAIwvB,MACA7b,EAAO2T,EAAOld,MAAM6c,EAAYpc,EAAMC,KAAKT,UAAW,GAC1D,KAAK,GAAIpK,KAAOD,GACP4M,EAAE6E,SAASkC,EAAM1T,KAAMuvB,EAAKvvB,GAAOD,EAAIC,GAEhD,OAAOuvB,IAIX5iB,EAAE8iB,SAAW,SAAU1vB,GAQnB,MAPAyT,GAAK5I,EAAMC,KAAKT,UAAW,GAAI,SAAUglB,GACrC,GAAIA,EACA,IAAK,GAAIC,KAAQD,GACK,SAAdrvB,EAAIsvB,KAAkBtvB,EAAIsvB,GAAQD,EAAOC,MAIlDtvB,GAIX4M,EAAEyD,MAAQ,SAAUrQ,GAChB,MAAK4M,GAAE+iB,SAAS3vB,GACT4M,EAAEwD,QAAQpQ,GAAOA,EAAI6K,QAAU+B,EAAEzH,UAAWnF,GADtBA,GAOjC4M,EAAEgjB,IAAM,SAAU5vB,EAAK6vB,GAEnB,MADAA,GAAY7vB,GACLA,EAIX,IAAI8vB,GAAK,SAAU9E,EAAGC,EAAG8E,EAAQC,GAG7B,GAAIhF,IAAMC,EAAG,MAAa,KAAND,GAAW,EAAIA,GAAK,EAAIC,CAE5C,IAAS,MAALD,GAAkB,MAALC,EAAW,MAAOD,KAAMC,CAErCD,aAAape,KAAGoe,EAAIA,EAAEzC,UACtB0C,YAAare,KAAGqe,EAAIA,EAAE1C,SAE1B,IAAI0H,GAAY1I,EAASzc,KAAKkgB,EAC9B,IAAIiF,GAAa1I,EAASzc,KAAKmgB,GAAI,OAAO,CAC1C,QAAQgF,GAEJ,IAAK,kBAGD,MAAOjF,IAAK9N,OAAO+N,EACvB,KAAK,kBAGD,MAAOD,KAAMA,EAAIC,IAAMA,EAAU,GAALD,EAAS,EAAIA,GAAK,EAAIC,EAAID,IAAMC,CAChE,KAAK,gBACL,IAAK,mBAID,OAAQD,IAAMC,CAElB,KAAK,kBACD,MAAOD,GAAEqE,QAAUpE,EAAEoE,QACjBrE,EAAEkF,QAAUjF,EAAEiF,QACdlF,EAAEmF,WAAalF,EAAEkF,WACjBnF,EAAEoF,YAAcnF,EAAEmF,WAE9B,GAAgB,gBAALpF,IAA6B,gBAALC,GAAe,OAAO,CAIzD,KADA,GAAI1qB,GAASwvB,EAAOxvB,OACbA,KAGH,GAAIwvB,EAAOxvB,IAAWyqB,EAAG,MAAOgF,GAAOzvB,IAAW0qB,CAItD,IAAIoF,GAAQrF,EAAE/f,YAAaqlB,EAAQrF,EAAEhgB,WACrC,IAAIolB,IAAUC,KAAW1jB,EAAEkd,WAAWuG,IAAWA,YAAiBA,IAC9DzjB,EAAEkd,WAAWwG,IAAWA,YAAiBA,IACzC,OAAO,CAGXP,GAAO/lB,KAAKghB,GACZgF,EAAOhmB,KAAKihB,EACZ,IAAIY,GAAO,EAAGhf,GAAS,CAEvB,IAAiB,kBAAbojB,GAIA,GAFApE,EAAOb,EAAEzqB,OACTsM,EAASgf,GAAQZ,EAAE1qB,OAGf,KAAOsrB,MACGhf,EAASijB,EAAG9E,EAAEa,GAAOZ,EAAEY,GAAOkE,EAAQC,WAGjD,CAEH,IAAK,GAAI/vB,KAAO+qB,GACZ,GAAIpe,EAAEye,IAAIL,EAAG/qB,KAET4rB,MAEMhf,EAASD,EAAEye,IAAIJ,EAAGhrB,IAAQ6vB,EAAG9E,EAAE/qB,GAAMgrB,EAAEhrB,GAAM8vB,EAAQC,KAAU,KAI7E,IAAInjB,EAAQ,CACR,IAAK5M,IAAOgrB,GACR,GAAIre,EAAEye,IAAIJ,EAAGhrB,KAAU4rB,IAAS,KAEpChf,IAAUgf,GAMlB,MAFAkE,GAAOnhB,MACPohB,EAAOphB,MACA/B,EAIXD,GAAE2jB,QAAU,SAAUvF,EAAGC,GACrB,MAAO6E,GAAG9E,EAAGC,UAKjBre,EAAEwK,QAAU,SAAUpX,GAClB,GAAW,MAAPA,EAAa,OAAO,CACxB,IAAI4M,EAAEwD,QAAQpQ,IAAQ4M,EAAE4jB,SAASxwB,GAAM,MAAsB,KAAfA,EAAIO,MAClD,KAAK,GAAIN,KAAOD,GAAK,GAAI4M,EAAEye,IAAIrrB,EAAKC,GAAM,OAAO,CACjD,QAAO,GAIX2M,EAAE6jB,UAAY,SAAUzwB,GACpB,SAAUA,GAAwB,IAAjBA,EAAI0wB,WAKzB9jB,EAAEwD,QAAUgY,GAAiB,SAAUpoB,GAC/B,MAA6B,kBAAtBunB,EAASzc,KAAK9K,IAI7B4M,EAAE+iB,SAAW,SAAU3vB,GACnB,MAAOA,KAAQmnB,OAAOnnB,IAI1ByT,GAAM,YAAa,WAAY,SAAU,SAAU,OAAQ,UAAW,SAAU7J,GAC5EgD,EAAE,KAAOhD,GAAQ,SAAU5J,GACvB,MAAOunB,GAASzc,KAAK9K,IAAQ,WAAa4J,EAAO,OAMpDgD,EAAE0f,YAAYjiB,aACfuC,EAAE0f,YAAc,SAAUtsB,GACtB,SAAUA,IAAO4M,EAAEye,IAAIrrB,EAAK,aAKf,kBAAV,MACP4M,EAAEkd,WAAa,SAAU9pB,GACrB,MAAsB,kBAARA,KAKtB4M,EAAE+jB,SAAW,SAAU3wB,GACnB,MAAO2wB,UAAS3wB,KAAS4wB,MAAMC,WAAW7wB,KAI9C4M,EAAEgkB,MAAQ,SAAU5wB,GAChB,MAAO4M,GAAEkkB,SAAS9wB,IAAQA,IAAQA,GAItC4M,EAAEmkB,UAAY,SAAU/wB,GACpB,MAAOA,MAAQ,GAAQA,KAAQ,GAA+B,oBAAtBunB,EAASzc,KAAK9K,IAI1D4M,EAAEokB,OAAS,SAAUhxB,GACjB,MAAe,QAARA,GAIX4M,EAAEqkB,YAAc,SAAUjxB,GACtB,MAAe,UAARA,GAKX4M,EAAEye,IAAM,SAAUrrB,EAAKC,GACnB,MAAOmL,GAAeN,KAAK9K,EAAKC,IAQpC2M,EAAEskB,WAAa,WAEX,MADApK,GAAKla,EAAIma,EACFxd,MAIXqD,EAAE6c,SAAW,SAAU/oB,GACnB,MAAOA,IAIXkM,EAAEmiB,MAAQ,SAAUtE,EAAG9B,EAAUC,GAE7B,IAAK,GADDuI,GAAQvmB,MAAMsH,KAAK+X,IAAI,EAAGQ,IACrBhgB,EAAI,EAAOggB,EAAJhgB,EAAOA,IAAK0mB,EAAM1mB,GAAKke,EAAS7d,KAAK8d,EAASne,EAC9D,OAAO0mB,IAIXvkB,EAAEqF,OAAS,SAAUmY,EAAKH,GAKtB,MAJW,OAAPA,IACAA,EAAMG,EACNA,EAAM,GAEHA,EAAMlY,KAAKe,MAAMf,KAAKD,UAAYgY,EAAMG,EAAM,IAIzD,IAAIgH,IACAC,QACIC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,UAGbN,GAAUO,SAAW/kB,EAAEqiB,OAAOmC,EAAUC,OAGxC,IAAIO,IACAP,OAAQ,GAAIpU,QAAO,IAAMrQ,EAAE+G,KAAKyd,EAAUC,QAAQjkB,KAAK,IAAM,IAAK,KAClEukB,SAAU,GAAI1U,QAAO,IAAMrQ,EAAE+G,KAAKyd,EAAUO,UAAUvkB,KAAK,KAAO,IAAK,KAI3ER,GAAE6G,MAAM,SAAU,YAAa,SAAUsC,GACrCnJ,EAAEmJ,GAAU,SAAU8G,GAClB,MAAc,OAAVA,EAAuB,IACnB,GAAKA,GAAQlM,QAAQihB,EAAc7b,GAAS,SAAUsM,GAC1D,MAAO+O,GAAUrb,GAAQsM,QAOrCzV,EAAEC,OAAS,SAAUmgB,EAAQ6E,GACzB,GAAc,MAAV7E,EAAgB,MAAO,OAC3B,IAAItsB,GAAQssB,EAAO6E,EACnB,OAAOjlB,GAAEkd,WAAWppB,GAASA,EAAMoK,KAAKkiB,GAAUtsB,GAItDkM,EAAEklB,MAAQ,SAAU9xB,GAChByT,EAAK7G,EAAEsiB,UAAUlvB,GAAM,SAAU4J,GAC7B,GAAI0I,GAAO1F,EAAEhD,GAAQ5J,EAAI4J,EACzBgD,GAAEjD,UAAUC,GAAQ,WAChB,GAAIggB,IAAQrgB,KAAKgf,SAEjB,OADAve,GAAKI,MAAMwf,EAAMvf,WACVwC,EAAO/B,KAAKvB,KAAM+I,EAAKlI,MAAMwC,EAAGgd,OAOnD,IAAImI,GAAY,CAChBnlB,GAAEolB,SAAW,SAAUC,GACnB,GAAI7jB,KAAO2jB,EAAY,EACvB,OAAOE,GAASA,EAAS7jB,EAAKA,GAKlCxB,EAAEslB,kBACEC,SAAU,kBACVC,YAAa,mBACbf,OAAQ,mBAMZ,IAAIgB,GAAU,OAIVC,GACAZ,IAAK,IACLa,KAAM,KACNC,KAAM,IACNC,KAAM,IACNC,IAAM,IACNC,SAAU,QACVC,SAAU,SAGVC,EAAU,8BAKdjmB,GAAEkmB,SAAW,SAAUxa,EAAM5Y,EAAMqzB,GAC/B,GAAInnB,EACJmnB,GAAWnmB,EAAE8iB,YAAaqD,EAAUnmB,EAAEslB,iBAGtC,IAAIc,GAAU,GAAI/V,UACT8V,EAAS1B,QAAUgB,GAAShD,QAC5B0D,EAASX,aAAeC,GAAShD,QACjC0D,EAASZ,UAAYE,GAAShD,QACjCjiB,KAAK,KAAO,KAAM,KAGpB0b,EAAQ,EACRuG,EAAS,QACb/W,GAAK3H,QAAQqiB,EAAS,SAAU3Q,EAAOgP,EAAQe,EAAaD,EAAUc,GAgBlE,MAfA5D,IAAU/W,EAAKzN,MAAMie,EAAOmK,GACvBtiB,QAAQkiB,EAAS,SAAUxQ,GACxB,MAAO,KAAOiQ,EAAQjQ,KAG1BgP,IACAhC,GAAU,cAAgBgC,EAAS,kCAEnCe,IACA/C,GAAU,cAAgB+C,EAAc,wBAExCD,IACA9C,GAAU,OAAS8C,EAAW,YAElCrJ,EAAQmK,EAAS5Q,EAAM9hB,OAChB8hB,IAEXgN,GAAU,OAGL0D,EAASG,WAAU7D,EAAS,mBAAqBA,EAAS,OAE/DA,EAAS,4FAELA,EAAS,eAEb,KACIzjB,EAAS,GAAIyb,UAAS0L,EAASG,UAAY,MAAO,IAAK7D,GACzD,MAAOltB,GAEL,KADAA,GAAEktB,OAASA,EACLltB,EAGV,GAAIzC,EAAM,MAAOkM,GAAOlM,EAAMkN,EAC9B,IAAIkmB,GAAW,SAAUpzB,GACrB,MAAOkM,GAAOd,KAAKvB,KAAM7J,EAAMkN,GAMnC,OAFAkmB,GAASzD,OAAS,aAAe0D,EAASG,UAAY,OAAS,OAAS7D,EAAS,IAE1EyD,GAIXlmB,EAAEumB,MAAQ,SAAUnzB,GAChB,MAAO4M,GAAE5M,GAAKmzB,QAUlB,IAAItmB,GAAS,SAAU7M,GACnB,MAAOuJ,MAAK6pB,OAASxmB,EAAE5M,GAAKmzB,QAAUnzB,EAI1C4M,GAAEklB,MAAMllB,GAGR6G,GAAM,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,WAAY,SAAU7J,GAC7E,GAAImM,GAASkR,EAAWrd,EACxBgD,GAAEjD,UAAUC,GAAQ,WAChB,GAAI5J,GAAMuJ,KAAKgf,QAGf,OAFAxS,GAAO3L,MAAMpK,EAAKqK,WACL,SAART,GAA2B,UAARA,GAAoC,IAAf5J,EAAIO,cAAqBP,GAAI,GACnE6M,EAAO/B,KAAKvB,KAAMvJ,MAKjCyT,GAAM,SAAU,OAAQ,SAAU,SAAU7J,GACxC,GAAImM,GAASkR,EAAWrd,EACxBgD,GAAEjD,UAAUC,GAAQ,WAChB,MAAOiD,GAAO/B,KAAKvB,KAAMwM,EAAO3L,MAAMb,KAAKgf,SAAUle,eAI7DuC,EAAEzH,OAAOyH,EAAEjD,WAGPwpB,MAAO,WAEH,MADA5pB,MAAK6pB,QAAS,EACP7pB,MAIX7I,MAAO,WACH,MAAO6I,MAAKgf,aAKrBzd,KAAKzH,QClwCP,SAASyjB,EAAMuM,GAGQ,kBAAX9zB,SAAyBA,OAAO+zB,IACzC/zB,QAAQ,aAAc,SAAU,WAAY,SAASqN,EAAG1L,EAAGsnB,GAGzD1B,EAAKyM,SAAWF,EAAQvM,EAAM0B,EAAS5b,EAAG1L,KAIhB,mBAAZsnB,SAChB6K,EAAQvM,EAAM0B,QAAS5b,GAIvBka,EAAKyM,SAAWF,EAAQvM,KAAUA,EAAKla,EAAIka,EAAKpT,QAAUoT,EAAK0M,OAAS1M,EAAK2M,OAAS3M,EAAK5lB,IAG7FqI,KAAM,SAASud,EAAMyM,EAAU3mB,EAAG1L,GAOlC,GAAIwyB,GAAmB5M,EAAKyM,SAGxB7gB,KAEA7H,GADO6H,EAAM1I,KACL0I,EAAM7H,MACL6H,GAAMnI,MAGnBgpB,GAAS7K,QAAU,QAInB6K,EAASryB,EAAIA,EAIbqyB,EAASrC,WAAa,WAEpB,MADApK,GAAKyM,SAAWG,EACTnqB,MAMTgqB,EAASI,aAAc,EAMvBJ,EAASK,aAAc,CAevB,IAAI/O,GAAS0O,EAAS1O,QAIpB9iB,GAAI,SAAS6H,EAAMC,EAAU+e,GAC3B,IAAKiL,EAAUtqB,KAAM,KAAMK,GAAOC,EAAU+e,MAAc/e,EAAU,MAAON,KAC3EA,MAAKuqB,UAAYvqB,KAAKuqB,WACtB,IAAI/nB,GAASxC,KAAKuqB,QAAQlqB,KAAUL,KAAKuqB,QAAQlqB,MAEjD,OADAmC,GAAO/B,MAAMH,SAAUA,EAAU+e,QAASA,EAASmL,IAAKnL,GAAWrf,OAC5DA,MAKTkb,KAAM,SAAS7a,EAAMC,EAAU+e,GAC7B,IAAKiL,EAAUtqB,KAAM,OAAQK,GAAOC,EAAU+e,MAAc/e,EAAU,MAAON,KAC7E,IAAIY,GAAOZ,KACPkb,EAAO7X,EAAE6X,KAAK,WAChBta,EAAK5H,IAAIqH,EAAM6a,GACf5a,EAASO,MAAMb,KAAMc,YAGvB,OADAoa,GAAKuP,UAAYnqB,EACVN,KAAKxH,GAAG6H,EAAM6a,EAAMmE,IAO7BrmB,IAAK,SAASqH,EAAMC,EAAU+e,GAC5B,GAAIqL,GAAQC,EAAInoB,EAAQqjB,EAAO3kB,EAAGiP,EAAGrN,EAAGW,CACxC,KAAKzD,KAAKuqB,UAAYD,EAAUtqB,KAAM,MAAOK,GAAOC,EAAU+e,IAAW,MAAOrf,KAChF,KAAKK,IAASC,IAAa+e,EAEzB,MADArf,MAAKuqB,QAAU,OACRvqB,IAGT,KADA6lB,EAAQxlB,GAAQA,GAAQgD,EAAE+G,KAAKpK,KAAKuqB,SAC/BrpB,EAAI,EAAGiP,EAAI0V,EAAM7uB,OAAYmZ,EAAJjP,EAAOA,IAEnC,GADAb,EAAOwlB,EAAM3kB,GACTsB,EAASxC,KAAKuqB,QAAQlqB,GAAO,CAE/B,GADAL,KAAKuqB,QAAQlqB,GAAQqqB,KACjBpqB,GAAY+e,EACd,IAAKvc,EAAI,EAAGW,EAAIjB,EAAOxL,OAAYyM,EAAJX,EAAOA,IACpC6nB,EAAKnoB,EAAOM,IACPxC,GAAYA,IAAaqqB,EAAGrqB,UAAYA,IAAaqqB,EAAGrqB,SAASmqB,WACjEpL,GAAWA,IAAYsL,EAAGtL,UAC7BqL,EAAOjqB,KAAKkqB,EAIbD,GAAO1zB,cAAegJ,MAAKuqB,QAAQlqB,GAI5C,MAAOL,OAOTiB,QAAS,SAASZ,GAChB,IAAKL,KAAKuqB,QAAS,MAAOvqB,KAC1B,IAAIqgB,GAAO/e,EAAMC,KAAKT,UAAW,EACjC,KAAKwpB,EAAUtqB,KAAM,UAAWK,EAAMggB,GAAO,MAAOrgB,KACpD,IAAIwC,GAASxC,KAAKuqB,QAAQlqB,GACtBuqB,EAAY5qB,KAAKuqB,QAAQtgB,GAG7B,OAFIzH,IAAQqoB,EAAcroB,EAAQ6d,GAC9BuK,GAAWC,EAAcD,EAAW9pB,WACjCd,MAKT8qB,cAAe,SAASr0B,EAAK4J,EAAMC,GACjC,GAAIyqB,GAAc/qB,KAAKgrB,YACvB,KAAKD,EAAa,MAAO/qB,KACzB,IAAIxI,IAAU6I,IAASC,CAClBA,IAA4B,gBAATD,KAAmBC,EAAWN,MAClDvJ,KAAMs0B,MAAkBt0B,EAAIw0B,WAAax0B,EAC7C,KAAK,GAAIoO,KAAMkmB,GACbt0B,EAAMs0B,EAAYlmB,GAClBpO,EAAIuC,IAAIqH,EAAMC,EAAUN,OACpBxI,GAAU6L,EAAEwK,QAAQpX,EAAI8zB,iBAAiBvqB,MAAKgrB,aAAanmB,EAEjE,OAAO7E,QAMPkrB,EAAgB,MAKhBZ,EAAY,SAAS7zB,EAAKiW,EAAQrM,EAAMoiB,GAC1C,IAAKpiB,EAAM,OAAO,CAGlB,IAAoB,gBAATA,GAAmB,CAC5B,IAAK,GAAI3J,KAAO2J,GACd5J,EAAIiW,GAAQ7L,MAAMpK,GAAMC,EAAK2J,EAAK3J,IAAMqnB,OAAO0E,GAEjD,QAAO,EAIT,GAAIyI,EAAcC,KAAK9qB,GAAO,CAE5B,IAAK,GADDwlB,GAAQxlB,EAAKvJ,MAAMo0B,GACdhqB,EAAI,EAAGiP,EAAI0V,EAAM7uB,OAAYmZ,EAAJjP,EAAOA,IACvCzK,EAAIiW,GAAQ7L,MAAMpK,GAAMovB,EAAM3kB,IAAI6c,OAAO0E,GAE3C,QAAO,EAGT,OAAO,GAMLoI,EAAgB,SAASroB,EAAQ6d,GACnC,GAAIsK,GAAIzpB,EAAI,GAAIiP,EAAI3N,EAAOxL,OAAQo0B,EAAK/K,EAAK,GAAIgL,EAAKhL,EAAK,GAAIiL,EAAKjL,EAAK,EACzE,QAAQA,EAAKrpB,QACX,IAAK,GAAG,OAASkK,EAAIiP,IAAIwa,EAAKnoB,EAAOtB,IAAIZ,SAASiB,KAAKopB,EAAGH,IAAM,OAChE,KAAK,GAAG,OAAStpB,EAAIiP,IAAIwa,EAAKnoB,EAAOtB,IAAIZ,SAASiB,KAAKopB,EAAGH,IAAKY,EAAK,OACpE,KAAK,GAAG,OAASlqB,EAAIiP,IAAIwa,EAAKnoB,EAAOtB,IAAIZ,SAASiB,KAAKopB,EAAGH,IAAKY,EAAIC,EAAK,OACxE,KAAK,GAAG,OAASnqB,EAAIiP,IAAIwa,EAAKnoB,EAAOtB,IAAIZ,SAASiB,KAAKopB,EAAGH,IAAKY,EAAIC,EAAIC,EAAK,OAC5E,SAAS,OAASpqB,EAAIiP,IAAIwa,EAAKnoB,EAAOtB,IAAIZ,SAASO,MAAM8pB,EAAGH,IAAKnK,EAAO,UAIxEkL,GAAiBC,SAAU,KAAMC,aAAc,OAKnDpoB,GAAE6G,KAAKqhB,EAAe,SAASG,EAAgBlf,GAC7C8O,EAAO9O,GAAU,SAAS/V,EAAK4J,EAAMC,GACnC,GAAIyqB,GAAc/qB,KAAKgrB,eAAiBhrB,KAAKgrB,iBACzCnmB,EAAKpO,EAAIw0B,YAAcx0B,EAAIw0B,UAAY5nB,EAAEolB,SAAS,KAItD,OAHAsC,GAAYlmB,GAAMpO,EACb6J,GAA4B,gBAATD,KAAmBC,EAAWN,MACtDvJ,EAAIi1B,GAAgBrrB,EAAMC,EAAUN,MAC7BA,QAKXsb,EAAO/V,KAAS+V,EAAO9iB,GACvB8iB,EAAOqQ,OAASrQ,EAAOtiB,IAIvBqK,EAAEzH,OAAOouB,EAAU1O,EAYnB,IAAIsQ,GAAQ5B,EAAS4B,MAAQ,SAASC,EAAY/wB,GAChD,GAAIwH,GAAQupB,KACZ/wB,KAAYA,MACZkF,KAAK8rB,IAAMzoB,EAAEolB,SAAS,KACtBzoB,KAAK6rB,cACD/wB,EAAQixB,aAAY/rB,KAAK+rB,WAAajxB,EAAQixB,YAC9CjxB,EAAQvE,QAAO+L,EAAQtC,KAAKzJ,MAAM+L,EAAOxH,QAC7CwH,EAAQe,EAAE8iB,YAAa7jB,EAAOe,EAAEC,OAAOtD,KAAM,aAC7CA,KAAKgsB,IAAI1pB,EAAOxH,GAChBkF,KAAKisB,WACLjsB,KAAKksB,WAAWrrB,MAAMb,KAAMc,WAI9BuC,GAAEzH,OAAOgwB,EAAMxrB,UAAWkb,GAGxB2Q,QAAS,KAGTE,gBAAiB,KAIjBC,YAAa,KAIbF,WAAY,aAGZG,OAAQ,SAASvxB,GACf,MAAOuI,GAAEyD,MAAM9G,KAAK6rB,aAKtBS,KAAM,WACJ,MAAOtC,GAASsC,KAAKzrB,MAAMb,KAAMc,YAInC9F,IAAK,SAASuH,GACZ,MAAOvC,MAAK6rB,WAAWtpB,IAIzBulB,OAAQ,SAASvlB,GACf,MAAOc,GAAEykB,OAAO9nB,KAAKhF,IAAIuH,KAK3Buf,IAAK,SAASvf,GACZ,MAAyB,OAAlBvC,KAAKhF,IAAIuH,IAMlBypB,IAAK,SAASt1B,EAAK0S,EAAKtO,GACtB,GAAIyH,GAAMD,EAAOiqB,EAAOC,EAASC,EAAQC,EAAUC,EAAM7nB,CACzD,IAAW,MAAPpO,EAAa,MAAOsJ,KAaxB,IAVmB,gBAARtJ,IACT4L,EAAQ5L,EACRoE,EAAUsO,IAET9G,MAAY5L,GAAO0S,EAGtBtO,IAAYA,OAGPkF,KAAK4sB,UAAUtqB,EAAOxH,GAAU,OAAO,CAG5CyxB,GAAkBzxB,EAAQyxB,MAC1BE,EAAkB3xB,EAAQ2xB,OAC1BD,KACAE,EAAkB1sB,KAAK6sB,UACvB7sB,KAAK6sB,WAAa,EAEbH,IACH1sB,KAAK8sB,oBAAsBzpB,EAAEyD,MAAM9G,KAAK6rB,YACxC7rB,KAAKisB,YAEPnnB,EAAU9E,KAAK6rB,WAAYc,EAAO3sB,KAAK8sB,oBAGnC9sB,KAAKosB,cAAe9pB,KAAOtC,KAAK6E,GAAKvC,EAAMtC,KAAKosB,aAGpD,KAAK7pB,IAAQD,GACX8G,EAAM9G,EAAMC,GACPc,EAAE2jB,QAAQliB,EAAQvC,GAAO6G,IAAMojB,EAAQ/rB,KAAK8B,GAC5Cc,EAAE2jB,QAAQ2F,EAAKpqB,GAAO6G,SAGlBpJ,MAAKisB,QAAQ1pB,GAFpBvC,KAAKisB,QAAQ1pB,GAAQ6G,EAIvBmjB,QAAeznB,GAAQvC,GAAQuC,EAAQvC,GAAQ6G,CAIjD,KAAKqjB,EAAQ,CACPD,EAAQx1B,SAAQgJ,KAAK+sB,SAAWjyB,EACpC,KAAK,GAAIoG,GAAI,EAAGiP,EAAIqc,EAAQx1B,OAAYmZ,EAAJjP,EAAOA,IACzClB,KAAKiB,QAAQ,UAAYurB,EAAQtrB,GAAIlB,KAAM8E,EAAQ0nB,EAAQtrB,IAAKpG,GAMpE,GAAI4xB,EAAU,MAAO1sB,KACrB,KAAKysB,EACH,KAAOzsB,KAAK+sB,UACVjyB,EAAUkF,KAAK+sB,SACf/sB,KAAK+sB,UAAW,EAChB/sB,KAAKiB,QAAQ,SAAUjB,KAAMlF,EAKjC,OAFAkF,MAAK+sB,UAAW,EAChB/sB,KAAK6sB,WAAY,EACV7sB,MAKTusB,MAAO,SAAShqB,EAAMzH,GACpB,MAAOkF,MAAKgsB,IAAIzpB,EAAM,OAAQc,EAAEzH,UAAWd,GAAUyxB,OAAO,MAI9D3Z,MAAO,SAAS9X,GACd,GAAIwH,KACJ,KAAK,GAAI5L,KAAOsJ,MAAK6rB,WAAYvpB,EAAM5L,GAAO,MAC9C,OAAOsJ,MAAKgsB,IAAI1pB,EAAOe,EAAEzH,UAAWd,GAAUyxB,OAAO,MAKvDS,WAAY,SAASzqB,GACnB,MAAY,OAARA,GAAsBc,EAAEwK,QAAQ7N,KAAKisB,SAClC5oB,EAAEye,IAAI9hB,KAAKisB,QAAS1pB,IAS7B0qB,kBAAmB,SAASC,GAC1B,IAAKA,EAAM,MAAOltB,MAAKgtB,aAAe3pB,EAAEyD,MAAM9G,KAAKisB,UAAW,CAC9D,IAAI7iB,GAAK6iB,GAAU,EACfkB,EAAMntB,KAAK6sB,UAAY7sB,KAAK8sB,oBAAsB9sB,KAAK6rB,UAC3D,KAAK,GAAItpB,KAAQ2qB,GACX7pB,EAAE2jB,QAAQmG,EAAI5qB,GAAQ6G,EAAM8jB,EAAK3qB,OACpC0pB,IAAYA,OAAe1pB,GAAQ6G,EAEtC,OAAO6iB,IAKTxH,SAAU,SAASliB,GACjB,MAAY,OAARA,GAAiBvC,KAAK8sB,oBACnB9sB,KAAK8sB,oBAAoBvqB,GADsB,MAMxD6qB,mBAAoB,WAClB,MAAO/pB,GAAEyD,MAAM9G,KAAK8sB,sBAMtBO,MAAO,SAASvyB,GACdA,EAAUA,EAAUuI,EAAEyD,MAAMhM,MACN,SAAlBA,EAAQvE,QAAkBuE,EAAQvE,OAAQ,EAC9C,IAAI+2B,GAAQttB,KACR4K,EAAU9P,EAAQ8P,OAOtB,OANA9P,GAAQ8P,QAAU,SAAS2iB,GACzB,MAAKD,GAAMtB,IAAIsB,EAAM/2B,MAAMg3B,EAAMzyB,GAAUA,IACvC8P,GAASA,EAAQ0iB,EAAOC,EAAMzyB,OAClCwyB,GAAMrsB,QAAQ,OAAQqsB,EAAOC,EAAMzyB,KAFyB,GAI9D0yB,EAAUxtB,KAAMlF,GACTkF,KAAKssB,KAAK,OAAQtsB,KAAMlF,IAMjC2yB,KAAM,SAAS/2B,EAAK0S,EAAKtO,GACvB,GAAIwH,GAAOkK,EAAQkhB,EAAK7B,EAAa7rB,KAAK6rB,UAe1C,IAZW,MAAPn1B,GAA8B,gBAARA,IACxB4L,EAAQ5L,EACRoE,EAAUsO,IAET9G,MAAY5L,GAAO0S,EAGtBtO,EAAUuI,EAAEzH,QAAQ8R,UAAU,GAAO5S,GAKjCwH,IAAUxH,EAAQupB,MACpB,IAAKrkB,KAAKgsB,IAAI1pB,EAAOxH,GAAU,OAAO,MAEtC,KAAKkF,KAAK4sB,UAAUtqB,EAAOxH,GAAU,OAAO,CAI1CwH,IAASxH,EAAQupB,OACnBrkB,KAAK6rB,WAAaxoB,EAAEzH,UAAWiwB,EAAYvpB,IAKvB,SAAlBxH,EAAQvE,QAAkBuE,EAAQvE,OAAQ,EAC9C,IAAI+2B,GAAQttB,KACR4K,EAAU9P,EAAQ8P,OAqBtB,OApBA9P,GAAQ8P,QAAU,SAAS2iB,GAEzBD,EAAMzB,WAAaA,CACnB,IAAI8B,GAAcL,EAAM/2B,MAAMg3B,EAAMzyB,EAEpC,OADIA,GAAQupB,OAAMsJ,EAActqB,EAAEzH,OAAO0G,MAAaqrB,IAClDtqB,EAAE+iB,SAASuH,KAAiBL,EAAMtB,IAAI2B,EAAa7yB,IAC9C,GAEL8P,GAASA,EAAQ0iB,EAAOC,EAAMzyB,OAClCwyB,GAAMrsB,QAAQ,OAAQqsB,EAAOC,EAAMzyB,KAErC0yB,EAAUxtB,KAAMlF,GAEhB0R,EAASxM,KAAK4tB,QAAU,SAAY9yB,EAAQ+yB,MAAQ,QAAU,SAC/C,UAAXrhB,IAAoB1R,EAAQwH,MAAQA,GACxCorB,EAAM1tB,KAAKssB,KAAK9f,EAAQxM,KAAMlF,GAG1BwH,GAASxH,EAAQupB,OAAMrkB,KAAK6rB,WAAaA,GAEtC6B,GAMTI,QAAS,SAAShzB,GAChBA,EAAUA,EAAUuI,EAAEyD,MAAMhM,KAC5B,IAAIwyB,GAAQttB,KACR4K,EAAU9P,EAAQ8P,QAElBkjB,EAAU,WACZR,EAAMrsB,QAAQ,UAAWqsB,EAAOA,EAAMvB,WAAYjxB,GASpD,IANAA,EAAQ8P,QAAU,SAAS2iB,IACrBzyB,EAAQupB,MAAQiJ,EAAMM,UAASE,IAC/BljB,GAASA,EAAQ0iB,EAAOC,EAAMzyB,GAC7BwyB,EAAMM,SAASN,EAAMrsB,QAAQ,OAAQqsB,EAAOC,EAAMzyB,IAGrDkF,KAAK4tB,QAEP,MADA9yB,GAAQ8P,WACD,CAET4iB,GAAUxtB,KAAMlF,EAEhB,IAAI4yB,GAAM1tB,KAAKssB,KAAK,SAAUtsB,KAAMlF,EAEpC,OADKA,GAAQupB,MAAMyJ,IACZJ,GAMT7yB,IAAK,WACH,GAAIoS,GACF5J,EAAEC,OAAOtD,KAAM,YACfqD,EAAEC,OAAOtD,KAAK+rB,WAAY,QAC1BgC,GACF,OAAI/tB,MAAK4tB,QAAgB3gB,EAClBA,EAAK7F,QAAQ,WAAY,OAAS4mB,mBAAmBhuB,KAAK6E,KAKnEtO,MAAO,SAASg3B,EAAMzyB,GACpB,MAAOyyB,IAITzmB,MAAO,WACL,MAAO,IAAI9G,MAAK0B,YAAY1B,KAAK6rB,aAInC+B,MAAO,WACL,OAAQ5tB,KAAK8hB,IAAI9hB,KAAKosB,cAIxB6B,QAAS,SAASnzB,GAChB,MAAOkF,MAAK4sB,aAAcvpB,EAAEzH,OAAOd,OAAiB4S,UAAU,MAKhEkf,UAAW,SAAStqB,EAAOxH,GACzB,IAAKA,EAAQ4S,WAAa1N,KAAK0N,SAAU,OAAO,CAChDpL,GAAQe,EAAEzH,UAAWoE,KAAK6rB,WAAYvpB,EACtC,IAAI8C,GAAQpF,KAAKmsB,gBAAkBnsB,KAAK0N,SAASpL,EAAOxH,IAAY,IACpE,OAAKsK,IACLpF,KAAKiB,QAAQ,UAAWjB,KAAMoF,EAAO/B,EAAEzH,OAAOd,GAAUqxB,gBAAiB/mB,MAClE,IAFY,IAQvB,IAAI8oB,IAAgB,OAAQ,SAAU,QAAS,SAAU,OAAQ,OAGjE7qB,GAAE6G,KAAKgkB,EAAc,SAAS1hB,GAC5Bof,EAAMxrB,UAAUoM,GAAU,WACxB,GAAI6T,GAAO/e,EAAMC,KAAKT,UAEtB,OADAuf,GAAK8N,QAAQnuB,KAAK6rB,YACXxoB,EAAEmJ,GAAQ3L,MAAMwC,EAAGgd,KAiB9B,IAAI+N,GAAapE,EAASoE,WAAa,SAASC,EAAQvzB,GACtDA,IAAYA,MACRA,EAAQwyB,QAAOttB,KAAKstB,MAAQxyB,EAAQwyB,OACb,SAAvBxyB,EAAQwzB,aAAuBtuB,KAAKsuB,WAAaxzB,EAAQwzB,YAC7DtuB,KAAKuuB,SACLvuB,KAAKksB,WAAWrrB,MAAMb,KAAMc,WACxButB,GAAQruB,KAAK0R,MAAM2c,EAAQhrB,EAAEzH,QAAQ6wB,QAAQ,GAAO3xB,KAItD0zB,GAAcpc,KAAK,EAAM5a,QAAQ,EAAMi3B,OAAO,GAC9CC,GAActc,KAAK,EAAM5a,QAAQ,EAGrC6L,GAAEzH,OAAOwyB,EAAWhuB,UAAWkb,GAI7BgS,MAAO1B,EAIPM,WAAY,aAIZG,OAAQ,SAASvxB,GACf,MAAOkF,MAAK+J,IAAI,SAASujB,GAAQ,MAAOA,GAAMjB,OAAOvxB,MAIvDwxB,KAAM,WACJ,MAAOtC,GAASsC,KAAKzrB,MAAMb,KAAMc,YAInCsR,IAAK,SAASic,EAAQvzB,GACpB,MAAOkF,MAAKgsB,IAAIqC,EAAQhrB,EAAEzH,QAAQ6yB,OAAO,GAAQ3zB,EAAS4zB,KAI5Dl3B,OAAQ,SAAS62B,EAAQvzB,GACvB,GAAI6zB,IAAYtrB,EAAEwD,QAAQwnB,EAC1BA,GAASM,GAAYN,GAAUhrB,EAAEyD,MAAMunB,GACvCvzB,IAAYA,KACZ,IAAIoG,GAAGiP,EAAGoP,EAAO+N,CACjB,KAAKpsB,EAAI,EAAGiP,EAAIke,EAAOr3B,OAAYmZ,EAAJjP,EAAOA,IACpCosB,EAAQe,EAAOntB,GAAKlB,KAAKhF,IAAIqzB,EAAOntB,IAC/BosB,UACEttB,MAAK4uB,MAAMtB,EAAMzoB,UACjB7E,MAAK4uB,MAAMtB,EAAMxB,KACxBvM,EAAQvf,KAAKyH,QAAQ6lB,GACrBttB,KAAKquB,OAAOrtB,OAAOue,EAAO,GAC1Bvf,KAAKhJ,SACA8D,EAAQ2xB,SACX3xB,EAAQykB,MAAQA,EAChB+N,EAAMrsB,QAAQ,SAAUqsB,EAAOttB,KAAMlF,IAEvCkF,KAAK6uB,iBAAiBvB,EAAOxyB,GAE/B,OAAO6zB,GAAWN,EAAO,GAAKA,GAOhCrC,IAAK,SAASqC,EAAQvzB,GACpBA,EAAUuI,EAAE8iB,YAAarrB,EAAS0zB,GAC9B1zB,EAAQvE,QAAO83B,EAASruB,KAAKzJ,MAAM83B,EAAQvzB,GAC/C,IAAI6zB,IAAYtrB,EAAEwD,QAAQwnB,EAC1BA,GAASM,EAAYN,GAAUA,MAAgBhrB,EAAEyD,MAAMunB,EACvD,IAAIntB,GAAGiP,EAAGtL,EAAIyoB,EAAOhrB,EAAOwsB,EAAUvN,EAClCwN,EAAKj0B,EAAQi0B,GACbC,EAAchvB,KAAKstB,MACnB2B,EAAWjvB,KAAKsuB,YAAqB,MAANS,GAAej0B,EAAQymB,QAAS,EAC/D2N,EAAW7rB,EAAE4jB,SAASjnB,KAAKsuB,YAActuB,KAAKsuB,WAAa,KAC3Da,KAAYC,KAAeC,KAC3Bjd,EAAMtX,EAAQsX,IAAKqc,EAAQ3zB,EAAQ2zB,MAAOj3B,EAASsD,EAAQtD,OAC3D83B,GAASL,GAAY7c,GAAO5a,MAAc,CAI9C,KAAK0J,EAAI,EAAGiP,EAAIke,EAAOr3B,OAAYmZ,EAAJjP,EAAOA,IAAK,CAUzC,GATAoB,EAAQ+rB,EAAOntB,OAEb2D,EADEvC,YAAiBspB,GACd0B,EAAQhrB,EAERA,EAAM0sB,EAAY5uB,UAAUgsB,aAAe;AAK9C0C,EAAW9uB,KAAKhF,IAAI6J,GAClBrN,IAAQ63B,EAASP,EAAShD,MAAO,GACjC2C,IACFnsB,EAAQA,IAAUgrB,EAAQA,EAAMzB,WAAavpB,EACzCxH,EAAQvE,QAAO+L,EAAQwsB,EAASv4B,MAAM+L,EAAOxH,IACjDg0B,EAAS9C,IAAI1pB,EAAOxH,GAChBm0B,IAAa1N,GAAQuN,EAAS9B,WAAWkC,KAAW3N,GAAO,IAEjE8M,EAAOntB,GAAK4tB,MAGP,IAAI1c,EAAK,CAEd,GADAkb,EAAQe,EAAOntB,GAAKlB,KAAKuvB,cAAcjtB,EAAOxH,IACzCwyB,EAAO,QACZ6B,GAAM1uB,KAAK6sB,GACXttB,KAAKwvB,cAAclC,EAAOxyB,GAI5BwyB,EAAQwB,GAAYxB,GAChBgC,IAAUhC,EAAMM,SAAYyB,EAAS/B,EAAMzoB,KAAMyqB,EAAM7uB,KAAK6sB,GAChE+B,EAAS/B,EAAMzoB,KAAM,EAIvB,GAAIrN,EAAQ,CACV,IAAK0J,EAAI,EAAGiP,EAAInQ,KAAKhJ,OAAYmZ,EAAJjP,IAASA,EAC/BmuB,GAAU/B,EAAQttB,KAAKquB,OAAOntB,IAAI4qB,MAAMsD,EAAS3uB,KAAK6sB,EAEzD8B,GAASp4B,QAAQgJ,KAAKxI,OAAO43B,EAAUt0B,GAI7C,GAAIq0B,EAAMn4B,QAAWs4B,GAASA,EAAMt4B,OAGlC,GAFIi4B,IAAU1N,GAAO,GACrBvhB,KAAKhJ,QAAUm4B,EAAMn4B,OACX,MAAN+3B,EACF,IAAK7tB,EAAI,EAAGiP,EAAIgf,EAAMn4B,OAAYmZ,EAAJjP,EAAOA,IACnClB,KAAKquB,OAAOrtB,OAAO+tB,EAAK7tB,EAAG,EAAGiuB,EAAMjuB,QAEjC,CACDouB,IAAOtvB,KAAKquB,OAAOr3B,OAAS,EAChC,IAAIy4B,GAAgBH,GAASH,CAC7B,KAAKjuB,EAAI,EAAGiP,EAAIsf,EAAcz4B,OAAYmZ,EAAJjP,EAAOA,IAC3ClB,KAAKquB,OAAO5tB,KAAKgvB,EAAcvuB,IASrC,GAHIqgB,GAAMvhB,KAAKuhB,MAAMkL,QAAQ,KAGxB3xB,EAAQ2xB,OAAQ,CACnB,IAAKvrB,EAAI,EAAGiP,EAAIgf,EAAMn4B,OAAYmZ,EAAJjP,EAAOA,KAClCosB,EAAQ6B,EAAMjuB,IAAID,QAAQ,MAAOqsB,EAAOttB,KAAMlF,IAE7CymB,GAAS+N,GAASA,EAAMt4B,SAASgJ,KAAKiB,QAAQ,OAAQjB,KAAMlF,GAIlE,MAAO6zB,GAAWN,EAAO,GAAKA,GAOhC3c,MAAO,SAAS2c,EAAQvzB,GACtBA,IAAYA,KACZ,KAAK,GAAIoG,GAAI,EAAGiP,EAAInQ,KAAKquB,OAAOr3B,OAAYmZ,EAAJjP,EAAOA,IAC7ClB,KAAK6uB,iBAAiB7uB,KAAKquB,OAAOntB,GAAIpG,EAMxC,OAJAA,GAAQ40B,eAAiB1vB,KAAKquB,OAC9BruB,KAAKuuB,SACLF,EAASruB,KAAKoS,IAAIic,EAAQhrB,EAAEzH,QAAQ6wB,QAAQ,GAAO3xB,IAC9CA,EAAQ2xB,QAAQzsB,KAAKiB,QAAQ,QAASjB,KAAMlF,GAC1CuzB,GAIT5tB,KAAM,SAAS6sB,EAAOxyB,GACpB,MAAOkF,MAAKoS,IAAIkb,EAAOjqB,EAAEzH,QAAQmzB,GAAI/uB,KAAKhJ,QAAS8D,KAIrDuK,IAAK,SAASvK,GACZ,GAAIwyB,GAAQttB,KAAK+uB,GAAG/uB,KAAKhJ,OAAS,EAElC,OADAgJ,MAAKxI,OAAO81B,EAAOxyB,GACZwyB,GAITa,QAAS,SAASb,EAAOxyB,GACvB,MAAOkF,MAAKoS,IAAIkb,EAAOjqB,EAAEzH,QAAQmzB,GAAI,GAAIj0B,KAI3C7D,MAAO,SAAS6D,GACd,GAAIwyB,GAAQttB,KAAK+uB,GAAG,EAEpB,OADA/uB,MAAKxI,OAAO81B,EAAOxyB,GACZwyB,GAIThsB,MAAO,WACL,MAAOA,GAAMT,MAAMb,KAAKquB,OAAQvtB,YAIlC9F,IAAK,SAASvE,GACZ,MAAW,OAAPA,EAAoB,OACjBuJ,KAAK4uB,MAAMn4B,IAAQuJ,KAAK4uB,MAAMn4B,EAAIoO,KAAO7E,KAAK4uB,MAAMn4B,EAAIq1B,MAIjEiD,GAAI,SAASxP,GACX,MAAOvf,MAAKquB,OAAO9O,IAKrB3X,MAAO,SAAStF,EAAOkG,GACrB,MAAInF,GAAEwK,QAAQvL,GAAekG,EAAQ,UAC9BxI,KAAKwI,EAAQ,OAAS,UAAU,SAAS8kB,GAC9C,IAAK,GAAI52B,KAAO4L,GACd,GAAIA,EAAM5L,KAAS42B,EAAMtyB,IAAItE,GAAM,OAAO,CAE5C,QAAO,KAMX+pB,UAAW,SAASne,GAClB,MAAOtC,MAAK4H,MAAMtF,GAAO,IAM3Bif,KAAM,SAASzmB,GACb,IAAKkF,KAAKsuB,WAAY,KAAM,IAAIrK,OAAM,yCAWtC,OAVAnpB,KAAYA,MAGRuI,EAAE4jB,SAASjnB,KAAKsuB,aAA0C,IAA3BtuB,KAAKsuB,WAAWt3B,OACjDgJ,KAAKquB,OAASruB,KAAKqhB,OAAOrhB,KAAKsuB,WAAYtuB,MAE3CA,KAAKquB,OAAO9M,KAAKle,EAAEkC,KAAKvF,KAAKsuB,WAAYtuB,OAGtClF,EAAQ2xB,QAAQzsB,KAAKiB,QAAQ,OAAQjB,KAAMlF,GACzCkF,MAITwgB,MAAO,SAASje,GACd,MAAOc,GAAE+c,OAAOpgB,KAAKquB,OAAQ,MAAO9rB,IAMtC8qB,MAAO,SAASvyB,GACdA,EAAUA,EAAUuI,EAAEyD,MAAMhM,MACN,SAAlBA,EAAQvE,QAAkBuE,EAAQvE,OAAQ,EAC9C,IAAIqU,GAAU9P,EAAQ8P,QAClBmhB,EAAa/rB,IAQjB,OAPAlF,GAAQ8P,QAAU,SAAS2iB,GACzB,GAAI/gB,GAAS1R,EAAQ4W,MAAQ,QAAU,KACvCqa,GAAWvf,GAAQ+gB,EAAMzyB,GACrB8P,GAASA,EAAQmhB,EAAYwB,EAAMzyB,GACvCixB,EAAW9qB,QAAQ,OAAQ8qB,EAAYwB,EAAMzyB,IAE/C0yB,EAAUxtB,KAAMlF,GACTkF,KAAKssB,KAAK,OAAQtsB,KAAMlF,IAMjC60B,OAAQ,SAASrC,EAAOxyB,GAEtB,GADAA,EAAUA,EAAUuI,EAAEyD,MAAMhM,QACtBwyB,EAAQttB,KAAKuvB,cAAcjC,EAAOxyB,IAAW,OAAO,CACrDA,GAAQupB,MAAMrkB,KAAKoS,IAAIkb,EAAOxyB,EACnC,IAAIixB,GAAa/rB,KACb4K,EAAU9P,EAAQ8P,OAMtB,OALA9P,GAAQ8P,QAAU,SAAS0iB,EAAOC,GAC5BzyB,EAAQupB,MAAM0H,EAAW3Z,IAAIkb,EAAOxyB,GACpC8P,GAASA,EAAQ0iB,EAAOC,EAAMzyB,IAEpCwyB,EAAMG,KAAK,KAAM3yB,GACVwyB,GAKT/2B,MAAO,SAASg3B,EAAMzyB,GACpB,MAAOyyB,IAITzmB,MAAO,WACL,MAAO,IAAI9G,MAAK0B,YAAY1B,KAAKquB,SAKnCE,OAAQ,WACNvuB,KAAKhJ,OAAS,EACdgJ,KAAKquB,UACLruB,KAAK4uB,UAKPW,cAAe,SAASjtB,EAAOxH,GAC7B,GAAIwH,YAAiBspB,GAAO,MAAOtpB,EACnCxH,GAAUA,EAAUuI,EAAEyD,MAAMhM,MAC5BA,EAAQixB,WAAa/rB,IACrB,IAAIstB,GAAQ,GAAIttB,MAAKstB,MAAMhrB,EAAOxH,EAClC,OAAKwyB,GAAMnB,iBACXnsB,KAAKiB,QAAQ,UAAWjB,KAAMstB,EAAMnB,gBAAiBrxB,IAC9C,GAF4BwyB,GAMrCkC,cAAe,SAASlC,EAAOxyB,GAC7BkF,KAAK4uB,MAAMtB,EAAMxB,KAAOwB,EACR,MAAZA,EAAMzoB,KAAY7E,KAAK4uB,MAAMtB,EAAMzoB,IAAMyoB,GACxCA,EAAMvB,aAAYuB,EAAMvB,WAAa/rB,MAC1CstB,EAAM90B,GAAG,MAAOwH,KAAK4vB,cAAe5vB,OAItC6uB,iBAAkB,SAASvB,EAAOxyB,GAC5BkF,OAASstB,EAAMvB,kBAAmBuB,GAAMvB,WAC5CuB,EAAMt0B,IAAI,MAAOgH,KAAK4vB,cAAe5vB,OAOvC4vB,cAAe,SAASC,EAAOvC,EAAOvB,EAAYjxB,IACjC,QAAV+0B,GAA6B,WAAVA,GAAuB9D,IAAe/rB,QAChD,YAAV6vB,GAAqB7vB,KAAKxI,OAAO81B,EAAOxyB,GACxCwyB,GAASuC,IAAU,UAAYvC,EAAMlB,oBAChCpsB,MAAK4uB,MAAMtB,EAAM7I,SAAS6I,EAAMlB,cACvB,MAAZkB,EAAMzoB,KAAY7E,KAAK4uB,MAAMtB,EAAMzoB,IAAMyoB,IAE/CttB,KAAKiB,QAAQJ,MAAMb,KAAMc,cAQ7B,IAAI8kB,IAAW,UAAW,OAAQ,MAAO,UAAW,SAAU,QAC5D,SAAU,cAAe,QAAS,OAAQ,SAAU,SAAU,SAC9D,SAAU,QAAS,MAAO,OAAQ,MAAO,UAAW,WAAY,SAChE,MAAO,MAAO,UAAW,OAAQ,QAAS,OAAQ,OAAQ,UAAW,OACrE,OAAQ,OAAQ,OAAQ,UAAW,aAAc,UAAW,UAC5D,cAAe,UAAW,QAAS,SAGrCviB,GAAE6G,KAAK0b,EAAS,SAASpZ,GACvB4hB,EAAWhuB,UAAUoM,GAAU,WAC7B,GAAI6T,GAAO/e,EAAMC,KAAKT,UAEtB,OADAuf,GAAK8N,QAAQnuB,KAAKquB,QACXhrB,EAAEmJ,GAAQ3L,MAAMwC,EAAGgd,KAK9B,IAAIyP,IAAoB,UAAW,UAAW,SAAU,UAGxDzsB,GAAE6G,KAAK4lB,EAAkB,SAAStjB,GAChC4hB,EAAWhuB,UAAUoM,GAAU,SAASrV,EAAOkoB,GAC7C,GAAID,GAAW/b,EAAEkd,WAAWppB,GAASA,EAAQ,SAASm2B,GACpD,MAAOA,GAAMtyB,IAAI7D,GAEnB,OAAOkM,GAAEmJ,GAAQxM,KAAKquB,OAAQjP,EAAUC,KAiB5C,IAAIvd,GAAOkoB,EAASloB,KAAO,SAAShH,GAClCkF,KAAK8rB,IAAMzoB,EAAEolB,SAAS,QACtB3tB,IAAYA,MACZuI,EAAEzH,OAAOoE,KAAMqD,EAAE2iB,KAAKlrB,EAASi1B,IAC/B/vB,KAAKgwB,iBACLhwB,KAAKksB,WAAWrrB,MAAMb,KAAMc,WAC5Bd,KAAKiwB,kBAIHC,EAAwB,iBAGxBH,GAAe,QAAS,aAAc,KAAM,KAAM,aAAc,YAAa,UAAW,SAG5F1sB,GAAEzH,OAAOkG,EAAK1B,UAAWkb,GAGvB6U,QAAS,MAITx4B,EAAG,SAASkL,GACV,MAAO7C,MAAKowB,IAAIxtB,KAAKC,IAKvBqpB,WAAY,aAKZ7pB,OAAQ,WACN,MAAOrC,OAKTxI,OAAQ,WAGN,MAFAwI,MAAKowB,IAAI54B,SACTwI,KAAK8qB,gBACE9qB,MAKTqwB,WAAY,SAASC,EAASvyB,GAK5B,MAJIiC,MAAKowB,KAAKpwB,KAAKuwB,mBACnBvwB,KAAKowB,IAAME,YAAmBtG,GAASryB,EAAI24B,EAAUtG,EAASryB,EAAE24B,GAChEtwB,KAAKnI,GAAKmI,KAAKowB,IAAI,GACfryB,KAAa,GAAOiC,KAAKiwB,iBACtBjwB,MAkBTiwB,eAAgB,SAASztB,GACvB,IAAMA,KAAWA,EAASa,EAAEC,OAAOtD,KAAM,WAAa,MAAOA,KAC7DA,MAAKuwB,kBACL,KAAK,GAAI75B,KAAO8L,GAAQ,CACtB,GAAIgK,GAAShK,EAAO9L,EAEpB,IADK2M,EAAEkd,WAAW/T,KAASA,EAASxM,KAAKwC,EAAO9L,KAC3C8V,EAAL,CAEA,GAAIsM,GAAQpiB,EAAIoiB,MAAMoX,GAClBlV,EAAYlC,EAAM,GAAIjW,EAAWiW,EAAM,EAC3CtM,GAASnJ,EAAEkC,KAAKiH,EAAQxM,MACxBgb,GAAa,kBAAoBhb,KAAK8rB,IACrB,KAAbjpB,EACF7C,KAAKowB,IAAI53B,GAAGwiB,EAAWxO,GAEvBxM,KAAKowB,IAAI53B,GAAGwiB,EAAWnY,EAAU2J,IAGrC,MAAOxM,OAMTuwB,iBAAkB,WAEhB,MADAvwB,MAAKowB,IAAIp3B,IAAI,kBAAoBgH,KAAK8rB,KAC/B9rB,MAOTgwB,eAAgB,WACd,GAAKhwB,KAAKnI,GAORmI,KAAKqwB,WAAWhtB,EAAEC,OAAOtD,KAAM,OAAO,OAP1B,CACZ,GAAIsC,GAAQe,EAAEzH,UAAWyH,EAAEC,OAAOtD,KAAM,cACpCA,MAAK6E,KAAIvC,EAAMuC,GAAKxB,EAAEC,OAAOtD,KAAM,OACnCA,KAAK0mB,YAAWpkB,EAAM,SAAWe,EAAEC,OAAOtD,KAAM,aACpD,IAAIowB,GAAMpG,EAASryB,EAAE,IAAM0L,EAAEC,OAAOtD,KAAM,WAAa,KAAKuC,KAAKD,EACjEtC,MAAKqwB,WAAWD,GAAK,OA0B3BpG,EAASsC,KAAO,SAAS9f,EAAQ8gB,EAAOxyB,GACtC,GAAImD,GAAOuyB,EAAUhkB,EAGrBnJ,GAAE8iB,SAASrrB,IAAYA,OACrBsvB,YAAaJ,EAASI,YACtBC,YAAaL,EAASK,aAIxB,IAAI9f,IAAUtM,KAAMA,EAAMwyB,SAAU,OAqBpC,IAlBK31B,EAAQD,MACX0P,EAAO1P,IAAMwI,EAAEC,OAAOgqB,EAAO,QAAUS,KAIrB,MAAhBjzB,EAAQ3E,OAAgBm3B,GAAqB,WAAX9gB,GAAkC,WAAXA,GAAkC,UAAXA,IAClFjC,EAAOmmB,YAAc,mBACrBnmB,EAAOpU,KAAOC,KAAKC,UAAUyE,EAAQwH,OAASgrB,EAAMjB,OAAOvxB,KAIzDA,EAAQuvB,cACV9f,EAAOmmB,YAAc,oCACrBnmB,EAAOpU,KAAOoU,EAAOpU,MAAQm3B,MAAO/iB,EAAOpU,UAKzC2E,EAAQsvB,cAAyB,QAATnsB,GAA2B,WAATA,GAA8B,UAATA,GAAmB,CACpFsM,EAAOtM,KAAO,OACVnD,EAAQuvB,cAAa9f,EAAOpU,KAAKw6B,QAAU1yB,EAC/C,IAAI2yB,GAAa91B,EAAQ81B,UACzB91B,GAAQ81B,WAAa,SAASlD,GAE5B,MADAA,GAAItiB,iBAAiB,yBAA0BnN,GAC3C2yB,EAAmBA,EAAW/vB,MAAMb,KAAMc,WAA9C,QAKgB,QAAhByJ,EAAOtM,MAAmBnD,EAAQuvB,cACpC9f,EAAOsmB,aAAc,GAMH,UAAhBtmB,EAAOtM,MAAoB6yB,IAC7BvmB,EAAOmjB,IAAM,WACX,MAAO,IAAIqD,eAAc,sBAK7B,IAAIrD,GAAM5yB,EAAQ4yB,IAAM1D,EAASlf,KAAKzH,EAAEzH,OAAO2O,EAAQzP,GAEvD,OADAwyB,GAAMrsB,QAAQ,UAAWqsB,EAAOI,EAAK5yB,GAC9B4yB,EAGT,IAAIoD,KACgB,mBAAXh3B,UAA4BA,OAAOi3B,eACtCj3B,OAAOk3B,iBAAkB,GAAKA,iBAAgBC,eAGhDT,GACFb,OAAU,OACVuB,OAAU,MACVrD,MAAU,QACVsD,SAAU,SACVC,KAAU,MAKZpH,GAASlf,KAAO,WACd,MAAOkf,GAASryB,EAAEmT,KAAKjK,MAAMmpB,EAASryB,EAAGmJ,WAQ3C,IAAIuwB,GAASrH,EAASqH,OAAS,SAASv2B,GACtCA,IAAYA,MACRA,EAAQw2B,SAAQtxB,KAAKsxB,OAASx2B,EAAQw2B,QAC1CtxB,KAAKuxB,cACLvxB,KAAKksB,WAAWrrB,MAAMb,KAAMc,YAK1B0wB,EAAgB,aAChBC,EAAgB,eAChBC,EAAgB,SAChBC,EAAgB,0BAGpBtuB,GAAEzH,OAAOy1B,EAAOjxB,UAAWkb,GAIzB4Q,WAAY,aAQZ0F,MAAO,SAASA,EAAOvxB,EAAMC,GACtB+C,EAAEwuB,SAASD,KAAQA,EAAQ5xB,KAAK8xB,eAAeF,IAChDvuB,EAAEkd,WAAWlgB,KACfC,EAAWD,EACXA,EAAO,IAEJC,IAAUA,EAAWN,KAAKK,GAC/B,IAAI0xB,GAAS/xB,IAQb,OAPAgqB,GAASjlB,QAAQ6sB,MAAMA,EAAO,SAASI,GACrC,GAAI3R,GAAO0R,EAAOE,mBAAmBL,EAAOI,EAC5CD,GAAOG,QAAQ5xB,EAAU+f,GACzB0R,EAAO9wB,QAAQJ,MAAMkxB,GAAS,SAAW1xB,GAAM0d,OAAOsC,IACtD0R,EAAO9wB,QAAQ,QAASZ,EAAMggB,GAC9B2J,EAASjlB,QAAQ9D,QAAQ,QAAS8wB,EAAQ1xB,EAAMggB,KAE3CrgB,MAKTkyB,QAAS,SAAS5xB,EAAU+f,GACtB/f,GAAUA,EAASO,MAAMb,KAAMqgB,IAIrC8R,SAAU,SAASH,EAAUl3B,GAE3B,MADAkvB,GAASjlB,QAAQotB,SAASH,EAAUl3B,GAC7BkF,MAMTuxB,YAAa,WACX,GAAKvxB,KAAKsxB,OAAV,CACAtxB,KAAKsxB,OAASjuB,EAAEC,OAAOtD,KAAM,SAE7B,KADA,GAAI4xB,GAAON,EAASjuB,EAAE+G,KAAKpK,KAAKsxB,QACC,OAAzBM,EAAQN,EAAOjsB,QACrBrF,KAAK4xB,MAAMA,EAAO5xB,KAAKsxB,OAAOM,MAMlCE,eAAgB,SAASF,GAOvB,MANAA,GAAQA,EAAMxqB,QAAQuqB,EAAc,QACtBvqB,QAAQoqB,EAAe,WACvBpqB,QAAQqqB,EAAY,SAAS3Y,EAAOsZ,GACnC,MAAOA,GAAWtZ,EAAQ,aAE3B1R,QAAQsqB,EAAY,YAC3B,GAAIhe,QAAO,IAAMke,EAAQ,yBAMlCK,mBAAoB,SAASL,EAAOI,GAClC,GAAIznB,GAASqnB,EAAM/W,KAAKmX,GAAU1wB,MAAM,EACxC,OAAO+B,GAAE0G,IAAIQ,EAAQ,SAASoL,EAAOzU,GAEnC,MAAIA,KAAMqJ,EAAOvT,OAAS,EAAU2e,GAAS,KACtCA,EAAQoF,mBAAmBpF,GAAS,SAcjD,IAAI0c,GAAUrI,EAASqI,QAAU,WAC/BryB,KAAKsyB,YACLjvB,EAAE0gB,QAAQ/jB,KAAM,YAGM,mBAAXlG,UACTkG,KAAKkF,SAAWpL,OAAOoL,SACvBlF,KAAK+E,QAAUjL,OAAOiL,UAKtBwtB,EAAgB,eAGhBC,EAAe,aAGfC,EAAa,cAGbC,EAAgB,MAGhBC,EAAe,MAGnBN,GAAQO,SAAU,EAGlBvvB,EAAEzH,OAAOy2B,EAAQjyB,UAAWkb,GAI1B3G,SAAU,GAGVke,OAAQ,WACN,MAAO7yB,MAAKkF,SAAS4tB,SAAS1rB,QAAQ,SAAU,SAAWpH,KAAKud,MAKlEwV,QAAS,SAASj5B,GAChB,GAAIgf,IAAShf,GAAUkG,MAAMkF,SAASC,KAAK2T,MAAM,SACjD,OAAOA,GAAQA,EAAM,GAAK,IAK5Bka,YAAa,SAAShB,EAAUiB,GAC9B,GAAgB,MAAZjB,EACF,GAAIhyB,KAAKkzB,gBAAkBlzB,KAAKmzB,kBAAoBF,EAAgB,CAClEjB,EAAWoB,UAAUpzB,KAAKkF,SAAS4tB,SAAW9yB,KAAKkF,SAAS4V,OAC5D,IAAIyC,GAAOvd,KAAKud,KAAKnW,QAAQsrB,EAAe,GACvCV,GAASvqB,QAAQ8V,KAAOyU,EAAWA,EAAS1wB,MAAMic,EAAKvmB,aAE5Dg7B,GAAWhyB,KAAK+yB,SAGpB,OAAOf,GAAS5qB,QAAQmrB,EAAe,KAKzCtrB,MAAO,SAASnM,GACd,GAAIu3B,EAAQO,QAAS,KAAM,IAAI3O,OAAM,4CACrCoO,GAAQO,SAAU,EAIlB5yB,KAAKlF,QAAmBuI,EAAEzH,QAAQ2hB,KAAM,KAAMvd,KAAKlF,QAASA,GAC5DkF,KAAKud,KAAmBvd,KAAKlF,QAAQyiB,KACrCvd,KAAKmzB,iBAAmBnzB,KAAKlF,QAAQu4B,cAAe,EACpDrzB,KAAKszB,kBAAqBtzB,KAAKlF,QAAQkK,UACvChF,KAAKkzB,iBAAsBlzB,KAAKlF,QAAQkK,WAAahF,KAAK+E,SAAW/E,KAAK+E,QAAQC,UAClF,IAAIgtB,GAAoBhyB,KAAKgzB,cACzBO,EAAoB35B,SAAS45B,aAC7BC,EAAqBhB,EAAW5X,KAAK6Y,UAAUC,UAAUC,kBAAoBL,GAAsB,GAAXA,EAK5F,IAFAvzB,KAAKud,MAAQ,IAAMvd,KAAKud,KAAO,KAAKnW,QAAQorB,EAAc,KAEtDiB,GAASzzB,KAAKmzB,iBAAkB,CAClC,GAAIU,GAAQ7J,EAASryB,EAAE,4CACvBqI,MAAKmN,OAAS0mB,EAAMv6B,OAAOiT,SAAS,QAAQ,GAAGunB,cAC/C9zB,KAAKmyB,SAASH,GAKZhyB,KAAKkzB,cACPlJ,EAASryB,EAAEmC,QAAQtB,GAAG,WAAYwH,KAAK+zB,UAC9B/zB,KAAKmzB,kBAAqB,gBAAkBr5B,UAAY25B,EACjEzJ,EAASryB,EAAEmC,QAAQtB,GAAG,aAAcwH,KAAK+zB,UAChC/zB,KAAKmzB,mBACdnzB,KAAKg0B,kBAAoBpf,YAAY5U,KAAK+zB,SAAU/zB,KAAK2U,WAK3D3U,KAAKgyB,SAAWA,CAChB,IAAIiC,GAAMj0B,KAAKkF,QAIf,IAAIlF,KAAKmzB,kBAAoBnzB,KAAKszB,gBAAiB,CAIjD,IAAKtzB,KAAKkzB,gBAAkBlzB,KAAK6yB,SAI/B,MAHA7yB,MAAKgyB,SAAWhyB,KAAKgzB,YAAY,MAAM,GACvChzB,KAAKkF,SAASkC,QAAQpH,KAAKud,KAAO,IAAMvd,KAAKgyB,WAEtC,CAIEhyB,MAAKkzB,eAAiBlzB,KAAK6yB,UAAYoB,EAAIC,OACpDl0B,KAAKgyB,SAAWhyB,KAAK+yB,UAAU3rB,QAAQmrB,EAAe,IACtDvyB,KAAK+E,QAAQovB,gBAAiBv6B,SAASqL,MAAOjF,KAAKud,KAAOvd,KAAKgyB,WAKnE,MAAKhyB,MAAKlF,QAAQ2xB,OAAlB,OAAiCzsB,KAAKo0B,WAKxCzQ,KAAM,WACJqG,EAASryB,EAAEmC,QAAQd,IAAI,WAAYgH,KAAK+zB,UAAU/6B,IAAI,aAAcgH,KAAK+zB,UACrE/zB,KAAKg0B,mBAAmBnf,cAAc7U,KAAKg0B,mBAC/C3B,EAAQO,SAAU,GAKpBhB,MAAO,SAASA,EAAOtxB,GACrBN,KAAKsyB,SAASnE,SAASyD,MAAOA,EAAOtxB,SAAUA,KAKjDyzB,SAAU,SAASn7B,GACjB,GAAIkM,GAAU9E,KAAKgzB,aAInB,OAHIluB,KAAY9E,KAAKgyB,UAAYhyB,KAAKmN,SACpCrI,EAAU9E,KAAKgzB,YAAYhzB,KAAK+yB,QAAQ/yB,KAAKmN,UAE3CrI,IAAY9E,KAAKgyB,UAAiB,GAClChyB,KAAKmN,QAAQnN,KAAKmyB,SAASrtB,OAC/B9E,MAAKo0B,YAMPA,QAAS,SAASpC,GAEhB,MADAA,GAAWhyB,KAAKgyB,SAAWhyB,KAAKgzB,YAAYhB,GACrC3uB,EAAE2G,IAAIhK,KAAKsyB,SAAU,SAAS3xB,GACnC,MAAIA,GAAQixB,MAAMzG,KAAK6G,IACrBrxB,EAAQL,SAAS0xB,IACV,GAFT,UAcJG,SAAU,SAASH,EAAUl3B,GAC3B,IAAKu3B,EAAQO,QAAS,OAAO,CACxB93B,IAAWA,KAAY,IAAMA,GAAWmG,UAAWnG,GAExD,IAAID,GAAMmF,KAAKud,MAAQyU,EAAWhyB,KAAKgzB,YAAYhB,GAAY,IAK/D,IAFAA,EAAWA,EAAS5qB,QAAQurB,EAAc,IAEtC3yB,KAAKgyB,WAAaA,EAAtB,CAOA,GANAhyB,KAAKgyB,SAAWA,EAGC,KAAbA,GAA2B,MAARn3B,IAAaA,EAAMA,EAAIyG,MAAM,EAAG,KAGnDtB,KAAKkzB,cACPlzB,KAAK+E,QAAQjK,EAAQsM,QAAU,eAAiB,gBAAiBxN,SAASqL,MAAOpK,OAI5E,CAAA,IAAImF,KAAKmzB,iBAad,MAAOnzB,MAAKkF,SAASmvB,OAAOx5B,EAZ5BmF,MAAKs0B,YAAYt0B,KAAKkF,SAAU8sB,EAAUl3B,EAAQsM,SAC9CpH,KAAKmN,QAAW6kB,IAAahyB,KAAKgzB,YAAYhzB,KAAK+yB,QAAQ/yB,KAAKmN,WAI9DrS,EAAQsM,SAASpH,KAAKmN,OAAOvT,SAAS6a,OAAOvY,QACjD8D,KAAKs0B,YAAYt0B,KAAKmN,OAAOjI,SAAU8sB,EAAUl3B,EAAQsM,UAQ7D,MAAItM,GAAQmG,QAAgBjB,KAAKo0B,QAAQpC,GAAzC,SAKFsC,YAAa,SAASpvB,EAAU8sB,EAAU5qB,GACxC,GAAIA,EAAS,CACX,GAAIjC,GAAOD,EAASC,KAAKiC,QAAQ,qBAAsB,GACvDlC,GAASkC,QAAQjC,EAAO,IAAM6sB,OAG9B9sB,GAASgvB,KAAO,IAAMlC,KAO5BhI,EAASjlB,QAAU,GAAIstB,EAQvB,IAAIz2B,GAAS,SAAS24B,EAAYC,GAChC,GACIhzB,GADA3D,EAASmC,IAOXwB,GADE+yB,GAAclxB,EAAEye,IAAIyS,EAAY,eAC1BA,EAAW7yB,YAEX,WAAY,MAAO7D,GAAOgD,MAAMb,KAAMc,YAIhDuC,EAAEzH,OAAO4F,EAAO3D,EAAQ22B,EAIxB,IAAIC,GAAY,WAAYz0B,KAAK0B,YAAcF,EAY/C,OAXAizB,GAAUr0B,UAAYvC,EAAOuC,UAC7BoB,EAAMpB,UAAY,GAAIq0B,GAIlBF,GAAYlxB,EAAEzH,OAAO4F,EAAMpB,UAAWm0B,GAI1C/yB,EAAMI,UAAY/D,EAAOuC,UAElBoB,EAIToqB,GAAMhwB,OAASwyB,EAAWxyB,OAASy1B,EAAOz1B,OAASkG,EAAKlG,OAASy2B,EAAQz2B,OAASA,CAGlF,IAAImyB,GAAW,WACb,KAAM,IAAI9J,OAAM,mDAIduJ,EAAY,SAASF,EAAOxyB,GAC9B,GAAIsK,GAAQtK,EAAQsK,KACpBtK,GAAQsK,MAAQ,SAASmoB,GACnBnoB,GAAOA,EAAMkoB,EAAOC,EAAMzyB,GAC9BwyB,EAAMrsB,QAAQ,QAASqsB,EAAOC,EAAMzyB,IAIxC,OAAOkvB,KCpkDTh0B,OAAO,mBAAoB,SAASC,GAYhC,QAASukB,GAAYjB,GACjB,GAAI7hB,GAAMC,EAAEC,WAGR8L,EAAIgK,EAAS6L,EAwBjB,OArBI7V,GAAE8V,MAEFkb,IAASpa,YAAYf,EAAQ,SAAS5N,EAAQ4O,GAC1C,GAAIA,EAASnV,MACT1N,EAAIgE,OAAO6e,EAASnV,MAAMwG,aACvB,CACH,GAAI4O,IACAC,aAAcF,EAAS1V,GACvB8vB,SAAUC,EAGdl9B,GAAImB,QAAQ2hB,MAMpB9iB,EAAIgE,OAAOgI,EAAEsO,OAAO,GAAGyH,QAIpB/hB,EAAIoB,UAIf,QAAS4U,GAAS6L,GACd,GAAIvH,KAmBJ,OAjBKuH,GAAOlZ,MACR2R,EAAOvR,MAAMgN,MAAO,OAAQgM,OAAQ,8BAGnCib,IAASG,KAAKjb,mBAAmBL,EAAOI,SACzC3H,EAAOvR,MAAMgN,MAAO,SAAUgM,OAAQ,gCAGrCib,IAASG,KAAKhb,YAAYN,EAAOO,MAClC9H,EAAOvR,MAAMgN,MAAO,MAAOgM,OAAQ,iBAGlCib,IAASG,KAAK9a,eAAeR,EAAOS,UAAWT,EAAOU,YACvDjI,EAAOvR,MAAMgN,MAAO,YAAagM,OAAQ,yBACzCzH,EAAOvR,MAAMgN,MAAO,WAAYgM,OAAQ,2BAGpCD,OAAQxH,EAAOhb,OAAQgb,OAAQA,GAI3C,QAAS0iB,KAKL,MAJKI,IACDx4B,IAGGxC,OAAOkf,OAGlB,QAASU,GAASqb,GACd,MAAOL,KAASG,KAAKnb,SAASqb,GAQlC,QAASz4B,KACL,GAAI5F,GAAMiB,EAAE,wCAAwC4K,KAAK,QACzD,KAAK7L,EACD,KAAM,mFAGVoD,QAAOkf,OAAOC,kBAAkBviB,GAGhCo+B,GAAkB,EA5FtB,GAAIF,GAAe,SA8EfE,GAAkB,CAmBtB,KAAKh7B,OAAOkf,OAAQ,CAChB,GAAIgc,GAASp7B,SAASq7B,cAAc,SACpCD,GAAOE,aAAa,OAAQ,mBAC5BF,EAAOE,aAAa,MAAO,6BAC3Bt7B,SAASC,KAAKs7B,YAAYH,GAI9B,OACItnB,SAAUA,EACVgM,SAAUA,EACVc,YAAaA,KC9GrBxkB,OAAO,cAAe,SAAUC,GAE5B,QAAS0U,KACL,GAAInQ,GAAIZ,SAASif,OAAOC,MAAM,8BAC9B,QAAKte,GAAKA,EAAExD,OAAS,EAAU,KACxBwD,EAAE,GAAG8G,MAAM,GAAI,IAG1B,MAAOqJ,KCRX3U,OAAO,yBAA0B,SAAUC,GAoBvC,QAAS8P,GAAKlO,EAAIu9B,EAAUC,EAAYC,EAAeC,EAAYC,GAC/DC,EAAM59B,EACN69B,EAAYN,EACZO,EAAcN,EACdO,EAAiBN,EACjBO,EAAcN,EACdO,EAAqBN,EAGrBO,EAAQN,EAAI7yB,KAAK,yBACjBozB,EAAOP,EAAI7yB,KAAK,gBAChBqzB,EAAUR,EAAI7yB,KAAK,wBACnBszB,EAAYr+B,EAAG+K,KAAK,6BACpBuzB,EAAWt+B,EAAG+K,KAAK,4BACnBwzB,EAAuBv+B,EAAG+K,KAAK,0BAC/ByzB,EAAoBZ,EAAI7yB,KAAK,sBAC7B0zB,EAAyBb,EAAI7yB,KAAK,6BAClC2zB,EAAuBd,EAAI7yB,KAAK,2BAE5ByzB,GACAA,EAAkB79B,GAAG,SAAUg+B,GAGnCP,EAAQz9B,GAAG,qBAAsBi+B,GACjCR,EAAQz9B,GAAG,WAAYk+B,GACvBV,EAAKx9B,GAAG,WAAYk+B,GAEpBT,EAAQz9B,GAAG,OAAQm+B,GACnBZ,EAAMv9B,GAAG,OAAQo+B,GAEjBb,EAAM3jB,IAAI6jB,GAAS7jB,IAAI4jB,GAAMx9B,GAAG,QAASq+B,GAEzCpB,EAAI7yB,KAAK,kBAAkBjK,MAAMm+B,GAEjCrB,EAAI7yB,KAAK,oBAAoBjK,MAAM,SAAUC,GACzC0E,WAAW,WACP24B,EAAQ/mB,SACT,OAIP5R,WAAW,WACPm4B,EAAI7yB,KAAK,wBAAwBsM,SAClC,KAGP,QAASsnB,KAEL,GAAKH,EAAL,CAIA,GAAIU,GAAYC,GAEhBV,GAAuBW,YAAY,UAAWF,GAC9CR,EAAqBU,YAAY,SAAUF,IAG/C,QAASC,KAEL,MAAKX,GAIEA,EAAkBhnB,GAAG,aAHjB,EAMf,QAASsnB,GAAwB/9B,GACzBjB,EAAEkX,KAAKonB,EAAQ7sB,QAEf5G,EAAOyU,OAAOzU,EAAO8Y,OAAOS,2BAA4Bmb,eAAgBvB,IAAyB,GAIzG,QAASe,GAAoB99B,GACzB,OAUJ,QAASi+B,GAAiBj+B,GACtB,GAAI0G,GAAI3H,EAAEiB,EAAE2G,eAERkO,EAAQ,IAEZ,QAAQnO,EAAEiD,KAAK,OACX,IAAK,sBACDkL,EAAQ,IACR,MACJ,KAAK,cACDA,EAAQ,KACR,MACJ,KAAK,uBACDA,EAAQ,OAKZA,GACAjL,EAAOyU,OAAOzU,EAAO8Y,OAAO,cAAgB7N,EAAQ,WAAYypB,eAAgBvB,IACjE,GAKvB,QAASiB,GAAWh+B,GACZjB,EAAEkX,KAAKknB,EAAM3sB,QAEb5G,EAAOyU,OAAOzU,EAAO8Y,OAAOQ,6BAA8Bob,eAAgBvB,IAAyB,GAK3G,QAASwB,GAAS1pB,GACd,MAAO9V,GAAEkX,KAAKpB,EAAMrE,OAGxB,QAASguB,KACL,OAEIzd,OAAQwd,EAASlB,GACjBnc,IAAKqd,EAASnB,GACdhc,UAAWmd,EAASjB,GACpBjc,SAAUkd,EAAShB,GAGnB91B,KAAM82B,EAASpB,IAOvB,QAASU,GAA2B79B,GAChC,GAAI0G,GAAI3H,EAAEiB,EAAE2G,eACR6J,EAAMzR,EAAEkX,KAAKvP,EAAE8J,MACnBiuB,GAAQ1C,EAASjb,SAAStQ,IAI9B,QAASkuB,GAAaC,GAElB9B,EAAI7yB,KAAK,gBAAgBxE,YAAYo5B,EAErC,KAAK,GAAIt2B,GAAI,EAAGA,EAAIq2B,EAAavlB,OAAOhb,OAAQkK,IAAK,CACjD,GAAIu2B,GAAMF,EAAavlB,OAAO9Q,GAE1BuL,EAAS,IACb,QAAQgrB,EAAIhqB,OACR,IAAK,SACDhB,EAASwpB,CACT,MACJ,KAAK,MACDxpB,EAASupB,CACT,MACJ,KAAK,YACDvpB,EAASypB,CACT,MACJ,KAAK,WACDzpB,EAAS0pB,CACT,MACJ,KAAK,OACD1pB,EAASspB,CACT,MACJ,SACItpB,EAASgpB,EAAI7yB,KAAK,IAAM60B,EAAIhqB,OAIhChB,GACAA,EAAO3U,SAAS0/B,GAKpBD,EAAavlB,OAAOhb,QACpByb,EAAS8kB,EAAavlB,OAAO,GAAGyH,QAIxC,QAASqd,GAAoBl+B,GACzB,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cAEZ,KAAID,EAAEE,SAAS,YAAf,CAKAgD,EAAOyU,OAAOzU,EAAO8Y,OAAOU,4BAA6Bkb,eAAgBvB,GAEzE,IAAIx/B,GAAOihC,IAEPG,EAAe5C,EAASjnB,SAASvX,EAMrC,IAJAuhC,EAAmBH,GAEnBD,EAAaC,GAETA,EAAa/d,MAEbme,EAAWxhC,OACR,CACH,GAAIsjB,GAAS,KAET8d,GAAavlB,OAAOhb,SACpByiB,EAAS8d,EAAavlB,OAAO,GAAGyH,QAGpCjX,EAAOyU,OAAOzU,EAAO8Y,OAAOW,2CACxBib,eAAgBvB,EAChBlc,OAAQA,MAKpB,QAASme,KACL,IAAKxB,EAAqBp/B,OACtB,OAAO,CAGX,IAAIsM,KAWJ,OATA8yB,GAAqBlsB,KAAK,WACtB,GAAI2tB,GAAWlgC,EAAEqI,KACjBsD,GAAOu0B,EAASt1B,KAAK,UACjBu1B,SAAUD,EAASxoB,GAAG,YACtBxK,GAAIgzB,EAASt1B,KAAK,MAClBlC,KAAMw3B,EAASt1B,KAAK,WAIrBe,EAIX,QAASo0B,GAAmBH,GACxB,GAAIQ,GAAgBH,GACpB,IAAKG,EAIL,IAAK,GAAIrhC,KAAOqhC,GAAe,CAC3B,GAAIC,GAAiBD,EAAcrhC,EAEnC,KAAKshC,EAAeF,SAAU,CAC1B,GAAI1yB,IAASqI,MAAOuqB,EAAenzB,GAAI4U,OAAQ,8BAC/C8d,GAAavlB,OAAOvR,KAAK2E,GACzBmyB,EAAa/d,OAAQ,IAQjC,QAASme,GAAWxhC,GAChB0J,EAAMX,OAGNuT,GAAS,EACT,IAAIiP,GAAI+T,EAAI7yB,KAAK,iBAEjBq1B,GAAgBvW,EAAE3S,OAElB2S,EAAE5pB,SAAS,YAAYiX,KAAK,kBAC5B0mB,EAAI7yB,KAAK,kCAAkCL,KAAK,YAAY,GAAMzK,SAAS,YAE3E68B,EAASna,YAAYrkB,GAAMoF,KAAK28B,GAAoB7+B,KAAK8+B,GAI7D,QAASC,KACL3C,EAAI7yB,KAAK,kBAAkBxE,YAAY,YAAY2Q,KAAKkpB,GACxDxC,EAAI7yB,KAAK,kCAAkCkN,WAAW,YAAY1R,YAAY,YAGlF,QAAS85B,GAAmBG,GACxBx4B,EAAMtB,SACN65B,IAEA3lB,EAAS4lB,GAGT71B,EAAOyU,OAAOzU,EAAO8Y,OAAOY,4BAA6Bgb,eAAgBvB,EAAavwB,MAAOizB,IAGjG,QAAS5lB,GAAS1D,GACVA,KAAS,EACT0mB,EAAI7yB,KAAK,UAAUtJ,OAEnBm8B,EAAI7yB,KAAK,UAAUxL,OAAOwL,KAAK,KAAKmM,KAAKA,GAWjD,QAAS2L,GAAmBra,GACxBA,EAAOA,EAAK+G,QAAQ,OAAQ,OAAQA,QAAQ,OAAQ,MACpD,IAAIuT,GAAS,SAAWta,EAAO,YAC3Bua,EAAQ,GAAIlH,QAAOiH,GACnB5X,EAAU6X,EAAMC,KAAK/gB,OAAOoL,SAAS4V,OACzC,OAAgB,QAAZ/X,EACO,GAEAgY,mBAAmBhY,EAAQ,GAAGqE,QAAQ,MAAO,MAK5D,QAAS+wB,GAAsBG,GAC3B,GAAIC,IACAC,aAAcC,EAAKviC,OAAOoiC,GAC1Bld,eAAgBV,EAAmB,MAGnCib,KACA4C,EAAErB,eAAiBvB,GAGnBE,IACA0C,EAAEG,YAAc7C,EAIpB,IAAI8C,GAAgBC,GAChBD,KACAJ,EAAEM,eAAiBF,GAGnB3B,KAAiClB,IACjCyC,EAAEO,eAAiBhD,EAGvB,IAAIjrB,GAAIyF,EAAKjG,KAAKqrB,EAAW6C,EAE7B1tB,GAAEtP,KAAK28B,GACPrtB,EAAExR,KAAK0/B,GAGX,QAASH,KACL,GAAIb,GAAgBH,GAEpB,KAAKG,EACD,OAAO,CAGX,IAAIz0B,KAEJ,KAAK,GAAI01B,KAAsBjB,GAC3Bz0B,EAAO01B,IAAsB,CAGjC,OAAO5iC,MAAKC,UAAUiN,GAI1B,QAASy1B,KAGL,GAAIE,IAAkB/B,eAAgBvB,EAElCqB,MAAiClB,IACjCmD,EAAeC,qBAAuBpD,GAG1CtzB,EAAOyU,OAAOzU,EAAO8Y,OAAOa,gBAAiB8c,GAAgB5yB,OAAO,WAChExG,EAAMtB,SAENsB,EAAM3D,OAAM,GACZvE,EAAE,aAAaqF,UAAU,GAErB44B,EACAh8B,SAASsL,SAAW0wB,EAGpBh8B,SAASsL,SAASwT,WAQ9B,QAAS2e,GAAQ3d,GACbA,EAAWA,EAASka,cAAcxsB,QAAQ,MAAO,KAEjDquB,EAAI7yB,KAAK,cAAcxE,YAAY+6B,GAC9BrhC,SAAS4hB,GA/ZlB,GAOImc,GAPAlB,EAAW1+B,EAAQ,oBACnBwiC,EAAOxiC,EAAQ,kBACfqa,EAAOra,EAAQ,iBACf4J,EAAQ5J,EAAQ,iBAChB0U,EAAQ1U,EAAQ,eAChBuM,EAASvM,EAAQ,iBAIrBqa,GAAK3F,MAAMA,EAEX,IAAI8qB,GAAKQ,EAASD,EAAME,EAAWC,EAAUJ,EAAOL,EAAWC,EAAaC,EAAgBQ,EACxFC,EAAmBP,EAAoBQ,EAAwBC,EAwQ/D0B,EApQAT,EAAoB,cAyYpB2B,EAAgB,mEAWpB,QACIpzB,KAAMA,KCvad/P,OAAO,wBAAyB,SAASC,GASrC,QAAS8P,GAAKlO,GACVuhC,EAAiBvhC,EAAG+K,KAAK,mBAAmBjK,MAAM0gC,GAClDpB,EAAgBmB,EAAerqB,OAE/B0mB,EAAM59B,EAWV,QAAS6iB,GAAmBra,GACxBA,EAAOA,EAAK+G,QAAQ,OAAQ,OAAQA,QAAQ,OAAQ,MACpD,IAAIuT,GAAS,SAAWta,EAAO,YAC3Bua,EAAQ,GAAIlH,QAAOiH,GACnB5X,EAAU6X,EAAMC,KAAK/gB,OAAOoL,SAAS4V,OACzC,OAAgB,QAAZ/X,EACO,GAEAgY,mBAAmBhY,EAAQ,GAAGqE,QAAQ,MAAO,MAM5D,QAASiyB,GAAuBzgC,GAC5B,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cACZ,KAAID,EAAEE,SAAS,YAAf,CAEA,GAAI85B,GAAgBh6B,EAAEnJ,KAAK,cAG3B,IAFAojC,EAAej6B,EAAEnJ,KAAK,aAEjBmjC,EAAL,CAGAz5B,EAAMX,OACNuT,GAAS,GAETnT,EAAExH,SAAS,YAAYiX,KAAK,iBAE5B,IAAIlE,GAAIyF,EAAKjG,KAAKmvB,GAAuBtC,eAAgBoC,EAAele,eAAgBV,EAAmB,OAE3G7P,GAAExR,KAAKogC,GAAuBl+B,KAAKm+B,KAGvC,QAASD,KACL55B,EAAMtB,SACNsB,EAAM3D,OAAM,GACZvE,EAAE,aAAaqF,UAAU,GACzBpD,SAASsL,SAASwT,SAItB,QAASjG,GAAS1D,GACVA,KAAS,EACT0mB,EAAI7yB,KAAK,UAAUtJ,OAEnBm8B,EAAI7yB,KAAK,UAAUxL,OAAOwL,KAAK,KAAKmM,KAAKA,GAKjD,QAAS2qB,GAAmBjC,GACxBhlB,EAASglB,GACT2B,EAAeh7B,YAAY,YAAY2Q,KAAKkpB,GAC5Cp4B,EAAMtB,SA5EV,GAKIk3B,GAAK2D,EAAgBnB,EALrB3nB,EAAOra,EAAQ,iBACf4J,EAAQ5J,EAAQ,iBAEhBujC,EAAuB,+BA+BvBD,GAAe,CA6CnB,QACIxzB,KAAMA,KC7Ed/P,OAAO,kBAAmB,SAAUC,GAoBhC,QAASmB,GAAKuiC,EAAUC,EAAWC,EAAYC,EAASl9B,GAC/Bm9B,SAAjBn9B,IAA4BA,GAAe,GAG/CV,GAEA,IAAIxE,GAAMC,EAAEC,WAER+D,EAAIgB,EAAQvF,MAEZwF,KAGIjF,EAAE4oB,WAAW3jB,GACbjB,EAAEtC,KAAK,WACCuD,MACAV,IACAxE,EAAImB,aAIZ8C,EAAEtC,KAAK6C,GAAO7C,KAAK3B,EAAImB,UAI/BmhC,EAAWF,EAEXG,EAAWN,EAASn6B,SAAS,aAC7B06B,EAAmBP,EAASn6B,SAAS,oBAErC26B,EAAUR,EAEVS,EAAaR,EAEb5hC,EAAWmK,IAEXk4B,EAAgBriC,EAAS4K,KAAK,UAE1Bi3B,GAAY7hC,EAASF,SAAS+hC,GAGlCphC,EAAMqF,OAAO9F,GAEbE,IAEAiiC,EAAQriC,SAASwiC,GAGjB/hC,EAAKC,GAAG,SAAU+hC,EAElB,IAAI1vB,GAAInT,EAAIoB,SAEZ,OADA+R,GAAEhT,GAAKG,EACA6S,EAIX,QAAS0vB,KAEDviC,GAAYmiC,IACZniC,EAASC,IAAI,WAAYuiC,KACzBtiC,KAIR,QAASA,KACL,GAIIG,GAJAoiC,EAAeC,EAAUP,GACzBQ,EAAcR,EAAQS,aACtBC,EAAe7iC,EAAS4iC,YAG5B,IAAIV,EAAkB,CAClB,GAAIY,GAAmBC,SAASV,EAAcpiC,IAAI,UAC9C+iC,EAAcX,EAAcO,aAAe,CAC/CviC,GAAOoiC,EAAapiC,KAAQsiC,EAAc,EAAKE,EAAeC,EAAmBE,MAEjF3iC,GAAOoiC,EAAapiC,KAAQsiC,EAAc,EAAME,EAAe,CAGnE,IAAIziC,GAAM,CAENA,GADA6hC,EACMQ,EAAariC,IAAMJ,EAASijC,cAAgB,EAE5CR,EAAariC,IAAM+hC,EAAQc,cAAgB,EAErDjjC,EAASC,KAAKG,IAAIA,EAAKC,KAAKA,IAE5ByB,OAAOwD,WAAWC,EAAiB,IAIvC,QAASm9B,GAAU7iC,GACf,GAAI8D,GAAI9D,EAAG6xB,QACX,IAAIsQ,EAAU,CACV,GAAIkB,GAAK3iC,EAAKyE,YACVm+B,EAAK5iC,EAAK0E,YAEd,QACI5E,KAAKsD,EAAEtD,KAAO8iC,EACd/iC,IAAIuD,EAAEvD,IAAM8iC,GAGhB,MAAOv/B,GAIf,QAAS6+B,KACL,MAAOR,GAAW,QAAU,WAShC,QAAS73B,KACL,GAAIi5B,GAASzjC,EAAE,2GAUf,OARAyjC,GAAOtjC,SAASmiC,EAAW,gBAAkB,iBAE7CmB,EAAOnjC,KAAKE,UAAU,IAAMD,SAAWsiC,MAEvCJ,EAAWhjC,OAGXgkC,EAAOx4B,KAAK,YAAY9E,OAAOs8B,GACxBgB,EAsBX,QAASl/B,KACLm/B,IAEKrjC,IAEDoiC,GAEA3hC,EAAMqF,OAAOs8B,EAAW9gC,QAGxBtB,GAAUA,EAASR,SACnB2iC,GAASA,EAAQ/7B,YAAYk8B,GAEjCF,EAAapiC,EAAWmiC,EAAU,KAElCx9B,EAAQnF,UAKZ,QAAS8jC,GAAKvsB,EAAM9L,GAChB,GAAKjL,EAAL,CACAqjC,GAEA,IAAIr/B,GAAUhE,EAAS4K,KAAK,YAAY4F,QACpC8yB,EAAO3jC,EAAE,uDAAyDoX,EAAO,gBACzE9L,IAAKq4B,EAAKxjC,SAASmL,GAEvBq4B,EAAKrjC,KACDsB,MAAMyC,EAAQ4+B,aACdnhC,OAAOuC,EAAQi/B,gBAGnBj/B,EAAQu/B,OAAOD,GAEfE,EAAQF,GAGZ,QAASD,KACAG,IACLA,EAAMhkC,SACNgkC,EAAQ,MAGZ,QAASj+B,KACL,GAAIwB,GAAKpH,EAAEqH,GAAGC,mBACTjH,IAAa+G,GAGlBA,EAAG/G,GAAU,GAxNjB,GAQIgiC,GAAUC,EAAUG,EAAYF,EAiLhCsB,EAzLA7+B,EAAU1G,EAAQ,mBAElBqkC,EAAe,SAEf3gC,EAAOhC,EAAEiC,UACTnB,EAAQd,EAAEgC,EAAK,GAAGE,MAClBtB,EAAOZ,EAAEmC,QA8ITugC,EAAgB,KAOhBriC,EAAW,KAOXmiC,EAAU,IAyDd,QACImB,KAAKA,EACLD,SAASA,EACTn/B,MAAMA,EACNq+B,QAAQA,EACRnjC,KAAKA,KAUbwI,KAAK67B,QAAU77B,KAAK87B,GAAGD,QChPvBzlC,OAAO,qBAAsB,SAASC,GAmBlC,QAAS0lC,GAAWC,EAAMC,EAAeC,GACrC97B,KAAK47B,KAAOA,EACZ57B,KAAK67B,cAAgBA,EACrB77B,KAAK87B,OAASA,EA4BlB,MAzBAH,GAAWv7B,WAIP27B,SAAU,WACN,GAAI5gC,IACA+7B,eAAkBl3B,KAAK47B,KAc3B,OAVI57B,MAAK67B,gBACL1gC,EAAEigB,eAAiBpb,KAAK67B,eAKxB77B,KAAK87B,SACL3gC,EAAEu9B,YAAc14B,KAAK87B,QAGlB3gC,IAKRwgC,IClDX3lC,OAAO,qBAAsB,SAASC,GA2BlC,QAASouB,GAAKvrB,EAAS+J,EAAUm5B,GAG7B,GAAwB,YAApBljC,EAAQoC,QACR,MAAOpC,EAIX+J,GAAWlL,EAAEkL,EACb,IAAIo5B,EA2BJ,OAxBID,KACAC,EAAep5B,EAASkM,QAK5BlM,EAAS/K,SAAS,YAAYyK,KAAK,YAAY,GAG3Cy5B,GACAn5B,EAASkM,KAAKitB,GAIlBljC,EAAQuN,OAAO,WACXxD,EAASzE,YAAY,YAAY0R,WAAW,YAGxCmsB,GACAp5B,EAASkM,KAAKktB,KAKfnjC,EASX,QAASojC,GAASr5B,GACd,MAAOlL,GAAEkL,GAAUwM,GAAG,aAI1B,OACIgV,KAAMA,EACN6X,SAAUA,KC7ElBlmC,OAAO,4BAA6B,SAASC,GAEzC,GAAIkmC,GAAalmC,EAAQ,sBACrBqa,EAAOra,EAAQ,iBAmBfujC,EAAuB,+BAQvB4C,EAAiBpS,SAASloB,KAAKlG,QAE/BswB,WAAY,SAASpxB,GAEjBkF,KAAKq8B,WAAavhC,EAAQuhC,WAI1Br8B,KAAKiwB,gBAAgBqM,8BAA+B,4BAE/CxhC,EAAQyhC,gBACTv8B,KAAKw8B,cAWbC,wBAAyB,SAAS7jC,GAE9B,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cAEZ,IAAI48B,EAAWD,SAAS58B,GACpB,OAAO,CAIXU,MAAKyS,UAAS,EAGd,IAAI5H,GAAIyF,EAAKjG,KAAKmvB,EAAsBx5B,KAAKq8B,WAAWN,WAGxDI,GAAW9X,KAAKxZ,EAAGvL,EAAG,kBAEtB68B,EAAW9X,KAAKxZ,EAAG7K,KAAKrI,EAAE,0CAG1BkT,EAAExR,KAAK1B,EAAEmM,MAAM9D,KAAK08B,sBAAuB18B,OAC3C6K,EAAEtP,KAAK5D,EAAEmM,MAAM9D,KAAK28B,mBAAoB38B,QAO5C08B,sBAAuB,SAASp5B,GAK5B,QAASrC,KACL0C,EAAM1C,QAAQ,kBAAmB0C,GAJrC,GAAIxI,GAAI6E,KAAK48B,uBACTj5B,EAAQ3D,IAMR7E,IAAKA,EAAEkL,OAGPlL,EAAEkL,OAAOpF,KAETA,KASR07B,mBAAoB,SAASE,GAEzB78B,KAAKyS,SAASoqB,IAOlBD,qBAAsB,aAOtBJ,WAAY,aAQZ/pB,SAAU,SAASoqB,GACf,GAAIhlC,GAAKmI,KAAKowB,IAAIxtB,KAAK,SAGnBi6B,GACAhlC,EAAGT,OAAOwL,KAAK,KAAKmM,KAAK8tB,GAEzBhlC,EAAGyB,SAOf,OAAO8iC,KC7IXpmC,OAAO,2BAA4B,SAASC,GAExC,GAAImmC,GAAiBnmC,EAAQ,oBACzBuM,EAASvM,EAAQ,kBAcjB6mC,EAAgBV,EAAexgC,QAE/B4gC,WAAY,WACJx8B,KAAK+8B,YACLv6B,EAAOyU,OAAOzU,EAAO8Y,OAAOqB,qBAAsBua,eAAgBl3B,KAAKq8B,WAAWT,OAElFp5B,EAAOyU,OAAOzU,EAAO8Y,OAAOiB,wBAAyB2a,eAAgBl3B,KAAKq8B,WAAWT,QAI7FgB,qBAAsB,WAClB,MAAI58B,MAAK+8B,YACEv6B,EAAOyU,OAAOzU,EAAO8Y,OAAOsB,kBAAmBsa,eAAgBl3B,KAAKq8B,WAAWT,OAE/Ep5B,EAAOyU,OAAOzU,EAAO8Y,OAAOoB,qBAAsBwa,eAAgBl3B,KAAKq8B,WAAWT,QAQjGmB,UAAW,WACP,MAAgC,SAAzB/8B,KAAKq8B,WAAWT,OAK/B,OAAOkB,KC7CX9mC,OAAO,yBAA0B,SAASC,GAEtC,GAAImmC,GAAiBnmC,EAAQ,oBAEzBuM,EAASvM,EAAQ,kBASjB+mC,EAAcZ,EAAexgC,QAG7B4gC,WAAY,WACRh6B,EAAOyU,OAAOzU,EAAO8Y,OAAOkB,sBAAuB0a,eAAgBl3B,KAAKq8B,WAAWT,QAGvFgB,qBAAsB,WAClB,MAAOp6B,GAAOyU,OAAOzU,EAAO8Y,OAAOmB,mBAAoBya,eAAgBl3B,KAAKq8B,WAAWT,SAM/F,OAAOoB,KC3BXhnC,OAAO,wBAAyB,SAAUC,GAqBtC,QAASmB,GAAK6lC,GAIV,GAAIpiC,GAAMqiC,CAEND,MAAiB,IACjBpiC,GAAO,iBACPsiC,GAAgB,GAGpBt9B,EAAMjF,QAAQC,GACV8C,SAAU,gCACVpE,MAAO,MACRF,KAAK+jC,GAGZ,QAASA,GAAWvlC,GAEhBA,EAAG+K,KAAK,iBAAiBjK,MAAM0kC,GAE/BC,IACAC,EAAc1lC,GAEVslC,GACAtlC,EAAG+K,KAAK,8BAA8BsM,QAI9C,QAASouB,KACA1f,OAAOxT,OACRwT,OAAOxT,KAAO,SAAUzO,GACpB,GAAIA,IAAMiiB,OAAOjiB,GACb,KAAM,IAAImkB,WAAU,qCAExB,IAAYjV,GAARpH,IACJ,KAAKoH,IAAKlP,GACFiiB,OAAOxd,UAAUyB,eAAeN,KAAK5F,EAAGkP,IACxCpH,EAAEhD,KAAKoK,EAGf,OAAOpH,KAKnB,QAAS+5B,KACLC,EAA8B9lC,EAAE,2BAChC+lC,EAAyB/lC,EAAE,qBAG3B0L,EAAE6G,KAAKvS,EAAE,aAAc,SAAUgmC,GAC7B,GAAIC,GAAWjmC,EAAEgmC,GAASxnC,KAAK,WAE/BynC,GAAWA,EAASx2B,QAAQ,KAAM,KAAKwsB,cACnCgK,IACAA,EAAWxnC,KAAKG,MAAMqnC,GAGtBv6B,EAAE6G,KAAK0zB,EAAU,SAAUC,GAEjBA,IAAWC,KACbA,EAAgCD,OAGpCC,EAAgCD,GAASp9B,KAAKk9B,EAAQx4B,MAEjD44B,EAA+BJ,EAAQx4B,QAExC44B,EAA+BJ,EAAQx4B,MAAQxN,EAAE,QAC5C4K,KAAK,OAAQo7B,EAAQx4B,MACrB4J,KAAK4uB,EAAQ5uB,MACbjX,SAAS,wBAM9B,IAAIkmC,GAAmB36B,EAAE+G,KAAK0zB,GAE1BG,EAAe,IAAMD,EAAiBn6B,KAAK,KAAO,aAElDq6B,EAAa,IACjBC,GAAgB,GAAIzqB,QAAOuqB,EAAcC,GAO7C,QAASX,GAAc1lC,GAUnB,QAASo2B,KACL,GAAImQ,KAAezmC,EAAEkX,KAAKE,EAAK3F,OAC3Bi1B,EAAcC,EAAQjvB,GAAG,WAC7B,OAAO+uB,IAAcC,EAZzB,GAAIE,GAAS1mC,EAAG+K,KAAK,oBACjBmM,EAAOlX,EAAG+K,KAAK,kBACf3E,EAAOpG,EAAG+K,KAAK,kBACf07B,EAAUzmC,EAAG+K,KAAK,gBAEtB46B,KAEAzuB,EAAKxJ,KAAK,QAASi5B,GASnBD,EAAO5lC,MAAM,SAAUC,GACnB,IAAI2lC,EAAO/+B,SAAS,YAApB,CAIA,GAAIxD,GAAUrE,EAAEkX,KAAKE,EAAK3F,MAE1Bq1B,GAAaziC,EAASiC,EAAKmL,UAK/B2F,EAAK2vB,MAAM,SAAU9lC,GACjB2lC,EAAOtH,YAAY,YAAahJ,OAGpCqQ,EAAQ3lC,MAAM,SAAUC,GACpB2lC,EAAOtH,YAAY,YAAahJ,OAGpCp2B,EAAG+K,KAAK,mBAAmBjK,MAAM,WAC7BoW,EAAK3F,IAAI,IACTvJ,EAAM3D,UAId,QAASyiC,GAAyBrO,GAC9BA,EAAQx4B,SAAS,WAGrB,QAAS8mC,GAAyBtO,GAC9BA,EAAQlyB,YAAY,WAGxB,QAASogC,GAAsB3O,GAC3B,GAAI9gB,GAAOpX,EAAEkX,KAAKghB,EAAMpjB,OAAOtV,OAE3B0nC,EAAsB9vB,EAAK+J,MAAMqlB,EAGjCU,IAAuBA,EAAoB7nC,OAAS,EACpD2nC,EAAyBlB,GAGzBmB,EAAyBnB,EAI7B,IAAIqB,GAAmBz7B,EAAE4f,WAAW8b,EAA4BF,EAChEx7B,GAAE6G,KAAK40B,EAAkB,SAAUE,GAC/B,GAAIC,GAA4BnB,EAAgCkB,EAChE37B,GAAE6G,KAAK+0B,EAA2B,SAAUC,GAExC,GAAIC,GAA8BpB,EAA+BmB,EAC7DC,GAA4B3/B,SAAS,aACrCo/B,EAAyBO,GACzBA,EAA4B3gC,SAC5B4gC,QAMZ,IAAIC,GAAch8B,EAAE4f,WAAW4b,EAAqBE,EACpD17B,GAAE6G,KAAKm1B,EAAa,SAAUC,GAC1B,KAAIF,GAAwBG,GAA5B,CAIA,GAAIC,GAA4B1B,EAAgCwB,EAChEj8B,GAAE6G,KAAKs1B,EAA2B,SAAUC,GACxC,KAAIL,GAAwBG,GAA5B,CAIA,GAAIG,GAA8B3B,EAA+B0B,EAE5DC,GAA4BlgC,SAAS,aAEtCkgC,EAA4BnzB,SAASmxB,GACrCiB,EAAyBe,GACzBN,WAMZL,EAA6BF,EAGjC,QAASJ,GAAaziC,EAASiC,GAC3B,GAAI0hC,GAAUhoC,EAAE,qBACZioC,EAAOjoC,EAAE,iBAGbgoC,GAAQvoC,OAAOyoC,WAAWvmC,OAE1BgX,EAAKjG,KAAKy1B,GACN9jC,QAASA,EACTkJ,SAAUtL,SAASsL,SAASC,KAC5BlH,KAAMA,EACNsgC,OAAQ,YACTl4B,OAAO,WACNu5B,EAAKxoC,OAAOyoC,WAAWvmC,SAQ/B,QAAS+jC,GAAiBzkC,GACtB,GAAImnC,GAAUpoC,EAAEiB,EAAE2G,eAAe1B,QACjCkiC,GAAQjoC,SAAS,UAAU+nC,WAAWzhC,YAAY,UAE9C2hC,EAAQvgC,SAAS,qBACjBlC,WAAW,WACPyiC,EAAQn9B,KAAK,YAAYsM,SAC1B,KAQX,QAASnJ,KAELpO,EAAE,wCAAwCgB,MAAMvB,GAEhDkZ,EAAK3F,MAAMA,GAhQf,GAOIwyB,GAGAgB,EAEAT,EACAD,EAbAntB,EAAOra,EAAQ,iBACf0U,EAAQ1U,EAAQ,eAChB4J,EAAQ5J,EAAQ,iBAEhBinC,EAAyB,qBACzB4C,EAAqB,wBAIrBhC,KAEAC,KAGAgB,KACAK,EAAuB,EAEvBG,EAAiC,CAsPrC,OAHA5nC,GAAEoO,IAIE3O,KAAMA,KC1QdpB,OAAO,wBAAyB,SAASC,GAErC,GAAI+pC,GAAe/pC,EAAQ,yBACvBoa,EAAWpa,EAAQ,0BAA0Boa,SAC7C7N,EAASvM,EAAQ,kBACjBkmC,EAAalmC,EAAQ,sBACrBqa,EAAOra,EAAQ,iBAgBfgqC,EAAwB,4BACxBC,EAA0B,kCAO1BC,EAAanW,SAASloB,KAAKlG,QAE3B4G,QACI49B,4BAA6B,6BAC7BC,+BAAgC,gCAChCC,+BAAgC,+BAChCC,sBAAuB,wBACvBC,4BAA6B,0BAGjCn+B,OAAQ,WAEJ,GAAIxK,GAAKmI,KAAKrI,EAAE,sBAChBqI,MAAKygC,UAAY,GAAIpwB,IAAUxY,GAAIA,EAC/B+Y,uBAAwB/Y,EAAG1B,KAAK,wBAEpC6J,KAAKygC,UAAUjoC,GAAG,UAAWb,EAAEmM,MAAM9D,KAAK0gC,uBAAwB1gC,OAElEwC,EAAOyU,OAAOzU,EAAO8Y,OAAOqB,qBAAsBua,eAAgB,UAQtEyJ,2BAA4B,WAExB3gC,KAAKiB,QAAQ,SAEb++B,EAAa5oC,MAAwB,GAGrCoL,EAAOyU,OAAOzU,EAAO8Y,OAAOuB,mBAAoB+jB,MAAO,aAU3DC,6BAA8B,SAASjoC,GAEnC,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cAEZ,KAAID,EAAEE,SAAS,YAAf,CAKA,GAAIshC,GAASxhC,EAAEyhC,QAAQ,SAASv4B,QAG5Bw4B,EAAaF,EAAOG,KAAK,QAEzBD,GAAWhqC,SACX8pC,EAAOxnC,OACP0nC,EAAW5pC,UASnB8pC,sBAAuB,SAAStoC,GAE5B,GAAIuoC,GAAoBxpC,EAAEiB,EAAE2G,eAExBg2B,EAAa4L,EAAkBhrC,KAAK,SAGxC,IAAKo/B,EAAL,CAIA,GAAI1qB,GAAIyF,EAAKjG,KAAK41B,GAAwBvH,YAAanD,GAEvDv1B,MAAKohC,wBAAwBv2B,EAAGs2B,EAAmB,WAAa5L,KASpE8L,uBAAwB,SAASzoC,GAE7B,GAAI0oC,GAAkB3pC,EAAEiB,EAAE2G,eAEtBsL,EAAIyF,EAAKjG,KAAK61B,EAElBlgC,MAAKohC,wBAAwBv2B,EAAGy2B,EAAiB,mBAUrDF,wBAAyB,SAASv2B,EAAG0zB,EAAQgD,GAIzCpF,EAAW9X,KAAKxZ,EAAG,0BACnBsxB,EAAW9X,KAAKxZ,EAAG0zB,EAAQ,kBAE3B1zB,EAAEzF,MAAM,SAASqyB,GACb39B,OAAO0nC,MAAM/J,KAKjB5sB,EAAExR,KAAK1B,EAAEmM,MAAM,WACX9D,KAAKyhC,kBAAkBF,IACxBvhC,QAOP0gC,uBAAwB,WAEpB/oC,EAAE,QAAQ2B,MAEV,IAAIi/B,GAAI/1B,EAAOyU,OAAOzU,EAAO8Y,OAAOsB,kBAAmBsa,eAAgB,QAGvEqB,GAAElyB,OAAO1O,EAAEmM,MAAM,WACb9D,KAAKiB,QAAQ,oBACdjB,QAQPyhC,kBAAmB,SAASF,GAExB5pC,EAAE,QAAQ2B,MACV,IAAIi/B,GAAI/1B,EAAOyU,OAAOzU,EAAO8Y,OAAOuB,mBAAoB+jB,MAAOW,GAG/DhJ,GAAElyB,OAAO1O,EAAEmM,MAAM,WACb9D,KAAKiB,QAAQ,oBACdjB,SAOX,OAAOmgC,KChMXnqC,OAAO,cAAe,SAAUC,GAgB5B,QAASyrC,GAAMC,EAAUC,GACrB,MAAK9nC,QAAO+nC,QAMZ/nC,QAAO+nC,IAAI,QAASF,EAAUC,WAL1BryB,SAAQ6G,IAAI,4BAA6BurB,EAAUC,GAS3D,MAAOF,KCzBX1rC,OAAO,2BAA4B,SAAUC,GAEzC,GAAI6rC,GAAc7rC,EAAQ,iBACtBuM,EAASvM,EAAQ,kBACjByrC,EAAQzrC,EAAQ,eAShB8rC,EAA4B,gCAC5BC,EAAsB,gBAOtBC,EAAgBjY,SAASloB,KAAKlG,QAE9BswB,WAAY,SAAUpxB,GAElBkF,KAAKq8B,WAAavhC,EAAQuhC,WAG1B75B,EAAOyU,OAAOzU,EAAO8Y,OAAOM,qBAAsBsb,eAAgBl3B,KAAKq8B,WAAWT,OAGlF8F,EAAM,qBAIVr/B,OAAQ,WACJ,GAAIizB,GAAgB0M,EAAsBhiC,KAAKq8B,WAAWT,IAC1DkG,GAAY/7B,KAAK/F,KAAKowB,IAClB2R,EACA/hC,KAAKq8B,WAAWT,KAChBtG,EACAt1B,KAAKq8B,WAAWP,UAM5B,OAAOmG,KCjDXjsC,OAAO,iCAAkC,SAASC,GA8D9C,QAASisC,GAAoBtG,EAAMC,EAAeC,GAM9C97B,KAAKq8B,WAAa,GAAIV,GAAWC,EAAMC,EAAeC,GAItDr2B,EAAUlE,KAAKvB,MArDnB,GAAIyF,GAAYxP,EAAQ,2BAA2BwP,UAE/Ck2B,EAAa1lC,EAAQ,sBAGrB6mC,EAAgB7mC,EAAQ,mBACxB+mC,EAAc/mC,EAAQ,iBACtBkqC,EAAalqC,EAAQ,gBACrBgsC,EAAgBhsC,EAAQ,mBAExBuM,GADSvM,EAAQ,qBACRA,EAAQ,mBAGjBqa,EAAOra,EAAQ,iBAQfksC,EAAiB,yCAOjBxrB,GACAhZ,SAAU,4BACVpE,MAAO,IACPqD,cAAc,EA4IlB,OAlHAslC,GAAoB9hC,WAMhBqG,aAAc,WAIV,MAAO6J,GAAKjG,KAAKrK,KAAKoiC,kBAAmBpiC,KAAKq8B,WAAWN,aAI7DqG,gBAAiB,WACb,MAAOD,IAQX9/B,OAAQ,WAEJ,GAAIggC,GAAYriC,KAAKnI,GAAG+K,KAAK,kBACzB3E,EAAOokC,EAAUlsC,KAAK,OAE1B,QAAQ8H,GACJ,IAAK,OAED,KAEJ,KAAK,YACD+B,KAAKsiC,aAAe,GAAIL,IAAepqC,GAAIwqC,EAAWhG,WAAYr8B,KAAKq8B,YACvE,MAEJ,KAAK,YACDr8B,KAAKsiC,aAAe,GAAIxF,IAAejlC,GAAIwqC,EAAWhG,WAAYr8B,KAAKq8B,YACvE,MAEJ,KAAK,UACDr8B,KAAKsiC,aAAe,GAAItF,IAAanlC,GAAIwqC,EAAWhG,WAAYr8B,KAAKq8B,YACrE,MAEJ,KAAK,SACDr8B,KAAKsiC,aAAe,GAAInC,IAAYtoC,GAAIwqC,EAAWhG,WAAYr8B,KAAKq8B,aAKxEr8B,KAAKsiC,eACLtiC,KAAKsiC,aAAajgC,SAGlBrC,KAAKsiC,aAAa9pC,GAAG,kBAAmBb,EAAEmM,MAAM9D,KAAK0gC,uBAAwB1gC,OAC7EA,KAAKsiC,aAAa9pC,GAAG,qBAAsBb,EAAEmM,MAAM9D,KAAKuiC,sBAAuBviC,OAC/EA,KAAKsiC,aAAa9pC,GAAG,QAASb,EAAEmM,MAAM9D,KAAKwiC,cAAexiC,SAKlE5I,KAAM,WACFqO,EAAUrF,UAAUhJ,KAAKmK,KAAKvB,KAAM2W,IAOxC+pB,uBAAwB,WACpB1gC,KAAKyiC,mBASTD,cAAe,WACXxiC,KAAK9D,OAAM,GACXsG,EAAOyU,OAAOzU,EAAO8Y,OAAOO,sBAOhC0mB,sBAAuB,WACnBviC,KAAKyiC,mBAOTA,gBAAiB,WAEbziC,KAAK9D,OAAM,GAIXvE,EAAE,aAAaqF,UAAU,GAGzBpD,SAASsL,SAASwT,WAK1BwpB,EAAoBQ,SAASj9B,GAGtBy8B,IC5LXlsC,OAAO,yBAA0B,SAAUC,GAuCvC,GAAI0sC,GAAc3Y,SAASloB,KAAKlG,QAE5B8qB,UAAW,gBAEXlkB,QACI7J,MAAS,qBAIbuzB,WAAY,SAAUpxB,GAClBkF,KAAKlF,QAAUA,MACfkF,KAAKzI,aAAeyI,KAAKlF,QAAQvD,eAAgB,EACjDyI,KAAK4iC,mBAAqB5iC,KAAKlF,QAAQ8nC,qBAAsB,EAE7D5iC,KAAK/B,KAAO+B,KAAKlF,QAAQmD,MAAQ,QAEjC+B,KAAK6iC,gBAAkBlrC,EAAE,UAAUG,SAAS,8BACvCyK,KAAK,KAAM,2BAYpBugC,kBAAmB,SAAUlqC,GACzB,GAAImqC,GAAmBnqC,EAAE6T,SAAWzM,KAAKnI,IAAMe,EAAE6T,SAAWzM,KAAK6iC,gBAAgB7nC,IAAI,EAErF,IAAK+nC,EAAL,CAIA,GAAIzuB,GAAKtU,KAAKlF,QAAQkoC,aAGlB3/B,GAAEkd,WAAWjM,IACbA,IAGAtU,KAAKzI,cACLyI,KAAK1G,SAQblC,KAAM,WAGF4I,KAAKqC,SACLrC,KAAKowB,IAAIt4B,SAAS,iBAAmBkI,KAAK/B,MAEtC+B,KAAK4iC,oBACL5iC,KAAKowB,IAAIt4B,SAAS,iCAGJ,UAAdkI,KAAK/B,MAAkC,gBAAd+B,KAAK/B,OAC9B+B,KAAKowB,IAAItyB,OAAOkC,KAAK6iC,gBAIzB,IAAII,GAAYjjC,KAAKkjC,cAEH,iBAAdljC,KAAK/B,MACL+B,KAAKowB,IAAIn4B,IAAI,aAAc+H,KAAKmjC,aAAaF,EAAU,KAI3DA,EAAUvqC,QAAQsH,KAAKnI,IAGvBmI,KAAKowB,IAAIh5B,OAAOU,SAAS,WAK7BwB,KAAM,WACF0G,KAAKowB,IAAIhyB,YAAY,SAErB,IAAIvG,GAAKmI,KAAKowB,GAEd,IAAkB,wBAAdpwB,KAAK/B,KACLpG,EAAGL,SACHwI,KAAKiB,QAAQ,aACV,CACH,GAAIL,GAAOZ,IAEXnI,GAAGurC,cAAc,WACbvrC,EAAGL,SACHoJ,EAAKK,QAAQ,aAKzBiiC,aAAc,WACV,GAAI5/B,GAAS3L,EAAE,0BAEf,OAAI2L,GAAOtM,QAAwB,UAAdgJ,KAAK/B,KACfqF,EAGJ3L,EAAE,SAObwrC,aAAc,SAAUF,GACpB,MAA0B,SAAtBA,EAAU9S,QACHxnB,KAAK+X,IAAIuiB,EAAUvpC,aAAcI,OAAOuD,aAG5C4lC,EAAUvpC,eAKzB,QACIipC,YAAaA,KCtKrB3sC,OAAO,cAAe,SAAUC,GAkC5B,QAASotC,GAAM/iC,EAAU+e,GAEjBA,IACA/e,EAAW3I,EAAEmM,MAAMxD,EAAU+e,IAIjCikB,EAAO7iC,KAAKH,GAERijC,EACAzpC,OAAOwD,WAAWkmC,EAAcC,GAEhCC,EAAKF,GAMb,QAASA,KACL,GAAKF,EAAOtsC,OAAZ,CAKA,GAAI4P,GAAQ08B,CAEZA,MAEAK,GAAgB,CAGhB,KAAK,GAAIziC,GAAI,EAAGA,EAAI0F,EAAM5P,OAAQkK,IAC9B0F,EAAM1F,IAGVyiC,IAAgB,GASpB,QAASC,GAActjC,EAAU+e,GACzBskB,GAEItkB,IACA/e,EAAW3I,EAAEmM,MAAMxD,EAAU+e,IAIjC/e,KAIJ+iC,EAAM/iC,EAAU+e,GAYpB,QAASzhB,GAAKmL,EAAMsW,GACXA,IACDA,EAAUvlB,OAGd,IAAIwJ,GAAS,WACT,GAAI+c,GAAOvf,SAGXuiC,GAAM,WACFt6B,EAAKlI,MAAMwe,EAASgB,KAI5B,OAAO/c,GArGX,GAAIogC,GAAO5pC,OAAO+pC,sBAAwB/pC,OAAO+pC,uBAAyB/pC,OAAOgqC,0BAC7EhqC,OAAOiqC,6BAA+BjqC,OAAOkqC,wBAI7CT,GAAaG,EACbD,EAAiB,GAEjBH,KA2BAK,GAAgB,CAsEpB,QACIN,MAAOA,EACPzlC,KAAMA,EACNgmC,cAAeA,KCzHvB5tC,OAAO,uBAAwB,SAAUC,GAErC,GAAIqa,GAAOra,EAAQ,iBACf0G,EAAU1G,EAAQ,aAClBguC,EAAMhuC,EAAQ,eACd8O,EAAU9O,EAAQ,qBAClBwJ,EAASxJ,EAAQ,oBAEjBsC,EAAOZ,EAAEmC,QACTrB,EAAQd,EAAEiC,SAASC,MAsGnB4L,EAAYukB,SAASloB,KAAKlG,QAK1BqG,gBACIrF,cAAc,EACdd,aAAc,aACdooC,WAAW,EACXtB,oBAAoB,EACpBuB,UAAW,SAYf/gC,iBAAkB,GAWlBghC,gBAAiB,GASjBC,aAAa,EAQbC,cAAe,WACX,MAAOvK,SASX7N,WAAY,SAAUpxB,GASlBkF,KAAKsD,OAAS3L,EAAEC,WAGhBoI,KAAKlF,QAAUuI,EAAEzH,UAAWoE,KAAKiC,eAAgBnH,OAGjDkF,KAAKwC,OAASa,EAAEzH,WACZ2oC,0BAA2B,kBAC3BC,oBAAqB,mBACrBC,yBAA0B,qBAC1BC,yBAA0B,qBAC1BC,sBAAuB,sBACxB3kC,KAAKwC,QAGRxC,KAAKpD,aAAeoD,KAAKlF,QAAQ8B,eAAgB,EAE7CoD,KAAKlF,QAAQopC,WACblkC,KAAKowB,IAAIt4B,SAAS,cAItBS,EAAKC,GAAG,SAAU6K,EAAEkhB,SAAS5sB,EAAEmM,MAAM9D,KAAK9H,SAAU8H,MAAO;AAG3DA,KAAK4kC,gBAgBT3+B,WAAY,WACR,GAAInN,GAAUnB,EAAEC,WAKZwL,EAAmBC,EAAEC,OAAOtD,KAAM,mBAGtC,IAAIoD,EAAkB,CAClB,GAAIpH,GAAUrE,EAAEyL,GAAkB9H,MASlC,OAPIU,IACAA,EAAUgE,KAAK6kC,cAAc7oC,GAC7BlD,EAAQD,QAAQmD,IAEhBlD,EAAQ4C,OAAO,aAAe0H,EAAmB,mBAG9CtK,EAIX,GAAIgsC,GAAWzhC,EAAEC,OAAOtD,KAAM,kBAG9B,KAAK8kC,EAED,MADAhsC,GAAQ4C,OAAO,+BAAiCsE,MACzClH,CAIX,IAAIyR,GAASlH,EAAEC,OAAOtD,KAAM,gBAE5B,OAAIqD,GAAEC,OAAOtD,KAAM,eAERsQ,EAAKjG,KAAKy6B,EAAUv6B,GAIxB5S,EAAEqD,IAAI8pC,EAAUv6B,IAG3Bs6B,cAAe,SAAUE,GACrB,MAAOA,IAGXC,aAAc,WACV,MAAkC,gBAA3BhlC,KAAKlF,QAAQqpC,WAiBxB/sC,KAAM,SAAU6tC,GAUZ,GARAjlC,KAAKklC,WAAaD,IAAcjlC,KAAKmlC,WAAa,GAGlDnlC,KAAKowB,IAAIt4B,SAAS,yBACdkI,KAAKklC,YACLllC,KAAKowB,IAAIt4B,SAAS,SAAWkI,KAAKklC,YAAc,KAGhDllC,KAAKlF,QAAQuB,YACb2D,KAAKolC,SAAWztC,EAAE,UAAUG,SAAS,4BAA4ByU,SAASvM,KAAKlF,QAAQuB,aACvF2D,KAAKolC,SAAStnC,OAAOkC,KAAKowB,SAEvB,CAEHpwB,KAAKrD,QAAU,GAAIA,GAAQgmC,aACvBprC,aAAcyI,KAAKpD,aACnBqB,KAAM+B,KAAKlF,QAAQqpC,UACnBvB,mBAAoB5iC,KAAKlF,QAAQ8nC,qBAGrC5iC,KAAKrD,QAAQkmC,gBAAgB/kC,OAAOkC,KAAKowB,KACzCpwB,KAAKrD,QAAQvF,MAEb,IAAIwJ,GAAOZ,IACXA,MAAKrD,QAAQnE,GAAG,QAAS,WACtBoI,EAAKK,QAAQ,WAMpB,GAAIjF,GAAUgE,KAAKiG,aAGfo/B,EAAU,WACc,YAApBrpC,EAAQd,SAER8E,KAAKslC,cAab,OARAxrC,QAAOwD,WAAW3F,EAAEmM,MAAMuhC,EAASrlC,MAAO,KAI1ChE,EAAQ3C,KAAK1B,EAAEmM,MAAM9D,KAAKulC,mBAAoBvlC,OAC9ChE,EAAQT,KAAK5D,EAAEmM,MAAM9D,KAAKwlC,qBAAsBxlC,OAGzCA,KAAKsD,QAGhBgiC,YAAa,WACTtlC,KAAKylC,SAASzlC,KAAK0lC,sBASvBH,mBAAoB,SAAUjqC,GAC1B0E,KAAKylC,SAASnqC,EAAM,WAIhB0E,KAAK2lC,eAGL3lC,KAAK4lC,aAGL5lC,KAAK6lC,gBAGL7lC,KAAKqC,SAELrC,KAAK8lC,YAIbA,OAAQ,aASRN,qBAAsB,SAAUpgC,GAC5BpF,KAAKylC,SAASzlC,KAAK+lC,gBAAgB3gC,KAYvCqgC,SAAU,SAAUnqC,EAAM0qC,GAEtB/B,EAAIZ,MAAM,WAGF5jC,EAAOzF,gBACPvB,EAAMX,SAAS,sBAGnBkI,KAAKowB,IAAI90B,KAAKA,GAEd0E,KAAK9H,WAEDmL,EAAEkd,WAAWylB,IACbA,EAAYzkC,KAAKvB,OAGtBA,OAOP0lC,kBAAmB,WACf,MAAO,mOASH1lC,KAAKlF,QAAQgB,aACb,sBAORiqC,gBAAiB,SAAU3gC,GACvB,MAAO,+QASXlN,SAAU,WAEN,GAAK8H,KAAKnI,GAAGouC,WAAb,CAIA,GAAIC,GAAS,GAETzsC,EAASuG,KAAKowB,IAAI32B,SAElB2D,EAAetD,OAAOuD,aAAe9E,EAAKkB,QAG1CuG,MAAKlF,QAAQuB,cACbe,EAAe4C,KAAKlF,QAAQuB,YAAY5C,SAI5C,IAAIuD,GAAYrF,EAAEmC,QAAQkD,WAEtBgD,MAAKglC,iBACLhoC,EAAY,EAGhB,IAAI5E,GAAOgF,EAAe,EAAO3D,EAAS,EAAKuD,CAG/C5E,GAAMuQ,KAAK+X,IAAIwlB,EAAQ9tC,GAEvB4H,KAAKowB,IAAIn4B,IAAI,aAAcG,GAAKN,SAAS,YAQ7CoT,SAAU,SAAU5H,GAEhBtD,KAAKmmC,WAAW7iC,GAGhBtD,KAAKomC,cAELpmC,KAAKsD,OAAOzK,QAAQyK,IAUxB6iC,WAAY,SAAU7iC,KAOtBpH,MAAO,SAAUmqC,GAEbrmC,KAAKoG,QAAQigC,GAGbrmC,KAAKomC,cAELpmC,KAAKiB,QAAQ,SAEbjB,KAAKsD,OAAO5H,OAAO2qC,IAUvBjgC,QAAS,SAAUigC,KAQnBD,YAAa,WAETpmC,KAAKowB,IAAIt4B,SAAS,QAGdkI,KAAKrD,SACLqD,KAAKrD,QAAQrD,MAGjB,IAAIgtC,GAAkBtmC,KAAKolC,SAEvBvtC,EAAKmI,KAAKowB,GAGdv4B,GAAGurC,cAAc,WACbvrC,EAAGL,SAGHiB,EAAM2F,YAAY,sBAEdkoC,GACAA,EAAgB9uC,WAKpBwI,KAAKumC,iBACLvmC,KAAKumC,eAAe/uC,SACpBwI,KAAKumC,eAAiB,OAa9BV,cAAe,WAGX,GAAIW,GAAWnjC,EAAEC,OAAOtD,KAAM,YAG1B2D,EAAQ3D,IAGZA,MAAKrI,EAAE,kBAAkBuS,KAAK,WAC1B,GAAIrS,GAAKF,EAAEqI,MAEPtJ,EAAMmB,EAAG1B,KAAK,WACdswC,EAAUD,EAAS9vC,EAEvB,KAAKA,IAAQ+vC,EAET,WADAl3B,SAAQnK,MAAM,4BAA6B1O,EAAK,MAAOmB,EAK3D,IAAI6N,EAEJ,IAAI+gC,EAAQ7kC,UAER8D,EAAO,GAAI+gC,IAAS5uC,GAAIA,QACrB,CAEH,GAAIwL,EAAE4jB,SAASwf,GAAU,CAErB,GAAIC,GAAW/iC,EAAM8iC,EAErB,KAAKC,EACD,KAAM,sBAAwBD,EAAU,GAI5CA,GAAUC,EAIdhhC,EAAO+gC,EAAQllC,KAAKoC,EAAO9L,GAK1B6N,IAKLA,EAAK7F,MAAQ8D,EAGbsgC,EAAIZ,MAAM39B,EAAKrD,OAAQqD,OAa/BkgC,WAAY,WAGR5lC,KAAK2mC,SAAW3mC,KAAKrI,EAAE,eAGvBqI,KAAKmlC,MAAQnlC,KAAK2mC,SAAS58B,IAAI,WAC3B,MAAOpS,GAAEqI,MAAM7J,KAAK,UACrB6E,MAGEgF,KAAKmlC,MAAMnuC,SAIhBgJ,KAAKklC,WAAallC,KAAKklC,aAAellC,KAAKmlC,WAAa,GAGxDnlC,KAAK4mC,OAAO5mC,KAAKklC,cAIrB2B,WAAY,SAAUC,GAClB,MAAO9mC,MAAK2mC,SAASr+B,OAAO,eAAiBw+B,EAAU,OAQ3DF,OAAQ,SAAUE,EAASC,GACvB,GAAIjG,GAAS9gC,KAAK6mC,WAAWC,EAE7B,OAAKhG,GAAO9pC,WAOZitC,GAAIL,cAAc,WAGV5jC,KAAKgnC,kBACLhnC,KAAKowB,IAAIhyB,YAAY,QAAU4B,KAAKgnC,iBAE/BD,GAED/mC,KAAK4kC,YAAYnkC,KAAKT,KAAKgnC,kBAInChnC,KAAKowB,IAAIt4B,SAAS,QAAUgvC,GAG5B9mC,KAAK2mC,SAASrtC,OAEdwnC,EAAO1pC,OAGP4I,KAAK9H,WAGL8H,KAAKgnC,gBAAkBF,EAMvB9mC,KAAKinC,cAAgBnG,EAEhBiG,GACD/mC,KAAKumC,eAAe9lC,MAAMmjB,KAAM5jB,KAAKgnC,kBAIzChnC,KAAKknC,gBAAgBJ,IAEtB9mC,UA5CCuP,SAAQnK,MAAM,2BAA4B0hC,EAAS,SAAU9mC,KAAK2mC,WA+C1EQ,WAAY,WACR,GAAKnnC,KAAK4kC,YAAY5tC,OAAtB,CAIA,GAAIowC,GAAepnC,KAAK4kC,YAAYv/B,KAEpCrF,MAAK4mC,OAAOQ,GAAc,KAG9BC,SAAU,SAAUP,GAChB,MAAO9mC,MAAKmlC,MAAM19B,QAAQq/B,IAM9BQ,SAAU,WAEN,GAAIA,GAAWtnC,KAAKmlC,MAAM,EAE1B,IAAInlC,KAAKgnC,gBAAiB,CACtB,GAAIjmC,GAAMf,KAAKqnC,SAASrnC,KAAKgnC,gBAK7B,IAFAM,EAAWtnC,KAAKmlC,MAAMpkC,EAAM,IAEvBumC,EACD,OAIRtnC,KAAK4mC,OAAOU,IAMhBC,SAAU,WAEN,GAAIA,GAAWvnC,KAAKmlC,MAAM,EAE1B,IAAInlC,KAAKgnC,gBAAiB,CACtB,GAAIjmC,GAAMf,KAAKqnC,SAASrnC,KAAKgnC,gBAK7B,IAFAO,EAAWvnC,KAAKmlC,MAAMpkC,EAAM,IAEvBwmC,EACD,OAIRvnC,KAAK4mC,OAAOW,IAOhBL,gBAAiB,SAAUJ,KAO3BnB,aAAc,WACV3lC,KAAKumC,eAAiBxhC,EAAQO,UAAU3N,EAAEmM,MAAM9D,KAAKwnC,mBAAoBxnC,QAY7EwnC,mBAAoB,SAAU5uC,EAAGsC,GACzBA,EAAM0oB,MACN5jB,KAAKmnC,cAIbM,gBAAiB,SAAU7uC,GACvBA,EAAEwG,iBACFxG,EAAEyG,2BACFW,KAAK9D,MAAM,sBAGfwrC,mBAAoB,SAAU9uC,GAC1B,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cACRD,GAAEE,SAAS,aAGfQ,KAAKsnC,YAGTK,mBAAoB,SAAU/uC,GAC1B,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cACRD,GAAEE,SAAS,aAGfQ,KAAKunC,YAGTK,iBAAkB,SAAUhvC,GACxB,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cACZ,KAAID,EAAEE,SAAS,YAAf,CAIA,GAAI9I,GAAM4I,EAAEnJ,KAAK,MACbO,IACAsJ,KAAK4mC,OAAOlwC,KAIpBmxC,mBAAoB,SAAUjvC,GAC1B,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cACRD,GAAEE,SAAS,aAKfQ,KAAKmnC,eAKb,QACI1hC,UAAWA,KCz1BnBzP,OAAO,mCAAoC,SAAUC,GAEjD,GAAIwP,GAAYxP,EAAQ,wBAAwBwP,UAK5CqiC,EAAwBriC,EAAU7J,QAElC8qB,UAAW,4CAEXtjB,iBAAkB,6BAElBnB,gBACIrF,cAAc,EACdunC,UAAW,eAGf3hC,QACIulC,uBAAwB,qBAKhC,OAAOD,KCzBX9xC,OAAO,qBAAsB,SAAUC,GAcnC,QAAS8P,KAELiiC,EAAS,GAAIC,GAAWvxB,gBAAgBjB,SAAU,gCAAiCmC,UAAWswB,GAE9F,IAAIC,IACA,iCACA,mCACA,qBACA,qCACA,mCACA,gCAGAC,EAA+BD,EAAuBtkC,KAAK,KAE/DlM,GAAEywC,GAA8BzvC,MAAM0vC,GAGtCxS,EAAcl+B,EAAE,kCAAkC4K,KAAK,SAEvD+lC,IAGA3wC,EAAE,qBAAqB4K,KAAK,oBAAoB,GAEhD5K,EAAE,oBAAoB4K,KAAK,OAAQ,0BAEnC5K,EAAE,mBAAmB4wC,WAAWC,GAC3BC,WAAWC,GAGhBC,IAEAC,IACAC,IAGJ,QAASC,KACL,GAAIC,IACAC,QAAS,aACTC,QAAS,aAGb,OAAOnvC,QAAOgvC,cAAgBC,EAGlC,QAASG,KACLJ,IAAeG,QAAQE,GAAgB,GAG3C,QAASC,KACL,MAAON,KAAeE,QAAQG,GAGlC,QAASE,KACL,QAASvvC,OAAOwvC,sBAAwBF,IAG5C,QAASR,KAEDW,KAIAF,KACAG,IAIR,QAASA,KACL,GAAIC,GAAY,GAAI3B,EACpB2B,GAAUryC,OAEV8xC,IAGJ,QAASK,KACL,QAASzvC,OAAO4vC,yBAA2B5vC,OAAO6vC,sBAAwB1B,EAAWnxB,aAGzF,QAAS+xB,KACDU,KACAK,EAAiB9vC,OAAO6vC,sBAIhC,QAASnB,GAA0B5vC,GAC/BjB,EAAEiB,EAAE2G,eAAeqD,KAAK,mBAAmB9K,SAAS,SAGxD,QAAS4wC,GAAyB9vC,GAC9BjB,EAAEiB,EAAE2G,eAAeqD,KAAK,mBAAmBxE,YAAY,SAI3D,QAASiqC,GAAiBzvC,GACtB,GAAI0G,GAAI3H,EAAEiB,EAAE2G,cACZ3G,GAAEyG,0BAGF,IAAIi6B,GAAgBh6B,EAAEnJ,KAAK,SACtBmjC,KAED2O,EAAWnxB,aAEX8yB,EAAiBtQ,EAAezD,EAAav2B,EAAEnJ,KAAK,gBAEpD0zC,EAA0BvQ,EAE1B0O,EAAO5wC,SAIf,QAAS8wC,KAKL53B,EAAKpE,KAAKtS,SAASsL,UACf4kC,aAAcD,EACdnR,YAAa7C,IAIrB,QAASyS,KACL,GAAIhpC,GAAI3H,EAAE,0CACN09B,EAAa/1B,EAAEiD,KAAK,SACpBwnC,EAAYzqC,EAAEnJ,KAAK,aAEnBk/B,IACAuU,EAAiBvU,EAAYQ,EAAakU,GAUlD,QAASH,GAAiBtQ,EAAe/D,EAAYwU,GACjD,GAAIC,GAAgB,WAMpB,QAJID,IACAC,EAAgB,kBAGZA,GACJ,IAAK,YAED,GAAInqC,GAAQ,GAAIqiC,GAAoB5I,EAAe,MAAO/D,EAC1D11B,GAAMzI,MACN,MACJ,KAAK,iBACD,GAAI68B,GAAM,uDAAyDqF,EAG/D2Q,EAAKznC,EAAOiX,MAEZwwB,IAAa,QAAPA,IACNhW,GAAQ,OAASgW,GAIjB1U,IACAtB,GAAO,gBAAkBsB,GAG7B37B,SAASsL,SAAW+uB,GAMhC,QAAS0U,KACL,GAAIuB,GAAQvyC,EAAE,oBAEduyC,GAAMC,UACFlsC,KAAM,SACNkH,KAAM,iDACNilC,KAAMF,EACN3wC,MAAO,IACPE,OAAQ,MAIZ9B,EAAE,aAAawyC,WAtMnB,GAIInC,GAAQ6B,EAJR5B,EAAahyC,EAAQ,wBACrBqa,EAAOra,EAAQ,iBAIfuM,GAHQvM,EAAQ,eACNA,EAAQ,mBAETA,EAAQ,mBACjBisC,EAAsBjsC,EAAQ,yBAC9B6xC,EAAwB7xC,EAAQ,2BAChC4/B,EAAc,GAEdsT,EAAiB,8BAgMrBxxC,GAAEoO,KC5MN/P,OAAO,8BAA+B,SAAUC,GAE5C,QAASo0C,KACL1yC,EAAE,oBAAoByG,YAAY,UAGtC,QAASksC,KACL3yC,EAAE,gBAAgBG,SAAS,UAG/B,QAASwE,KACL3E,EAAE,sCAAsCgB,MAAM,SAAUC,GAEpDyxC,GACA,IAAIE,GAAkB5yC,EAAEiB,EAAE2G,cAC1BgrC,GAAgBzyC,SAAS,UAGzBwyC,GACA,IAAIE,GAAgBD,EAAgBp0C,KAAK,iBACzCwB,GAAE,IAAM6yC,GAAepsC,YAAY,YAI3CzG,EAAE2E,KCxBNtG,OAAO,8BAA+B,SAASC,GAwB3C,QAASmB,KACL,GAAIyT,GAAIyF,EAAKjG,KAAK83B,EAElBtiC,GAAM9E,aAAa8P,EAAG8L,GAAetd,KAAK+jC,GAG9C,QAASA,GAAWvlC,GAChB,GAAIqU,GAAOrU,EAAG+K,KAAK,6BACnB6nC,GAAY1kC,KAAKmG,EAAMw+B,GAG3B,QAAStkC,GAAQxN,IAIjB,QAAS0D,KACL3E,EAAE,wBAAwBgB,MAAMvB,GAtCpC,GAAIyI,GAAQ5J,EAAQ,iBAChBqa,EAAOra,EAAQ,iBACf0U,EAAQ1U,EAAQ,eAGhBw0C,EAAcx0C,EAAQ,yBAG1Bqa,GAAK3F,MAAMA,EAEX,IAAIw3B,GAAiB,yCACjBuI,EAA+B,mCAG/B/zB,GACAhZ,SAAU,2BACVpE,MAAO,IACPqD,cAAc,EACdV,MAAOkK,EAwBXzO,GAAE2E,KC5CNtG,OAAO,iBAAkB,SAAUC,GAK/B,QAAS00C,KACLrtC,WAAW,WACP3F,EAAEizC,GAAgB9yC,SAAS,WAC5B+yC,GANP,GAAID,GAAiB,6BACjBC,EAAgB,GAQpBlzC,GAAEgzC,KCXN30C,OAAO,2BAA4B,SAAUC,GASzC,QAAS8P,KACL,GAAImG,GAAOupB,EAAI7yB,KAAK,wBAChBkoC,EAAmB5+B,EAAK/V,KAAK,YAC7B40C,EAAyB7+B,EAAK/V,KAAK,uBAAyB4rC,EAC5DiJ,EAAqB9+B,EAAK/V,KAAK,wBAA0B6rC,EACzD1M,EAAgB0V,EAAqB,mBAAqBF,CAE9DhJ,GAAY/7B,KACR0vB,EACAsV,EACAD,EACAxV,EACAppB,EAAK/V,KAAK,eACV+V,EAAK/V,KAAK,mBArBlB,GACI2rC,IADS7rC,EAAQ,kBACHA,EAAQ,2BAEtB8rC,EAA4B,gCAC5BC,EAAsB,sBAEtBvM,EAAM99B,EAAE,qCAqBR89B,GAAIz+B,QACJW,EAAEoO,KCXV,SAAWpO,GACP,GACIszC,GAAKC,EAASvuC,EAASiB,EAAMutC,EAAOnvC,EAASE,EAAO+I,EAAOmmC,EAAUC,EAMrEC,EAEgCC,EAAWC,EAT3CC,EAAY,IAGZC,EAAgB,EAAGC,KAAmBC,KAAoBC,EAAe,EAAGC,KAAkBC,KAE9FC,EAAa,KAAMC,EAAe,GAAIC,OAASC,EAAY,kCAAmCC,EAAY,oBAE5FC,EAAe,EAE7BC,EAAc,EAAGC,EAAW,GAA0BC,GAAO,EAAOC,EAAK90C,EAAEiE,OAAOjE,EAAE,UAAU,IAAMouB,KAAM,IAE1G2mB,EAAQ/0C,EAAEg1C,QAAQC,MAAQj1C,EAAEg1C,QAAQE,QAAU,IAAM/yC,OAAOk3B,eAM3D8b,EAAS,WACL5B,EAAQ5xC,OAER2yC,EAAac,QAAUd,EAAae,OAAS,KAEzChB,GACAA,EAAW7gC,QAGf8/B,EAAIgC,SAGRC,EAAS,WACL,OAAI,IAAUvB,EAAawB,QAAQvB,EAAeF,EAAeC,IAC7DT,EAAQ5xC,YACRkzC,GAAO,KAIXb,EAAayB,WAAY,EAEzBzB,EAAapyC,MAAQ,OACrBoyC,EAAalyC,OAAS,OAEtBwxC,EAAI3vC,KAAK,uGAET+xC,OAGJC,EAAS,WACL,GACInoC,GACAlH,EACAgH,EACA6P,EACAy4B,EACAC,EANA/2C,EAAMm1C,EAAeF,EAczB,IANAoB,IAEAnB,EAAeh0C,EAAEiE,UAAWjE,EAAEqH,GAAGmrC,SAAShkB,SAA6C,mBAA3BxuB,GAAElB,GAAKN,KAAK,YAA6Bw1C,EAAeh0C,EAAElB,GAAKN,KAAK,aAEhIq3C,EAAM7B,EAAa8B,QAAQ7B,EAAeF,EAAeC,GAErD6B,KAAQ,EAER,YADAhB,GAAO,EAkDX,IAhDyB,gBAAPgB,KACd7B,EAAeh0C,EAAEiE,OAAO+vC,EAAc6B,IAG1CvoC,EAAQ0mC,EAAa1mC,QAAUxO,EAAIi3C,SAAW/1C,EAAElB,GAAK8L,KAAK,SAAW9L,EAAIwO,QAAU,GAE/ExO,EAAIi3C,WAAa/B,EAAavB,OAC9BuB,EAAavB,KAAOzyC,EAAElB,GAAKqI,SAAS,aAAa9H,OAASW,EAAElB,GAAKqI,SAAS,aAAenH,EAAElB,IAGjF,KAAVwO,GAAgB0mC,EAAavB,MAAQuB,EAAagC,eAClD1oC,EAAQ0mC,EAAavB,KAAK7nC,KAAK,QAGnC4C,EAAOwmC,EAAaxmC,OAAS1O,EAAIi3C,SAAW/1C,EAAElB,GAAK8L,KAAK,QAAU9L,EAAI0O,OAAS,MAE3E,mBAAqBgmB,KAAKhmB,IAAiB,KAARA,KACnCA,EAAO,MAGPwmC,EAAa1tC,MACbA,EAAO0tC,EAAa1tC,KAEfkH,IACDA,EAAOwmC,EAAa3vC,UAGjB2vC,EAAa3vC,QACpBiC,EAAO,OAEAkH,IAEHlH,EADAkH,EAAK2T,MAAMqzB,GACJ,QAEAhnC,EAAK2T,MAAMszB,GACX,MAEAz0C,EAAElB,GAAK+I,SAAS,UAChB,SAEsB,IAAtB2F,EAAKsC,QAAQ,KACb,SAGA,SAIVxJ,EAED,WADAivC,IAuCJ,QAnCY,UAARjvC,IACAxH,EAAM0O,EAAKyoC,OAAOzoC,EAAKsC,QAAQ,MAC/BxJ,EAAOtG,EAAElB,GAAKO,OAAS,EAAI,SAAW,QAG1C20C,EAAa1tC,KAAOA,EACpB0tC,EAAaxmC,KAAOA,EACpBwmC,EAAa1mC,MAAQA,EAEjB0mC,EAAakC,iBACY,QAArBlC,EAAa1tC,MAAuC,UAArB0tC,EAAa1tC,MAAyC,QAArB0tC,EAAa1tC,MAC7E0tC,EAAapyC,MAAQ,OACrBoyC,EAAalyC,OAAS,QAEtBkyC,EAAakC,gBAAiB,GAIlClC,EAAa9rC,QACb8rC,EAAamC,aAAc,EAC3BnC,EAAaoC,oBAAqB,EAClCpC,EAAaqC,oBAAqB,EAClCrC,EAAasC,oBAAqB,EAClCtC,EAAauC,iBAAkB,GAGnCvC,EAAawC,QAAUpT,SAAS4Q,EAAawC,QAAS,IACtDxC,EAAayC,OAASrT,SAAS4Q,EAAayC,OAAQ,IAEpDnD,EAAIhzC,IAAI,UAAY0zC,EAAawC,QAAUxC,EAAayC,QAExDz2C,EAAE,wBAAwBg0B,OAAO,mBAAmBpmB,KAAK,kBAAmB,WACxE5N,EAAEqI,MAAMquC,YAAYryC,EAAQ8C,cAGxBb,GACJ,IAAK,OACDgtC,EAAI3vC,KAAKqwC,EAAa3vC,SACtBqxC,GACA,MAEJ,KAAK,SACD,GAAI11C,EAAElB,GAAKoH,SAASwR,GAAG,wBAAyB,EAE5C,YADAm9B,GAAO,EAIX70C,GAAE,uCACG2B,OACAyO,aAAapQ,EAAElB,IACf8O,KAAK,mBAAoB,WACtB5N,EAAEqI,MAAMquC,YAAYryC,EAAQ8C,cAC7ByG,KAAK,kBAAmB,WACvB5N,EAAEqI,MAAMquC,YAAYpD,EAAInsC,cAGhCnH,EAAElB,GAAK8V,SAAS0+B,GAEhBoC,GACA,MAEJ,KAAK,QACDb,GAAO,EAEP70C,EAAEwyC,SAASmE,eAEXrC,EAAe,GAAIC,OAEnBD,EAAac,QAAU,WACnBG,KAGJjB,EAAae,OAAS,WAClBR,GAAO,EAEPP,EAAac,QAAUd,EAAae,OAAS,KAE7CuB,KAGJtC,EAAauC,IAAMrpC,CACnB,MAEJ,KAAK,MACDwmC,EAAa8C,UAAY,KAEzB35B,EAAM,uEAAyE62B,EAAapyC,MAAQ,aAAeoyC,EAAalyC,OAAS,gCAAkC0L,EAAO,aAClLooC,EAAM,GAEN51C,EAAEuS,KAAKyhC,EAAa+C,IAAK,SAAUruC,EAAM+I,GACrC0L,GAAO,gBAAkBzU,EAAO,YAAc+I,EAAM,aACpDmkC,GAAO,IAAMltC,EAAO,KAAO+I,EAAM,MAGrC0L,GAAO,eAAiB3P,EAAO,iDAAmDwmC,EAAapyC,MAAQ,aAAeoyC,EAAalyC,OAAS,IAAM8zC,EAAM,qBAExJtC,EAAI3vC,KAAKwZ,GAETu4B,GACA,MAEJ,KAAK,OACDb,GAAO,EAEP70C,EAAEwyC,SAASmE,eAEX3C,EAAa7gC,KAAK6jC,IAAMhD,EAAa7gC,KAAKF,QAE1CohC,EAAar0C,EAAEmT,KAAKnT,EAAEiE,UAAW+vC,EAAa7gC,MAC1CjQ,IAAKsK,EACLhP,KAAMw1C,EAAa7gC,KAAK3U,SACxBiP,MAAO,SAAU4rB,EAAgBtlB,EAAYkjC,GACrC5d,EAAerlB,OAAS,GACxBuhC,KAGRtiC,QAAS,SAAUzU,EAAMuV,EAAYslB,GACjC,GAAIr1B,GAA6B,gBAAlBq1B,GAA6BA,EAAiBgb,CAC7D,IAAgB,KAAZrwC,EAAEgQ,OAAe,CACjB,GAAoC,kBAAzBggC,GAAa7gC,KAAK6jC,IAAmB,CAG5C,GAFAnB,EAAM7B,EAAa7gC,KAAK6jC,IAAIxpC,EAAMhP,EAAMuV,EAAYslB,GAEhDwc,KAAQ,EAER,WADAtC,GAAQ5xC,QAEa,gBAAPk0C,IAAiC,gBAAPA,MACxCr3C,EAAOq3C,GAIfvC,EAAI3vC,KAAKnF,GACTk3C,QAKZ,MAEJ,KAAK,SACDwB,MAKZxB,EAAkB,WACd,GACIyB,GAAInD,EAAapyC,MACjB2J,EAAIyoC,EAAalyC,MAGjBq1C,GADAA,EAAE9wB,WAAWvW,QAAQ,KAAO,GACxBszB,UAAUpjC,EAAEmC,QAAQP,QAAiC,EAAtBoyC,EAAayC,QAAe9mB,WAAWwnB,GAAK,IAAK,IAAM,KAGjF,QAALA,EAAc,OAASA,EAAI,KAI/B5rC,EADAA,EAAE8a,WAAWvW,QAAQ,KAAO,GACxBszB,UAAUpjC,EAAEmC,QAAQL,SAAkC,EAAtBkyC,EAAayC,QAAe9mB,WAAWpkB,GAAK,IAAK,IAAM,KAGlF,QAALA,EAAc,OAASA,EAAI,KAGnC+nC,EAAI8D,UAAU,qBAAuBD,EAAI,WAAa5rC,EAAI,eAA2C,QAA1ByoC,EAAa8C,UAAsB,OAAoC,OAA1B9C,EAAa8C,UAAqB,SAAW,UAAa,+BAElL9C,EAAapyC,MAAQ0xC,EAAI1xC,QACzBoyC,EAAalyC,OAASwxC,EAAIxxC,SAE1Bo1C,KAGJN,EAAiB,WACb5C,EAAapyC,MAAQoP,KAAK+X,IAAIurB,EAAa1yC,MAAOkyC,GAClDE,EAAalyC,OAASwyC,EAAaxyC,OAEnC9B,EAAE,WAAW4K,MACTsC,GAAM,eACN2pC,IAAOvC,EAAauC,IACpBQ,IAAOrD,EAAa1mC,QACrBsH,SAAS0+B,GAEZ4D,KAGJA,EAAQ,WACJ,GAAII,GAAKC,CAIT,OAFAhE,GAAQ5xC,OAEJsE,EAAKyR,GAAG,cAAe,IAAUy8B,EAAYqD,UAAUpD,EAAcF,EAAcC,IACnFn0C,EAAEk4B,MAAM5uB,QAAQ,wBAEhBurC,GAAO,KAIXA,GAAO,EAEP70C,EAAEqE,EAAQoW,IAAIzV,IAAUgvB,SAExBh0B,EAAEmC,QAAQ6xB,OAAO,uBACjBh0B,EAAEiC,UAAU+xB,OAAO,cAEf/tB,EAAKyR,GAAG,aAA6C,YAA9By8B,EAAYsD,eACnCxxC,EAAK3F,IAAI,SAAU2F,EAAKnE,UAG5BsyC,EAAeH,EACfC,EAAeH,EACfI,EAAcH,EAEVG,EAAYgC,aACZnxC,EAAQ1E,KACJo3C,mBAAoBvD,EAAYwD,aAChCp2C,QAAW4yC,EAAYyD,eACvBC,OAAU1D,EAAYiC,mBAAqB,UAAY,OACvDt0C,OAAU9B,EAAEiC,UAAUH,WAGrBkD,EAAQ0S,GAAG,cACRq9B,GACA/0C,EAAE,oCAAoC2Q,OAAO,WACzC,MAAiC,WAA1BtI,KAAKyvC,MAAMviC,aACnBjV,KAAKiV,WAAc,WAAWxM,IAAI,mBAAoB,WACrDV,KAAKyvC,MAAMviC,WAAa,YAIhCvQ,EAAQvF,SAGZuF,EAAQrD,OAGZkyC,EAAYkE,IAEZC,IAEI/xC,EAAKyR,GAAG,aACR1X,EAAEuE,EAAMkW,IAAIg5B,GAAUh5B,IAAIi5B,IAAY/xC,OAEtC21C,EAAMrxC,EAAK1F,WAEPqzC,GACInzC,IAAK62C,EAAI72C,IACTC,KAAM42C,EAAI52C,KACVkB,MAAOqE,EAAKrE,QACZE,OAAQmE,EAAKnE,UAGrBy1C,EAAS3D,EAAUhyC,OAASiyC,EAAUjyC,OAASgyC,EAAU9xC,QAAU+xC,EAAU/xC,WAE7EuC,GAAQ4zC,OAAO9D,EAAY+D,WAAY,GAAK,WACxC,GAAIC,GAAkB,WAClB9zC,EAAQV,KAAK2vC,EAAI8E,YAAYH,OAAO9D,EAAY+D,WAAY,EAAGG,GAGnEr4C,GAAEk4B,MAAM5uB,QAAQ,mBAEhBjF,EACKixC,QACAn9B,WAAW,UACX7X,KACGg4C,eAAgBnE,EAAYqC,QAC5B50C,MAASiyC,EAAUjyC,MAA8B,EAAtBuyC,EAAYqC,QACvC10C,OAAUkyC,EAAakC,eAAiB,OAASrC,EAAU/xC,OAAS6yC,EAAoC,EAAtBR,EAAYqC,UAGlGe,EACAY,KAGArD,EAAG1mB,KAAO,EAEVpuB,EAAE80C,GAAIxzC,SAAS8sB,KAAM,IACjBmqB,SAAUpE,EAAYqE,YACtBC,OAAQtE,EAAYuE,aACpBzsB,KAAM0sB,EACNplC,SAAU4kC,SAQ1BlyC,EAAKkS,WAAW,SAEhB9T,EAAQ/D,IAAI,eAAgB6zC,EAAYqC,SAER,WAA5BrC,EAAYyE,cACZhF,EAAYiF,IAEZx0C,EAAQV,KAAK2vC,EAAI8E,YAEjBnyC,EAAKxG,OAED00C,EAAY5yC,UACZsyC,EAAUtyC,QAAU,GAGxBuzC,EAAG1mB,KAAO,MAEVpuB,GAAE80C,GAAIxzC,SAAS8sB,KAAM,IACjBmqB,SAAUpE,EAAY2E,QACtBL,OAAQtE,EAAY4E,SACpB9sB,KAAM0sB,EACNplC,SAAU8kC,MAMe,UAA7BlE,EAAYsD,eAA6B9C,EAAc,GACvDrnC,EAAM7N,OAGV4E,EACK/D,KACGsB,MAASiyC,EAAUjyC,MAA8B,EAAtBuyC,EAAYqC,QACvC10C,OAAUkyC,EAAakC,eAAiB,OAASrC,EAAU/xC,OAAS6yC,EAAoC,EAAtBR,EAAYqC,UAEjG7yC,KAAK2vC,EAAI8E,gBAEdnyC,GACK3F,IAAIuzC,GACJmF,OAAmC,QAA5B7E,EAAYyE,aAAyB,EAAIzE,EAAY2E,QAAST,OAG9EY,EAAgB,SAAU3rC,GACtB,MAAIA,IAASA,EAAMjO,OACkB,SAA7B80C,EAAYsD,cACL,wJAA0JnqC,EAAQ,8DAGtK,2BAA6B6mC,EAAYsD,cAAgB,KAAOnqC,EAAQ,UAG5E,GAGX0qC,EAAiB,WASb,GARApD,EAAWT,EAAY7mC,OAAS,GAChCqnC,EAAc,EAEdrnC,EACKgoC,QACAn9B,WAAW,SACX1R,cAED0tC,EAAYsB,aAAc,EAE1B,WADAnoC,GAAM3L,MAMV,IAFAizC,EAAW50C,EAAE4oB,WAAWurB,EAAY+E,aAAe/E,EAAY+E,YAAYtE,EAAUR,EAAcF,EAAcC,GAAe8E,EAAcrE,IAEzIA,GAAyB,KAAbA,EAEb,WADAtnC,GAAM3L,MAUV,QANA2L,EACKnN,SAAS,kBAAoBg0C,EAAYsD,eACzC9zC,KAAKixC,GACLhgC,SAAS,QACTnV,OAEG00C,EAAYsD,eAChB,IAAK,SACDnqC,EACKhN,KACGsB,MAASiyC,EAAUjyC,MAA+B,EAAtBuyC,EAAYqC,QACxC2C,WAAchF,EAAYqC,QAC1B4C,YAAejF,EAAYqC,UAGnC7B,EAAcrnC,EAAMg2B,aAAY,GAEhCh2B,EAAMsH,SAAS4+B,GAEfK,EAAU/xC,QAAU6yC,CACpB,MAEJ,KAAK,OACDrnC,EACKhN,KACG64C,WAAchF,EAAYqC,QAC1B50C,MAASiyC,EAAUjyC,MAA+B,EAAtBuyC,EAAYqC,QACxC6C,OAAUlF,EAAYqC,UAEzB5hC,SAAS4+B,EACd,MAEJ,KAAK,QACDlmC,EACKhN,IAAI,OAAmE,GAA3D8iC,UAAU91B,EAAM1L,QAAUiyC,EAAUjyC,MAAQ,IAAM,EAAG,KACjEgT,SAAS3O,EACd,MAEJ,SACIqH,EACKhN,KACGsB,MAASiyC,EAAUjyC,MAA+B,EAAtBuyC,EAAYqC,QACxC8C,YAAenF,EAAYqC,QAC3B+C,aAAgBpF,EAAYqC,UAE/B5hC,SAAS3O,GAItBqH,EAAM3L,QAGV63C,EAAkB,WAcd,OAbIrF,EAAYmC,oBAAsBnC,EAAYsF,oBAC9Cz5C,EAAEiC,UAAU2L,KAAK,aAAc,SAAU3M,GACpB,IAAbA,EAAEy4C,SAAiBvF,EAAYmC,oBAC/Br1C,EAAEwG,iBACFzH,EAAEwyC,SAASjuC,SAEU,IAAbtD,EAAEy4C,SAA8B,IAAbz4C,EAAEy4C,UAAkBvF,EAAYsF,mBAA0C,UAArBx4C,EAAE6T,OAAO0jB,SAA4C,aAArBv3B,EAAE6T,OAAO0jB,SAA+C,WAArBv3B,EAAE6T,OAAO0jB,UAC5Jv3B,EAAEwG,iBACFzH,EAAEwyC,SAAuB,IAAbvxC,EAAEy4C,QAAgB,OAAS,aAK9CvF,EAAYwF,gBAMZxF,EAAYyF,QAAUxF,EAAa/0C,OAAS,GAAuB,IAAjB60C,IACnDT,EAASh0C,aAGR00C,EAAYyF,QAAUxF,EAAa/0C,OAAS,GAAM60C,GAAiBE,EAAa/0C,OAAS,IAC1Fq0C,EAAUj0C,UAVVg0C,EAAS9xC,WACT+xC,GAAU/xC,SAalB02C,EAAU,WACDr4C,EAAE65C,QAAQt4C,UACX8C,EAAQhB,IAAI,GAAGy0C,MAAMgC,gBAAgB,UACrC7zC,EAAK5C,IAAI,GAAGy0C,MAAMgC,gBAAgB,WAGlC9F,EAAakC,gBACb7xC,EAAQ/D,IAAI,SAAU,QAG1B2F,EAAK3F,IAAI,SAAU,QAEfs0C,GAAYA,EAASv1C,QACrBiO,EAAM7N,OAGN00C,EAAYoC,iBACZhyC,EAAM9E,OAGV+5C,IAEIrF,EAAYkC,oBACZhyC,EAAQuJ,KAAK,QAAS5N,EAAEwyC,SAASjuC,OAGjC4vC,EAAYiC,oBACZpxC,EAAQ4I,KAAK,QAAS5N,EAAEwyC,SAASjuC,OAGrCvE,EAAEmC,QAAQyL,KAAK,YAAa5N,EAAEwyC,SAASuH,QAEnC5F,EAAY6F,gBACZh6C,EAAEmC,QAAQyL,KAAK,YAAa5N,EAAEwyC,SAASyH,QAGnB,UAApB9F,EAAY7tC,MACZtG,EAAE,oDAAqD,GAAIwf,OAAO06B,UAAY,iCAAmCl6C,EAAEg1C,QAAQC,KAAO,4BAA8B,IAAM,eAAiBjB,EAAa8C,UAAY,UAAY3C,EAAY3mC,KAAO,eAAeoH,SAASvQ,GAG3Q4B,EAAKxG,OAELo1C,GAAO,EAEP70C,EAAEwyC,SAASyH,SAEX9F,EAAY3F,WAAW4F,EAAcF,EAAcC,GAEnDgG,KAGJA,EAAkB,WACd,GAAI3sC,GACA4sC,CAEChG,GAAa/0C,OAAS,EAAK60C,IAC5B1mC,EAAO4mC,EAAcF,EAAe,GAAI1mC,KAEpB,mBAATA,IAAwBA,EAAK2T,MAAMqzB,KAC1C4F,EAAU,GAAI7F,OACd6F,EAAQvD,IAAMrpC,IAIlB0mC,EAAe,IACf1mC,EAAO4mC,EAAcF,EAAe,GAAI1mC,KAEpB,mBAATA,IAAwBA,EAAK2T,MAAMqzB,KAC1C4F,EAAU,GAAI7F,OACd6F,EAAQvD,IAAMrpC,KAK1BmrC,EAAQ,SAAUrB,GACd,GAAI+C,IACAz4C,MAAOwhC,SAASwQ,EAAUhyC,OAASiyC,EAAUjyC,MAAQgyC,EAAUhyC,OAAS01C,EAAK,IAC7Ex1C,OAAQshC,SAASwQ,EAAU9xC,QAAU+xC,EAAU/xC,OAAS8xC,EAAU9xC,QAAUw1C,EAAK,IAEjF72C,IAAK2iC,SAASwQ,EAAUnzC,KAAOozC,EAAUpzC,IAAMmzC,EAAUnzC,KAAO62C,EAAK,IACrE52C,KAAM0iC,SAASwQ,EAAUlzC,MAAQmzC,EAAUnzC,KAAOkzC,EAAUlzC,MAAQ42C,EAAK,IAG5C,oBAAtBzD,GAAUtyC,UACjB84C,EAAI94C,QAAgB,GAAN+1C,EAAY,GAAMA,GAGpCrxC,EAAK3F,IAAI+5C,GAETh2C,EAAQ/D,KACJsB,MAASy4C,EAAIz4C,MAA8B,EAAtBuyC,EAAYqC,QACjC10C,OAAUu4C,EAAIv4C,OAAU6yC,EAAc2C,EAA6B,EAAtBnD,EAAYqC,WAIjE8D,EAAgB,WACZ,OACQt6C,EAAEmC,QAAQP,QAAgC,EAArBuyC,EAAYsC,OACjCz2C,EAAEmC,QAAQL,SAAiC,EAArBqyC,EAAYsC,OAClCz2C,EAAEiC,UAAUqD,aAAe6uC,EAAYsC,OACvCz2C,EAAEiC,UAAUoD,YAAc8uC,EAAYsC,SAIlDsB,EAAe,WACX,GAIIwC,GAJAxsC,EAAOusC,IACPE,KACAT,EAAS5F,EAAYsG,UACrBC,EAAuC,EAAtBvG,EAAYqC,OAsCjC,OAnCIrC,GAAYvyC,MAAMykB,WAAWvW,QAAQ,KAAO,GAC5C0qC,EAAG54C,MAAQwhC,SAAUr1B,EAAK,GAAK4hB,WAAWwkB,EAAYvyC,OAAU,IAAK,IAErE44C,EAAG54C,MAAQuyC,EAAYvyC,MAAQ84C,EAG/BvG,EAAYryC,OAAOukB,WAAWvW,QAAQ,KAAO,GAC7C0qC,EAAG14C,OAASshC,SAAUr1B,EAAK,GAAK4hB,WAAWwkB,EAAYryC,QAAW,IAAK,IAEvE04C,EAAG14C,OAASqyC,EAAYryC,OAAS44C,EAGjCX,IAAWS,EAAG54C,MAAQmM,EAAK,IAAMysC,EAAG14C,OAASiM,EAAK,MACzB,SAArBimC,EAAa1tC,MAAwC,OAArB0tC,EAAa1tC,MAC7Ci0C,EAASpG,EAAkB,MAAKA,EAAmB,OAE9CqG,EAAS,MAAIzsC,EAAK,KACnBysC,EAAG54C,MAAQmM,EAAK,GAChBysC,EAAG14C,OAASshC,UAAWoX,EAAG54C,MAAQ84C,GAAkBH,EAASG,EAAgB,KAG5EF,EAAS,OAAIzsC,EAAK,KACnBysC,EAAG14C,OAASiM,EAAK,GACjBysC,EAAG54C,MAAQwhC,UAAWoX,EAAG14C,OAAS44C,GAAkBH,EAASG,EAAgB,OAIjFF,EAAG54C,MAAQoP,KAAKkY,IAAIsxB,EAAG54C,MAAOmM,EAAK,IACnCysC,EAAG14C,OAASkP,KAAKkY,IAAIsxB,EAAG14C,OAAQiM,EAAK,MAI7CysC,EAAG/5C,IAAM2iC,SAASpyB,KAAK+X,IAAIhb,EAAK,GAAK,GAAIA,EAAK,GAAmC,IAA5BA,EAAK,GAAKysC,EAAG14C,OAAS,KAAa,IACxF04C,EAAG95C,KAAO0iC,SAASpyB,KAAK+X,IAAIhb,EAAK,GAAK,GAAIA,EAAK,GAAkC,IAA3BA,EAAK,GAAKysC,EAAG54C,MAAQ,KAAa,IAEjF44C,GAGXG,EAAe,SAAU77C,GACrB,GAAIw4C,GAAMx4C,EAAIizB,QAWd,OATAulB,GAAI72C,KAAO2iC,SAAStkC,EAAIwB,IAAI,cAAe,KAAO,EAClDg3C,EAAI52C,MAAQ0iC,SAAStkC,EAAIwB,IAAI,eAAgB,KAAO,EAEpDg3C,EAAI72C,KAAO2iC,SAAStkC,EAAIwB,IAAI,oBAAqB,KAAO,EACxDg3C,EAAI52C,MAAQ0iC,SAAStkC,EAAIwB,IAAI,qBAAsB,KAAO,EAE1Dg3C,EAAI11C,MAAQ9C,EAAI8C,QAChB01C,EAAIx1C,OAAShD,EAAIgD,SAEVw1C,GAGXuB,EAAiB,WACb,GAEIvB,GACAvpC,EAHA0kC,EAAOuB,EAAavB,KAAOzyC,EAAEg0C,EAAavB,OAAQ,EAClD7gC,IAyBJ,OArBI6gC,IAAQA,EAAKpzC,QACbi4C,EAAMqD,EAAalI,GAEnB7gC,GACIhQ,MAAO01C,EAAI11C,MAA+B,EAAtBuyC,EAAYqC,QAChC10C,OAAQw1C,EAAIx1C,OAAgC,EAAtBqyC,EAAYqC,QAClC/1C,IAAK62C,EAAI72C,IAAM0zC,EAAYqC,QAAU,GACrC91C,KAAM42C,EAAI52C,KAAOyzC,EAAYqC,QAAU,MAI3CzoC,EAAOusC,IAEP1oC,GACIhQ,MAA6B,EAAtBuyC,EAAYqC,QACnB10C,OAA8B,EAAtBqyC,EAAYqC,QACpB/1C,IAAK2iC,SAASr1B,EAAK,GAAe,GAAVA,EAAK,GAAU,IACvCrN,KAAM0iC,SAASr1B,EAAK,GAAe,GAAVA,EAAK,GAAU,MAIzC6D,GAGXgpC,EAAmB,WACf,MAAKrH,GAAQ77B,GAAG,aAKhB1X,EAAE,MAAOuzC,GAASjzC,IAAI,MAAuB,IAAfo0C,EAAsB,WAEpDA,GAAgBA,EAAe,GAAK,SANhCx3B,eAAcy2B,GAa1B3zC,GAAEqH,GAAGmrC,SAAW,SAAUrvC,GACtB,MAAKnD,GAAEqI,MAAMhJ,QAIbW,EAAEqI,MACG7J,KAAK,WAAYwB,EAAEiE,UAAWd,EAAUnD,EAAE66C,SAAW76C,EAAEqI,MAAMwyC,gBAC7D7mB,OAAO,YACPpmB,KAAK,WAAY,SAAU3M,GAGxB,GAFAA,EAAEwG,kBAEEotC,EAAJ,CAIAA,GAAO,EAEP70C,EAAEqI,MAAMyyC,OAER7G,KACAF,EAAgB,CAEhB,IAAIgH,GAAM/6C,EAAEqI,MAAMuC,KAAK,QAAU,EAE5BmwC,IAAc,IAAPA,GAAqB,aAARA,GAIrB9G,EAAgBj0C,EAAE,SAAW+6C,EAAM,eAAiBA,EAAM,KAC1DhH,EAAgBE,EAAcrsB,MAAMvf,OAJpC4rC,EAAcnrC,KAAKT,MAOvBstC,OAKDttC,MAnCIA,MAsCfrI,EAAEwyC,SAAW,SAAU1zC,GACnB,GAAIgU,EAEJ,KAAI+hC,EAAJ,CAUA,GANAA,GAAO,EACP/hC,EAA+B,mBAAjB3J,WAAU,GAAqBA,UAAU,MAEvD8qC,KACAF,EAAgB3Q,SAAStwB,EAAK8U,MAAO,KAAO,EAExC5nB,EAAEkP,QAAQpQ,GAAM,CAChB,IAAK,GAAIyK,GAAI,EAAG4B,EAAIrM,EAAIO,OAAY8L,EAAJ5B,EAAOA,IACd,gBAAVzK,GAAIyK,GACXvJ,EAAElB,EAAIyK,IAAI/K,KAAK,WAAYwB,EAAEiE,UAAW6O,EAAMhU,EAAIyK,KAElDzK,EAAIyK,GAAKvJ,MAAMxB,KAAK,WAAYwB,EAAEiE,QAAQI,QAASvF,EAAIyK,IAAKuJ,GAIpEmhC,GAAgBzhC,OAAOskB,MAAMmd,EAAen1C,OAG1B,gBAAPA,GACPkB,EAAElB,GAAKN,KAAK,WAAYwB,EAAEiE,UAAW6O,EAAMhU,IAE3CA,EAAMkB,MAAMxB,KAAK,WAAYwB,EAAEiE,QAAQI,QAASvF,GAAMgU,IAG1DmhC,EAAcnrC,KAAKhK,IAGnBi1C,EAAgBE,EAAc50C,QAA0B,EAAhB00C,KACxCA,EAAgB,GAGpB4B,MAGJ31C,EAAEwyC,SAASmE,aAAe,WACtBz5B,cAAcy2B,GAEdJ,EAAQ9zC,OACRk0C,EAAe12B,YAAY29B,EAAkB,KAGjD56C,EAAEwyC,SAASwI,aAAe,WACtBzH,EAAQ5xC,QAGZ3B,EAAEwyC,SAASlJ,KAAO,WACd,MAAOtpC,GAAEwyC,SAAS8E,IAAIpD,EAAe,IAGzCl0C,EAAEwyC,SAASxd,KAAO,WACd,MAAOh1B,GAAEwyC,SAAS8E,IAAIpD,EAAe,IAGzCl0C,EAAEwyC,SAAS8E,IAAM,SAAUA,GACnBzC,IAIJyC,EAAMlU,SAASkU,GAEfrD,EAAgBG,EAEZkD,EAAM,IAAMA,EAAMlD,EAAa/0C,QAC/B00C,EAAgBuD,EAChB3B,KAEOxB,EAAYyF,QAAUxF,EAAa/0C,OAAS,IACnD00C,EAAgBuD,GAAOlD,EAAa/0C,OAAS,EAAI+0C,EAAa/0C,OAAS,EACvEs2C,OAMR31C,EAAEwyC,SAASyI,OAAS,WACZpG,IAIJA,GAAO,EAEP70C,EAAEk4B,MAAM5uB,QAAQ,mBAEhB6rC,IAEAnB,EAAakH,SAASjH,EAAeF,EAAeC,GAEpDa,GAAO,IAIX70C,EAAEwyC,SAASjuC,MAAQ,WA6Bf,QAAS42C,KACLn2C,EAAQo2C,QAAQ,QAEhB9tC,EAAMgoC,QAAQ3zC,OACdsE,EAAKtE,OAEL3B,EAAEk4B,MAAM5uB,QAAQ,oBAEhBjF,EAAQixC,QAERnB,EAAYkH,SAASjH,EAAcF,EAAcC,GAEjDC,EAAeJ,KACfE,EAAeH,EAAgB,EAC/BI,EAAcH,KAEda,GAAO,EA5CX,IAAIA,IAAQ5uC,EAAKyR,GAAG,WAApB,CAMA,GAFAm9B,GAAO,EAEHV,IAAe,IAAUA,EAAYqD,UAAUpD,EAAcF,EAAcC,GAE3E,YADAU,GAAO,EAwCX,IApCAM,IAEAn1C,EAAEuE,EAAMkW,IAAIg5B,GAAUh5B,IAAIi5B,IAAY/xC,OAEtC3B,EAAEqE,EAAQoW,IAAIzV,IAAUgvB,SAExBh0B,EAAEmC,QAAQ6xB,OAAO,uBACjBh0B,EAAEiC,UAAU+xB,OAAO,cAEnB3vB,EAAQ4G,KAAK,UAAUL,KAAK,MAAOmqC,GAAS,UAAUvhB,KAAKrxB,OAAOoL,SAASC,MAAQ,IAAM,yBAA2B,eAElF,WAA9B2mC,EAAYsD,eACZnqC,EAAMgoC,QAGVrvC,EAAK+lB,OAqB4B,WAA7BmoB,EAAYmH,cAA4B,CACxC1H,EAAYiF,GAEZ,IAAIvB,GAAMrxC,EAAK1F,UAEfszC,IACIpzC,IAAK62C,EAAI72C,IACTC,KAAM42C,EAAI52C,KACVkB,MAAOqE,EAAKrE,QACZE,OAAQmE,EAAKnE,UAGbqyC,EAAY5yC,UACZsyC,EAAUtyC,QAAU,GAGxB+L,EAAMgoC,QAAQ3zC,OAEdmzC,EAAG1mB,KAAO,EAEVpuB,EAAE80C,GAAIxzC,SAAU8sB,KAAM,IAClBmqB,SAAUpE,EAAYoH,SACtB9C,OAAQtE,EAAYqH,UACpBvvB,KAAM0sB,EACNplC,SAAU4nC,QAIdl1C,GAAKm1C,QAAqC,QAA7BjH,EAAYmH,cAA0B,EAAInH,EAAYoH,SAAUJ,KAIrFn7C,EAAEwyC,SAASuH,OAAS,WACZ/0C,EAAQ0S,GAAG,aACX1S,EAAQ1E,IAAI,SAAUN,EAAEiC,UAAUH,UAGtC9B,EAAEwyC,SAASyH,QAAO,IAGtBj6C,EAAEwyC,SAASyH,OAAS,WAChB,GAAIlsC,GAAM0tC,CAEN5G,KAIJ4G,EAAQtyC,UAAU,MAAO,EAAO,EAAI,EACpC4E,EAAOusC,KAEFmB,KAAUx1C,EAAKrE,QAAUmM,EAAK,IAAM9H,EAAKnE,SAAWiM,EAAK,MAI9D9H,EACK+lB,OACA1qB,SACGb,IAAO2iC,SAASpyB,KAAK+X,IAAIhb,EAAK,GAAK,GAAIA,EAAK,GAA0C,IAAnCA,EAAK,GAAK1J,EAAQvC,SAAW,IAAaqyC,EAAYqC,UACzG91C,KAAQ0iC,SAASpyB,KAAK+X,IAAIhb,EAAK,GAAK,GAAIA,EAAK,GAAyC,IAAlCA,EAAK,GAAK1J,EAAQzC,QAAU,IAAauyC,EAAYqC,WACnF,gBAAhBrtC,WAAU,GAAiBA,UAAU,GAAK,OAG5DnJ,EAAEwyC,SAASpkC,KAAO,WACVpO,EAAE,kBAAkBX,SAIxBW,EAAE,QAAQmG,OACNmtC,EAAMtzC,EAAE,iCACRuzC,EAAUvzC,EAAE,gDACZgF,EAAUhF,EAAE,qCACZiG,EAAOjG,EAAE,mCAGbwzC,EAAQxzC,EAAE,mCACLmG,OAAO,wZACPyO,SAAS3O,GAEdutC,EAAMrtC,OACF9B,EAAUrE,EAAE,qCACZuE,EAAQvE,EAAE,+BACVsN,EAAQtN,EAAE,mCAEVyzC,EAAWzzC,EAAE,wGACb0zC,EAAY1zC,EAAE,2GAGlBuE,EAAMvD,MAAMhB,EAAEwyC,SAASjuC,OACvBgvC,EAAQvyC,MAAMhB,EAAEwyC,SAASyI,QAEzBxH,EAASzyC,MAAM,SAAUC,GACrBA,EAAEwG,iBACFzH,EAAEwyC,SAASxd,SAGf0e,EAAU1yC,MAAM,SAAUC,GACtBA,EAAEwG,iBACFzH,EAAEwyC,SAASlJ,SAGXtpC,EAAEqH,GAAGq0C,YACLz1C,EAAK2H,KAAK,gBAAiB,SAAU3M,EAAG06C,GAChC9G,EACA5zC,EAAEwG,kBAEwC,GAAnCzH,EAAEiB,EAAE6T,QAAQzR,IAAI,GAAGu4C,cAAqB57C,EAAEiB,EAAE6T,QAAQzR,IAAI,GAAGtB,eAAiB/B,EAAEiB,EAAE6T,QAAQzR,IAAI,GAAGu4C,gBACtG36C,EAAEwG,iBACFzH,EAAEwyC,SAAUmJ,EAAQ,EAAI,OAAS,aAKxC37C,EAAE65C,QAAQt4C,SACX0E,EAAK9F,SAAS,eAGd40C,IACAxB,EAAQpzC,SAAS,gBACjB8F,EAAK9F,SAAS,gBAEdH,EAAE,8CAAgD,UAAUwzB,KAAKrxB,OAAOoL,SAASC,MAAQ,IAAM,yBAA2B,eAAkB,uEAAuEquC,UAAUrI,MAIrOxzC,EAAEqH,GAAGmrC,SAAShkB,UACVgoB,QAAS,GACTC,OAAQ,GACRl1C,SAAS,EACT2G,OAAO,EACP0xC,QAAQ,EACR9C,UAAW,OAEXl1C,MAAO,IACPE,OAAQ,IAER24C,WAAW,EACXvE,gBAAgB,EAChB8D,gBAAgB,EAEhB7mC,QACA4jC,KAAO+E,MAAO,eAEd1F,oBAAoB,EACpBC,oBAAoB,EAEpBF,aAAa,EACbyB,eAAgB,GAChBD,aAAc,OAEdlC,WAAW,EACXgC,cAAe,QACfyB,YAAa,KACblD,cAAc,EAEd4C,aAAc,OACd0C,cAAe,OAEfxC,QAAS,IACTyC,SAAU,IAEV/C,YAAa,IACbN,WAAY,OAEZa,SAAU,QACVyC,UAAW,QAEXjF,iBAAiB,EACjBoD,eAAe,EACfrD,oBAAoB,EACpBmD,mBAAmB,EAEnB3D,QAAS,aAEToF,SAAU,aAEV1M,WAAY,aAEZgJ,UAAW,aAEX6D,SAAU,aAEV7F,QAAS,cAIbx1C,EAAEiC,UAAU85C,MAAM,WACd/7C,EAAEwyC,SAASpkC,UAGhBoE", "sourcesContent": ["\n\n        var DEVMODE=false;\n        var STATIC_URI_PREFIX=\"https://s.smore.com/\";\n\n        ", "define('fire/util/json', function (require) {\r\n\r\n    /***\r\n     *\r\n     * @param {*} data\r\n     * @return {String}\r\n     */\r\n    function encode(data) {\r\n        return JSON.stringify(data);\r\n    }\r\n\r\n\r\n    /***\r\n     *\r\n     * @param {String} data\r\n     * @return {*}\r\n     */\r\n    function decode(data) {\r\n        return JSON.parse(data);\r\n    }\r\n\r\n\r\n    /****\r\n     * Fetches a path of an object safely\r\n     * @param {Object} obj\r\n     * @param {String} key\r\n     * @param {*=} fallback an optional fallback value\r\n     *\r\n     * Example:\r\n     *  json.path({a: {b: 'c'}}, 'a.b') -> 'c'\r\n     *  json.path({a: {b: 'c'}}, 'a.c') -> undefined\r\n     *  json.path({a: {b: 'c'}}, 'molsh.c') -> undefined\r\n     *\r\n     */\r\n    function path(obj, key, fallback) {\r\n        var parts = key.split('.');\r\n        var cur = obj;\r\n        for (var part; parts.length && (part = parts.shift());) {\r\n            if (part in cur) {\r\n                cur = cur[part];\r\n                if (!parts.length) {\r\n                    return cur;\r\n                }\r\n            } else {\r\n                return fallback;\r\n            }\r\n        }\r\n        return fallback\r\n    }\r\n\r\n\r\n    /****\r\n     * Sets the value of a given path\r\n     * @param {Object} obj\r\n     * @param {String} key\r\n     * @param {*} value\r\n     *\r\n     */\r\n    function setPath(obj, key, value) {\r\n        var parts = key.split('.');\r\n        var cur = obj;\r\n        for (var part; parts.length && (part = parts.shift());) {\r\n            if (part in cur && parts.length) {\r\n                cur = cur[part];\r\n                continue;\r\n            }\r\n            // if we've reached the end of the path\r\n            if (!parts.length) {\r\n                cur[part] = value;\r\n                return;\r\n            }\r\n\r\n            // if the next object doesn't exist\r\n            cur = cur[part] = {};\r\n        }\r\n    }\r\n\r\n    return {\r\n        encode: encode,\r\n        decode: decode,\r\n        path: path,\r\n        setPath: setPath\r\n    }\r\n});", "/****\n *  @fileOverview\n *\n *\n *****/\n\ndefine('fire/ui/overlay', function (require) {\n    var Z_INDEX = 5000;\n    var SHIM_CLS = 'fire-shim';\n    var FADE_DURATION = 300;\n\n    var _doc = $(document);\n    var _body = $(_doc[0].body);\n    var _win = $(window);\n    var _current;\n\n    function show(zIndex, extraClass, closeOnClick) {\n        // remove previous shim\n        remove();\n\n        zIndex = zIndex || Z_INDEX;\n\n        // new deferred\n        var dfd = $.Deferred();\n\n        // create shim\n        var el = $('<div/>').addClass(SHIM_CLS + ' ' + (extraClass || ''));\n\n        // set current + css\n        _current = el.css({position: 'absolute', 'z-index': zIndex, top: 0, left: 0, overflow: 'hidden'});\n\n\n        // resize handler\n        _win.on('resize', position);\n\n        // position\n        position();\n        // add to dom\n        _body.prepend(el);\n\n        // click handler\n        el.click(function (e) {\n            dfd.resolve(e);\n            if (closeOnClick) {\n                remove();\n            }\n        });\n\n\n        // return promise\n        return dfd.promise();\n    }\n\n\n    /****\n     *\n     * @param {Boolean=} fade\n     */\n    function remove(fade) {\n        if (!_current) return;\n        _win.off('resize', position);\n\n        if (fade) {\n            _current.animate({opacity: 0}, FADE_DURATION);\n\n        }\n\n        // support for fade\n        return $.when(_current).done(function () {\n            if (_current) _current.remove();\n            _current = null;\n        })\n    }\n\n    function position() {\n        if (!_current) return;\n\n\n        // hide the overlay to not interfere with the scroll width/height calculation\n        _current.hide();\n        _current.css({width: _body[0].scrollWidth, height: _body[0].scrollHeight});\n        _current.show();\n    }\n\n\n    return {\n        show: show,\n        remove: remove\n    };\n\n});", "// Generated by CoffeeScript 1.12.3\n\n/*\n  mobile\n  ======\n\n  A set of utility methods for testing mobile devices and media queries.\n */\ndefine('fire/util/mobile', function(require) {\n  var isLandscape, isMiniLayout, isMobile, isPhone, isPortrait, isRetina, isTablet, mq;\n  mq = function(q) {\n\n    /*\n    Test a media query and see if it matches\n    \n    Params:\n      q   The media query to test for\n    \n    Examples:\n      mobile.mq(\"screen and (max-width: 600px)\")\n      => true\n     */\n    var m, matchMedia;\n    matchMedia = window.matchMedia || window.msMatchMedia;\n    if (!matchMedia) {\n      return false;\n    }\n    m = matchMedia(q);\n    return m && (m.matches || false);\n  };\n  isMobile = function() {\n\n    /*\n    Returns true if the device is a phone or a tablet\n     */\n    return isPhone() || isTablet();\n  };\n  isLandscape = function() {\n\n    /*\n    Returns true if our orientation is landscape\n     */\n    return mq('(orientation: landscape)');\n  };\n  isPortrait = function() {\n\n    /*\n    Returns true if our orientation is portrait\n     */\n    return mq('(orientation: portrait)');\n  };\n  isPhone = function() {\n\n    /*\n    Returns true if the device is a phone\n     */\n    return mq('only screen and (min-device-width: 320px) and (max-device-width: 480px)');\n  };\n  isTablet = function() {\n\n    /*\n    Returns true if the device is a tablet\n     */\n    return mq('only screen and (min-device-width:768px) and (max-device-width:1024px)');\n  };\n  isRetina = function() {\n\n    /*\n    Returns true if the device has high pixel density\n     */\n    return mq('only screen and (-webkit-min-device-pixel-ratio : 1.5)') || mq('only screen and (min-device-pixel-ratio : 1.5)');\n  };\n  isMiniLayout = function() {\n\n    /*\n    Returns true if the screen is in mini layout\n     */\n    return mq('only screen and (max-width: 720px)');\n  };\n  return {\n    mq: mq,\n    isMobile: isMobile,\n    isLandscape: isLandscape,\n    isPortrait: isPortrait,\n    isPhone: isPhone,\n    isTablet: isTablet,\n    isRetina: isRetina,\n    isMiniLayout: isMiniLayout\n  };\n});\n", "define('fire/ui/modal', function (require) {\r\n    var overlay = require('fire/ui/overlay');\r\n    var mobile = require('fire/util/mobile');\r\n\r\n    var Z_INDEX = 101;\r\n\r\n    var DEFAULTS = {\r\n        animate: true,\r\n        width: 500,\r\n        overlayClose: true,\r\n        loadingTitle: 'Loading...',\r\n        overlayClass: '',\r\n        close: null,\r\n        cssClass: '',\r\n        loadingSubtitle: '',\r\n        zIndex: Z_INDEX,\r\n        skipOverlay: false,\r\n        containerEl: false\r\n    };\r\n\r\n    var OVERLAY_CLASS = 'fire-modal-overlay';\r\n    var MODAL_CLASS = 'fire-modal';\r\n    var MOBILE_MODAL_CLASS = 'fire-modal-mobile';\r\n\r\n    var ANIMATION_DURATION = 250;\r\n\r\n\r\n    var _win = $(window);\r\n    var _body = $('body');\r\n\r\n    var _current, _options, _contentWrap, _locked;\r\n\r\n    // This should be extracted to a helper 'fire' library\r\n    var isTouch = \"ontouchend\" in document;\r\n\r\n    var _isPhone = mobile.isPhone();\r\n\r\n    /**************************** REMOTE URL ************************************/\r\n\r\n    function showUrl(url, options) {\r\n        // fetch the remote content\r\n        return showDeferred($.get(url), options);\r\n    }\r\n\r\n    function showDeferred(deferred, options) {\r\n        var dfd = $.Deferred();\r\n\r\n        // handle the case of a resolved deferred\r\n        if (deferred.state() === 'resolved') {\r\n            deferred.done(function (r) {\r\n                show(r, options).done(dfd.resolve);\r\n                return dfd.promise();\r\n            });\r\n            return dfd.promise();\r\n        }\r\n\r\n\r\n        // show the loading screen\r\n        show(getLoading(options), options).done(function () {\r\n            // When the deferred is completed\r\n            deferred.done(function (r) {\r\n                // replace content\r\n                _contentWrap.html(r);\r\n                position();\r\n                dfd.resolve(_current);\r\n            }).fail(function (r) {\r\n                // In case of an error\r\n                _contentWrap.html(getError());\r\n                _current.addClass(MODAL_CLASS + '-error');\r\n                position();\r\n                dfd.reject(_current);\r\n            });\r\n        });\r\n\r\n\r\n        return dfd.promise();\r\n    }\r\n\r\n\r\n    function getLoading(options) {\r\n        var o = $.extend({}, DEFAULTS, options || {});\r\n\r\n        return '<div class=\"spinner\"><h3><span></span>' + o.loadingTitle\r\n            + '</h3><p class=\"help-text\">' + o.loadingSubtitle\r\n            + '</p></div>'\r\n    }\r\n\r\n    function getError() {\r\n\r\n        return '<div class=\"' + MODAL_CLASS + '-error-content\"><h3 class=\"webfont\">Oops! Something bad happened :/</h3>' +\r\n            '<p>Hope we can still be friends...</p> ' +\r\n            '<p style=\"margin-top: 15px;\"><a class=\"' + MODAL_CLASS + '-close\">Close this</a> or <a href=\"mailto:hello@smore.com\">shower us with rage</a>.</div></div>';\r\n    }\r\n\r\n    /**************************** MODAL  ************************************/\r\n\r\n\r\n    function show(content, options) {\r\n\r\n        var dfd = $.Deferred();\r\n\r\n        // init options\r\n        _options = $.extend({}, DEFAULTS, options, {});\r\n\r\n        // close the currently open modal;\r\n        close();\r\n\r\n        if (_isPhone) {\r\n            return showPhone(content);\r\n        }\r\n\r\n        var containerEl = options.containerEl || _body;\r\n        _current = setup(content, MODAL_CLASS, containerEl);\r\n\r\n        // Store the container el\r\n        if (options.containerEl) {\r\n            _current.data('containerEl', options.containerEl);\r\n        }\r\n\r\n        _current.css('width', options.width);\r\n\r\n\r\n        if (!options.skipOverlay) {\r\n            var oc = OVERLAY_CLASS;\r\n            if (options.overlayClass) {\r\n                oc += (' ' + options.overlayClass);\r\n            }\r\n\r\n            // show overlay\r\n            var o = overlay.show(_options.zIndex, oc, _options.overlayClose);\r\n\r\n            // attach close\r\n            if (_options.overlayClose) {\r\n                o.done(close);\r\n            }\r\n        }\r\n\r\n        // position\r\n        position();\r\n\r\n        if (options.resolveBeforeAnimation) {\r\n            dfd.resolve(_current);\r\n        }\r\n\r\n        // apply show animation\r\n        if (_options.animate) {\r\n            animate('show', _current);\r\n        }\r\n\r\n        // resolve the deferred after the animation completion\r\n        $.when(_current).done(dfd.resolve);\r\n\r\n        // return deferred\r\n        return dfd.promise();\r\n    }\r\n\r\n    function position() {\r\n        if (!_current || _isPhone) return;\r\n        var width = _current.width();\r\n        var height = _current.height();\r\n\r\n        var left = 0;\r\n        var top = 0;\r\n\r\n        if (_current.data('containerEl')) {\r\n            var containerEl = _current.data('containerEl');\r\n\r\n            var containerHeight = containerEl.height();\r\n            var containerWidth = containerEl.width();\r\n\r\n            // put at screen center\r\n            top = (containerHeight / 2 ) - (height / 2);\r\n\r\n            // if our modal is too big for the screen, position it 50 pixel from the top\r\n            if (top < 0) {\r\n                top = 50;\r\n            }\r\n\r\n            left = (containerWidth / 2) - (width / 2);\r\n\r\n\r\n        } else {\r\n\r\n            var scrollTop = _win.scrollTop();\r\n            var scrollLeft = _win.scrollLeft();\r\n            var screenWidth = window.innerWidth || _win.width();\r\n            var screenHeight = window.innerHeight || _win.height();\r\n\r\n            // put at screen center\r\n            top = scrollTop + (screenHeight / 2 ) - (height / 2);\r\n\r\n            // if our modal is too big for the screen, position it 50 pixel from the top\r\n            if (top < scrollTop) {\r\n                top = scrollTop + 50;\r\n            }\r\n\r\n            left = scrollLeft + (screenWidth / 2) - (width / 2);\r\n        }\r\n\r\n\r\n        _current.css({\r\n            top: top,\r\n            left: left\r\n        });\r\n\r\n        window.setTimeout(fixPlaceholders, 20);\r\n    }\r\n\r\n    function setup(content, modalClass, containerEl) {\r\n        var c = $(content).show();\r\n\r\n        var dom = $('<div/>').addClass(modalClass + '  ' + (_options.cssClass || ''));\r\n        // wrap content with a wrapper div;\r\n        _contentWrap = c.wrap('<div/>').parent().addClass(MODAL_CLASS + '-content');\r\n\r\n        dom.append(_contentWrap);\r\n        containerEl.append(dom);\r\n\r\n\r\n        // delegate the 'fire-modal-close' class to close the modal\r\n        dom.delegate('.' + MODAL_CLASS + '-close', 'click', onCloseClicked);\r\n\r\n        return dom;\r\n    }\r\n\r\n    /***\r\n     *\r\n     * @param {string} type animation type (show/hide)\r\n     */\r\n    function animate(type, el) {\r\n        if (!el) return $.when();\r\n\r\n        // remove shadow for performance\r\n        el.addClass('no-shadow');\r\n\r\n        if (type === 'show') {\r\n            el.css({'margin-top': '-50px', opacity: 0})\r\n                .show()\r\n                .animate({'margin-top': 0, 'opacity': 1}, ANIMATION_DURATION);\r\n        }\r\n\r\n        if (type === 'hide') {\r\n            el\r\n                .animate({'margin-top': '50px', 'opacity': 0}, ANIMATION_DURATION);\r\n        }\r\n\r\n\r\n        return $.when(el).done(function () {\r\n            el.removeClass('no-shadow');\r\n        });\r\n    }\r\n\r\n    /***\r\n     *\r\n     * @param {Boolean=} fast should we use animation for the close?\r\n     */\r\n    function close(fast) {\r\n        if (!_current) return $.when();\r\n\r\n        if (_isPhone) return closePhone();\r\n\r\n        unlock();\r\n\r\n        var cur = _current;\r\n        // remove events\r\n        _win.off('resize', position);\r\n\r\n        // hide overlay\r\n        var o = overlay.remove(!fast && _options.animate);\r\n\r\n        // animate hide\r\n        if (_options.animate && !fast) {\r\n            animate('hide', cur);\r\n        }\r\n\r\n        // when done\r\n        return $.when(o, cur).done(function () {\r\n            // fix a tipsy issue\r\n            $('div.tipsy').hide();\r\n\r\n            if (_options && _options.close) {\r\n                _options.close(cur);\r\n            }\r\n            cur.detach();\r\n            var containerEl = _current.data('containerEl');\r\n\r\n            _contentWrap = _current = _options = cur = null;\r\n\r\n\r\n            if (containerEl) {\r\n                containerEl.remove();\r\n            }\r\n        });\r\n    }\r\n\r\n    /*********************************************************************************\r\n     * Phone width modal\r\n     *********************************************************************************/\r\n\r\n        // TODO - maybe restore the scroll position after a close?\r\n\r\n    function closePhone() {\r\n\r\n        var cur = _current;\r\n        if (_options && _options.close) _options.close(cur);\r\n        cur.remove();\r\n\r\n        // clean up everything\r\n        _contentWrap = _current = _options = cur = null;\r\n\r\n        // restore the body state\r\n        showBodyItems();\r\n\r\n        _body.removeClass('mobile-modal-body');\r\n\r\n        // restore the scroll top\r\n\r\n        if (_prePhoneScrollTop) {\r\n            _body.scrollTop(_prePhoneScrollTop);\r\n            _prePhoneScrollTop = null;\r\n        }\r\n\r\n        return $.when();\r\n    }\r\n\r\n    var _prePhoneScrollTop = null;\r\n\r\n    /***\r\n     * Show phone content\r\n     * @param content\r\n     */\r\n    function showPhone(content) {\r\n        // store the scroll top value\r\n        _prePhoneScrollTop = _body.scrollTop();\r\n\r\n        // hide body items\r\n        hideBodyItems();\r\n\r\n        // setup phone view\r\n        _current = setup(content, MOBILE_MODAL_CLASS,_body);\r\n\r\n        _body.addClass('mobile-modal-body');\r\n\r\n        // scroll to the top\r\n        _body.scrollTop(0);\r\n        return $.when(_current);\r\n    }\r\n\r\n    var _hiddenBodyItems;\r\n\r\n    function showBodyItems() {\r\n        // restore hidden body items\r\n        _hiddenBodyItems.show();\r\n\r\n        // remove current body items\r\n        _hiddenBodyItems = null;\r\n    }\r\n\r\n    function hideBodyItems() {\r\n        _hiddenBodyItems = _body.children(':visible').hide();\r\n    }\r\n\r\n\r\n    function fixPlaceholders() {\r\n        var pf = $.fn.placeholderPolyfill;\r\n        if (!_current || !pf) return;\r\n\r\n        // apply the placeholder on child elements\r\n        pf(_current, true);\r\n    }\r\n\r\n\r\n    function lock() {\r\n        _locked = true;\r\n\r\n        if (_current) _current.addClass('fire-modal-locked');\r\n    }\r\n\r\n    function unlock() {\r\n        _locked = false;\r\n\r\n        if (_current) _current.removeClass('fire-modal-locked');\r\n    }\r\n\r\n\r\n    function onCloseClicked(e) {\r\n        e.preventDefault();\r\n        e.stopImmediatePropagation();\r\n\r\n        var t = $(e.currentTarget);\r\n        if (_locked || t.hasClass('disabled')) return;\r\n\r\n        close();\r\n    }\r\n\r\n    // setup events\r\n\r\n    if (!isTouch) {\r\n        _win.on('resize', position);\r\n    }\r\n\r\n\r\n    var module = {\r\n        close: close,\r\n        show: show,\r\n        showUrl: showUrl,\r\n        showDeferred: showDeferred,\r\n        position: position,\r\n        lock: lock,\r\n        unlock: unlock\r\n    };\r\n\r\n\r\n    /*****\r\n     * Backward compatibility\r\n     * @deprecated\r\n     */\r\n    window.fire.modal = module;\r\n\r\n    /*****\r\n     * Backward compatibility\r\n     * @deprecated\r\n     */\r\n    window.fire.modal.reposition = position;\r\n\r\n\r\n    return module;\r\n});\r\n", "// Generated by CoffeeScript 1.12.3\ndefine('fire/util/eventEmitter', function(require) {\n\n  /*\n    Event emitter class\n  \n    TODO: this needs a proper documentation\n    shlomiatar @ 16/04/13\n   */\n  var Emitter;\n  Emitter = (function() {\n    var _guid, getGuid;\n\n    _guid = 0;\n\n    getGuid = function() {\n\n      /*\n      Returns a new emitter guid\n       */\n      _guid += 1;\n      return \"ev_\" + _guid;\n    };\n\n    function Emitter() {\n      this.__ev = {};\n    }\n\n    Emitter.prototype.on = function(name, callback) {\n\n      /*\n        Register a callback\n       */\n      if (!callback) {\n        return;\n      }\n      if (!(name in this.__ev)) {\n        this.__ev[name] = [];\n      }\n      if (this.__findCallbackIdx(name, callback) > 0) {\n        return;\n      }\n      if (!callback.guid) {\n        callback.guid = getGuid();\n      }\n      this.__ev[name].push(callback);\n      return this;\n    };\n\n    Emitter.prototype.one = function(name, callback) {\n\n      /*\n      Creates a callback that will fire only once\n       */\n      var handler, self;\n      self = this;\n      handler = function() {\n        callback.apply(this, arguments);\n        return self.off(name, callback);\n      };\n      if (!callback.guid) {\n        callback.guid = getGuid();\n      }\n      handler.guid = callback.guid;\n      return this.on(name, handler);\n    };\n\n    Emitter.prototype.off = function(name, callback) {\n\n      /*\n        Unregister an event/multiple events\n      \n        Params:\n          - name      The name of the event we dergisterring\n          - callback  (optional) the callback we want to de-register. if non was specified, removes all the callbacks for\n                                 the event\n       */\n      var idx;\n      if (!callback) {\n        delete this.__ev[name];\n        return;\n      }\n      idx = this.__findCallbackIdx(name, callback);\n      if (idx > -1) {\n        this.__ev[name].splice(idx, 1);\n      }\n      return this;\n    };\n\n    Emitter.prototype.trigger = function(name) {\n\n      /*\n      Trigger an event\n       */\n      var c, i, len, ref;\n      if (!(name in this.__ev)) {\n        return;\n      }\n      ref = this.__ev[name];\n      for (i = 0, len = ref.length; i < len; i++) {\n        c = ref[i];\n        c.apply(this, Array.prototype.slice.call(arguments, 1));\n      }\n      return this;\n    };\n\n    Emitter.prototype.__findCallbackIdx = function(name, callback) {\n\n      /*\n      Locates the callback index by the event name and callback\n       */\n      var c, i, idx, len, ref;\n      if (!(name in this.__ev)) {\n        return -1;\n      }\n      ref = this.__ev[name];\n      for (idx = i = 0, len = ref.length; i < len; idx = ++i) {\n        c = ref[idx];\n        if (c === callback) {\n          return idx;\n        }\n        if (c.guid && c.guid === callback.guid) {\n          return idx;\n        }\n      }\n      return -1;\n    };\n\n    return Emitter;\n\n  })();\n  return {\n    Emitter: Emitter\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty,\n  slice = [].slice;\n\ndefine('fire/ui/view', function(require) {\n  var View, em;\n  em = require('fire/util/eventEmitter');\n\n  /*\n  The basic view building block\n   */\n  View = (function(superClass) {\n    extend(View, superClass);\n\n    function View(options) {\n      if (options == null) {\n        options = {};\n      }\n      this.options = options;\n      if (this.defaultOptions) {\n        this.options = $.extend({}, this.defaultOptions, options);\n      }\n      View.__super__.constructor.apply(this, arguments);\n      this._modifiers = {};\n      this.el = options.el;\n      if (!this.el) {\n        this.el = this.generate();\n      } else {\n        this.options = $.extend({}, this.defaultOptions, this.el.data(), options);\n      }\n      if (this.autoRender) {\n        this.render();\n        this.setup();\n      }\n    }\n\n    View.prototype.autoRender = true;\n\n    View.prototype.render = function() {\n      return null;\n    };\n\n    View.prototype.setup = function() {\n      if (this.attrs) {\n        this.el.attr(this.attrs);\n      }\n      if (this.cssClass) {\n        this.el.addClass(this.cssClass);\n      }\n      if (this.events) {\n        return this.delegate(this._extractEvents(this.events));\n      }\n    };\n\n    View.prototype.remove = function() {\n      if (this.beforeRemove) {\n        this.beforeRemove();\n      }\n      if (this.el) {\n        this.el.remove();\n      }\n      return this.removed = true;\n    };\n\n    View.prototype.find = function(selector) {\n      return this.el.find(selector);\n    };\n\n    View.prototype.delegate = function(events) {\n      var e, j, len, results;\n      results = [];\n      for (j = 0, len = events.length; j < len; j++) {\n        e = events[j];\n        results.push(this.el.on(e.name, e.selector, e.handler));\n      }\n      return results;\n    };\n\n    View.prototype.undelegate = function(events) {\n      var e, j, len, results;\n      results = [];\n      for (j = 0, len = events.length; j < len; j++) {\n        e = events[j];\n        results.push(this.el.off(e.name, e.selector, e.handler));\n      }\n      return results;\n    };\n\n    View.prototype.generate = function() {\n\n      /*\n      An override of view to allow quick generation of widget steps\n       */\n      var cls, h, selEl, selector;\n      if (this.templateSelector) {\n        selector = _.result(this, 'templateSelector');\n        selEl = $(selector);\n        h = selEl.html();\n        cls = selEl.data('class') || '';\n        if (!h) {\n          throw \"Could not find html content with the selector \" + selector + \".\";\n        }\n        return $('<div>').addClass(cls).append(h);\n      }\n    };\n\n    View.prototype._extractEvents = function(eventDict) {\n\n      /*\n      Converts an event dict to a list of event handlers\n       */\n      var extractEvent, k, v;\n      if (!eventDict) {\n        return [];\n      }\n      extractEvent = (function(_this) {\n        return function(key, handlerName) {\n          var handler, name, ref, selector;\n          ref = key.split(' '), name = ref[0], selector = 2 <= ref.length ? slice.call(ref, 1) : [];\n          handler = _this[handlerName];\n          if (!handler) {\n            throw \"The handler \" + handlerName + \" was not found in \" + _this;\n          }\n          return {\n            name: name,\n            selector: selector.join(' '),\n            handler: $.proxy(handler, _this)\n          };\n        };\n      })(this);\n      return (function() {\n        var results;\n        results = [];\n        for (k in eventDict) {\n          v = eventDict[k];\n          results.push(extractEvent(k, v));\n        }\n        return results;\n      })();\n    };\n\n    View.prototype.addModifier = function(modifier, allowDomUpdate) {\n      var u;\n      if (allowDomUpdate == null) {\n        allowDomUpdate = false;\n      }\n\n      /*\n      Add a modifier to the current view\n      \n      Params:\n        - modifier\n        - allowDomUpdate        Sets a delay so the browser could update the dom before applying the modifier\n       */\n      if (this.hasModifier(modifier)) {\n        return;\n      }\n      this._modifiers[modifier] = true;\n      u = (function(_this) {\n        return function() {\n          if (_this.el) {\n            return _this.el.addClass(\"is-\" + modifier);\n          }\n        };\n      })(this);\n      if (allowDomUpdate) {\n        return setTimeout(u, 20);\n      } else {\n        return u();\n      }\n    };\n\n    View.prototype.removeModifier = function(modifier) {\n\n      /*\n      Remove the modifier from the view\n      \n      Params:\n        - modifier\n       */\n      if (!this.hasModifier(modifier)) {\n        return;\n      }\n      delete this._modifiers[modifier];\n      if (this.el) {\n        return this.el.removeClass(\"is-\" + modifier);\n      }\n    };\n\n    View.prototype.hasModifier = function(modifier) {\n\n      /*\n      Checks if the given modifier is active\n      \n      Params:\n        - Modifier  The modifier\n      \n      Returns:\n        true if the view has the given modifier, false if not\n       */\n      return modifier in this._modifiers;\n    };\n\n    View.prototype.modifiers = function() {\n\n      /*\n      Returns a list of the active modifiers\n       */\n      var i;\n      return (function() {\n        var results;\n        results = [];\n        for (i in this._modifiers) {\n          results.push(i);\n        }\n        return results;\n      }).call(this);\n    };\n\n    return View;\n\n  })(em.Emitter);\n  return {\n    View: View\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\ndefine('fire/util/history', function(require) {\n  var HISTORY_ID, HISTORY_KEY, StateHelper, getKey, hub, onHistoryPopState;\n  HISTORY_ID = 0;\n  HISTORY_KEY = '__history_key';\n  getKey = function() {\n    HISTORY_ID += 1;\n    return \"history_key_\" + HISTORY_ID;\n  };\n  hub = $({});\n  onHistoryPopState = function(e) {\n    var k, state;\n    state = e.originalEvent.state;\n    if (!state) {\n      return;\n    }\n    k = state[HISTORY_KEY];\n    if (k) {\n      return hub.trigger(k, state);\n    }\n  };\n  $(window).on('popstate', onHistoryPopState);\n  StateHelper = (function() {\n    function StateHelper(callback) {\n      this.id = getKey();\n      hub.on(this.id, callback);\n    }\n\n    StateHelper.prototype.push = function(state) {\n      var current;\n      if (state == null) {\n        state = {};\n      }\n      state[HISTORY_KEY] = this.id;\n      if (!history.pushState) {\n        return;\n      }\n      try {\n        current = JSON.stringify(history.state);\n        if (JSON.stringify(state) === current) {\n          return;\n        }\n        return history.pushState(state, document.title, document.location.href);\n      } catch (error) {}\n    };\n\n    StateHelper.prototype.pop = function() {\n      return null;\n    };\n\n    StateHelper.prototype.remove = function() {\n      return hub.off(this.id);\n    };\n\n    return StateHelper;\n\n  })();\n  return {\n    getHelper: function(callback) {\n      return new StateHelper(callback);\n    }\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\n\n/*\n  TODO - Proper view documentation\n */\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/views/ModalView', function(require) {\n  var ModalView, history, modal, view;\n  modal = require('fire/ui/modal');\n  view = require('fire/ui/view');\n  history = require('fire/util/history');\n\n  /*\n    Provides a simple modal implementation\n  \n    @class ModalView\n   */\n  ModalView = (function(superClass) {\n    var PRELOAD_CACHE;\n\n    extend(ModalView, superClass);\n\n    PRELOAD_CACHE = {};\n\n    function ModalView(url1, options) {\n      this.url = url1;\n      this.onModalCompleted = bind(this.onModalCompleted, this);\n      ModalView.__super__.constructor.call(this, options);\n      if (this.enableHistory) {\n        this.historyHelper = history.getHelper((function(_this) {\n          return function(e, state) {\n            if (state && state.init) {\n              return _this.close();\n            }\n          };\n        })(this));\n      }\n      if (this.preload) {\n        this.getContent();\n      }\n    }\n\n    ModalView.prototype.autoRender = false;\n\n    ModalView.prototype.preload = false;\n\n    ModalView.prototype.show = function(modalOptions) {\n      var close;\n      close = $.proxy(this.onClose, this);\n      if (this.preload) {\n        modalOptions = $.extend({}, {\n          resolveBeforeAnimation: true,\n          close: close\n        }, modalOptions);\n      }\n      return modal.showDeferred(this.getContent(), modalOptions).always(this.onModalCompleted);\n    };\n\n    ModalView.prototype.onModalCompleted = function(el) {\n\n      /*\n      Happens when the modal creation is complete.\n      \n      We use this event to initalize the modal, setup history and call the render function\n       */\n      if (this.enableHistory) {\n        this.historyHelper.push({\n          init: true\n        });\n      }\n      this.el = el;\n      this.setup();\n      this.setupModalEvents();\n      this.render();\n      return modal.position();\n    };\n\n    ModalView.prototype.close = function(fast) {\n      return modal.close(fast);\n    };\n\n    ModalView.prototype.onClose = function() {\n\n      /*\n      Modals can override this to define behavior on close\n       */\n      return this.closed = true;\n    };\n\n    ModalView.prototype.setupModalEvents = function() {\n      return null;\n    };\n\n    ModalView.prototype.getContent = function() {\n\n      /*\n      Loads the content from the given url, if preload is defined, the content will be cached\n       */\n      var result;\n      if (this._loadedContent) {\n        return $.when(this._loadedContent);\n      }\n      result = this._loadContent();\n      if (this.preload) {\n        result.done((function(_this) {\n          return function(content) {\n            return _this._loadedContent = content;\n          };\n        })(this));\n      }\n      return result;\n    };\n\n    ModalView.prototype._loadContent = function() {\n\n      /*\n      Loads the content, use the preload cache if possible\n       */\n      var name;\n      if (!this.preload) {\n        return $.get(this.url);\n      }\n      return PRELOAD_CACHE[name = this.url] != null ? PRELOAD_CACHE[name] : PRELOAD_CACHE[name] = $.get(this.url);\n    };\n\n    ModalView.preloadUrl = function(url) {\n\n      /*\n      Preloads the url and stores it in cache for all the modals\n       */\n      return PRELOAD_CACHE[url] = $.get(url);\n    };\n\n    return ModalView;\n\n  })(view.View);\n  return {\n    ModalView: ModalView\n  };\n});\n", "define('fire/util/array', function (require) {\r\n    var _proto = Array.prototype;\r\n\r\n    // polyfills flag\r\n    // maybe in to future we could compile our code with legacy-ie flag to remove non important code\r\n    var POLYFILLS = true;\r\n\r\n\r\n    function normalize(items) {\r\n        if (items === null) return null;\r\n        if (Array.isArray(items)) return items.clone();\r\n        return [items];\r\n    }\r\n\r\n\r\n    /****\r\n     * Remove single or multiple items from the current array\r\n     * @param {*|Array} input\r\n     * @returns {Array}\r\n     */\r\n    _proto.remove = function (input) {\r\n        var items = normalize(input);\r\n        for (var i = 0; i < items.length; i++) {\r\n            var idx = this.indexOf(items[i]);\r\n            if (idx == -1) return this;\r\n            this.splice(idx, 1);\r\n        }\r\n        return this;\r\n    };\r\n\r\n\r\n    /***\r\n     * Removes elements that match the given lambda\r\n     * @param {function(*):boolean} lambda\r\n     * @returns {Array}\r\n     */\r\n    _proto.removeBy = function (lambda) {\r\n        return this.remove(this.where(lambda));\r\n    };\r\n\r\n    /***\r\n     * Insert the given item at the given index\r\n     * @param {*} item\r\n     * @param {number} idx\r\n     */\r\n    _proto.insert = function (item, idx) {\r\n        this.splice(idx, 0, item);\r\n    };\r\n\r\n\r\n    /***\r\n     * Inserts item before origItem\r\n     * @param {*} item\r\n     * @param {*} origItem\r\n     */\r\n    _proto.insertBefore = function (item, origItem) {\r\n        var idx = this.indexOf(origItem);\r\n        // if not found push it the the end\r\n        if (idx == -1) {\r\n            this.push(item);\r\n            return;\r\n        }\r\n\r\n        this.insert(item, idx);\r\n    };\r\n\r\n    /***\r\n     * Inserts item before origItem\r\n     * @param {*} item\r\n     * @param {*} origItem\r\n     */\r\n    _proto.insertAfter = function (item, origItem) {\r\n        var idx = this.indexOf(origItem);\r\n        // if not found push it the the end\r\n        if (idx == -1 || (idx + 1) > this.length) {\r\n            this.push(item);\r\n            return;\r\n        }\r\n\r\n        this.insert(item, idx + 1);\r\n    };\r\n\r\n\r\n    /**\r\n     * Duplicates the array\r\n     * @returns {Array}\r\n     */\r\n    _proto.clone = _proto.slice;\r\n\r\n    /***\r\n     * Checks if the given item is inside the current array\r\n     * @param {*} item\r\n     *\r\n     * @returns {boolean}\r\n     */\r\n    _proto.contains = function (item) {\r\n        return this.indexOf(item) != -1;\r\n    };\r\n\r\n\r\n    /***\r\n     * Returns the given array without the items from secondArray\r\n     * @param {Array} secondArray\r\n     * @returns {Array}\r\n     */\r\n    _proto.minus = function (secondArray) {\r\n        return this.clone().remove(secondArray);\r\n    };\r\n\r\n    /***\r\n     * Normalize input that can be single item or array to single array;\r\n     * @param items {Array/object}\r\n     * @returns {Array}\r\n     */\r\n    Array.normalize = normalize;\r\n\r\n    /***\r\n     * Returns the last element of the array\r\n     *\r\n     * @param {Function=} filter\r\n     * @returns {*}\r\n     */\r\n    _proto.last = function (filter) {\r\n        var arr = filter ? this.filter(filter) : this;\r\n        return arr[arr.length - 1];\r\n    };\r\n\r\n    /***\r\n     * Returns the first element of the array\r\n     *\r\n     * @param {Function=} filter\r\n     * @returns {*}\r\n     */\r\n    _proto.first = function (filter) {\r\n        var arr = filter ? this.filter(filter) : this;\r\n        return arr[0];\r\n    };\r\n\r\n\r\n    /***\r\n     * Adds the given item to the array only if not already inside\r\n     * returns true if the item was added\r\n     *\r\n     * @param {*} item\r\n     * @returns {boolean}\r\n     */\r\n    _proto.setPush = function (item) {\r\n        return !this.contains(item) && this.push(item);\r\n    };\r\n\r\n    /***\r\n     * Get a random item from the array\r\n     *\r\n     * @returns {*}\r\n     */\r\n    _proto.random = function () {\r\n        var i = Math.round((this.length - 1) * Math.random());\r\n        return this[i];\r\n    };\r\n\r\n    /****\r\n     * returns a unique representation of the array\r\n     *\r\n     * @returns {Array}\r\n     */\r\n    _proto.unique = function () {\r\n        var r = [];\r\n        for (var i = 0; i < this.length; i++) {\r\n            var el = this[i];\r\n            var idx = this.indexOf(el);\r\n            if (idx > -1 && idx < i) continue;\r\n            r.push(el);\r\n        }\r\n        return r;\r\n    };\r\n\r\n    _proto.sum = function (func) {\r\n        var o = 0;\r\n        for (var i = 0; i < this.length; i++) {\r\n            if (func) {\r\n                o += func(this[i]);\r\n            } else {\r\n                o += this[i];\r\n            }\r\n        }\r\n        return o;\r\n    };\r\n\r\n    /****\r\n     * Converts an array with arrays to a normal array\r\n     *\r\n     * @returns {Array}\r\n     */\r\n    _proto.flatten = function () {\r\n        var r = [];\r\n        for (var i = 0; i < this.length; i++) {\r\n            var o = this[i];\r\n            if (Array.isArray(o)) {\r\n                o.flatten().forEach(function (i) {\r\n                    r.push(i)\r\n                });\r\n            } else {\r\n                r.push(o);\r\n            }\r\n        }\r\n        return r;\r\n    };\r\n\r\n    /****\r\n     * Converts the given array to a dictionary type object\r\n     *\r\n     * converts [1,2,3,5] to {1:true, 2:true,3:true,5:true}\r\n     *\r\n     * @param {Array} array\r\n     * @returns {object.<*.boolean>}\r\n     */\r\n    Array.toObject = function (array) {\r\n        // empty object if no array/no items in array\r\n        if (!array || !array.length) return {};\r\n\r\n        var result = {};\r\n        for (var i = 0; i < array.length; i++) {\r\n            result[array[i]] = true;\r\n        }\r\n        return result;\r\n    };\r\n\r\n    function objectKeys(obj) {\r\n        var r = [];\r\n        for (var k in obj) {\r\n            r.push(k);\r\n        }\r\n        return r;\r\n    }\r\n\r\n    /**************************** POLYFILLS ************************************/\r\n\r\n    if (POLYFILLS) {\r\n        // isArray polyfill for older browsers\r\n        if (!Array.isArray) {\r\n            Array.isArray = function (val) {\r\n                return val &&\r\n                    typeof(val) === 'object' &&\r\n                    typeof(val.length) === 'number' &&\r\n                    typeof(val.splice) === 'function' && !(val.propertyIsEnumerable('length'));\r\n            }\r\n        }\r\n\r\n\r\n        // SUPPORT FOR ARRAYS IN IE8\r\n        if (!_proto.indexOf) {\r\n            _proto.indexOf = function (elt /*, from*/) {\r\n                var len = this.length >>> 0;\r\n\r\n                var from = Number(arguments[1]) || 0;\r\n                from = (from < 0)\r\n                    ? Math.ceil(from)\r\n                    : Math.floor(from);\r\n                if (from < 0)\r\n                    from += len;\r\n\r\n                for (; from < len; from++) {\r\n                    if (from in this &&\r\n                        this[from] === elt)\r\n                        return from;\r\n                }\r\n                return -1;\r\n            };\r\n        }\r\n\r\n        // polyfill for .some\r\n        if (!_proto.some) {\r\n            _proto.some = function (fn, scope) {\r\n                if (!fn) return false;\r\n                scope = scope || window;\r\n\r\n                for (var i = 0; i < this.length; i++) {\r\n                    if (fn.call(scope, this[i], i)) return true;\r\n                }\r\n\r\n                return false;\r\n            };\r\n        }\r\n\r\n        // polyfill for .forEach\r\n        if (!_proto.forEach) {\r\n            _proto.forEach = function (fn, scope) {\r\n                for (var i = 0, len = this.length; i < len; ++i) {\r\n                    fn.call(scope || this, this[i], i, this);\r\n                }\r\n            }\r\n        }\r\n\r\n        // polyfill for .filter\r\n        if (!_proto.filter) {\r\n            _proto.filter = function (fn, scope) {\r\n                var res = [];\r\n                if (!fn) return res;\r\n                scope = scope || window;\r\n\r\n                for (var i = 0; i < this.length; i++) {\r\n                    var v = this[i];\r\n                    if (fn.call(scope, v, i)) {\r\n                        res.push(v);\r\n                    }\r\n                }\r\n\r\n                return res;\r\n            };\r\n        }\r\n\r\n        if (!_proto.every) {\r\n            _proto.every = function (fn, scope) {\r\n                if (!fn) return true;\r\n                scope = scope || window;\r\n\r\n                for (var i = 0; i < this.length; i++) {\r\n                    if (!fn.call(scope, this[i], i)) return false;\r\n\r\n                }\r\n                return true;\r\n            };\r\n        }\r\n\r\n        if (!_proto.map) {\r\n            _proto.map = function (fn, scope) {\r\n                if (!fn) return this;\r\n                scope = scope || window;\r\n                var res = [];\r\n                for (var i = 0; i < this.length; i++) {\r\n                    res.push(fn.call(scope, this[i], i));\r\n                }\r\n\r\n                return res;\r\n            }\r\n        }\r\n    }\r\n\r\n    /**************************** BACKWARDS COMP ************************************/\r\n\r\n    /***\r\n     * @deprecated use .some\r\n     */\r\n    _proto.any = _proto.some;\r\n    /***\r\n     * @deprecated use .every\r\n     */\r\n    _proto.all = _proto.every;\r\n    /***\r\n     * @deprecated use .forEach\r\n     */\r\n    _proto.each = _proto.forEach;\r\n    /***\r\n     * @deprecated use .filter\r\n     */\r\n    _proto.where = _proto.filter;\r\n\r\n\r\n    /**************************** jQuery support ************************************/\r\n    if ('jQuery' in window) {\r\n        ['forEach', 'every', 'some', 'sum'].forEach(function (k) {\r\n            jQuery.fn[k] = _proto[k];\r\n        });\r\n    }\r\n\r\n\r\n    /**************************** range ************************************/\r\n\r\n    var FORMAT_REGXP = /\\{0\\}/g\r\n\r\n    /****\r\n     * Range function similar to python's range\r\n     * @param {Number} start\r\n     * @param {Number=} end\r\n     * @param {String=} format String of the format 'molsh_{0}_1', the function will an array with the strings and\r\n     *                         replace {0} with the index\r\n     * @return {Array}\r\n     */\r\n    function range(start, end, format) {\r\n        var r = [];\r\n\r\n        if (!end) {\r\n            end = start;\r\n            start = 0;\r\n        }\r\n\r\n        for (var i = start; i < end; i++) {\r\n            if (format) {\r\n                r.push(format.replace(FORMAT_REGXP, i));\r\n            } else {\r\n                r.push(i);\r\n            }\r\n        }\r\n\r\n        return r;\r\n    }\r\n\r\n    return {\r\n        toObject:Array.toObject,\r\n        keys:objectKeys,\r\n        range:range\r\n    }\r\n})\r\n;", "define('fire/net/safe', function (require) {\r\n    \"use strict\";\r\n\r\n    var GENERIC_ERROR_MESSAGE = 'Something went wrong :-/';\r\n    var _body = $('body');\r\n\r\n    /***\r\n     *\r\n     * @param {String} uri\r\n     * @param {Object=} params\r\n     * @param {Function=} successFunc\r\n     * @param {Object=} opts\r\n     *\r\n     * @returns {$.Deferred}\r\n     */\r\n    function post(uri, params, successFunc, opts) {\r\n        params = params || {};\r\n\r\n        // add the smore token\r\n        $.extend(params, {_token: token()});\r\n\r\n        var o = $.extend({\r\n            url: uri,\r\n            type: 'POST',\r\n            success: successFunc,\r\n            data: params\r\n        }, opts);\r\n\r\n        var p = $.ajax(o);\r\n\r\n        var call = p.then(handleRequest, handleFailedRequest);\r\n\r\n        // setup shorthands for compatibility with $.post\r\n        call.success = call.done;\r\n        call.error = call.fail;\r\n        call.complete = call.always;\r\n\r\n\r\n        // compatibility with jqXhr\r\n        call.abort = p.abort;\r\n        call.setRequestHeader = p.setRequestHeader;\r\n        call.getAllResponseHeaders = p.getAllResponseHeaders;\r\n        call.getResponseHeader = p.getResponseHeader;\r\n\r\n        // handle success callback\r\n        if (successFunc) {\r\n            call.done(successFunc);\r\n        }\r\n        return call;\r\n    }\r\n\r\n    function handleFailedRequest(jqXhr, statusText, error) {\r\n        var dfd = $.Deferred();\r\n\r\n        if (statusText === 'abort') {\r\n            dfd.reject(statusText, jqXhr, error);\r\n        } else {\r\n            dfd.reject(GENERIC_ERROR_MESSAGE, jqXhr, error);\r\n        }\r\n        return dfd;\r\n    }\r\n\r\n\r\n    /****\r\n     *\r\n     * @param data\r\n     * @param textStatus\r\n     * @param jqXhr\r\n     * @return {jQuery.Deferred}\r\n     * @private\r\n     */\r\n    function handleRequest(data, textStatus, jqXhr) {\r\n        // create the new deferred\r\n        var dfd = $.Deferred();\r\n        // if there is data, and no status information\r\n        if (!data || data && !data.status) {\r\n            dfd.resolve(data, textStatus, jqXhr);\r\n        }\r\n\r\n        // if we have status\r\n        if (data.status) {\r\n            if (data.status === 'success') {\r\n                dfd.resolve(data.result, textStatus, jqXhr);\r\n            }\r\n\r\n            if (data.status === 'error') {\r\n                dfd.reject(data.message || GENERIC_ERROR_MESSAGE, data, textStatus, jqXhr);\r\n            }\r\n\r\n        }\r\n\r\n\r\n        // setup shorthands for compatibility with $.post\r\n        return dfd;\r\n    }\r\n\r\n\r\n    function iframeEl(uri, params, fromForm) {\r\n        var dfd = $.Deferred();\r\n        var i = getIframe();\r\n        var name = i.attr('name');\r\n\r\n        registerCallback(name, dfd);\r\n\r\n        params = $.extend({}, params, {'_iframe_id': name});\r\n\r\n        // create a form and submit it\r\n        form(uri, params, name, fromForm);\r\n\r\n        var p = dfd.promise();\r\n\r\n        p.abort = function () {\r\n            dfd.reject(\"ABORT\");\r\n        };\r\n\r\n        return p;\r\n    }\r\n\r\n    function registerCallback(name, dfd) {\r\n        if (!('smore' in window)) {\r\n            window.smore = {};\r\n        }\r\n\r\n\r\n        window.smore[name] = function (data) {\r\n            // if there is data, and no status information\r\n            if (!data || data && !data.status) {\r\n                dfd.resolve(data);\r\n            }\r\n\r\n            // if we have status\r\n            if (data.status) {\r\n                if (data.status === 'success') {\r\n                    dfd.resolve(data.result);\r\n                }\r\n\r\n                if (data.status === 'error') {\r\n                    dfd.reject(data.message, data);\r\n                }\r\n            }\r\n        };\r\n\r\n        // always remove the callback from the smore object\r\n        dfd.always(function () {\r\n            delete window.smore[name];\r\n        });\r\n    }\r\n\r\n\r\n    var HIDDEN_CSS = {\r\n        'visibility': 'hidden',\r\n        'width': 1,\r\n        'height': 1,\r\n        'position': 'absolute',\r\n        'left': -10000,\r\n        'top': -10000\r\n    };\r\n\r\n\r\n    var _iframeId = 0;\r\n\r\n    function getIframe() {\r\n\r\n        var name = 'iframe_name_' + (++_iframeId);\r\n\r\n        var iframeEl = $('<iframe/>')\r\n            .css(HIDDEN_CSS)\r\n            .attr('name', name);\r\n\r\n        $(document.body).append(iframeEl);\r\n\r\n\r\n        return iframeEl;\r\n    }\r\n\r\n    /***\r\n     * Store the token\r\n     *\r\n     * @type {String|Function}\r\n     * @private\r\n     */\r\n    var _token = '';\r\n\r\n    /***\r\n     * Gets or sets the token\r\n     * @param {string|Function=} val\r\n     * @return {*}\r\n     */\r\n    function token(val) {\r\n        if (val) {\r\n            _token = val;\r\n        }\r\n\r\n        // If we have a function stored\r\n        if (typeof _token === 'function') {\r\n            return _token();\r\n        }\r\n\r\n        return _token;\r\n    }\r\n\r\n\r\n    function form(uri, params, targetFrame, form) {\r\n        params = $.extend({'_token': token()}, params);\r\n\r\n        if (!form) {\r\n            form = $('<form/>')\r\n                .css(HIDDEN_CSS)\r\n                .appendTo(_body);\r\n        }\r\n\r\n\r\n        form.attr({\r\n            method: 'POST',\r\n            // the target frame\r\n            target: targetFrame,\r\n            // the action uri\r\n            action: uri,\r\n            enctype: 'multipart/form-data'\r\n        });\r\n\r\n        for (var k in params) {\r\n            $('<input/>').attr({\r\n                name: k,\r\n                type: 'hidden'\r\n            })\r\n                .appendTo(form)\r\n                .val(params[k]);\r\n        }\r\n\r\n        form.submit();\r\n    }\r\n\r\n    function callbackForm(uri, params, targetFrame, baseForm, callbackParam) {\r\n        callbackParam = callbackParam || 'cb';\r\n\r\n        var cbName = 'form_cb_name_' + (++_iframeId);\r\n\r\n        var dfd = $.Deferred();\r\n\r\n        registerCallback(cbName, dfd);\r\n\r\n        var base = {};\r\n        base[callbackParam] = cbName;\r\n\r\n        params = $.extend(base, params);\r\n\r\n        form(uri, params, targetFrame, baseForm);\r\n\r\n        return dfd;\r\n    }\r\n\r\n\r\n    return {\r\n        token: token,\r\n        post: post,\r\n        iframe: iframeEl,\r\n        form: form,\r\n        callbackForm: callbackForm\r\n    };\r\n});\r\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/validators', function(require) {\n  var RequiredValidator, VALIDATORS, Validator, fromField;\n  VALIDATORS = [];\n  Validator = (function() {\n    function Validator(field1) {\n      this.field = field1;\n      null;\n    }\n\n    Validator.prototype.validate = function() {\n      throw 'NotImplemented';\n    };\n\n    return Validator;\n\n  })();\n  RequiredValidator = (function(superClass) {\n    var DEFAULT_REQUIRED_MESSAGE;\n\n    extend(RequiredValidator, superClass);\n\n    DEFAULT_REQUIRED_MESSAGE = 'This field is required';\n\n    function RequiredValidator() {\n      RequiredValidator.__super__.constructor.apply(this, arguments);\n      this.message = this.field.options.required;\n      if (this.message === true) {\n        this.message = DEFAULT_REQUIRED_MESSAGE;\n      }\n    }\n\n    RequiredValidator.prototype.validate = function() {\n      if (this.field.isEmpty()) {\n        return this.message;\n      }\n    };\n\n    RequiredValidator.isFieldMatch = function(field) {\n      return field.options.required;\n    };\n\n    return RequiredValidator;\n\n  })(Validator);\n  VALIDATORS.push(RequiredValidator);\n  fromField = function(fieldView) {\n\n    /*\n    Get a list of validators for the given field\n    \n    We will iterate over all the registered validators and their 'isFieldMatch' static method\n     */\n    var i, len, result, validatorClass;\n    result = [];\n    for (i = 0, len = VALIDATORS.length; i < len; i++) {\n      validatorClass = VALIDATORS[i];\n      if (validatorClass.isFieldMatch(fieldView)) {\n        result.push(new validatorClass(fieldView));\n      }\n    }\n    return result;\n  };\n  return {\n    fromField: fromField\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fieldView', function(require) {\n  var FieldView, validators, vw;\n  vw = require('fire/ui/view');\n  validators = require('./validators');\n  FieldView = (function(superClass) {\n    extend(FieldView, superClass);\n\n    function FieldView() {\n      return FieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    FieldView.prototype.render = function() {\n      this.name = this.options.name || this.el.attr('name');\n      this.id = this.options.id || this.el.attr('id');\n      this.el.attr({\n        'name': this.name,\n        'id': this.id\n      });\n      this.setupInputEvents(this.el);\n      return this.setupValidators();\n    };\n\n    FieldView.prototype.setupInputEvents = function(inputEl) {\n\n      /*\n      Register different input events\n       */\n      inputEl.on('focus', (function(_this) {\n        return function(e) {\n          return _this.onInputFocus(e);\n        };\n      })(this));\n      return inputEl.on('blur', (function(_this) {\n        return function(e) {\n          return _this.onInputBlur(e);\n        };\n      })(this));\n    };\n\n    FieldView.prototype.setupValidators = function() {\n\n      /*\n      Initalize validation classes for the field\n       */\n      return this.validators = validators.fromField(this);\n    };\n\n    FieldView.prototype.onInputFocus = function(e) {\n      return this.addModifier('active');\n    };\n\n    FieldView.prototype.onInputBlur = function(e) {\n      return this.removeModifier('active');\n    };\n\n    FieldView.prototype.onChanged = function() {\n\n      /*\n      An internal event to update the empty modifier and status\n       */\n      if (this.isEmpty()) {\n        this.addModifier('empty');\n      } else {\n        this.removeModifier('empty');\n      }\n      return this.setValid();\n    };\n\n    FieldView.prototype.validateField = function() {\n\n      /*\n      Start the validation of the field\n       */\n      var error;\n      this.setValid();\n      error = this.validate();\n      if (error) {\n        this.setInvalid(error);\n        return false;\n      }\n      return true;\n    };\n\n    FieldView.prototype.validate = function() {\n\n      /*\n      handle the field validation.\n      \n      Returns\n        - nothing if the field is valid\n        - String if the field is invalid, the string will be used as the message\n       */\n      var error, i, len, ref, v;\n      ref = this.validators;\n      for (i = 0, len = ref.length; i < len; i++) {\n        v = ref[i];\n        error = v.validate();\n        if (error) {\n          return error;\n        }\n      }\n    };\n\n    FieldView.prototype.value = function() {\n\n      /*\n      Extract the value from the field\n       */\n      return $.trim(this.el.val());\n    };\n\n    FieldView.prototype.isEmpty = function() {\n\n      /*\n      Is this field empty\n       */\n      return !this.value();\n    };\n\n    FieldView.prototype.errorSpan = function() {\n\n      /*\n      Returns the error span element if available\n      \n      Error element id should be {original-field-id}-error.\n      \n      Returns\n        - jQuery element for the errorSpan\n       */\n      return $(\"#\" + this.id + \"-error\");\n    };\n\n    FieldView.prototype.setInvalid = function(message) {\n\n      /*\n      Show the error label, mark the field as invalid\n      \n      Params:\n        - message   The message to show in the error label\n       */\n      this.addModifier('invalid');\n      this.trigger('invalid', this);\n      return this.errorSpan().show().text(message);\n    };\n\n    FieldView.prototype.setValid = function() {\n\n      /*\n      Mark the field as valid\n       */\n      this.removeModifier('invalid');\n      this.trigger('valid', this);\n      return this.errorSpan().hide();\n    };\n\n    FieldView.prototype.enable = function() {\n\n      /*\n      Enables the field\n       */\n      return this.removeModifier('disabled');\n    };\n\n    FieldView.prototype.disable = function() {\n\n      /*\n      Disables the field\n       */\n      return this.addModifier('disabled');\n    };\n\n    FieldView.prototype.focus = function() {\n\n      /*\n      Sets the focus on the field\n       */\n      return this.el.focus();\n    };\n\n    FieldView.fromEl = function(el) {\n\n      /*\n      Creates a new FieldView instance for the given element\n      \n      FieldView subsclasses needs to register themselves using FieldView.register(selector, subclass)\n      \n      For example, if we want to have a special FieldView for checkboxes, we'll use\n      FieldView.register('input[type=checkbox]', CheckboxFieldView)\n      \n      \n      Params:\n        - el    The element that we're creating a FieldView for\n       */\n      var i, item, len, selectors;\n      el = $(el);\n      selectors = FieldView.selectors;\n      for (i = 0, len = selectors.length; i < len; i++) {\n        item = selectors[i];\n        if (el.is(item.selector)) {\n          return new item.subclass({\n            el: el\n          });\n        }\n      }\n      console.error(\"Can't find FieldView for \", el);\n      throw \"Can't find a FieldView for the field \" + el;\n    };\n\n    FieldView.selectors = [];\n\n    FieldView.register = function(selector, subclass) {\n\n      /*\n       * Registers FieldView subclass to a given selector.\n       * When the FieldView.fromEl(el) static method is called, it will try to match\n       * The field element to the selector. if the selector matches, it will instantiate the subclass\n       *\n       * Params:\n       *   - selector    a selector to test the field with\n       *   - subclass    The subclass of FieldView to instantiate if the selector matches\n       */\n      return FieldView.selectors.push({\n        selector: selector,\n        subclass: subclass\n      });\n    };\n\n    return FieldView;\n\n  })(vw.View);\n  return {\n    FieldView: FieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/textFieldView', function(require) {\n  var FIELD_VIEW_SELECTOR, TextFieldView, fv;\n  FIELD_VIEW_SELECTOR = 'input[type=text],input[type=email],input[type=search],input[type=url],input[type=password],select,textarea';\n  fv = require('fire/ui/forms/fieldView');\n  TextFieldView = (function(superClass) {\n    extend(TextFieldView, superClass);\n\n    function TextFieldView() {\n      return TextFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    TextFieldView.prototype.setupInputEvents = function() {\n      TextFieldView.__super__.setupInputEvents.apply(this, arguments);\n      this.el.on('input keyup', (function(_this) {\n        return function(e) {\n          return _this.onInput(e);\n        };\n      })(this));\n      return this.el.on('paste cut', (function(_this) {\n        return function(e) {\n          return _this.onClipboardTextChanged(e);\n        };\n      })(this));\n    };\n\n    TextFieldView.prototype.onInput = function(e) {\n\n      /*\n      Handle key up events\n      \n      Params:\n        - e    jQuery.Event\n       */\n      return this.onChanged();\n    };\n\n    TextFieldView.prototype.onClipboardTextChanged = function(e) {\n\n      /*\n      Handle cut/paste events\n      \n      Params:\n        - e   jQuery.Event\n       */\n      return this.onChanged();\n    };\n\n    TextFieldView.prototype.disable = function() {\n\n      /*\n      Disable the field\n       */\n      TextFieldView.__super__.disable.apply(this, arguments);\n      return this.el.attr('disabled', true);\n    };\n\n    TextFieldView.prototype.enable = function() {\n\n      /*\n      Enable the field\n       */\n      TextFieldView.__super__.enable.apply(this, arguments);\n      return this.el.removeAttr('disabled');\n    };\n\n    return TextFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, TextFieldView);\n  return {\n    TextFieldView: TextFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/checkboxFieldView', function(require) {\n  var CheckboxFieldView, FIELD_VIEW_SELECTOR, fv;\n  FIELD_VIEW_SELECTOR = 'input[type=checkbox]';\n  fv = require('fire/ui/forms/fieldView');\n  CheckboxFieldView = (function(superClass) {\n    extend(CheckboxFieldView, superClass);\n\n    function CheckboxFieldView() {\n      return CheckboxFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    CheckboxFieldView.prototype.value = function() {\n\n      /*\n      Extract the value from the field\n       */\n      return this.el.is(':checked');\n    };\n\n    return CheckboxFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, CheckboxFieldView);\n  return {\n    CheckboxFieldView: CheckboxFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/radioFieldView', function(require) {\n  var FIELD_VIEW_SELECTOR, RadioFieldView, fv;\n  FIELD_VIEW_SELECTOR = 'div.radio-container';\n  fv = require('fire/ui/forms/fieldView');\n  RadioFieldView = (function(superClass) {\n    extend(RadioFieldView, superClass);\n\n    function RadioFieldView() {\n      return RadioFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    RadioFieldView.prototype.value = function() {\n\n      /*\n      Extract the value from the field\n       */\n      return this.el.find('input:radio:checked').val();\n    };\n\n    RadioFieldView.prototype.setupInputEvents = function() {\n      var radios;\n      RadioFieldView.__super__.setupInputEvents.apply(this, arguments);\n      radios = this.el.find('input:radio');\n      radios.on('focus', (function(_this) {\n        return function(e) {\n          return _this.onInputFocus(e);\n        };\n      })(this));\n      radios.on('blur', (function(_this) {\n        return function(e) {\n          return _this.onInputBlur(e);\n        };\n      })(this));\n      return radios.on('change', (function(_this) {\n        return function(e) {\n          return _this.onChanged();\n        };\n      })(this));\n    };\n\n    return RadioFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, RadioFieldView);\n  return {\n    RadioFieldView: RadioFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/hiddenFieldView', function(require) {\n  var FIELD_VIEW_SELECTOR, HiddenFieldView, fv;\n  FIELD_VIEW_SELECTOR = 'input[type=hidden]';\n  fv = require('fire/ui/forms/fieldView');\n  HiddenFieldView = (function(superClass) {\n    extend(HiddenFieldView, superClass);\n\n    function HiddenFieldView() {\n      return HiddenFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    HiddenFieldView.prototype.setupInputEvents = function() {\n      return HiddenFieldView.__super__.setupInputEvents.apply(this, arguments);\n    };\n\n    HiddenFieldView.prototype.disable = function() {\n\n      /*\n      Disable the field\n       */\n      HiddenFieldView.__super__.disable.apply(this, arguments);\n      return this.el.attr('disabled', true);\n    };\n\n    HiddenFieldView.prototype.enable = function() {\n\n      /*\n      Enable the field\n       */\n      HiddenFieldView.__super__.enable.apply(this, arguments);\n      return this.el.removeAttr('disabled');\n    };\n\n    return HiddenFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, HiddenFieldView);\n  return {\n    HiddenFieldView: HiddenFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\n\n/*\n *  Fields loader\n *  ==============\n *\n *  This module loads the common fields from the fields folder.\n *\n *  Require this file instead of the fieldView file\n */\ndefine('fire/ui/forms/fields', function(require) {\n  var fv;\n  fv = require('./fieldView');\n  require('./fields/textFieldView');\n  require('./fields/checkboxFieldView');\n  require('./fields/radioFieldView');\n  require('./fields/hiddenFieldView');\n  return {\n    FieldView: fv.FieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty,\n  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\ndefine('fire/ui/forms/formView', function(require) {\n  var ErrorCollection, FormView, arr, fv, mobile, safe, vw;\n  arr = require('fire/util/array');\n  vw = require('fire/ui/view');\n  safe = require('fire/net/safe');\n  fv = require('./fields');\n  mobile = require('fire/util/mobile');\n  FormView = (function(superClass) {\n    var ERROR_BOX_SELECTOR, SUBMIT_BUTTON_SELECTOR;\n\n    extend(FormView, superClass);\n\n    function FormView() {\n      return FormView.__super__.constructor.apply(this, arguments);\n    }\n\n    SUBMIT_BUTTON_SELECTOR = '.submit-button,input[type=submit]';\n\n    ERROR_BOX_SELECTOR = '.error-box';\n\n    FormView.prototype.cssClass = 'form-view';\n\n    FormView.prototype.defaultOptions = {\n      pleaseWaitText: 'Please Wait...',\n      fieldSelector: '.form-field',\n      deliveryMethod: 'ajax',\n      validationErrorMessage: 'Some of the fields are invalid.',\n      deliveryDelay: 300\n    };\n\n    FormView.prototype.render = function() {\n\n      /*\n      Setup all the fields, etc\n       */\n      this.setupFields();\n      this.setupSubmitButton();\n      this.errorBox = this.find(ERROR_BOX_SELECTOR).hide();\n      if (!this.options.action) {\n        return this.options.action = this.el.attr('action');\n      }\n    };\n\n    FormView.prototype.setupFields = function() {\n\n      /*\n      Initialize the fields for the form\n       */\n      var el, j, len, ref, results1;\n      this.fields = [];\n      ref = this.find(this.options.fieldSelector);\n      results1 = [];\n      for (j = 0, len = ref.length; j < len; j++) {\n        el = ref[j];\n        results1.push(this.fields.push(new fv.FieldView.fromEl(el)));\n      }\n      return results1;\n    };\n\n    FormView.prototype.setupSubmitButton = function() {\n\n      /*\n      Setup the submit button text\n       */\n      this.submitButton = this.find(SUBMIT_BUTTON_SELECTOR);\n      if (this.options.submitText) {\n        this.submitButtonText(this.options.submitText);\n      } else {\n        this.options.submitText = $.trim(this.submitButtonText());\n      }\n      return this.submitButton.click((function(_this) {\n        return function(e) {\n          return _this.onSubmitButtonClicked(e);\n        };\n      })(this));\n    };\n\n    FormView.prototype.onSubmitButtonClicked = function(e) {\n\n      /*\n      Handle clicks on the submission button\n       */\n      e.stopPropagation();\n      e.preventDefault();\n      return this.submit();\n    };\n\n    FormView.prototype.submit = function() {\n\n      /*\n      Tries to send the form\n      \n      Returns:\n        true if the form was delivered, false if not\n       */\n      if (this.hasModifier('disabled') || this.hasModifier('submitting')) {\n        return false;\n      }\n      if (this.validateForm()) {\n        this.deliverForm();\n        return true;\n      }\n      return false;\n    };\n\n    FormView.prototype.reset = function() {\n\n      /*\n      Clear the form\n       */\n      this.cleanup();\n      this.hideErrors();\n      return this.el[0].reset();\n    };\n\n    FormView.prototype.deliverForm = function() {\n\n      /*\n      Delivers the form, returns a deferred with completion/failure handling\n       */\n      var p, params, url;\n      this.addModifier('submitting');\n      this.trigger('submitstart', this);\n      this.submitButtonText(this.options.pleaseWaitText);\n      this.disable();\n      params = this.values();\n      url = this.options.action;\n      p = $.Deferred();\n      switch (this.options.deliveryMethod) {\n        case 'ajax':\n          p = safe.post(url, params);\n          break;\n        case 'form':\n          safe.form(url, params);\n          break;\n        case 'iframe':\n          p = safe.iframe(url, params);\n          break;\n        default:\n          throw \"Bad deliveryMethod: \" + this.options.deliveryMethod;\n      }\n      p.done((function(_this) {\n        return function(result) {\n          return _this.onDeliveryCompleted(result);\n        };\n      })(this));\n      p.fail((function(_this) {\n        return function(error, data) {\n          return _this.onDeliveryFailed(error, data);\n        };\n      })(this));\n      return p.promise();\n    };\n\n    FormView.prototype.onDeliveryCompleted = function(result) {\n\n      /*\n      Handles the successful completion of the form\n      \n      Params:\n        - form      The FormView\n        - result    The response from the server\n       */\n      this.result = result;\n      return setTimeout((function(_this) {\n        return function() {\n          _this.trigger('success', _this, result);\n          return _this.cleanup();\n        };\n      })(this), this.options.deliveryDelay);\n    };\n\n    FormView.prototype.onDeliveryFailed = function(error, data) {\n\n      /*\n      Handles a failed submission of the form\n      \n      Params:\n        - error       Error message\n        - data        Error result from the server\n       */\n      this.result = null;\n      return setTimeout((function(_this) {\n        return function() {\n          _this.errors = new ErrorCollection();\n          _this.processServerErrors(error, data, _this.errors);\n          _this.trigger('fail', _this, _this.error);\n          _this.showErrors();\n          return _this.cleanup();\n        };\n      })(this), this.options.deliveryDelay);\n    };\n\n    FormView.prototype.processServerErrors = function(message, data, error_collection) {\n\n      /*\n      Process the server error. return a proper error\n      \n      Params:\n        - message           The error value returned from the server\n        - data              The error data response from the server\n        - error_collection  The error collection. Implementations should append the errors to the collection\n       */\n      return error_collection.add('server_error', message, 'server_error');\n    };\n\n    FormView.prototype.cleanup = function() {\n\n      /*\n      Clean up the form\n       */\n      this.removeModifier('submitting');\n      this.trigger('submitcomplete', this);\n      this.submitButtonText(this.options.submitText);\n      return this.enable();\n    };\n\n    FormView.prototype.submitButtonText = function(text) {\n\n      /*\n      Sets the submit button text\n       */\n      if (this.submitButton.is('input')) {\n        if (text) {\n          return this.submitButton.val(text);\n        }\n        return this.submitButton.val();\n      }\n      if (text) {\n        return this.submitButton.text(text);\n      }\n      return this.submitButton.text();\n    };\n\n    FormView.prototype.values = function() {\n\n      /*\n      Extract the fields and get the values\n       */\n      var f, j, len, ref, values;\n      values = $.extend({}, this.options.extraParams);\n      ref = this.fields;\n      for (j = 0, len = ref.length; j < len; j++) {\n        f = ref[j];\n        values[f.name] = f.value();\n      }\n      return values;\n    };\n\n    FormView.prototype.validateForm = function() {\n\n      /*\n      Validates the fields and call a custom validation method\n      \n      Returns:\n        true if the form is valid, false if not\n       */\n      var field, results;\n      this.errors = new ErrorCollection();\n      this.validate(this.fields, this.errors);\n      results = (function() {\n        var j, len, ref, results1;\n        ref = this.fields;\n        results1 = [];\n        for (j = 0, len = ref.length; j < len; j++) {\n          field = ref[j];\n          results1.push(field.validateField());\n        }\n        return results1;\n      }).call(this);\n      if (indexOf.call(results, false) >= 0) {\n        this.errors.add('validation_error', this.options.validationErrorMessage);\n      }\n      if (this.errors.length) {\n        this.trigger('invalid', this);\n        this.addModifier('invalid');\n        this.showErrors();\n        return false;\n      } else {\n        this.trigger('valid', this);\n        this.removeModifier('invalid');\n        this.hideErrors();\n        return true;\n      }\n    };\n\n    FormView.prototype.validate = function(fields, errorCollecion) {\n\n      /*\n      An extra validation method that can be overriden by implemntations\n      \n      Params\n        - fields            A list of FieldView objects\n        - errorCollection   An ErrorCollection object that can be used to add errors to the form\n       */\n      return null;\n    };\n\n    FormView.prototype.showErrors = function() {\n\n      /*\n      Show the active errors\n       */\n      var e, h, j, len, ref;\n      h = '';\n      ref = this.errors.errors;\n      for (j = 0, len = ref.length; j < len; j++) {\n        e = ref[j];\n        if (e.description) {\n          h += \"<p>\" + e.description + \"</p>\";\n        }\n      }\n      if (h) {\n        return this.errorBox.html(h).show();\n      }\n    };\n\n    FormView.prototype.setError = function(message) {\n\n      /*\n      Override the errors with a custom message, show errors\n      \n      Params:\n        - message   Error message to show\n       */\n      this.errors = new ErrorCollection();\n      this.errors.add('custom', message);\n      return this.showErrors();\n    };\n\n    FormView.prototype.hideErrors = function() {\n\n      /*\n      Hide the errors\n       */\n      return this.errorBox.hide();\n    };\n\n    FormView.prototype.disable = function() {\n\n      /*\n      Disable the form.\n      \n      This method will:\n      - Add the `disabled` modifier to the form\n      - Call the `disable` method for all of the fields\n      - Add the `is-disabled` class to the submit button\n       */\n      var f, j, len, ref;\n      this.addModifier('disabled');\n      ref = this.fields;\n      for (j = 0, len = ref.length; j < len; j++) {\n        f = ref[j];\n        f.disable();\n      }\n      return this.submitButton.addClass('is-disabled');\n    };\n\n    FormView.prototype.enable = function() {\n\n      /*\n      Enables the form\n      \n      This method will:\n      - Remove the `disabled` modifier from the form\n      - Call the `enable` method for all of the fields\n      - Remove the `is-disabled` class from the submit button\n       */\n      var f, j, len, ref;\n      this.removeModifier('disabled');\n      ref = this.fields;\n      for (j = 0, len = ref.length; j < len; j++) {\n        f = ref[j];\n        f.enable();\n      }\n      return this.submitButton.removeClass('is-disabled');\n    };\n\n    FormView.prototype.field = function(fieldName) {\n\n      /*\n      Gets an instance of a field by name\n       */\n      return this.fields.filter(function(i) {\n        return i.name === fieldName;\n      })[0];\n    };\n\n    FormView.prototype.focus = function(fieldName) {\n      var ref, ref1;\n      if (fieldName == null) {\n        fieldName = null;\n      }\n\n      /*\n      Focus the form.\n      \n      If a field name is given, the form will try to focus on that field\n      If not - the form will focus on the first element\n      \n      Params:\n        - fieldName       (Optional) The field name to try and focus on\n       */\n      if (mobile.isPhone()) {\n        return;\n      }\n      if (fieldName) {\n        return (ref = this.field(fieldName)) != null ? ref.focus() : void 0;\n      } else {\n        return (ref1 = this.fields[0]) != null ? ref1.focus() : void 0;\n      }\n    };\n\n    return FormView;\n\n  })(vw.View);\n  ErrorCollection = (function() {\n    function ErrorCollection() {\n      this.clear();\n    }\n\n    ErrorCollection.prototype.add = function(name, description, type) {\n      if (type == null) {\n        type = null;\n      }\n      this.errors.push({\n        name: name,\n        description: description,\n        type: type\n      });\n      return this.length += 1;\n    };\n\n    ErrorCollection.prototype.clear = function() {\n      this.errors = [];\n      return this.length = 0;\n    };\n\n    return ErrorCollection;\n\n  })();\n  return {\n    FormView: FormView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/signupFormView', function(require) {\n  var SignupFormView, fv;\n  fv = require('fire/ui/forms/formView');\n  SignupFormView = (function(superClass) {\n    extend(SignupFormView, superClass);\n\n    function SignupFormView() {\n      SignupFormView.__super__.constructor.apply(this, arguments);\n      this.options.validationErrorMessage = '';\n    }\n\n    SignupFormView.prototype.processServerErrors = function(errorMessage, errorData, errorCollection) {\n\n      /*\n      Process the server error. return a proper error\n      \n      Params:\n        - errorMessage       The error value returned from the server\n        - errorData          The error data, as returned from the server\n        - errorCollection    The error collection. Implementations should append the errors to the collection\n       */\n      var field, firstProblem, i, len, p, problem, problems, ref;\n      switch (errorMessage) {\n        case 'invalid':\n          problems = errorData.code;\n          firstProblem = '';\n          for (i = 0, len = problems.length; i < len; i++) {\n            p = problems[i];\n            field = p[0], problem = p[1];\n            if ((ref = this.field(field)) != null) {\n              ref.setInvalid(problem);\n            }\n            firstProblem = firstProblem || problem;\n          }\n          return errorCollection.add('invalid', false);\n        case 'tryfacebook':\n          return errorCollection.add('tryfacebook', 'Try logging in with your Facebook account.');\n        case 'tryemail':\n          return errorCollection.add('tryemail', 'Try logging in with email.');\n        case 'user exists':\n          return errorCollection.add('user exists', 'We already have a user with that email.', 'field_error', {\n            target: 'email'\n          });\n        default:\n          return errorCollection.add('unkown', 'Something is broken. Try again later :(');\n      }\n    };\n\n    return SignupFormView;\n\n  })(fv.FormView);\n  return {\n    SignupFormView: SignupFormView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/loginFormView', function(require) {\n  var LoginFormView, fv;\n  fv = require('fire/ui/forms/formView');\n  LoginFormView = (function(superClass) {\n    extend(LoginFormView, superClass);\n\n    function LoginFormView() {\n      LoginFormView.__super__.constructor.apply(this, arguments);\n      this.options.validationErrorMessage = '';\n    }\n\n    LoginFormView.prototype.processServerErrors = function(errorMessage, errorData, errorCollection) {\n\n      /*\n      Process the server error. return a proper error\n      \n      Params:\n        - errorMessage       The error value returned from the server\n        - errorData          The error data, as returned from the server\n        - errorCollection    The error collection. Implementations should append the errors to the collection\n       */\n      switch (errorMessage) {\n        case 'tryfacebook':\n          return errorCollection.add('tryfacebook', 'Try logging in with your Facebook account.');\n        case 'invaliduser':\n          return errorCollection.add('invaliduser', 'Please enter your email', 'field_error', {\n            target: 'email'\n          });\n        case 'nouser':\n          return errorCollection.add('nouser', 'Not registered', 'field_error', {\n            target: 'email'\n          });\n        case 'tryemail':\n          return errorCollection.add('tryemail', 'Try logging in with email.');\n        case 'badpassword':\n          return errorCollection.add('badpassword', 'Password is incorrect. Did you forget it?', 'field_error', {\n            target: 'email'\n          });\n        default:\n          return errorCollection.add('unkown', 'Something is broken. Try again later :(');\n      }\n    };\n\n    return LoginFormView;\n\n  })(fv.FormView);\n  return {\n    LoginFormView: LoginFormView\n  };\n});\n", "define('fire/util/strings', function(require) {\r\n\r\n    var _proto = String.prototype;\r\n\r\n    /****\r\n     * Simple string format\r\n     *\r\n     * format('molsh {0}', 'dolsh')\r\n     * => 'molsh dolsh'\r\n     *\r\n     * @param {String} string\r\n     * @param {...string} varArgs\r\n     * @returns {string}\r\n     */\r\n    function format(string, varArgs) {\r\n        var s = arguments[0];\r\n        for (var i = 0; i < arguments.length - 1; i++) {\r\n            var reg = new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\");\r\n            s = s.replace(reg, arguments[i + 1]);\r\n        }\r\n\r\n        return s;\r\n    }\r\n\r\n    // shortcut\r\n    _proto.format = format;\r\n\r\n    return {\r\n        format: format\r\n    };\r\n});", "define('fire/net/popup', function (require) {\r\n    var str = require('fire/util/strings');\r\n\r\n    var NO_DATA_CODE = 'NO_DATA';\r\n    var POPUP_CLOSED = 'POPUP_CLOSED';\r\n\r\n    /*****\r\n     * Opens a popup to the given url with the given width/height.\r\n     *\r\n     * Returns a deferred object that will be resolved with the value returned from the popup.\r\n     *\r\n     * This method generates a callback inside the window object and cleans up afterwards.\r\n     * The generated callback name is than sent with the url, so the popup will use it to resolve the call\r\n     *\r\n     * The deferred will be rejected if:\r\n     *  - The server returned an error\r\n     *  - The popup was closed before it was resolved\r\n     *\r\n     *\r\n     * The results from the server should be in the form:\r\n     *\r\n     * Success:\r\n     *  {status: 'success', result: <result data>}\r\n     *\r\n     * Error:\r\n     *  {status: 'error', message: <error message or code>}\r\n     *\r\n     *\r\n     * @param {String} url              the url for the popup\r\n     * @param {Number} width            popup width\r\n     * @param {Number} height           popup height\r\n     * @param {String=} callbackParam   an optional callback param. defaults to 'cb'\r\n     *\r\n     * @returns {jQuery.Deferred}\r\n     */\r\n    function popup(url, width, height, callbackParam) {\r\n        if (!url) {\r\n            throw \"Url must be defined!\";\r\n        }\r\n\r\n        // setup defaults\r\n        callbackParam = callbackParam || 'cb';\r\n\r\n        // create a new deferred\r\n        var dfd = $.Deferred();\r\n\r\n        // setup callback name\r\n        var cbName = '__pop_cb_' + (++_callbackId);\r\n\r\n\r\n        // an inner function to handle the result\r\n        function handleResult(data) {\r\n            // do nothing if we already handled it\r\n            if (dfd.state() !== 'pending') {\r\n                return;\r\n            }\r\n\r\n            // if there is no data or data is from an unexpected type\r\n            if (!data || typeof data !== 'object') {\r\n                // reject it\r\n                dfd.reject('NO_DATA');\r\n            }\r\n\r\n            // Switch by status code\r\n            switch (data.status) {\r\n                case 'success':\r\n                    dfd.resolve(data.result);\r\n                    break;\r\n                case 'error':\r\n                    dfd.reject(data.message);\r\n                    break;\r\n                default:\r\n                    dfd.reject(NO_DATA_CODE);\r\n            }\r\n\r\n            // cleanup\r\n            delete window[cbName];\r\n        }\r\n\r\n        // store the\r\n        window[cbName] = handleResult;\r\n\r\n        // setup the url\r\n        var popUrl = setupUrl(url, callbackParam, cbName);\r\n\r\n        //console.debug(\"Opening popup\", popUrl);\r\n\r\n        // open the popup\r\n        var popRef = openPopup(popUrl, width, height, function () {\r\n            handleResult({status: 'error', message: POPUP_CLOSED});\r\n        });\r\n\r\n        // return a read only promise\r\n        var promise = dfd.promise();\r\n\r\n        // add an abort method\r\n        promise.abort = function () {\r\n            tryAbort(popRef, dfd);\r\n        };\r\n\r\n        return promise;\r\n    }\r\n\r\n\r\n    /***\r\n     * We store the callback id\r\n     * @type {Number}\r\n     * @private\r\n     */\r\n    var _callbackId = 0;\r\n\r\n\r\n    /****\r\n     * Generate a url with the callback name and param\r\n     * @param {String} url\r\n     * @param {String} callbackParam\r\n     * @param {String} cbName\r\n     *\r\n     * @returns {String} the url with the callback\r\n     */\r\n    function setupUrl(url, callbackParam, cbName) {\r\n\r\n        var cb = callbackParam + '=' + cbName;\r\n\r\n        // Support for placeholder\r\n        if (url.indexOf('%{cb}') !== -1) {\r\n            return url.replace('%{cb}', cb);\r\n        }\r\n\r\n\r\n        // do we have a ? inside the url?\r\n        if (url.indexOf('?') === -1) {\r\n            // not? just add the cb with a ?\r\n            return url + '?' + cb;\r\n        } else {\r\n            return url + '&' + cb;\r\n        }\r\n    }\r\n\r\n    /***\r\n     * Opens the popup, fires the closeCb function when it is closed\r\n     *\r\n     * @param {String} url\r\n     * @param {Number} width\r\n     * @param {Number} height\r\n     * @param {Function} closeCb\r\n     * @param {String} frameName\r\n     */\r\n    function openPopup(url, width, height, closeCb, frameName) {\r\n        var popup = window.open(url, frameName || '', popupSettings(width, height));\r\n\r\n        // create an interval that test the popup\r\n        var interval = setInterval(function () {\r\n            // die if it's still open\r\n            if (popup && !popup.closed) {\r\n                return;\r\n            }\r\n            // else:\r\n\r\n            // stop interval\r\n            clearInterval(interval);\r\n\r\n            // call the closeCb:\r\n            closeCb();\r\n        }, 20);\r\n\r\n        return popup;\r\n    }\r\n\r\n    /***\r\n     * Tries to abort the given popup\r\n     * @param popRef\r\n     * @param {jQuery.Deferred} dfd\r\n     */\r\n    function tryAbort(popRef, dfd) {\r\n        // if the popup is already resolved, exit\r\n        if (dfd.state() !== 'pending') {\r\n            return;\r\n        }\r\n\r\n        // try to close the popup\r\n        try {\r\n            popRef.close();\r\n        } catch (e) {\r\n            // no-op\r\n        }\r\n    }\r\n\r\n    /***\r\n     *\r\n     * @param width\r\n     * @param height\r\n     * @returns {String} a string that represent popup settings\r\n     */\r\n    function popupSettings(width, height) {\r\n        return str.format('width={0},height={1},location=no,status=no', width, height);\r\n    }\r\n\r\n\r\n    return {\r\n        open: popup,\r\n        openPopup: openPopup\r\n    };\r\n});", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/facebookConnectView', function(require) {\n  var FacebookConnectView, popup, vw;\n  vw = require('fire/ui/view');\n  popup = require('fire/net/popup');\n  FacebookConnectView = (function(superClass) {\n    var POPUP_SIZE;\n\n    extend(FacebookConnectView, superClass);\n\n    function FacebookConnectView() {\n      return FacebookConnectView.__super__.constructor.apply(this, arguments);\n    }\n\n    POPUP_SIZE = {\n      width: 600,\n      height: 450\n    };\n\n    FacebookConnectView.prototype.cssClass = 'facebook-connect-button';\n\n    FacebookConnectView.prototype.events = {\n      'click': 'onConnectClicked'\n    };\n\n    FacebookConnectView.prototype.defaultOptions = {\n      pleaseWaitText: 'Please wait...',\n      connectUrl: '/app/users/connect'\n    };\n\n    FacebookConnectView.prototype.render = function() {\n\n      /*\n       */\n      this.textSpan = this.find('.text-content');\n      if (this.options.text) {\n        return this.textSpan.text(this.options.text);\n      } else {\n        return this.options.text = $.trim(this.textSpan.text());\n      }\n    };\n\n    FacebookConnectView.prototype.onConnectClicked = function(e) {\n\n      /*\n      Hanldes clicks on the button element\n       */\n      if (this.hasModifier('disabled') || this.hasModifier('connecting')) {\n        return;\n      }\n      this.addModifier('connecting');\n      this.trigger('connectstart', this);\n      this.disable();\n      this.textSpan.text(this.options.pleaseWaitText);\n      this.popup = popup.open(this.generateUrl(), POPUP_SIZE.width, POPUP_SIZE.height);\n      this.popup.done((function(_this) {\n        return function(r) {\n          return _this.onPopupComplete(r);\n        };\n      })(this));\n      return this.popup.fail((function(_this) {\n        return function(r) {\n          return _this.onPopupFailed(r);\n        };\n      })(this));\n    };\n\n    FacebookConnectView.prototype.generateUrl = function() {\n\n      /*\n      Generate url for the connect popup\n      \n      We're composing the url from three parts\n        - options.connectUrl\n        - options.buttonId\n        - options.connectParams\n       */\n      var params, query, url;\n      params = $.extend({}, this.options.connectParams);\n      if (this.options.buttonId) {\n        params['signup_button'] = this.options.buttonId;\n      }\n      if (this.options.signupSegment) {\n        params['segment'] = this.options.signupSegment;\n      }\n      query = $.param(params);\n      url = this.options.connectUrl;\n      if (url.indexOf('?') > 0) {\n        url += '&';\n      } else {\n        url += '?';\n      }\n      return url + query;\n    };\n\n    FacebookConnectView.prototype.onPopupComplete = function(result) {\n\n      /*\n      When the popup action is completed\n       */\n      var connectType;\n      if (result.is_new) {\n        connectType = 'signup';\n      } else {\n        connectType = 'login';\n      }\n      this.trigger('success', this, connectType, result);\n      this.trigger(connectType, this, result);\n      return this.cleanup();\n    };\n\n    FacebookConnectView.prototype.onPopupFailed = function(message) {\n\n      /*\n      When the popup action has failed\n       */\n      switch (message) {\n        case 'POPUP_CLOSED':\n        case 'fb_cancel':\n          this.trigger('cancel', this);\n          break;\n        default:\n          this.trigger('fail', this, message);\n      }\n      return this.cleanup();\n    };\n\n    FacebookConnectView.prototype.cleanup = function() {\n\n      /*\n      Clean up after successful/failed connection.\n      We need to enable buttons and remove connecting modifier\n       */\n      this.textSpan.text(this.options.text);\n      this.removeModifier('connecting');\n      this.trigger('connectcomplete', this);\n      this.enable();\n      return this.popup.abort();\n    };\n\n    FacebookConnectView.prototype.enable = function() {\n\n      /*\n      Enables the button\n       */\n      return this.removeModifier('disabled');\n    };\n\n    FacebookConnectView.prototype.disable = function() {\n\n      /*\n      Disables the button\n       */\n      return this.addModifier('disabled');\n    };\n\n    FacebookConnectView.prototype.beforeRemove = function() {\n\n      /*\n      Before remove, cleanup some resources, abort the popup etc\n       */\n      var ref;\n      return (ref = this.popup) != null ? ref.abort() : void 0;\n    };\n\n    return FacebookConnectView;\n\n  })(vw.View);\n  return {\n    FacebookConnectView: FacebookConnectView\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\n\n/*\n * Report module\n * =============\n *\n * This is the new version of smore.report\n *\n * Reports events to mixpanel/google analytics\n *\n * Public Methods\n * --------------\n * - event(name, props={},unique=false}        Sends an event to mixpanel. returns a deferred object when the event\n *                                           has been sent successfully\n * - ab()                                    Returns a dict with the results of the current active a/b tests\n *\n */\ndefine('smore/util/report', function(require) {\n  var MIXPANEL_TIMEOUT, _uniqueEvents, getAbTestValues, track;\n  MIXPANEL_TIMEOUT = 300;\n  _uniqueEvents = {};\n  track = function(name, props, unique) {\n    var analytics, dfd, key;\n    if (props == null) {\n      props = {};\n    }\n    if (unique == null) {\n      unique = false;\n    }\n\n    /*\n    \n    Report an event to segment.io\n    \n    Params:\n      - name      Event name\n      - props     Optional properties to sedn with the event\n      - unique    Only send once for the given name and props\n    \n    Returns:\n        A deferred object, that will be resolve on success or rejected after MIXPANEL_TIMEOUT ms\n     */\n    analytics = window.analytics;\n    if (!name || !analytics.track) {\n      DEVMODE && console.error(\"analytics is not loaded or event name wasn't provided!\");\n      return;\n    }\n    props = $.extend(getAbTestValues(), props);\n    if (unique && window.JSON) {\n      key = name + \"-\" + (JSON.stringify(props));\n      if (key in _uniqueEvents) {\n        return;\n      }\n      _uniqueEvents[key] = true;\n    }\n    dfd = $.Deferred();\n    DEVMODE && console.log(\"%cevent:\", 'color:green', name, props, unique);\n    analytics.track(name, props, dfd.resolve);\n    setTimeout(dfd.reject, MIXPANEL_TIMEOUT);\n    return dfd.promise();\n  };\n  getAbTestValues = function() {\n\n    /*\n    Extract the a/b test values from the meta tags\n    \n    Returns:\n      A dict from the ab test key to the value\n     */\n    var el, els, i, key, len, values;\n    values = {};\n    els = $('.smore-ab-test-meta');\n    for (i = 0, len = els.length; i < len; i++) {\n      el = els[i];\n      key = el.getAttribute('key');\n      if (key) {\n        values[\"ab_test_\" + key] = el.getAttribute('content');\n      }\n    }\n    return values;\n  };\n  return {\n    track: track,\n    ab: getAbTestValues\n  };\n});\n", "// Generated by CoffeeScript 1.12.3\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/modal', function(require) {\n  var CONTENT_ENDPOINT, DEFAULT_AFTER_SUCCESS_URL, LoginModalView, MODAL_OPTIONS, autoLogin, fbv, isLoggedIn, lfv, mv, report, sfv, show;\n  mv = require('fire/ui/views/ModalView');\n  sfv = require('./signupFormView');\n  lfv = require('./loginFormView');\n  fbv = require('./facebookConnectView');\n  report = require('smore/util/report');\n  CONTENT_ENDPOINT = '/app/users/login_modal';\n  if (DEVMODE) {\n    CONTENT_ENDPOINT += '?_t=' + Number(new Date());\n  }\n  MODAL_OPTIONS = {\n    cssClass: 'base-modal login-modal',\n    width: 406,\n    overlayClose: true,\n    overlayClass: 'login-modal-overlay'\n  };\n  DEFAULT_AFTER_SUCCESS_URL = '/app';\n  LoginModalView = (function(superClass) {\n    var EVENTS;\n\n    extend(LoginModalView, superClass);\n\n    EVENTS = {\n      login_modal_open: 'LOGIN MODAL: Open'\n    };\n\n\n    /*\n      LoginModalViews\n    \n      @extends {ModalView}\n      @class\n     */\n\n    LoginModalView.prototype.preload = true;\n\n    LoginModalView.prototype.enableHistory = true;\n\n    LoginModalView.prototype.events = {\n      'click .switch-state': 'onSwitchStateClicked'\n    };\n\n    LoginModalView.prototype.defaultOptions = {\n      state: 'signup'\n    };\n\n    function LoginModalView(options) {\n\n      /*\n      \n       @param {String} state Starts the modal in a specifc state. state can be 'login' or 'signup'\n       */\n      LoginModalView.__super__.constructor.call(this, CONTENT_ENDPOINT, options);\n      this.state = this.options.state;\n    }\n\n    LoginModalView.prototype.render = function() {\n\n      /*\n        Initialize sub-views, like signup,login and facbook connect\n       */\n      var buttonId, segment, signupParams;\n      buttonId = this.options.buttonId;\n      signupParams = {\n        'signup_button': buttonId\n      };\n      segment = this._signupSegment();\n      if (segment) {\n        signupParams['segment'] = segment;\n      }\n      this.loginForm = new lfv.LoginFormView({\n        el: this.find('.login-form')\n      });\n      this.loginForm.on('success', (function(_this) {\n        return function(f, result) {\n          return _this.onSuccess('login', result);\n        };\n      })(this));\n      this.signupForm = new sfv.SignupFormView({\n        el: this.find('.signup-form'),\n        extraParams: signupParams\n      });\n      this.signupForm.on('success', (function(_this) {\n        return function(f, result) {\n          return _this.onSuccess('signup', result);\n        };\n      })(this));\n      this.signupfbConnect = new fbv.FacebookConnectView({\n        el: this.find('.only-signup .facebook-connect-button'),\n        buttonId: buttonId,\n        signupSegment: segment\n      });\n      this.signupfbConnect.on('success', (function(_this) {\n        return function(f, type, result) {\n          return _this.onSuccess(type, result);\n        };\n      })(this)).on('fail', (function(_this) {\n        return function(fbc, msg) {\n          return _this.onSignupFbFailed(msg);\n        };\n      })(this));\n      this.loginfbConnect = new fbv.FacebookConnectView({\n        el: this.find('.only-login .facebook-connect-button'),\n        buttonId: buttonId,\n        signupSegment: segment\n      });\n      this.loginfbConnect.on('success', (function(_this) {\n        return function(f, type, result) {\n          return _this.onSuccess(type, result);\n        };\n      })(this)).on('fail', (function(_this) {\n        return function(fbc, msg) {\n          return _this.onLoginFbFailed(msg);\n        };\n      })(this));\n      this.setState(this.state);\n      this.setupDisableState(this.loginForm, this.loginfbConnect);\n      return this.setupDisableState(this.signupForm, this.signupfbConnect);\n    };\n\n    LoginModalView.prototype._signupSegment = function() {\n\n      /*\n      Get the the segment information from the meta tag \"smore:signup_segemnt\"\n       */\n      return $('meta[name=\"smore:signup_segment\"]').attr('value');\n    };\n\n    LoginModalView.prototype.setupDisableState = function(form, fbConnect) {\n\n      /*\n      Setup events to disable/enable the form when the fb-connect button is connecting.\n      Same thing goes the other way around: disable/enable fb-connect button when the form is being proccessed\n       */\n      form.on('submitstart', (function(_this) {\n        return function(f) {\n          fbConnect.disable();\n          return _this.addModifier('pending', true);\n        };\n      })(this));\n      form.on('submitcomplete', (function(_this) {\n        return function(f) {\n          fbConnect.enable();\n          return _this.removeModifier('pending');\n        };\n      })(this));\n      fbConnect.on('connectstart', (function(_this) {\n        return function(f) {\n          form.disable();\n          return _this.addModifier('pending', true);\n        };\n      })(this));\n      return fbConnect.on('connectcomplete', (function(_this) {\n        return function(f) {\n          form.enable();\n          return _this.removeModifier('pending');\n        };\n      })(this));\n    };\n\n    LoginModalView.prototype.setState = function(state) {\n\n      /*\n      Switch between states for the modal\n      \n      State can be 'login' or 'signup'\n       */\n      this.removeModifier(this.state);\n      this.addModifier(state);\n      this.state = state;\n      if (state === 'login') {\n        return this.loginForm.focus();\n      } else {\n        return this.signupForm.focus();\n      }\n    };\n\n    LoginModalView.prototype.onSwitchStateClicked = function(e) {\n\n      /*\n      When someone clicks on the switch state label\n       */\n      var state;\n      state = $(e.currentTarget).data('target');\n      if (state) {\n        return this.setState(state);\n      }\n    };\n\n    LoginModalView.prototype.show = function() {\n      LoginModalView.__super__.show.call(this, MODAL_OPTIONS);\n      if (window.ga) {\n        return ga(\"send\", \"pageview\", \"/app/users/signup_modal\");\n      }\n    };\n\n    LoginModalView.prototype.onSuccess = function(type, result) {\n\n      /*\n      Login/Signup was successfully completed\n      \n      Params:\n        - type    login if we had a successful login, signup if we had a successful signup\n        - result  The result dictionary from the server\n       */\n      var r;\n      if (this.closed) {\n        return;\n      }\n      if (this.options.onSuccess) {\n        return this.options.onSuccess(this, type, result);\n      }\n      $('body').hide();\n      if (this.options.reloadOnly) {\n        return document.location.reload();\n      } else {\n        r = result.redirect_url || DEFAULT_AFTER_SUCCESS_URL;\n        if (r === 'app/reporting/report_errors') {\n          r = '/app';\n        }\n        return document.location = r;\n      }\n    };\n\n    LoginModalView.prototype.onLoginFbFailed = function(msg) {\n\n      /*\n      Handle failed fb logins\n       */\n      return this.handleFbError(msg, this.loginForm);\n    };\n\n    LoginModalView.prototype.onSignupFbFailed = function(msg) {\n\n      /*\n      Handle failed fb logins\n       */\n      return this.handleFbError(msg, this.signupForm);\n    };\n\n    LoginModalView.prototype.handleFbError = function(msg, form) {\n\n      /*\n      Handles fb error\n       */\n      var error;\n      error = \"Something is broken.Try again later: (\";\n      if (msg === 'tryemail') {\n        error = 'Already registered via email';\n      }\n      return form.setError(error);\n    };\n\n    LoginModalView.prototype.onClose = function() {\n      LoginModalView.__super__.onClose.apply(this, arguments);\n      this.signupfbConnect.remove();\n      return this.loginfbConnect.remove();\n    };\n\n    return LoginModalView;\n\n  })(mv.ModalView);\n  show = function(el, options) {\n    var m, opts;\n    if (options == null) {\n      options = {};\n    }\n\n    /*\n    Show the login modal in case of\n    \n    Params:\n      - el        jQuery   The button element\n      - options            Optional options to add\n     */\n    opts = $.extend({}, el.data(), options);\n    m = new LoginModalView(opts);\n    m.show();\n    return m;\n  };\n  isLoggedIn = function() {\n\n    /*\n    Test if the user has a login cookie\n     */\n    var m;\n    m = document.cookie.match(/FP=\"?([A-Za-z0-9\\+\\/\\\\]*)\"?/);\n    return m && m.length >= 2;\n  };\n  autoLogin = function() {\n    $('.auto-quick-login').on('click', function(e) {\n      var t;\n      e.preventDefault();\n      t = $(e.currentTarget);\n      return show(t);\n    });\n    return mv.ModalView.preloadUrl(CONTENT_ENDPOINT);\n  };\n  $(autoLogin);\n  return {\n    LoginModalView: LoginModalView,\n    show: show,\n    isLoggedIn: isLoggedIn\n  };\n});\n", "define('billing/stripe', function (require) {\r\n    // Stripe js is loaded externally;\r\n    var Stripe = window.Stripe;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n    /*********************************************************************************\r\n     * Strip key\r\n     *********************************************************************************/\r\n\r\n    function setKey(key) {\r\n        Stripe.setPublishableKey(key);\r\n    }\r\n\r\n    return {\r\n        setKey: setKey\r\n    }\r\n\r\n});\r\n\r\n\r\nfire.provide('smore.StripePaymentProvider');\r\n\r\nsmore.StripePaymentProvider = function (stripePublishableKey) {\r\n    Stripe.setPublishableKey(stripePublishableKey);\r\n};\r\n\r\nsmore.StripePaymentProvider.prototype = {\r\n    getProviderName: function () {\r\n        return 'stripe';\r\n    },\r\n\r\n    /*\r\n     checkCCData: Checks credit card data, and returns a dict:\r\n     {\r\n     valid: true or false, whether the given CC data is valid.\r\n     reason: If the CC data is invalid, the reason why. Otherwise a blank string.\r\n     cardType: The type of credit card - i.e. Visa, MasterCard, etc.\r\n     }\r\n\r\n     ccData must contain at least the following keys:\r\n     number: Credit card number\r\n     cvc: Credit card CVC code\r\n     exp_month: Credit card expiry month\r\n     exp_year: Credit card expiry year\r\n     All other keys are ignored.\r\n     */\r\n    checkCCData: function (ccData) {\r\n        var valid = false;\r\n        var reason = '';\r\n        var cardType = Stripe.cardType(ccData.number);\r\n\r\n        if (!Stripe.validateCardNumber(ccData.number)) {\r\n            reason = 'Invalid credit card number.';\r\n        } else if (!Stripe.validateCVC(ccData.cvc)) {\r\n            reason = 'Invalid CVC.';\r\n        } else if (!Stripe.validateExpiry(ccData.exp_month, ccData.exp_year)) {\r\n            reason = 'Invalid expiry date.';\r\n        } else {\r\n            valid = true;\r\n        }\r\n\r\n        return { valid: valid, reason: reason, cardType: cardType };\r\n    },\r\n\r\n    /*\r\n     convertCCDataToSafePaymentData: Converts sensitive credit card data to payment data that may be\r\n     safely sent to the Smore server.\r\n\r\n     In ccData, the keys 'number', 'cvc', 'exp_month' and 'exp_year' are required.\r\n     Other (optional) keys: 'name', 'address_line1', 'address_line2', 'address_city',\r\n     'address_state', 'address_zip', 'address_country'.\r\n\r\n     Callback prototypes:\r\n     successCallback(paymentData)\r\n     failureCallback(errorMessage)\r\n     */\r\n    convertCCDataToSafePaymentData: function (ccData, successCallback, failureCallback) {\r\n        var checkResult = this.checkCCData(ccData);\r\n        if (checkResult.valid) {\r\n            Stripe.createToken(ccData, function (status, response) {\r\n                if (response.error) {\r\n                    failureCallback(response.error.message);\r\n                } else {\r\n                    var paymentData = {\r\n                        stripe_token: response['id']\r\n                    };\r\n\r\n                    successCallback(paymentData);\r\n                }\r\n            });\r\n        } else {\r\n            failureCallback(checkResult.reason);\r\n        }\r\n    }\r\n};\r\n", "/* globals smore */\r\ndefine('billing/events', function (require) {\r\n    /***\r\n     * Utilities and tools to track events inside the pricing/billing process\r\n     */\r\n\r\n    var PREFIX = 'BILLING: ';\r\n\r\n    // the mixpanel call\r\n    var track = smore.report.track;\r\n\r\n\r\n    var Events = {\r\n        opened_pricing_page: 'Opened pricing page',\r\n        opened_education_pricing_page: 'Opened education pricing page',\r\n        opened_education_bulk_page: 'Opened education bulk page',\r\n        opened_standalone_upgrade_page: 'Opened standalone upgrade page',\r\n        clicked_choose_this_plan: 'Clicked choose this plan',\r\n        signup_modal_opened: 'Signup modal opened',\r\n        signup_modal_closed: 'Signup modal closed',\r\n        entered_name_in_signup_form: 'Entered name in signup form',\r\n        entered_cc_in_signup_flow: 'Entered cc in signup form',\r\n        clicked_completed_purchase: 'Clicked on Complete Purchase',\r\n        validation_error_before_complete_purchase: 'Validation error before complete purchase',\r\n        server_error_in_signing_up: 'Server error in signing up',\r\n        signup_complete: 'Signup complete',\r\n\r\n        focused_on_cc_field: 'Focused on the cc field',\r\n        focused_on_name_field: 'Focused on the name field',\r\n        focused_on_cvc_field: 'Focused on the cvc field',\r\n\r\n        // Downgrade/Upgrade\r\n        opened_downgrade_modal: 'Opened downgrade modal',\r\n        opened_upgrade_modal: 'Opened upgrade modal',\r\n        completed_upgrade: 'Completed upgrade',\r\n        completed_downgrade: 'Completed downgrade',\r\n\r\n        // Cancel modal\r\n        opened_cancel_modal: 'Opened cancel modal',\r\n        completed_cancel: 'Completed cancel',\r\n        took_cancel_offer: 'Took cancel offer',\r\n\r\n        // Credits modal\r\n\r\n        opened_credits_modal: 'Opened credits modal',\r\n        opened_credits_modal_plan_upgrade: 'Opened credits modal plan upgrade',\r\n        upgraded_to_plan_from_credits_modal: 'Upgraded to plan through credits modal',\r\n        opened_flyer_packs_intro: 'Opened flyer packs intro step',\r\n        opened_flyer_pack_option: 'Opened flyer pack option',\r\n        opened_share_for_credits: 'Opened share for credits',\r\n        completed_share_for_credits: 'Completed share for credits',\r\n        completed_flyer_pack_purchase: 'Completed flyer pack purchase',\r\n\r\n        // Annual upgrade\r\n        opened_switch_to_yearly_plan_page: 'Opened switch to yearly plan page'\r\n    };\r\n\r\n\r\n    /***\r\n     * Get a parameter from query string\r\n     * http://stackoverflow.com/a/901144\r\n     *\r\n     * @param name\r\n     * @returns {string}\r\n     */\r\n    function getParameterByName(name) {\r\n        name = name.replace(/[\\[]/, \"\\\\\\[\").replace(/[\\]]/, \"\\\\\\]\");\r\n        var regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\r\n        var regex = new RegExp(regexS);\r\n        var results = regex.exec(window.location.search);\r\n        if (results === null) {\r\n            return \"\";\r\n        }\r\n        else {\r\n            return decodeURIComponent(results[1].replace(/\\+/g, \" \"));\r\n        }\r\n\r\n    }\r\n\r\n    // extract the upgrade reason if relevant\r\n    var _upgradeReason = getParameterByName('ur') || 'N/A';\r\n\r\n\r\n    /***\r\n     * Report an event\r\n     * @param eventName\r\n     * @param extraProps\r\n     * @param once\r\n     * @returns {jQuery.Deferred}\r\n     */\r\n    function report(eventName, extraProps, once) {\r\n        if (!eventName) {\r\n            return $.when();\r\n        }\r\n\r\n\r\n        var base = {};\r\n\r\n        if (_upgradeReason) {\r\n            base.upgrade_reason = _upgradeReason;\r\n        }\r\n\r\n        var props = $.extend(base, extraProps || {});\r\n\r\n\r\n        return track(PREFIX + eventName, props, once);\r\n    }\r\n\r\n\r\n    return {\r\n        report: report,\r\n        Events: Events,\r\n        reason: _upgradeReason\r\n    };\r\n});", "//     Underscore.js 1.5.2\n//     http://underscorejs.org\n//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function () {\n\n    // Baseline setup\n    // --------------\n\n    // Establish the root object, `window` in the browser, or `exports` on the server.\n    var root = this;\n\n    // Save the previous value of the `_` variable.\n    var previousUnderscore = root._;\n\n    // Establish the object that gets returned to break out of a loop iteration.\n    var breaker = {};\n\n    // Save bytes in the minified (but not gzipped) version:\n    var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n    // Create quick reference variables for speed access to core prototypes.\n    var\n        push = ArrayProto.push,\n        slice = ArrayProto.slice,\n        concat = ArrayProto.concat,\n        toString = ObjProto.toString,\n        hasOwnProperty = ObjProto.hasOwnProperty;\n\n    // All **ECMAScript 5** native function implementations that we hope to use\n    // are declared here.\n    var\n        nativeForEach = ArrayProto.forEach,\n        nativeMap = ArrayProto.map,\n        nativeReduce = ArrayProto.reduce,\n        nativeReduceRight = ArrayProto.reduceRight,\n        nativeFilter = ArrayProto.filter,\n        nativeEvery = ArrayProto.every,\n        nativeSome = ArrayProto.some,\n        nativeIndexOf = ArrayProto.indexOf,\n        nativeLastIndexOf = ArrayProto.lastIndexOf,\n        nativeIsArray = Array.isArray,\n        nativeKeys = Object.keys,\n        nativeBind = FuncProto.bind;\n\n    // Create a safe reference to the Underscore object for use below.\n    var _ = function (obj) {\n        if (obj instanceof _) return obj;\n        if (!(this instanceof _)) return new _(obj);\n        this._wrapped = obj;\n    };\n\n    // Export the Underscore object for **Node.js**, with\n    // backwards-compatibility for the old `require()` API. If we're in\n    // the browser, add `_` as a global object via a string identifier,\n    // for Closure Compiler \"advanced\" mode.\n    if (typeof exports !== 'undefined') {\n        if (typeof module !== 'undefined' && module.exports) {\n            exports = module.exports = _;\n        }\n        exports._ = _;\n    } else {\n        root._ = _;\n        root._underscore = _;\n    }\n\n    // Current version.\n    _.VERSION = '1.5.2';\n\n    // Collection Functions\n    // --------------------\n\n    // The cornerstone, an `each` implementation, aka `forEach`.\n    // Handles objects with the built-in `forEach`, arrays, and raw objects.\n    // Delegates to **ECMAScript 5**'s native `forEach` if available.\n    var each = _.each = _.forEach = function (obj, iterator, context) {\n        if (obj == null) return;\n        if (nativeForEach && obj.forEach === nativeForEach) {\n            obj.forEach(iterator, context);\n        } else if (obj.length === +obj.length) {\n            for (var i = 0, length = obj.length; i < length; i++) {\n                if (iterator.call(context, obj[i], i, obj) === breaker) return;\n            }\n        } else {\n            var keys = _.keys(obj);\n            for (var i = 0, length = keys.length; i < length; i++) {\n                if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;\n            }\n        }\n    };\n\n    // Return the results of applying the iterator to each element.\n    // Delegates to **ECMAScript 5**'s native `map` if available.\n    _.map = _.collect = function (obj, iterator, context) {\n        var results = [];\n        if (obj == null) return results;\n        if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n        each(obj, function (value, index, list) {\n            results.push(iterator.call(context, value, index, list));\n        });\n        return results;\n    };\n\n    var reduceError = 'Reduce of empty array with no initial value';\n\n    // **Reduce** builds up a single result from a list of values, aka `inject`,\n    // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n    _.reduce = _.foldl = _.inject = function (obj, iterator, memo, context) {\n        var initial = arguments.length > 2;\n        if (obj == null) obj = [];\n        if (nativeReduce && obj.reduce === nativeReduce) {\n            if (context) iterator = _.bind(iterator, context);\n            return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n        }\n        each(obj, function (value, index, list) {\n            if (!initial) {\n                memo = value;\n                initial = true;\n            } else {\n                memo = iterator.call(context, memo, value, index, list);\n            }\n        });\n        if (!initial) throw new TypeError(reduceError);\n        return memo;\n    };\n\n    // The right-associative version of reduce, also known as `foldr`.\n    // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n    _.reduceRight = _.foldr = function (obj, iterator, memo, context) {\n        var initial = arguments.length > 2;\n        if (obj == null) obj = [];\n        if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n            if (context) iterator = _.bind(iterator, context);\n            return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n        }\n        var length = obj.length;\n        if (length !== +length) {\n            var keys = _.keys(obj);\n            length = keys.length;\n        }\n        each(obj, function (value, index, list) {\n            index = keys ? keys[--length] : --length;\n            if (!initial) {\n                memo = obj[index];\n                initial = true;\n            } else {\n                memo = iterator.call(context, memo, obj[index], index, list);\n            }\n        });\n        if (!initial) throw new TypeError(reduceError);\n        return memo;\n    };\n\n    // Return the first value which passes a truth test. Aliased as `detect`.\n    _.find = _.detect = function (obj, iterator, context) {\n        var result;\n        any(obj, function (value, index, list) {\n            if (iterator.call(context, value, index, list)) {\n                result = value;\n                return true;\n            }\n        });\n        return result;\n    };\n\n    // Return all the elements that pass a truth test.\n    // Delegates to **ECMAScript 5**'s native `filter` if available.\n    // Aliased as `select`.\n    _.filter = _.select = function (obj, iterator, context) {\n        var results = [];\n        if (obj == null) return results;\n        if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n        each(obj, function (value, index, list) {\n            if (iterator.call(context, value, index, list)) results.push(value);\n        });\n        return results;\n    };\n\n    // Return all the elements for which a truth test fails.\n    _.reject = function (obj, iterator, context) {\n        return _.filter(obj, function (value, index, list) {\n            return !iterator.call(context, value, index, list);\n        }, context);\n    };\n\n    // Determine whether all of the elements match a truth test.\n    // Delegates to **ECMAScript 5**'s native `every` if available.\n    // Aliased as `all`.\n    _.every = _.all = function (obj, iterator, context) {\n        iterator || (iterator = _.identity);\n        var result = true;\n        if (obj == null) return result;\n        if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n        each(obj, function (value, index, list) {\n            if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n        });\n        return !!result;\n    };\n\n    // Determine if at least one element in the object matches a truth test.\n    // Delegates to **ECMAScript 5**'s native `some` if available.\n    // Aliased as `any`.\n    var any = _.some = _.any = function (obj, iterator, context) {\n        iterator || (iterator = _.identity);\n        var result = false;\n        if (obj == null) return result;\n        if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n        each(obj, function (value, index, list) {\n            if (result || (result = iterator.call(context, value, index, list))) return breaker;\n        });\n        return !!result;\n    };\n\n    // Determine if the array or object contains a given value (using `===`).\n    // Aliased as `include`.\n    _.contains = _.include = function (obj, target) {\n        if (obj == null) return false;\n        if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n        return any(obj, function (value) {\n            return value === target;\n        });\n    };\n\n    // Invoke a method (with arguments) on every item in a collection.\n    _.invoke = function (obj, method) {\n        var args = slice.call(arguments, 2);\n        var isFunc = _.isFunction(method);\n        return _.map(obj, function (value) {\n            return (isFunc ? method : value[method]).apply(value, args);\n        });\n    };\n\n    // Convenience version of a common use case of `map`: fetching a property.\n    _.pluck = function (obj, key) {\n        return _.map(obj, function (value) {\n            return value[key];\n        });\n    };\n\n    // Convenience version of a common use case of `filter`: selecting only objects\n    // containing specific `key:value` pairs.\n    _.where = function (obj, attrs, first) {\n        if (_.isEmpty(attrs)) return first ? void 0 : [];\n        return _[first ? 'find' : 'filter'](obj, function (value) {\n            for (var key in attrs) {\n                if (attrs[key] !== value[key]) return false;\n            }\n            return true;\n        });\n    };\n\n    // Convenience version of a common use case of `find`: getting the first object\n    // containing specific `key:value` pairs.\n    _.findWhere = function (obj, attrs) {\n        return _.where(obj, attrs, true);\n    };\n\n    // Return the maximum element or (element-based computation).\n    // Can't optimize arrays of integers longer than 65,535 elements.\n    // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)\n    _.max = function (obj, iterator, context) {\n        if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n            return Math.max.apply(Math, obj);\n        }\n        if (!iterator && _.isEmpty(obj)) return -Infinity;\n        var result = {computed: -Infinity, value: -Infinity};\n        each(obj, function (value, index, list) {\n            var computed = iterator ? iterator.call(context, value, index, list) : value;\n            computed > result.computed && (result = {value: value, computed: computed});\n        });\n        return result.value;\n    };\n\n    // Return the minimum element (or element-based computation).\n    _.min = function (obj, iterator, context) {\n        if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n            return Math.min.apply(Math, obj);\n        }\n        if (!iterator && _.isEmpty(obj)) return Infinity;\n        var result = {computed: Infinity, value: Infinity};\n        each(obj, function (value, index, list) {\n            var computed = iterator ? iterator.call(context, value, index, list) : value;\n            computed < result.computed && (result = {value: value, computed: computed});\n        });\n        return result.value;\n    };\n\n    // Shuffle an array, using the modern version of the\n    // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher\u00e2\u20ac\u201cYates_shuffle).\n    _.shuffle = function (obj) {\n        var rand;\n        var index = 0;\n        var shuffled = [];\n        each(obj, function (value) {\n            rand = _.random(index++);\n            shuffled[index - 1] = shuffled[rand];\n            shuffled[rand] = value;\n        });\n        return shuffled;\n    };\n\n    // Sample **n** random values from an array.\n    // If **n** is not specified, returns a single random element from the array.\n    // The internal `guard` argument allows it to work with `map`.\n    _.sample = function (obj, n, guard) {\n        if (arguments.length < 2 || guard) {\n            return obj[_.random(obj.length - 1)];\n        }\n        return _.shuffle(obj).slice(0, Math.max(0, n));\n    };\n\n    // An internal function to generate lookup iterators.\n    var lookupIterator = function (value) {\n        return _.isFunction(value) ? value : function (obj) {\n            return obj[value];\n        };\n    };\n\n    // Sort the object's values by a criterion produced by an iterator.\n    _.sortBy = function (obj, value, context) {\n        var iterator = lookupIterator(value);\n        return _.pluck(_.map(obj, function (value, index, list) {\n            return {\n                value: value,\n                index: index,\n                criteria: iterator.call(context, value, index, list)\n            };\n        }).sort(function (left, right) {\n            var a = left.criteria;\n            var b = right.criteria;\n            if (a !== b) {\n                if (a > b || a === void 0) return 1;\n                if (a < b || b === void 0) return -1;\n            }\n            return left.index - right.index;\n        }), 'value');\n    };\n\n    // An internal function used for aggregate \"group by\" operations.\n    var group = function (behavior) {\n        return function (obj, value, context) {\n            var result = {};\n            var iterator = value == null ? _.identity : lookupIterator(value);\n            each(obj, function (value, index) {\n                var key = iterator.call(context, value, index, obj);\n                behavior(result, key, value);\n            });\n            return result;\n        };\n    };\n\n    // Groups the object's values by a criterion. Pass either a string attribute\n    // to group by, or a function that returns the criterion.\n    _.groupBy = group(function (result, key, value) {\n        (_.has(result, key) ? result[key] : (result[key] = [])).push(value);\n    });\n\n    // Indexes the object's values by a criterion, similar to `groupBy`, but for\n    // when you know that your index values will be unique.\n    _.indexBy = group(function (result, key, value) {\n        result[key] = value;\n    });\n\n    // Counts instances of an object that group by a certain criterion. Pass\n    // either a string attribute to count by, or a function that returns the\n    // criterion.\n    _.countBy = group(function (result, key) {\n        _.has(result, key) ? result[key]++ : result[key] = 1;\n    });\n\n    // Use a comparator function to figure out the smallest index at which\n    // an object should be inserted so as to maintain order. Uses binary search.\n    _.sortedIndex = function (array, obj, iterator, context) {\n        iterator = iterator == null ? _.identity : lookupIterator(iterator);\n        var value = iterator.call(context, obj);\n        var low = 0, high = array.length;\n        while (low < high) {\n            var mid = (low + high) >>> 1;\n            iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n        }\n        return low;\n    };\n\n    // Safely create a real, live array from anything iterable.\n    _.toArray = function (obj) {\n        if (!obj) return [];\n        if (_.isArray(obj)) return slice.call(obj);\n        if (obj.length === +obj.length) return _.map(obj, _.identity);\n        return _.values(obj);\n    };\n\n    // Return the number of elements in an object.\n    _.size = function (obj) {\n        if (obj == null) return 0;\n        return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n    };\n\n    // Array Functions\n    // ---------------\n\n    // Get the first element of an array. Passing **n** will return the first N\n    // values in the array. Aliased as `head` and `take`. The **guard** check\n    // allows it to work with `_.map`.\n    _.first = _.head = _.take = function (array, n, guard) {\n        if (array == null) return void 0;\n        return (n == null) || guard ? array[0] : slice.call(array, 0, n);\n    };\n\n    // Returns everything but the last entry of the array. Especially useful on\n    // the arguments object. Passing **n** will return all the values in\n    // the array, excluding the last N. The **guard** check allows it to work with\n    // `_.map`.\n    _.initial = function (array, n, guard) {\n        return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n    };\n\n    // Get the last element of an array. Passing **n** will return the last N\n    // values in the array. The **guard** check allows it to work with `_.map`.\n    _.last = function (array, n, guard) {\n        if (array == null) return void 0;\n        if ((n == null) || guard) {\n            return array[array.length - 1];\n        } else {\n            return slice.call(array, Math.max(array.length - n, 0));\n        }\n    };\n\n    // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n    // Especially useful on the arguments object. Passing an **n** will return\n    // the rest N values in the array. The **guard**\n    // check allows it to work with `_.map`.\n    _.rest = _.tail = _.drop = function (array, n, guard) {\n        return slice.call(array, (n == null) || guard ? 1 : n);\n    };\n\n    // Trim out all falsy values from an array.\n    _.compact = function (array) {\n        return _.filter(array, _.identity);\n    };\n\n    // Internal implementation of a recursive `flatten` function.\n    var flatten = function (input, shallow, output) {\n        if (shallow && _.every(input, _.isArray)) {\n            return concat.apply(output, input);\n        }\n        each(input, function (value) {\n            if (_.isArray(value) || _.isArguments(value)) {\n                shallow ? push.apply(output, value) : flatten(value, shallow, output);\n            } else {\n                output.push(value);\n            }\n        });\n        return output;\n    };\n\n    // Flatten out an array, either recursively (by default), or just one level.\n    _.flatten = function (array, shallow) {\n        return flatten(array, shallow, []);\n    };\n\n    // Return a version of the array that does not contain the specified value(s).\n    _.without = function (array) {\n        return _.difference(array, slice.call(arguments, 1));\n    };\n\n    // Produce a duplicate-free version of the array. If the array has already\n    // been sorted, you have the option of using a faster algorithm.\n    // Aliased as `unique`.\n    _.uniq = _.unique = function (array, isSorted, iterator, context) {\n        if (_.isFunction(isSorted)) {\n            context = iterator;\n            iterator = isSorted;\n            isSorted = false;\n        }\n        var initial = iterator ? _.map(array, iterator, context) : array;\n        var results = [];\n        var seen = [];\n        each(initial, function (value, index) {\n            if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n                seen.push(value);\n                results.push(array[index]);\n            }\n        });\n        return results;\n    };\n\n    // Produce an array that contains the union: each distinct element from all of\n    // the passed-in arrays.\n    _.union = function () {\n        return _.uniq(_.flatten(arguments, true));\n    };\n\n    // Produce an array that contains every item shared between all the\n    // passed-in arrays.\n    _.intersection = function (array) {\n        var rest = slice.call(arguments, 1);\n        return _.filter(_.uniq(array), function (item) {\n            return _.every(rest, function (other) {\n                return _.indexOf(other, item) >= 0;\n            });\n        });\n    };\n\n    // Take the difference between one array and a number of other arrays.\n    // Only the elements present in just the first array will remain.\n    _.difference = function (array) {\n        var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n        return _.filter(array, function (value) {\n            return !_.contains(rest, value);\n        });\n    };\n\n    // Zip together multiple lists into a single array -- elements that share\n    // an index go together.\n    _.zip = function () {\n        var length = _.max(_.pluck(arguments, \"length\").concat(0));\n        var results = new Array(length);\n        for (var i = 0; i < length; i++) {\n            results[i] = _.pluck(arguments, '' + i);\n        }\n        return results;\n    };\n\n    // Converts lists into objects. Pass either a single array of `[key, value]`\n    // pairs, or two parallel arrays of the same length -- one of keys, and one of\n    // the corresponding values.\n    _.object = function (list, values) {\n        if (list == null) return {};\n        var result = {};\n        for (var i = 0, length = list.length; i < length; i++) {\n            if (values) {\n                result[list[i]] = values[i];\n            } else {\n                result[list[i][0]] = list[i][1];\n            }\n        }\n        return result;\n    };\n\n    // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n    // we need this function. Return the position of the first occurrence of an\n    // item in an array, or -1 if the item is not included in the array.\n    // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n    // If the array is large and already in sort order, pass `true`\n    // for **isSorted** to use binary search.\n    _.indexOf = function (array, item, isSorted) {\n        if (array == null) return -1;\n        var i = 0, length = array.length;\n        if (isSorted) {\n            if (typeof isSorted == 'number') {\n                i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);\n            } else {\n                i = _.sortedIndex(array, item);\n                return array[i] === item ? i : -1;\n            }\n        }\n        if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n        for (; i < length; i++) if (array[i] === item) return i;\n        return -1;\n    };\n\n    // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n    _.lastIndexOf = function (array, item, from) {\n        if (array == null) return -1;\n        var hasIndex = from != null;\n        if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n            return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n        }\n        var i = (hasIndex ? from : array.length);\n        while (i--) if (array[i] === item) return i;\n        return -1;\n    };\n\n    // Generate an integer Array containing an arithmetic progression. A port of\n    // the native Python `range()` function. See\n    // [the Python documentation](http://docs.python.org/library/functions.html#range).\n    _.range = function (start, stop, step) {\n        if (arguments.length <= 1) {\n            stop = start || 0;\n            start = 0;\n        }\n        step = arguments[2] || 1;\n\n        var length = Math.max(Math.ceil((stop - start) / step), 0);\n        var idx = 0;\n        var range = new Array(length);\n\n        while (idx < length) {\n            range[idx++] = start;\n            start += step;\n        }\n\n        return range;\n    };\n\n    // Function (ahem) Functions\n    // ------------------\n\n    // Reusable constructor function for prototype setting.\n    var ctor = function () {\n    };\n\n    // Create a function bound to a given object (assigning `this`, and arguments,\n    // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n    // available.\n    _.bind = function (func, context) {\n        var args, bound;\n        if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n        if (!_.isFunction(func)) throw new TypeError;\n        args = slice.call(arguments, 2);\n        return bound = function () {\n            if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\n            ctor.prototype = func.prototype;\n            var self = new ctor;\n            ctor.prototype = null;\n            var result = func.apply(self, args.concat(slice.call(arguments)));\n            if (Object(result) === result) return result;\n            return self;\n        };\n    };\n\n    // Partially apply a function by creating a version that has had some of its\n    // arguments pre-filled, without changing its dynamic `this` context.\n    _.partial = function (func) {\n        var args = slice.call(arguments, 1);\n        return function () {\n            return func.apply(this, args.concat(slice.call(arguments)));\n        };\n    };\n\n    // Bind all of an object's methods to that object. Useful for ensuring that\n    // all callbacks defined on an object belong to it.\n    _.bindAll = function (obj) {\n        var funcs = slice.call(arguments, 1);\n        if (funcs.length === 0) throw new Error(\"bindAll must be passed function names\");\n        each(funcs, function (f) {\n            obj[f] = _.bind(obj[f], obj);\n        });\n        return obj;\n    };\n\n    // Memoize an expensive function by storing its results.\n    _.memoize = function (func, hasher) {\n        var memo = {};\n        hasher || (hasher = _.identity);\n        return function () {\n            var key = hasher.apply(this, arguments);\n            return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n        };\n    };\n\n    // Delays a function for the given number of milliseconds, and then calls\n    // it with the arguments supplied.\n    _.delay = function (func, wait) {\n        var args = slice.call(arguments, 2);\n        return setTimeout(function () {\n            return func.apply(null, args);\n        }, wait);\n    };\n\n    // Defers a function, scheduling it to run after the current call stack has\n    // cleared.\n    _.defer = function (func) {\n        return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n    };\n\n    // Returns a function, that, when invoked, will only be triggered at most once\n    // during a given window of time. Normally, the throttled function will run\n    // as much as it can, without ever going more than once per `wait` duration;\n    // but if you'd like to disable the execution on the leading edge, pass\n    // `{leading: false}`. To disable execution on the trailing edge, ditto.\n    _.throttle = function (func, wait, options) {\n        var context, args, result;\n        var timeout = null;\n        var previous = 0;\n        options || (options = {});\n        var later = function () {\n            previous = options.leading === false ? 0 : new Date;\n            timeout = null;\n            result = func.apply(context, args);\n        };\n        return function () {\n            var now = new Date;\n            if (!previous && options.leading === false) previous = now;\n            var remaining = wait - (now - previous);\n            context = this;\n            args = arguments;\n            if (remaining <= 0) {\n                clearTimeout(timeout);\n                timeout = null;\n                previous = now;\n                result = func.apply(context, args);\n            } else if (!timeout && options.trailing !== false) {\n                timeout = setTimeout(later, remaining);\n            }\n            return result;\n        };\n    };\n\n    // Returns a function, that, as long as it continues to be invoked, will not\n    // be triggered. The function will be called after it stops being called for\n    // N milliseconds. If `immediate` is passed, trigger the function on the\n    // leading edge, instead of the trailing.\n    _.debounce = function (func, wait, immediate) {\n        var timeout, args, context, timestamp, result;\n        return function () {\n            context = this;\n            args = arguments;\n            timestamp = new Date();\n            var later = function () {\n                var last = (new Date()) - timestamp;\n                if (last < wait) {\n                    timeout = setTimeout(later, wait - last);\n                } else {\n                    timeout = null;\n                    if (!immediate) result = func.apply(context, args);\n                }\n            };\n            var callNow = immediate && !timeout;\n            if (!timeout) {\n                timeout = setTimeout(later, wait);\n            }\n            if (callNow) result = func.apply(context, args);\n            return result;\n        };\n    };\n\n    // Returns a function that will be executed at most one time, no matter how\n    // often you call it. Useful for lazy initialization.\n    _.once = function (func) {\n        var ran = false, memo;\n        return function () {\n            if (ran) return memo;\n            ran = true;\n            memo = func.apply(this, arguments);\n            func = null;\n            return memo;\n        };\n    };\n\n    // Returns the first function passed as an argument to the second,\n    // allowing you to adjust arguments, run code before and after, and\n    // conditionally execute the original function.\n    _.wrap = function (func, wrapper) {\n        return function () {\n            var args = [func];\n            push.apply(args, arguments);\n            return wrapper.apply(this, args);\n        };\n    };\n\n    // Returns a function that is the composition of a list of functions, each\n    // consuming the return value of the function that follows.\n    _.compose = function () {\n        var funcs = arguments;\n        return function () {\n            var args = arguments;\n            for (var i = funcs.length - 1; i >= 0; i--) {\n                args = [funcs[i].apply(this, args)];\n            }\n            return args[0];\n        };\n    };\n\n    // Returns a function that will only be executed after being called N times.\n    _.after = function (times, func) {\n        return function () {\n            if (--times < 1) {\n                return func.apply(this, arguments);\n            }\n        };\n    };\n\n    // Object Functions\n    // ----------------\n\n    // Retrieve the names of an object's properties.\n    // Delegates to **ECMAScript 5**'s native `Object.keys`\n    _.keys = nativeKeys || function (obj) {\n            if (obj !== Object(obj)) throw new TypeError('Invalid object');\n            var keys = [];\n            for (var key in obj) if (_.has(obj, key)) keys.push(key);\n            return keys;\n        };\n\n    // Retrieve the values of an object's properties.\n    _.values = function (obj) {\n        var keys = _.keys(obj);\n        var length = keys.length;\n        var values = new Array(length);\n        for (var i = 0; i < length; i++) {\n            values[i] = obj[keys[i]];\n        }\n        return values;\n    };\n\n    // Convert an object into a list of `[key, value]` pairs.\n    _.pairs = function (obj) {\n        var keys = _.keys(obj);\n        var length = keys.length;\n        var pairs = new Array(length);\n        for (var i = 0; i < length; i++) {\n            pairs[i] = [keys[i], obj[keys[i]]];\n        }\n        return pairs;\n    };\n\n    // Invert the keys and values of an object. The values must be serializable.\n    _.invert = function (obj) {\n        var result = {};\n        var keys = _.keys(obj);\n        for (var i = 0, length = keys.length; i < length; i++) {\n            result[obj[keys[i]]] = keys[i];\n        }\n        return result;\n    };\n\n    // Return a sorted list of the function names available on the object.\n    // Aliased as `methods`\n    _.functions = _.methods = function (obj) {\n        var names = [];\n        for (var key in obj) {\n            if (_.isFunction(obj[key])) names.push(key);\n        }\n        return names.sort();\n    };\n\n    // Extend a given object with all the properties in passed-in object(s).\n    _.extend = function (obj) {\n        each(slice.call(arguments, 1), function (source) {\n            if (source) {\n                for (var prop in source) {\n                    obj[prop] = source[prop];\n                }\n            }\n        });\n        return obj;\n    };\n\n    // Return a copy of the object only containing the whitelisted properties.\n    _.pick = function (obj) {\n        var copy = {};\n        var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n        each(keys, function (key) {\n            if (key in obj) copy[key] = obj[key];\n        });\n        return copy;\n    };\n\n    // Return a copy of the object without the blacklisted properties.\n    _.omit = function (obj) {\n        var copy = {};\n        var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n        for (var key in obj) {\n            if (!_.contains(keys, key)) copy[key] = obj[key];\n        }\n        return copy;\n    };\n\n    // Fill in a given object with default properties.\n    _.defaults = function (obj) {\n        each(slice.call(arguments, 1), function (source) {\n            if (source) {\n                for (var prop in source) {\n                    if (obj[prop] === void 0) obj[prop] = source[prop];\n                }\n            }\n        });\n        return obj;\n    };\n\n    // Create a (shallow-cloned) duplicate of an object.\n    _.clone = function (obj) {\n        if (!_.isObject(obj)) return obj;\n        return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n    };\n\n    // Invokes interceptor with the obj, and then returns obj.\n    // The primary purpose of this method is to \"tap into\" a method chain, in\n    // order to perform operations on intermediate results within the chain.\n    _.tap = function (obj, interceptor) {\n        interceptor(obj);\n        return obj;\n    };\n\n    // Internal recursive comparison function for `isEqual`.\n    var eq = function (a, b, aStack, bStack) {\n        // Identical objects are equal. `0 === -0`, but they aren't identical.\n        // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n        if (a === b) return a !== 0 || 1 / a == 1 / b;\n        // A strict comparison is necessary because `null == undefined`.\n        if (a == null || b == null) return a === b;\n        // Unwrap any wrapped objects.\n        if (a instanceof _) a = a._wrapped;\n        if (b instanceof _) b = b._wrapped;\n        // Compare `[[Class]]` names.\n        var className = toString.call(a);\n        if (className != toString.call(b)) return false;\n        switch (className) {\n            // Strings, numbers, dates, and booleans are compared by value.\n            case '[object String]':\n                // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n                // equivalent to `new String(\"5\")`.\n                return a == String(b);\n            case '[object Number]':\n                // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n                // other numeric values.\n                return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n            case '[object Date]':\n            case '[object Boolean]':\n                // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n                // millisecond representations. Note that invalid dates with millisecond representations\n                // of `NaN` are not equivalent.\n                return +a == +b;\n            // RegExps are compared by their source patterns and flags.\n            case '[object RegExp]':\n                return a.source == b.source &&\n                    a.global == b.global &&\n                    a.multiline == b.multiline &&\n                    a.ignoreCase == b.ignoreCase;\n        }\n        if (typeof a != 'object' || typeof b != 'object') return false;\n        // Assume equality for cyclic structures. The algorithm for detecting cyclic\n        // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n        var length = aStack.length;\n        while (length--) {\n            // Linear search. Performance is inversely proportional to the number of\n            // unique nested structures.\n            if (aStack[length] == a) return bStack[length] == b;\n        }\n        // Objects with different constructors are not equivalent, but `Object`s\n        // from different frames are.\n        var aCtor = a.constructor, bCtor = b.constructor;\n        if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n            _.isFunction(bCtor) && (bCtor instanceof bCtor))) {\n            return false;\n        }\n        // Add the first object to the stack of traversed objects.\n        aStack.push(a);\n        bStack.push(b);\n        var size = 0, result = true;\n        // Recursively compare objects and arrays.\n        if (className == '[object Array]') {\n            // Compare array lengths to determine if a deep comparison is necessary.\n            size = a.length;\n            result = size == b.length;\n            if (result) {\n                // Deep compare the contents, ignoring non-numeric properties.\n                while (size--) {\n                    if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n                }\n            }\n        } else {\n            // Deep compare objects.\n            for (var key in a) {\n                if (_.has(a, key)) {\n                    // Count the expected number of properties.\n                    size++;\n                    // Deep compare each member.\n                    if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n                }\n            }\n            // Ensure that both objects contain the same number of properties.\n            if (result) {\n                for (key in b) {\n                    if (_.has(b, key) && !(size--)) break;\n                }\n                result = !size;\n            }\n        }\n        // Remove the first object from the stack of traversed objects.\n        aStack.pop();\n        bStack.pop();\n        return result;\n    };\n\n    // Perform a deep comparison to check if two objects are equal.\n    _.isEqual = function (a, b) {\n        return eq(a, b, [], []);\n    };\n\n    // Is a given array, string, or object empty?\n    // An \"empty\" object has no enumerable own-properties.\n    _.isEmpty = function (obj) {\n        if (obj == null) return true;\n        if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n        for (var key in obj) if (_.has(obj, key)) return false;\n        return true;\n    };\n\n    // Is a given value a DOM element?\n    _.isElement = function (obj) {\n        return !!(obj && obj.nodeType === 1);\n    };\n\n    // Is a given value an array?\n    // Delegates to ECMA5's native Array.isArray\n    _.isArray = nativeIsArray || function (obj) {\n            return toString.call(obj) == '[object Array]';\n        };\n\n    // Is a given variable an object?\n    _.isObject = function (obj) {\n        return obj === Object(obj);\n    };\n\n    // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n    each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function (name) {\n        _['is' + name] = function (obj) {\n            return toString.call(obj) == '[object ' + name + ']';\n        };\n    });\n\n    // Define a fallback version of the method in browsers (ahem, IE), where\n    // there isn't any inspectable \"Arguments\" type.\n    if (!_.isArguments(arguments)) {\n        _.isArguments = function (obj) {\n            return !!(obj && _.has(obj, 'callee'));\n        };\n    }\n\n    // Optimize `isFunction` if appropriate.\n    if (typeof (/./) !== 'function') {\n        _.isFunction = function (obj) {\n            return typeof obj === 'function';\n        };\n    }\n\n    // Is a given object a finite number?\n    _.isFinite = function (obj) {\n        return isFinite(obj) && !isNaN(parseFloat(obj));\n    };\n\n    // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n    _.isNaN = function (obj) {\n        return _.isNumber(obj) && obj != +obj;\n    };\n\n    // Is a given value a boolean?\n    _.isBoolean = function (obj) {\n        return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n    };\n\n    // Is a given value equal to null?\n    _.isNull = function (obj) {\n        return obj === null;\n    };\n\n    // Is a given variable undefined?\n    _.isUndefined = function (obj) {\n        return obj === void 0;\n    };\n\n    // Shortcut function for checking if an object has a given property directly\n    // on itself (in other words, not on a prototype).\n    _.has = function (obj, key) {\n        return hasOwnProperty.call(obj, key);\n    };\n\n    // Utility Functions\n    // -----------------\n\n    // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n    // previous owner. Returns a reference to the Underscore object.\n    _.noConflict = function () {\n        root._ = previousUnderscore;\n        return this;\n    };\n\n    // Keep the identity function around for default iterators.\n    _.identity = function (value) {\n        return value;\n    };\n\n    // Run a function **n** times.\n    _.times = function (n, iterator, context) {\n        var accum = Array(Math.max(0, n));\n        for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n        return accum;\n    };\n\n    // Return a random integer between min and max (inclusive).\n    _.random = function (min, max) {\n        if (max == null) {\n            max = min;\n            min = 0;\n        }\n        return min + Math.floor(Math.random() * (max - min + 1));\n    };\n\n    // List of HTML entities for escaping.\n    var entityMap = {\n        escape: {\n            '&': '&amp;',\n            '<': '&lt;',\n            '>': '&gt;',\n            '\"': '&quot;',\n            \"'\": '&#x27;'\n        }\n    };\n    entityMap.unescape = _.invert(entityMap.escape);\n\n    // Regexes containing the keys and values listed immediately above.\n    var entityRegexes = {\n        escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),\n        unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')\n    };\n\n    // Functions for escaping and unescaping strings to/from HTML interpolation.\n    _.each(['escape', 'unescape'], function (method) {\n        _[method] = function (string) {\n            if (string == null) return '';\n            return ('' + string).replace(entityRegexes[method], function (match) {\n                return entityMap[method][match];\n            });\n        };\n    });\n\n    // If the value of the named `property` is a function then invoke it with the\n    // `object` as context; otherwise, return it.\n    _.result = function (object, property) {\n        if (object == null) return void 0;\n        var value = object[property];\n        return _.isFunction(value) ? value.call(object) : value;\n    };\n\n    // Add your own custom functions to the Underscore object.\n    _.mixin = function (obj) {\n        each(_.functions(obj), function (name) {\n            var func = _[name] = obj[name];\n            _.prototype[name] = function () {\n                var args = [this._wrapped];\n                push.apply(args, arguments);\n                return result.call(this, func.apply(_, args));\n            };\n        });\n    };\n\n    // Generate a unique integer id (unique within the entire client session).\n    // Useful for temporary DOM ids.\n    var idCounter = 0;\n    _.uniqueId = function (prefix) {\n        var id = ++idCounter + '';\n        return prefix ? prefix + id : id;\n    };\n\n    // By default, Underscore uses ERB-style template delimiters, change the\n    // following template settings to use alternative delimiters.\n    _.templateSettings = {\n        evaluate: /<%([\\s\\S]+?)%>/g,\n        interpolate: /<%=([\\s\\S]+?)%>/g,\n        escape: /<%-([\\s\\S]+?)%>/g\n    };\n\n    // When customizing `templateSettings`, if you don't want to define an\n    // interpolation, evaluation or escaping regex, we need one that is\n    // guaranteed not to match.\n    var noMatch = /(.)^/;\n\n    // Certain characters need to be escaped so that they can be put into a\n    // string literal.\n    var escapes = {\n        \"'\": \"'\",\n        '\\\\': '\\\\',\n        '\\r': 'r',\n        '\\n': 'n',\n        '\\t': 't',\n        '\\u2028': 'u2028',\n        '\\u2029': 'u2029'\n    };\n\n    var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n\n    // JavaScript micro-templating, similar to John Resig's implementation.\n    // Underscore templating handles arbitrary delimiters, preserves whitespace,\n    // and correctly escapes quotes within interpolated code.\n    _.template = function (text, data, settings) {\n        var render;\n        settings = _.defaults({}, settings, _.templateSettings);\n\n        // Combine delimiters into one regular expression via alternation.\n        var matcher = new RegExp([\n                (settings.escape || noMatch).source,\n                (settings.interpolate || noMatch).source,\n                (settings.evaluate || noMatch).source\n            ].join('|') + '|$', 'g');\n\n        // Compile the template source, escaping string literals appropriately.\n        var index = 0;\n        var source = \"__p+='\";\n        text.replace(matcher, function (match, escape, interpolate, evaluate, offset) {\n            source += text.slice(index, offset)\n                .replace(escaper, function (match) {\n                    return '\\\\' + escapes[match];\n                });\n\n            if (escape) {\n                source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n            }\n            if (interpolate) {\n                source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n            }\n            if (evaluate) {\n                source += \"';\\n\" + evaluate + \"\\n__p+='\";\n            }\n            index = offset + match.length;\n            return match;\n        });\n        source += \"';\\n\";\n\n        // If a variable is not specified, place data values in local scope.\n        if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n        source = \"var __t,__p='',__j=Array.prototype.join,\" +\n            \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n            source + \"return __p;\\n\";\n\n        try {\n            render = new Function(settings.variable || 'obj', '_', source);\n        } catch (e) {\n            e.source = source;\n            throw e;\n        }\n\n        if (data) return render(data, _);\n        var template = function (data) {\n            return render.call(this, data, _);\n        };\n\n        // Provide the compiled function source as a convenience for precompilation.\n        template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n\n        return template;\n    };\n\n    // Add a \"chain\" function, which will delegate to the wrapper.\n    _.chain = function (obj) {\n        return _(obj).chain();\n    };\n\n    // OOP\n    // ---------------\n    // If Underscore is called as a function, it returns a wrapped object that\n    // can be used OO-style. This wrapper holds altered versions of all the\n    // underscore functions. Wrapped objects may be chained.\n\n    // Helper function to continue chaining intermediate results.\n    var result = function (obj) {\n        return this._chain ? _(obj).chain() : obj;\n    };\n\n    // Add all of the Underscore functions to the wrapper object.\n    _.mixin(_);\n\n    // Add all mutator Array functions to the wrapper.\n    each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function (name) {\n        var method = ArrayProto[name];\n        _.prototype[name] = function () {\n            var obj = this._wrapped;\n            method.apply(obj, arguments);\n            if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];\n            return result.call(this, obj);\n        };\n    });\n\n    // Add all accessor Array functions to the wrapper.\n    each(['concat', 'join', 'slice'], function (name) {\n        var method = ArrayProto[name];\n        _.prototype[name] = function () {\n            return result.call(this, method.apply(this._wrapped, arguments));\n        };\n    });\n\n    _.extend(_.prototype, {\n\n        // Start chaining a wrapped Underscore object.\n        chain: function () {\n            this._chain = true;\n            return this;\n        },\n\n        // Extracts the result from a wrapped and chained object.\n        value: function () {\n            return this._wrapped;\n        }\n\n    });\n\n}).call(window);", "//     Backbone.js 1.1.2\n\n//     (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://backbonejs.org\n\n(function(root, factory) {\n\n  // Set up Backbone appropriately for the environment. Start with AMD.\n  if (typeof define === 'function' && define.amd) {\n    define(['underscore', 'jquery', 'exports'], function(_, $, exports) {\n      // Export global even in AMD case in case this script is loaded with\n      // others that may still expect a global Backbone.\n      root.Backbone = factory(root, exports, _, $);\n    });\n\n  // Next for Node.js or CommonJS. jQuery may not be needed as a module.\n  } else if (typeof exports !== 'undefined') {\n    factory(root, exports, _);\n\n  // Finally, as a browser global.\n  } else {\n    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));\n  }\n\n}(this, function(root, Backbone, _, $) {\n\n  // Initial Setup\n  // -------------\n\n  // Save the previous value of the `Backbone` variable, so that it can be\n  // restored later on, if `noConflict` is used.\n  var previousBackbone = root.Backbone;\n\n  // Create local references to array methods we'll want to use later.\n  var array = [];\n  var push = array.push;\n  var slice = array.slice;\n  var splice = array.splice;\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '1.1.2';\n\n  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns\n  // the `$` variable.\n  Backbone.$ = $;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\n  // will fake `\"PATCH\"`, `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\n  // set a `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // ---------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // custom events. You may bind with `on` or remove with `off` callback\n  // functions to an event; `trigger`-ing an event fires all callbacks in\n  // succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.on('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  var Events = Backbone.Events = {\n\n    // Bind an event to a `callback` function. Passing `\"all\"` will bind\n    // the callback to all events fired.\n    on: function(name, callback, context) {\n      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;\n      this._events || (this._events = {});\n      var events = this._events[name] || (this._events[name] = []);\n      events.push({callback: callback, context: context, ctx: context || this});\n      return this;\n    },\n\n    // Bind an event to only be triggered a single time. After the first time\n    // the callback is invoked, it will be removed.\n    once: function(name, callback, context) {\n      if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;\n      var self = this;\n      var once = _.once(function() {\n        self.off(name, once);\n        callback.apply(this, arguments);\n      });\n      once._callback = callback;\n      return this.on(name, once, context);\n    },\n\n    // Remove one or many callbacks. If `context` is null, removes all\n    // callbacks with that function. If `callback` is null, removes all\n    // callbacks for the event. If `name` is null, removes all bound\n    // callbacks for all events.\n    off: function(name, callback, context) {\n      var retain, ev, events, names, i, l, j, k;\n      if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;\n      if (!name && !callback && !context) {\n        this._events = void 0;\n        return this;\n      }\n      names = name ? [name] : _.keys(this._events);\n      for (i = 0, l = names.length; i < l; i++) {\n        name = names[i];\n        if (events = this._events[name]) {\n          this._events[name] = retain = [];\n          if (callback || context) {\n            for (j = 0, k = events.length; j < k; j++) {\n              ev = events[j];\n              if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||\n                  (context && context !== ev.context)) {\n                retain.push(ev);\n              }\n            }\n          }\n          if (!retain.length) delete this._events[name];\n        }\n      }\n\n      return this;\n    },\n\n    // Trigger one or many events, firing all bound callbacks. Callbacks are\n    // passed the same arguments as `trigger` is, apart from the event name\n    // (unless you're listening on `\"all\"`, which will cause your callback to\n    // receive the true name of the event as the first argument).\n    trigger: function(name) {\n      if (!this._events) return this;\n      var args = slice.call(arguments, 1);\n      if (!eventsApi(this, 'trigger', name, args)) return this;\n      var events = this._events[name];\n      var allEvents = this._events.all;\n      if (events) triggerEvents(events, args);\n      if (allEvents) triggerEvents(allEvents, arguments);\n      return this;\n    },\n\n    // Tell this object to stop listening to either specific events ... or\n    // to every object it's currently listening to.\n    stopListening: function(obj, name, callback) {\n      var listeningTo = this._listeningTo;\n      if (!listeningTo) return this;\n      var remove = !name && !callback;\n      if (!callback && typeof name === 'object') callback = this;\n      if (obj) (listeningTo = {})[obj._listenId] = obj;\n      for (var id in listeningTo) {\n        obj = listeningTo[id];\n        obj.off(name, callback, this);\n        if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id];\n      }\n      return this;\n    }\n\n  };\n\n  // Regular expression used to split event strings.\n  var eventSplitter = /\\s+/;\n\n  // Implement fancy features of the Events API such as multiple event\n  // names `\"change blur\"` and jQuery-style event maps `{change: action}`\n  // in terms of the existing API.\n  var eventsApi = function(obj, action, name, rest) {\n    if (!name) return true;\n\n    // Handle event maps.\n    if (typeof name === 'object') {\n      for (var key in name) {\n        obj[action].apply(obj, [key, name[key]].concat(rest));\n      }\n      return false;\n    }\n\n    // Handle space separated event names.\n    if (eventSplitter.test(name)) {\n      var names = name.split(eventSplitter);\n      for (var i = 0, l = names.length; i < l; i++) {\n        obj[action].apply(obj, [names[i]].concat(rest));\n      }\n      return false;\n    }\n\n    return true;\n  };\n\n  // A difficult-to-believe, but optimized internal dispatch function for\n  // triggering events. Tries to keep the usual cases speedy (most internal\n  // Backbone events have 3 arguments).\n  var triggerEvents = function(events, args) {\n    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n    switch (args.length) {\n      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n    }\n  };\n\n  var listenMethods = {listenTo: 'on', listenToOnce: 'once'};\n\n  // Inversion-of-control versions of `on` and `once`. Tell *this* object to\n  // listen to an event in another object ... keeping track of what it's\n  // listening to.\n  _.each(listenMethods, function(implementation, method) {\n    Events[method] = function(obj, name, callback) {\n      var listeningTo = this._listeningTo || (this._listeningTo = {});\n      var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n      listeningTo[id] = obj;\n      if (!callback && typeof name === 'object') callback = this;\n      obj[implementation](name, callback, this);\n      return this;\n    };\n  });\n\n  // Aliases for backwards compatibility.\n  Events.bind   = Events.on;\n  Events.unbind = Events.off;\n\n  // Allow the `Backbone` object to serve as a global event bus, for folks who\n  // want global \"pubsub\" in a convenient place.\n  _.extend(Backbone, Events);\n\n  // Backbone.Model\n  // --------------\n\n  // Backbone **Models** are the basic data object in the framework --\n  // frequently representing a row in a table in a database on your server.\n  // A discrete chunk of data and a bunch of useful, related methods for\n  // performing computations and transformations on that data.\n\n  // Create a new model with the specified attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  var Model = Backbone.Model = function(attributes, options) {\n    var attrs = attributes || {};\n    options || (options = {});\n    this.cid = _.uniqueId('c');\n    this.attributes = {};\n    if (options.collection) this.collection = options.collection;\n    if (options.parse) attrs = this.parse(attrs, options) || {};\n    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));\n    this.set(attrs, options);\n    this.changed = {};\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Model.prototype, Events, {\n\n    // A hash of attributes whose current and previous value differ.\n    changed: null,\n\n    // The value returned during the last failed validation.\n    validationError: null,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute: 'id',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON: function(options) {\n      return _.clone(this.attributes);\n    },\n\n    // Proxy `Backbone.sync` by default -- but override this if you need\n    // custom syncing semantics for *this* particular model.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Get the value of an attribute.\n    get: function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape: function(attr) {\n      return _.escape(this.get(attr));\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has: function(attr) {\n      return this.get(attr) != null;\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"`. This is\n    // the core primitive operation of a model, updating the data and notifying\n    // anyone who needs to know about the change in state. The heart of the beast.\n    set: function(key, val, options) {\n      var attr, attrs, unset, changes, silent, changing, prev, current;\n      if (key == null) return this;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options || (options = {});\n\n      // Run validation.\n      if (!this._validate(attrs, options)) return false;\n\n      // Extract attributes and options.\n      unset           = options.unset;\n      silent          = options.silent;\n      changes         = [];\n      changing        = this._changing;\n      this._changing  = true;\n\n      if (!changing) {\n        this._previousAttributes = _.clone(this.attributes);\n        this.changed = {};\n      }\n      current = this.attributes, prev = this._previousAttributes;\n\n      // Check for changes of `id`.\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\n\n      // For each `set` attribute, update or delete the current value.\n      for (attr in attrs) {\n        val = attrs[attr];\n        if (!_.isEqual(current[attr], val)) changes.push(attr);\n        if (!_.isEqual(prev[attr], val)) {\n          this.changed[attr] = val;\n        } else {\n          delete this.changed[attr];\n        }\n        unset ? delete current[attr] : current[attr] = val;\n      }\n\n      // Trigger all relevant attribute changes.\n      if (!silent) {\n        if (changes.length) this._pending = options;\n        for (var i = 0, l = changes.length; i < l; i++) {\n          this.trigger('change:' + changes[i], this, current[changes[i]], options);\n        }\n      }\n\n      // You might be wondering why there's a `while` loop here. Changes can\n      // be recursively nested within `\"change\"` events.\n      if (changing) return this;\n      if (!silent) {\n        while (this._pending) {\n          options = this._pending;\n          this._pending = false;\n          this.trigger('change', this, options);\n        }\n      }\n      this._pending = false;\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"`. `unset` is a noop\n    // if the attribute doesn't exist.\n    unset: function(attr, options) {\n      return this.set(attr, void 0, _.extend({}, options, {unset: true}));\n    },\n\n    // Clear all attributes on the model, firing `\"change\"`.\n    clear: function(options) {\n      var attrs = {};\n      for (var key in this.attributes) attrs[key] = void 0;\n      return this.set(attrs, _.extend({}, options, {unset: true}));\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged: function(attr) {\n      if (attr == null) return !_.isEmpty(this.changed);\n      return _.has(this.changed, attr);\n    },\n\n    // Return an object containing all the attributes that have changed, or\n    // false if there are no changed attributes. Useful for determining what\n    // parts of a view need to be updated and/or what attributes need to be\n    // persisted to the server. Unset attributes will be set to undefined.\n    // You can also pass an attributes object to diff against the model,\n    // determining if there *would be* a change.\n    changedAttributes: function(diff) {\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\n      var val, changed = false;\n      var old = this._changing ? this._previousAttributes : this.attributes;\n      for (var attr in diff) {\n        if (_.isEqual(old[attr], (val = diff[attr]))) continue;\n        (changed || (changed = {}))[attr] = val;\n      }\n      return changed;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous: function(attr) {\n      if (attr == null || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes: function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Fetch the model from the server. If the server's representation of the\n    // model differs from its current attributes, they will be overridden,\n    // triggering a `\"change\"` event.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        if (!model.set(model.parse(resp, options), options)) return false;\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save: function(key, val, options) {\n      var attrs, method, xhr, attributes = this.attributes;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (key == null || typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options = _.extend({validate: true}, options);\n\n      // If we're not waiting and attributes exist, save acts as\n      // `set(attr).save(null, opts)` with validation. Otherwise, check if\n      // the model will be valid when the attributes, if any, are set.\n      if (attrs && !options.wait) {\n        if (!this.set(attrs, options)) return false;\n      } else {\n        if (!this._validate(attrs, options)) return false;\n      }\n\n      // Set temporary attributes if `{wait: true}`.\n      if (attrs && options.wait) {\n        this.attributes = _.extend({}, attributes, attrs);\n      }\n\n      // After a successful server-side save, the client is (optionally)\n      // updated with the server-side state.\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        // Ensure attributes are restored during synchronous saves.\n        model.attributes = attributes;\n        var serverAttrs = model.parse(resp, options);\n        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);\n        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {\n          return false;\n        }\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n\n      method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');\n      if (method === 'patch') options.attrs = attrs;\n      xhr = this.sync(method, this, options);\n\n      // Restore attributes.\n      if (attrs && options.wait) this.attributes = attributes;\n\n      return xhr;\n    },\n\n    // Destroy this model on the server if it was already persisted.\n    // Optimistically removes the model from its collection, if it has one.\n    // If `wait: true` is passed, waits for the server to respond before removal.\n    destroy: function(options) {\n      options = options ? _.clone(options) : {};\n      var model = this;\n      var success = options.success;\n\n      var destroy = function() {\n        model.trigger('destroy', model, model.collection, options);\n      };\n\n      options.success = function(resp) {\n        if (options.wait || model.isNew()) destroy();\n        if (success) success(model, resp, options);\n        if (!model.isNew()) model.trigger('sync', model, resp, options);\n      };\n\n      if (this.isNew()) {\n        options.success();\n        return false;\n      }\n      wrapError(this, options);\n\n      var xhr = this.sync('delete', this, options);\n      if (!options.wait) destroy();\n      return xhr;\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url: function() {\n      var base =\n        _.result(this, 'urlRoot') ||\n        _.result(this.collection, 'url') ||\n        urlError();\n      if (this.isNew()) return base;\n      return base.replace(/([^\\/])$/, '$1/') + encodeURIComponent(this.id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone: function() {\n      return new this.constructor(this.attributes);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew: function() {\n      return !this.has(this.idAttribute);\n    },\n\n    // Check if the model is currently in a valid state.\n    isValid: function(options) {\n      return this._validate({}, _.extend(options || {}, { validate: true }));\n    },\n\n    // Run validation against the next complete set of model attributes,\n    // returning `true` if all is well. Otherwise, fire an `\"invalid\"` event.\n    _validate: function(attrs, options) {\n      if (!options.validate || !this.validate) return true;\n      attrs = _.extend({}, this.attributes, attrs);\n      var error = this.validationError = this.validate(attrs, options) || null;\n      if (!error) return true;\n      this.trigger('invalid', this, error, _.extend(options, {validationError: error}));\n      return false;\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Model.\n  var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];\n\n  // Mix in each Underscore method as a proxy to `Model#attributes`.\n  _.each(modelMethods, function(method) {\n    Model.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.attributes);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // If models tend to represent a single row of data, a Backbone Collection is\n  // more analagous to a table full of data ... or a small slice or page of that\n  // table, or a collection of rows that belong together for a particular reason\n  // -- all of the messages in this particular folder, all of the documents\n  // belonging to this particular author, and so on. Collections maintain\n  // indexes of their models, both in order, and for lookup by `id`.\n\n  // Create a new **Collection**, perhaps to contain a specific type of `model`.\n  // If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  var Collection = Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.model) this.model = options.model;\n    if (options.comparator !== void 0) this.comparator = options.comparator;\n    this._reset();\n    this.initialize.apply(this, arguments);\n    if (models) this.reset(models, _.extend({silent: true}, options));\n  };\n\n  // Default options for `Collection#set`.\n  var setOptions = {add: true, remove: true, merge: true};\n  var addOptions = {add: true, remove: false};\n\n  // Define the Collection's inheritable methods.\n  _.extend(Collection.prototype, Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model: Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON: function(options) {\n      return this.map(function(model){ return model.toJSON(options); });\n    },\n\n    // Proxy `Backbone.sync` by default.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Add a model, or list of models to the set.\n    add: function(models, options) {\n      return this.set(models, _.extend({merge: false}, options, addOptions));\n    },\n\n    // Remove a model, or a list of models from the set.\n    remove: function(models, options) {\n      var singular = !_.isArray(models);\n      models = singular ? [models] : _.clone(models);\n      options || (options = {});\n      var i, l, index, model;\n      for (i = 0, l = models.length; i < l; i++) {\n        model = models[i] = this.get(models[i]);\n        if (!model) continue;\n        delete this._byId[model.id];\n        delete this._byId[model.cid];\n        index = this.indexOf(model);\n        this.models.splice(index, 1);\n        this.length--;\n        if (!options.silent) {\n          options.index = index;\n          model.trigger('remove', model, this, options);\n        }\n        this._removeReference(model, options);\n      }\n      return singular ? models[0] : models;\n    },\n\n    // Update a collection by `set`-ing a new list of models, adding new ones,\n    // removing models that are no longer present, and merging models that\n    // already exist in the collection, as necessary. Similar to **Model#set**,\n    // the core operation for updating the data contained by the collection.\n    set: function(models, options) {\n      options = _.defaults({}, options, setOptions);\n      if (options.parse) models = this.parse(models, options);\n      var singular = !_.isArray(models);\n      models = singular ? (models ? [models] : []) : _.clone(models);\n      var i, l, id, model, attrs, existing, sort;\n      var at = options.at;\n      var targetModel = this.model;\n      var sortable = this.comparator && (at == null) && options.sort !== false;\n      var sortAttr = _.isString(this.comparator) ? this.comparator : null;\n      var toAdd = [], toRemove = [], modelMap = {};\n      var add = options.add, merge = options.merge, remove = options.remove;\n      var order = !sortable && add && remove ? [] : false;\n\n      // Turn bare objects into model references, and prevent invalid models\n      // from being added.\n      for (i = 0, l = models.length; i < l; i++) {\n        attrs = models[i] || {};\n        if (attrs instanceof Model) {\n          id = model = attrs;\n        } else {\n          id = attrs[targetModel.prototype.idAttribute || 'id'];\n        }\n\n        // If a duplicate is found, prevent it from being added and\n        // optionally merge it into the existing model.\n        if (existing = this.get(id)) {\n          if (remove) modelMap[existing.cid] = true;\n          if (merge) {\n            attrs = attrs === model ? model.attributes : attrs;\n            if (options.parse) attrs = existing.parse(attrs, options);\n            existing.set(attrs, options);\n            if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;\n          }\n          models[i] = existing;\n\n        // If this is a new, valid model, push it to the `toAdd` list.\n        } else if (add) {\n          model = models[i] = this._prepareModel(attrs, options);\n          if (!model) continue;\n          toAdd.push(model);\n          this._addReference(model, options);\n        }\n\n        // Do not add multiple models with the same `id`.\n        model = existing || model;\n        if (order && (model.isNew() || !modelMap[model.id])) order.push(model);\n        modelMap[model.id] = true;\n      }\n\n      // Remove nonexistent models if appropriate.\n      if (remove) {\n        for (i = 0, l = this.length; i < l; ++i) {\n          if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);\n        }\n        if (toRemove.length) this.remove(toRemove, options);\n      }\n\n      // See if sorting is needed, update `length` and splice in new models.\n      if (toAdd.length || (order && order.length)) {\n        if (sortable) sort = true;\n        this.length += toAdd.length;\n        if (at != null) {\n          for (i = 0, l = toAdd.length; i < l; i++) {\n            this.models.splice(at + i, 0, toAdd[i]);\n          }\n        } else {\n          if (order) this.models.length = 0;\n          var orderedModels = order || toAdd;\n          for (i = 0, l = orderedModels.length; i < l; i++) {\n            this.models.push(orderedModels[i]);\n          }\n        }\n      }\n\n      // Silently sort the collection if appropriate.\n      if (sort) this.sort({silent: true});\n\n      // Unless silenced, it's time to fire all appropriate add/sort events.\n      if (!options.silent) {\n        for (i = 0, l = toAdd.length; i < l; i++) {\n          (model = toAdd[i]).trigger('add', model, this, options);\n        }\n        if (sort || (order && order.length)) this.trigger('sort', this, options);\n      }\n\n      // Return the added (or merged) model (or models).\n      return singular ? models[0] : models;\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any granular `add` or `remove` events. Fires `reset` when finished.\n    // Useful for bulk operations and optimizations.\n    reset: function(models, options) {\n      options || (options = {});\n      for (var i = 0, l = this.models.length; i < l; i++) {\n        this._removeReference(this.models[i], options);\n      }\n      options.previousModels = this.models;\n      this._reset();\n      models = this.add(models, _.extend({silent: true}, options));\n      if (!options.silent) this.trigger('reset', this, options);\n      return models;\n    },\n\n    // Add a model to the end of the collection.\n    push: function(model, options) {\n      return this.add(model, _.extend({at: this.length}, options));\n    },\n\n    // Remove a model from the end of the collection.\n    pop: function(options) {\n      var model = this.at(this.length - 1);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Add a model to the beginning of the collection.\n    unshift: function(model, options) {\n      return this.add(model, _.extend({at: 0}, options));\n    },\n\n    // Remove a model from the beginning of the collection.\n    shift: function(options) {\n      var model = this.at(0);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Slice out a sub-array of models from the collection.\n    slice: function() {\n      return slice.apply(this.models, arguments);\n    },\n\n    // Get a model from the set by id.\n    get: function(obj) {\n      if (obj == null) return void 0;\n      return this._byId[obj] || this._byId[obj.id] || this._byId[obj.cid];\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      return this.models[index];\n    },\n\n    // Return models with matching attributes. Useful for simple cases of\n    // `filter`.\n    where: function(attrs, first) {\n      if (_.isEmpty(attrs)) return first ? void 0 : [];\n      return this[first ? 'find' : 'filter'](function(model) {\n        for (var key in attrs) {\n          if (attrs[key] !== model.get(key)) return false;\n        }\n        return true;\n      });\n    },\n\n    // Return the first model with matching attributes. Useful for simple cases\n    // of `find`.\n    findWhere: function(attrs) {\n      return this.where(attrs, true);\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under\n    // normal circumstances, as the set will maintain sort order as each item\n    // is added.\n    sort: function(options) {\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\n      options || (options = {});\n\n      // Run sort based on type of `comparator`.\n      if (_.isString(this.comparator) || this.comparator.length === 1) {\n        this.models = this.sortBy(this.comparator, this);\n      } else {\n        this.models.sort(_.bind(this.comparator, this));\n      }\n\n      if (!options.silent) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck: function(attr) {\n      return _.invoke(this.models, 'get', attr);\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `reset: true` is passed, the response\n    // data will be passed through the `reset` method instead of `set`.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var success = options.success;\n      var collection = this;\n      options.success = function(resp) {\n        var method = options.reset ? 'reset' : 'set';\n        collection[method](resp, options);\n        if (success) success(collection, resp, options);\n        collection.trigger('sync', collection, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. Add the model to the\n    // collection immediately, unless `wait: true` is passed, in which case we\n    // wait for the server to agree.\n    create: function(model, options) {\n      options = options ? _.clone(options) : {};\n      if (!(model = this._prepareModel(model, options))) return false;\n      if (!options.wait) this.add(model, options);\n      var collection = this;\n      var success = options.success;\n      options.success = function(model, resp) {\n        if (options.wait) collection.add(model, options);\n        if (success) success(model, resp, options);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new collection with an identical list of models as this one.\n    clone: function() {\n      return new this.constructor(this.models);\n    },\n\n    // Private method to reset all internal state. Called when the collection\n    // is first initialized or reset.\n    _reset: function() {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n    },\n\n    // Prepare a hash of attributes (or other model) to be added to this\n    // collection.\n    _prepareModel: function(attrs, options) {\n      if (attrs instanceof Model) return attrs;\n      options = options ? _.clone(options) : {};\n      options.collection = this;\n      var model = new this.model(attrs, options);\n      if (!model.validationError) return model;\n      this.trigger('invalid', this, model.validationError, options);\n      return false;\n    },\n\n    // Internal method to create a model's ties to a collection.\n    _addReference: function(model, options) {\n      this._byId[model.cid] = model;\n      if (model.id != null) this._byId[model.id] = model;\n      if (!model.collection) model.collection = this;\n      model.on('all', this._onModelEvent, this);\n    },\n\n    // Internal method to sever a model's ties to a collection.\n    _removeReference: function(model, options) {\n      if (this === model.collection) delete model.collection;\n      model.off('all', this._onModelEvent, this);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent: function(event, model, collection, options) {\n      if ((event === 'add' || event === 'remove') && collection !== this) return;\n      if (event === 'destroy') this.remove(model, options);\n      if (model && event === 'change:' + model.idAttribute) {\n        delete this._byId[model.previous(model.idAttribute)];\n        if (model.id != null) this._byId[model.id] = model;\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  // 90% of the core usefulness of Backbone Collections is actually implemented\n  // right here:\n  var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',\n    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',\n    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',\n    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',\n    'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',\n    'lastIndexOf', 'isEmpty', 'chain', 'sample'];\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  _.each(methods, function(method) {\n    Collection.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.models);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Underscore methods that take a property name as an argument.\n  var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];\n\n  // Use attributes instead of properties.\n  _.each(attributeMethods, function(method) {\n    Collection.prototype[method] = function(value, context) {\n      var iterator = _.isFunction(value) ? value : function(model) {\n        return model.get(value);\n      };\n      return _[method](this.models, iterator, context);\n    };\n  });\n\n  // Backbone.View\n  // -------------\n\n  // Backbone Views are almost more convention than they are actual code. A View\n  // is simply a JavaScript object that represents a logical chunk of UI in the\n  // DOM. This might be a single item, an entire list, a sidebar or panel, or\n  // even the surrounding frame which wraps your whole app. Defining a chunk of\n  // UI as a **View** allows you to define your DOM events declaratively, without\n  // having to worry about render order ... and makes it easy for the view to\n  // react to specific changes in the state of your models.\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  var View = Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    options || (options = {});\n    _.extend(this, _.pick(options, viewOptions));\n    this._ensureElement();\n    this.initialize.apply(this, arguments);\n    this.delegateEvents();\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be merged as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(View.prototype, Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName: 'div',\n\n    // jQuery delegate for element lookup, scoped to DOM elements within the\n    // current view. This should be preferred to global lookups where possible.\n    $: function(selector) {\n      return this.$el.find(selector);\n    },\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render: function() {\n      return this;\n    },\n\n    // Remove this view by taking the element out of the DOM, and removing any\n    // applicable Backbone.Events listeners.\n    remove: function() {\n      this.$el.remove();\n      this.stopListening();\n      return this;\n    },\n\n    // Change the view's element (`this.el` property), including event\n    // re-delegation.\n    setElement: function(element, delegate) {\n      if (this.$el) this.undelegateEvents();\n      this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);\n      this.el = this.$el[0];\n      if (delegate !== false) this.delegateEvents();\n      return this;\n    },\n\n    // Set callbacks, where `this.events` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save',\n    //       'click .open':       function(e) { ... }\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    // This only works for delegate-able events: not `focus`, `blur`, and\n    // not `change`, `submit`, and `reset` in Internet Explorer.\n    delegateEvents: function(events) {\n      if (!(events || (events = _.result(this, 'events')))) return this;\n      this.undelegateEvents();\n      for (var key in events) {\n        var method = events[key];\n        if (!_.isFunction(method)) method = this[events[key]];\n        if (!method) continue;\n\n        var match = key.match(delegateEventSplitter);\n        var eventName = match[1], selector = match[2];\n        method = _.bind(method, this);\n        eventName += '.delegateEvents' + this.cid;\n        if (selector === '') {\n          this.$el.on(eventName, method);\n        } else {\n          this.$el.on(eventName, selector, method);\n        }\n      }\n      return this;\n    },\n\n    // Clears all callbacks previously bound to the view with `delegateEvents`.\n    // You usually don't need to use this, but may wish to if you have multiple\n    // Backbone views attached to the same DOM element.\n    undelegateEvents: function() {\n      this.$el.off('.delegateEvents' + this.cid);\n      return this;\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` properties.\n    _ensureElement: function() {\n      if (!this.el) {\n        var attrs = _.extend({}, _.result(this, 'attributes'));\n        if (this.id) attrs.id = _.result(this, 'id');\n        if (this.className) attrs['class'] = _.result(this, 'className');\n        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);\n        this.setElement($el, false);\n      } else {\n        this.setElement(_.result(this, 'el'), false);\n      }\n    }\n\n  });\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\n  // instead of `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default options, unless specified.\n    _.defaults(options || (options = {}), {\n      emulateHTTP: Backbone.emulateHTTP,\n      emulateJSON: Backbone.emulateJSON\n    });\n\n    // Default JSON-request options.\n    var params = {type: type, dataType: 'json'};\n\n    // Ensure that we have a URL.\n    if (!options.url) {\n      params.url = _.result(model, 'url') || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(options.attrs || model.toJSON(options));\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (options.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.data = params.data ? {model: params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {\n      params.type = 'POST';\n      if (options.emulateJSON) params.data._method = type;\n      var beforeSend = options.beforeSend;\n      options.beforeSend = function(xhr) {\n        xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        if (beforeSend) return beforeSend.apply(this, arguments);\n      };\n    }\n\n    // Don't process data on a non-GET request.\n    if (params.type !== 'GET' && !options.emulateJSON) {\n      params.processData = false;\n    }\n\n    // If we're sending a `PATCH` request, and we're in an old Internet Explorer\n    // that still has ActiveX enabled by default, override jQuery to use that\n    // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.\n    if (params.type === 'PATCH' && noXhrPatch) {\n      params.xhr = function() {\n        return new ActiveXObject(\"Microsoft.XMLHTTP\");\n      };\n    }\n\n    // Make the request, allowing the user to override any Ajax options.\n    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));\n    model.trigger('request', model, xhr, options);\n    return xhr;\n  };\n\n  var noXhrPatch =\n    typeof window !== 'undefined' && !!window.ActiveXObject &&\n      !(window.XMLHttpRequest && (new XMLHttpRequest).dispatchEvent);\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'patch':  'PATCH',\n    'delete': 'DELETE',\n    'read':   'GET'\n  };\n\n  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.\n  // Override this if you'd like to use a different library.\n  Backbone.ajax = function() {\n    return Backbone.$.ajax.apply(Backbone.$, arguments);\n  };\n\n  // Backbone.Router\n  // ---------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  var Router = Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var optionalParam = /\\((.*?)\\)/g;\n  var namedParam    = /(\\(\\?)?:\\w+/g;\n  var splatParam    = /\\*\\w+/g;\n  var escapeRegExp  = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Router.prototype, Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route: function(route, name, callback) {\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      if (_.isFunction(name)) {\n        callback = name;\n        name = '';\n      }\n      if (!callback) callback = this[name];\n      var router = this;\n      Backbone.history.route(route, function(fragment) {\n        var args = router._extractParameters(route, fragment);\n        router.execute(callback, args);\n        router.trigger.apply(router, ['route:' + name].concat(args));\n        router.trigger('route', name, args);\n        Backbone.history.trigger('route', router, name, args);\n      });\n      return this;\n    },\n\n    // Execute a route handler with the provided parameters.  This is an\n    // excellent place to do pre-route setup or post-route cleanup.\n    execute: function(callback, args) {\n      if (callback) callback.apply(this, args);\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate: function(fragment, options) {\n      Backbone.history.navigate(fragment, options);\n      return this;\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes: function() {\n      if (!this.routes) return;\n      this.routes = _.result(this, 'routes');\n      var route, routes = _.keys(this.routes);\n      while ((route = routes.pop()) != null) {\n        this.route(route, this.routes[route]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp: function(route) {\n      route = route.replace(escapeRegExp, '\\\\$&')\n                   .replace(optionalParam, '(?:$1)?')\n                   .replace(namedParam, function(match, optional) {\n                     return optional ? match : '([^/?]+)';\n                   })\n                   .replace(splatParam, '([^?]*?)');\n      return new RegExp('^' + route + '(?:\\\\?([\\\\s\\\\S]*))?$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted decoded parameters. Empty or unmatched parameters will be\n    // treated as `null` to normalize cross-browser behavior.\n    _extractParameters: function(route, fragment) {\n      var params = route.exec(fragment).slice(1);\n      return _.map(params, function(param, i) {\n        // Don't decode the search params.\n        if (i === params.length - 1) return param || null;\n        return param ? decodeURIComponent(param) : null;\n      });\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on either\n  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or\n  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\n  // and URL fragments. If the browser supports neither (old IE, natch),\n  // falls back to polling.\n  var History = Backbone.History = function() {\n    this.handlers = [];\n    _.bindAll(this, 'checkUrl');\n\n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n      this.location = window.location;\n      this.history = window.history;\n    }\n  };\n\n  // Cached regex for stripping a leading hash/slash and trailing space.\n  var routeStripper = /^[#\\/]|\\s+$/g;\n\n  // Cached regex for stripping leading and trailing slashes.\n  var rootStripper = /^\\/+|\\/+$/g;\n\n  // Cached regex for detecting MSIE.\n  var isExplorer = /msie [\\w.]+/;\n\n  // Cached regex for removing a trailing slash.\n  var trailingSlash = /\\/$/;\n\n  // Cached regex for stripping urls of hash.\n  var pathStripper = /#.*$/;\n\n  // Has the history handling already been started?\n  History.started = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(History.prototype, Events, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Are we at the app root?\n    atRoot: function() {\n      return this.location.pathname.replace(/[^\\/]$/, '$&/') === this.root;\n    },\n\n    // Gets the true hash value. Cannot use location.hash directly due to bug\n    // in Firefox where location.hash will always be decoded.\n    getHash: function(window) {\n      var match = (window || this).location.href.match(/#(.*)$/);\n      return match ? match[1] : '';\n    },\n\n    // Get the cross-browser normalized URL fragment, either from the URL,\n    // the hash, or the override.\n    getFragment: function(fragment, forcePushState) {\n      if (fragment == null) {\n        if (this._hasPushState || !this._wantsHashChange || forcePushState) {\n          fragment = decodeURI(this.location.pathname + this.location.search);\n          var root = this.root.replace(trailingSlash, '');\n          if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);\n        } else {\n          fragment = this.getHash();\n        }\n      }\n      return fragment.replace(routeStripper, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start: function(options) {\n      if (History.started) throw new Error(\"Backbone.history has already been started\");\n      History.started = true;\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      this.options          = _.extend({root: '/'}, this.options, options);\n      this.root             = this.options.root;\n      this._wantsHashChange = this.options.hashChange !== false;\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);\n      var fragment          = this.getFragment();\n      var docMode           = document.documentMode;\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n\n      // Normalize root to always include a leading and trailing slash.\n      this.root = ('/' + this.root + '/').replace(rootStripper, '/');\n\n      if (oldIE && this._wantsHashChange) {\n        var frame = Backbone.$('<iframe src=\"javascript:0\" tabindex=\"-1\">');\n        this.iframe = frame.hide().appendTo('body')[0].contentWindow;\n        this.navigate(fragment);\n      }\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._hasPushState) {\n        Backbone.$(window).on('popstate', this.checkUrl);\n      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {\n        Backbone.$(window).on('hashchange', this.checkUrl);\n      } else if (this._wantsHashChange) {\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\n      }\n\n      // Determine if we need to change the base url, for a pushState link\n      // opened by a non-pushState browser.\n      this.fragment = fragment;\n      var loc = this.location;\n\n      // Transition from hashChange to pushState or vice versa if both are\n      // requested.\n      if (this._wantsHashChange && this._wantsPushState) {\n\n        // If we've started off with a route from a `pushState`-enabled\n        // browser, but we're currently in a browser that doesn't support it...\n        if (!this._hasPushState && !this.atRoot()) {\n          this.fragment = this.getFragment(null, true);\n          this.location.replace(this.root + '#' + this.fragment);\n          // Return immediately as browser will do redirect to new url\n          return true;\n\n        // Or if we've started out with a hash-based route, but we're currently\n        // in a browser where it could be `pushState`-based instead...\n        } else if (this._hasPushState && this.atRoot() && loc.hash) {\n          this.fragment = this.getHash().replace(routeStripper, '');\n          this.history.replaceState({}, document.title, this.root + this.fragment);\n        }\n\n      }\n\n      if (!this.options.silent) return this.loadUrl();\n    },\n\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\n    // but possibly useful for unit testing Routers.\n    stop: function() {\n      Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);\n      if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);\n      History.started = false;\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later\n    // may override previous routes.\n    route: function(route, callback) {\n      this.handlers.unshift({route: route, callback: callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl: function(e) {\n      var current = this.getFragment();\n      if (current === this.fragment && this.iframe) {\n        current = this.getFragment(this.getHash(this.iframe));\n      }\n      if (current === this.fragment) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl();\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl: function(fragment) {\n      fragment = this.fragment = this.getFragment(fragment);\n      return _.any(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n    },\n\n    // Save a fragment into the hash history, or replace the URL state if the\n    // 'replace' option is passed. You are responsible for properly URL-encoding\n    // the fragment in advance.\n    //\n    // The options object can contain `trigger: true` if you wish to have the\n    // route callback be fired (not usually desirable), or `replace: true`, if\n    // you wish to modify the current URL without adding an entry to the history.\n    navigate: function(fragment, options) {\n      if (!History.started) return false;\n      if (!options || options === true) options = {trigger: !!options};\n\n      var url = this.root + (fragment = this.getFragment(fragment || ''));\n\n      // Strip the hash for matching.\n      fragment = fragment.replace(pathStripper, '');\n\n      if (this.fragment === fragment) return;\n      this.fragment = fragment;\n\n      // Don't include a trailing slash on the root.\n      if (fragment === '' && url !== '/') url = url.slice(0, -1);\n\n      // If pushState is available, we use it to set the fragment as a real URL.\n      if (this._hasPushState) {\n        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n      // If hash changes haven't been explicitly disabled, update the hash\n      // fragment to store history.\n      } else if (this._wantsHashChange) {\n        this._updateHash(this.location, fragment, options.replace);\n        if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {\n          // Opening and closing the iframe tricks IE7 and earlier to push a\n          // history entry on hash-tag change.  When replace is true, we don't\n          // want this.\n          if(!options.replace) this.iframe.document.open().close();\n          this._updateHash(this.iframe.location, fragment, options.replace);\n        }\n\n      // If you've told us that you explicitly don't want fallback hashchange-\n      // based history, then `navigate` becomes a page refresh.\n      } else {\n        return this.location.assign(url);\n      }\n      if (options.trigger) return this.loadUrl(fragment);\n    },\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    _updateHash: function(location, fragment, replace) {\n      if (replace) {\n        var href = location.href.replace(/(javascript:|#).*$/, '');\n        location.replace(href + '#' + fragment);\n      } else {\n        // Some browsers require that `hash` contains a leading #.\n        location.hash = '#' + fragment;\n      }\n    }\n\n  });\n\n  // Create the default Backbone.history.\n  Backbone.history = new History;\n\n  // Helpers\n  // -------\n\n  // Helper function to correctly set up the prototype chain, for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var extend = function(protoProps, staticProps) {\n    var parent = this;\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call the parent's constructor.\n    if (protoProps && _.has(protoProps, 'constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Add static properties to the constructor function, if supplied.\n    _.extend(child, parent, staticProps);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function.\n    var Surrogate = function(){ this.constructor = child; };\n    Surrogate.prototype = parent.prototype;\n    child.prototype = new Surrogate;\n\n    // Add prototype properties (instance properties) to the subclass,\n    // if supplied.\n    if (protoProps) _.extend(child.prototype, protoProps);\n\n    // Set a convenience property in case the parent's prototype is needed\n    // later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, router, view and history.\n  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(model, options) {\n    var error = options.error;\n    options.error = function(resp) {\n      if (error) error(model, resp, options);\n      model.trigger('error', model, resp, options);\n    };\n  };\n\n  return Backbone;\n\n}));", "define('billing/provider', function(require) {\r\n\r\n    var PROVIDER_KEY = 'stripe';\r\n\r\n    /***\r\n     *\r\n     * @param {{number: String,\r\n     *          cvc: String,\r\n     *          exp_month:String,\r\n     *          exp_year:String,\r\n     *          name:String   }} ccData\r\n     */\r\n    function paymentData(ccData) {\r\n        var dfd = $.Deferred();\r\n\r\n        // validate on the client side\r\n        var v = validate(ccData);\r\n\r\n        // if valid\r\n        if (v.valid) {\r\n            // send to stripe\r\n            stripe().createToken(ccData, function(status, response) {\r\n                if (response.error) {\r\n                    dfd.reject(response.error.message);\r\n                } else {\r\n                    var paymentData = {\r\n                        stripe_token: response.id,\r\n                        provider: PROVIDER_KEY\r\n                    };\r\n\r\n                    dfd.resolve(paymentData);\r\n                }\r\n            });\r\n\r\n        } else {\r\n            // not valid on the client side, reject\r\n            dfd.reject(v.errors[0].reason);\r\n        }\r\n\r\n\r\n        return dfd.promise();\r\n    }\r\n\r\n\r\n    function validate(ccData) {\r\n        var errors = [];\r\n\r\n        if (!ccData.name) {\r\n            errors.push({field: 'name', reason: 'Invalid card holder name.'});\r\n        }\r\n\r\n        if (!stripe().card.validateCardNumber(ccData.number)) {\r\n            errors.push({field: 'number', reason: 'Invalid credit card number.'});\r\n        }\r\n\r\n        if (!stripe().card.validateCVC(ccData.cvc)) {\r\n            errors.push({field: 'cvc', reason: 'Invalid CVC.'});\r\n        }\r\n\r\n        if (!stripe().card.validateExpiry(ccData.exp_month, ccData.exp_year)) {\r\n            errors.push({field: 'exp_month', reason: 'Invalid expiry date.'});\r\n            errors.push({field: 'exp_year', reason: 'Invalid expiry date.'});\r\n        }\r\n\r\n        return {valid: !errors.length, errors: errors};\r\n    }\r\n\r\n\r\n    function stripe() {\r\n        if (!_setupCompleted) {\r\n            setup();\r\n        }\r\n\r\n        return window.Stripe;\r\n    }\r\n\r\n    function cardType(cardNumber) {\r\n        return stripe().card.cardType(cardNumber);\r\n    }\r\n\r\n    var _setupCompleted = false;\r\n\r\n    /***\r\n     * Setup on the first run\r\n     */\r\n    function setup() {\r\n        var key = $('meta[name=\"smore:stripe_public_key\"]').attr('value');\r\n        if (!key) {\r\n            throw \"No stripe key was provided! add meta tag with smore:stripe_public_key to the page\";\r\n        }\r\n\r\n        window.Stripe.setPublishableKey(key);\r\n\r\n        // Mark as completed\r\n        _setupCompleted = true;\r\n    }\r\n\r\n\r\n    // Check if we have the stripe api, if not, load it\r\n    if (!window.Stripe) {\r\n        var script = document.createElement('script');\r\n        script.setAttribute('type', 'text/javascript');\r\n        script.setAttribute('src', 'https://js.stripe.com/v2/');\r\n        document.body.appendChild(script);\r\n    }\r\n\r\n\r\n    return {\r\n        validate: validate,\r\n        cardType: cardType,\r\n        paymentData: paymentData\r\n    };\r\n});", "define('smore/token', function (require) {\r\n\r\n    function token() {\r\n        var m = document.cookie.match(/FP=\"?([A-Za-z0-9\\+\\/\\\\]*)\"?/);\r\n        if (!m || m.length < 2) return null;\r\n        return m[1].slice(16, 32);\r\n    }\r\n\r\n    return token;\r\n});", "define('billing/ui/paymentForm', function (require) {\r\n\r\n    var provider = require('billing/provider');\r\n    var json = require('fire/util/json');\r\n    var safe = require('fire/net/safe');\r\n    var modal = require('fire/ui/modal');\r\n    var token = require('smore/token');\r\n    var events = require('billing/events');\r\n\r\n    var _couponCode;\r\n\r\n    safe.token(token);\r\n\r\n    var _el, _number, _cvc, _expMonth, _expYear, _name, _endPoint, _targetPlan, _completionUrl, _agreementCheckboxes,\r\n        _classroomConfirm, _classroomAddonKey, _purchaseTextWithAddon, _purchaseTextNoAddon;\r\n\r\n    var NUMBER_MASKED_CHARS_REGEX = /[^\\d-]/;\r\n\r\n    var INPUT_ERROR_CLASS = 'input-error';\r\n\r\n    function init(el, endPoint, targetPlan, completionUrl, couponCode, classroomAddonKey) {\r\n        _el = el;\r\n        _endPoint = endPoint;\r\n        _targetPlan = targetPlan;\r\n        _completionUrl = completionUrl;\r\n        _couponCode = couponCode;\r\n        _classroomAddonKey = classroomAddonKey;\r\n\r\n        // Extract fields\r\n        _name = _el.find('.payment-name-on-card');\r\n        _cvc = _el.find('.payment-cvc');\r\n        _number = _el.find('.payment-card-number');\r\n        _expMonth = el.find('.payment-expiration-month');\r\n        _expYear = el.find('.payment-expiration-year');\r\n        _agreementCheckboxes = el.find('.cc-agreement-required');\r\n        _classroomConfirm = _el.find('.classroom-confirm');\r\n        _purchaseTextWithAddon = _el.find('.purchase-text-with-addon');\r\n        _purchaseTextNoAddon = _el.find('.purchase-text-no-addon');\r\n\r\n        if (_classroomConfirm) {\r\n            _classroomConfirm.on('change', onClassroomConfirmChanged);\r\n        }\r\n\r\n        _number.on('keyup change input', onPaymentCardNumberChanged);\r\n        _number.on('keypress', maskNonNumericChars);\r\n        _cvc.on('keypress', maskNonNumericChars);\r\n\r\n        _number.on('blur', onPaymentCardNumberBlur);\r\n        _name.on('blur', onNameBlur);\r\n\r\n        _name.add(_number).add(_cvc).on('focus', reportFieldFocus);\r\n\r\n        _el.find('.submit-button').click(onSubmitFormClicked);\r\n\r\n        _el.find('.supported-cards').click(function (e) {\r\n            setTimeout(function () {\r\n                _number.focus();\r\n            }, 100);\r\n        });\r\n\r\n\r\n        setTimeout(function () {\r\n            _el.find('input[tabindex=1000]').focus();\r\n        }, 250);\r\n    }\r\n\r\n    function onClassroomConfirmChanged() {\r\n        // the confirm is only used in the Educator standalone upgrade form\r\n        if (!_classroomConfirm) {\r\n            return;\r\n        }\r\n\r\n        var isChecked = isClassroomConfirmChecked();\r\n\r\n        _purchaseTextWithAddon.toggleClass('hidden', !isChecked);\r\n        _purchaseTextNoAddon.toggleClass('hidden', isChecked);\r\n    }\r\n\r\n    function isClassroomConfirmChecked() {\r\n        // the confirm is only used in the Educator standalone upgrade form\r\n        if (!_classroomConfirm) {\r\n            return false;\r\n        }\r\n\r\n        return _classroomConfirm.is(':checked');\r\n    }\r\n\r\n    function onPaymentCardNumberBlur(e) {\r\n        if ($.trim(_number.val())) {\r\n            // report event\r\n            events.report(events.Events.entered_cc_in_signup_flow, {requested_plan: _targetPlan}, /* once */ true);\r\n        }\r\n    }\r\n\r\n    function maskNonNumericChars(e) {\r\n        return;\r\n        var c = String.fromCharCode(e.which);\r\n\r\n        if (c && c.match(NUMBER_MASKED_CHARS_REGEX)) {\r\n            e.preventDefault();\r\n            e.stopImmediatePropagation();\r\n        }\r\n    }\r\n\r\n\r\n    function reportFieldFocus(e) {\r\n        var t = $(e.currentTarget);\r\n\r\n        var field = null;\r\n\r\n        switch (t.attr('id')) {\r\n            case 'payment-card-number':\r\n                field = 'cc';\r\n                break;\r\n            case 'payment-cvc':\r\n                field = 'cvc';\r\n                break;\r\n            case 'payment-name-on-card':\r\n                field = 'name';\r\n                break;\r\n        }\r\n\r\n\r\n        if (field) {\r\n            events.report(events.Events['focused_on_' + field + '_field'], {requested_plan: _targetPlan},\r\n                /* once */ true);\r\n        }\r\n\r\n    }\r\n\r\n    function onNameBlur(e) {\r\n        if ($.trim(_name.val())) {\r\n            // report event\r\n            events.report(events.Events.entered_name_in_signup_form, {requested_plan: _targetPlan}, /* once */ true);\r\n        }\r\n    }\r\n\r\n\r\n    function fieldVal(field) {\r\n        return $.trim(field.val());\r\n    }\r\n\r\n    function getCCData() {\r\n        return {\r\n            // Sensitive data:\r\n            number: fieldVal(_number),\r\n            cvc: fieldVal(_cvc),\r\n            exp_month: fieldVal(_expMonth),\r\n            exp_year: fieldVal(_expYear),\r\n\r\n            // Less sensitive data:\r\n            name: fieldVal(_name)\r\n            // If we need other details (i.e. billing address), add them here and they'll be sent to Smore.\r\n            //          send_invoices: _el.find('#payment-send-me-receipt').is(':checked')\r\n        };\r\n    }\r\n\r\n\r\n    function onPaymentCardNumberChanged(e) {\r\n        var t = $(e.currentTarget);\r\n        var val = $.trim(t.val());\r\n        setCard(provider.cardType(val));\r\n    }\r\n\r\n\r\n    function updateErrors(validateInfo) {\r\n        // remove all the error class\r\n        _el.find('.cc-validate').removeClass(INPUT_ERROR_CLASS);\r\n\r\n        for (var i = 0; i < validateInfo.errors.length; i++) {\r\n            var err = validateInfo.errors[i];\r\n\r\n            var target = null;\r\n            switch (err.field) {\r\n                case 'number':\r\n                    target = _number;\r\n                    break;\r\n                case 'cvc':\r\n                    target = _cvc;\r\n                    break;\r\n                case 'exp_month':\r\n                    target = _expMonth;\r\n                    break;\r\n                case 'exp_year':\r\n                    target = _expYear;\r\n                    break;\r\n                case 'name':\r\n                    target = _name;\r\n                    break;\r\n                default:\r\n                    target = _el.find('#' + err.field);\r\n                    break;\r\n            }\r\n\r\n            if (target) {\r\n                target.addClass(INPUT_ERROR_CLASS);\r\n            }\r\n        }\r\n\r\n\r\n        if (validateInfo.errors.length) {\r\n            setError(validateInfo.errors[0].reason);\r\n        }\r\n    }\r\n\r\n    function onSubmitFormClicked(e) {\r\n        var t = $(e.currentTarget);\r\n\r\n        if (t.hasClass('disabled')) {\r\n            return;\r\n        }\r\n\r\n        // report event\r\n        events.report(events.Events.clicked_completed_purchase, {requested_plan: _targetPlan});\r\n\r\n        var data = getCCData();\r\n\r\n        var validateInfo = provider.validate(data);\r\n\r\n        validateAgreements(validateInfo);\r\n\r\n        updateErrors(validateInfo);\r\n\r\n        if (validateInfo.valid) {\r\n            // submit\r\n            submitForm(data);\r\n        } else {\r\n            var reason = 'N/A';\r\n\r\n            if (validateInfo.errors.length) {\r\n                reason = validateInfo.errors[0].reason;\r\n            }\r\n            // report event\r\n            events.report(events.Events.validation_error_before_complete_purchase, {\r\n                requested_plan: _targetPlan,\r\n                reason: reason\r\n            });\r\n        }\r\n    }\r\n\r\n    function getAgreementInfo() {\r\n        if (!_agreementCheckboxes.length) {\r\n            return false;\r\n        }\r\n\r\n        var result = {};\r\n\r\n        _agreementCheckboxes.each(function () {\r\n            var checkbox = $(this);\r\n            result[checkbox.attr('name')] = {\r\n                isAgreed: checkbox.is(':checked'),\r\n                id: checkbox.attr('id'),\r\n                name: checkbox.attr('name')\r\n            };\r\n        });\r\n\r\n        return result;\r\n    }\r\n\r\n\r\n    function validateAgreements(validateInfo) {\r\n        var agreementInfo = getAgreementInfo();\r\n        if (!agreementInfo) {\r\n            return;\r\n        }\r\n\r\n        for (var key in agreementInfo) {\r\n            var agreementValue = agreementInfo[key];\r\n\r\n            if (!agreementValue.isAgreed) {\r\n                var error = {field: agreementValue.id, reason: 'You must agree to the terms'};\r\n                validateInfo.errors.push(error);\r\n                validateInfo.valid = false;\r\n            }\r\n        }\r\n    }\r\n\r\n\r\n    var _originalText;\r\n\r\n    function submitForm(data) {\r\n        modal.lock();\r\n        // hide the error\r\n\r\n        setError(false);\r\n        var b = _el.find('.submit-button');\r\n\r\n        _originalText = b.text();\r\n\r\n        b.addClass('disabled').text('Please wait...');\r\n        _el.find('.cc-validate,.fire-modal-close').attr('disabled', true).addClass('disabled');\r\n\r\n        provider.paymentData(data).fail(onProviderDataFail).done(onProviderDataSuccess);\r\n\r\n    }\r\n\r\n    function revertForm() {\r\n        _el.find('.submit-button').removeClass('disabled').text(_originalText);\r\n        _el.find('.cc-validate,.fire-modal-close').removeAttr('disabled').removeClass('disabled');\r\n    }\r\n\r\n    function onProviderDataFail(errMsg) {\r\n        modal.unlock();\r\n        revertForm();\r\n\r\n        setError(errMsg);\r\n\r\n        // report event\r\n        events.report(events.Events.server_error_in_signing_up, {requested_plan: _targetPlan, error: errMsg});\r\n    }\r\n\r\n    function setError(text) {\r\n        if (text === false) {\r\n            _el.find('.error').hide();\r\n        } else {\r\n            _el.find('.error').show().find('p').text(text);\r\n        }\r\n    }\r\n\r\n    /***\r\n     * Get a parameter from query string\r\n     * http://stackoverflow.com/a/901144\r\n     *\r\n     * @param name\r\n     * @returns {string}\r\n     */\r\n    function getParameterByName(name) {\r\n        name = name.replace(/[\\[]/, \"\\\\\\[\").replace(/[\\]]/, \"\\\\\\]\");\r\n        var regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\r\n        var regex = new RegExp(regexS);\r\n        var results = regex.exec(window.location.search);\r\n        if (results === null) {\r\n            return \"\";\r\n        } else {\r\n            return decodeURIComponent(results[1].replace(/\\+/g, \" \"));\r\n        }\r\n    }\r\n\r\n\r\n    function onProviderDataSuccess(billingData) {\r\n        var d = {\r\n            billing_data: json.encode(billingData),\r\n            upgrade_reason: getParameterByName('ur')\r\n        };\r\n\r\n        if (_targetPlan) {\r\n            d.requested_plan = _targetPlan;\r\n        }\r\n\r\n        if (_couponCode) {\r\n            d.coupon_code = _couponCode;\r\n        }\r\n\r\n        // send agreement data\r\n        var agreementData = getAgreementData();\r\n        if (agreementData) {\r\n            d.agreement_data = agreementData;\r\n        }\r\n\r\n        if (isClassroomConfirmChecked() && !!_classroomAddonKey) {\r\n            d.plan_addon_key = _classroomAddonKey;\r\n        }\r\n\r\n        var p = safe.post(_endPoint, d);\r\n\r\n        p.fail(onProviderDataFail);\r\n        p.done(onPaymentComplete);\r\n    }\r\n\r\n    function getAgreementData() {\r\n        var agreementInfo = getAgreementInfo();\r\n\r\n        if (!agreementInfo) {\r\n            return false;\r\n        }\r\n\r\n        var result = {};\r\n\r\n        for (var agreementFieldName in agreementInfo) {\r\n            result[agreementFieldName] = true;\r\n        }\r\n\r\n        return JSON.stringify(result);\r\n    }\r\n\r\n\r\n    function onPaymentComplete() {\r\n        // report an event\r\n\r\n        var mixpanelParams = {requested_plan: _targetPlan};\r\n\r\n        if (isClassroomConfirmChecked() && !!_classroomAddonKey) {\r\n            mixpanelParams.requested_plan_addon = _classroomAddonKey;\r\n        }\r\n\r\n        events.report(events.Events.signup_complete, mixpanelParams).always(function () {\r\n            modal.unlock();\r\n            // everything is fine!\r\n            modal.close(true);\r\n            $('html,body').scrollTop(0);\r\n\r\n            if (_completionUrl) {\r\n                document.location = _completionUrl;\r\n\r\n            } else {\r\n                document.location.reload();\r\n            }\r\n\r\n        });\r\n    }\r\n\r\n    var CARDS_CLASSES = 'visa american-express diners-club mastercard discover jcb unknown';\r\n\r\n    function setCard(cardType) {\r\n        cardType = cardType.toLowerCase().replace(/\\s/g, '-');\r\n        // Add card icon\r\n        _el.find('.card-type').removeClass(CARDS_CLASSES)\r\n            .addClass(cardType);\r\n\r\n    }\r\n\r\n\r\n    return {\r\n        init: init\r\n    };\r\n});", "define('billing/ui/changePlan', function(require) {\r\n\r\n    var safe = require('fire/net/safe');\r\n    var modal = require('fire/ui/modal');\r\n\r\n    var CHANGE_PLAN_ENDPOINT = '/app/billing/change_pro_plan';\r\n\r\n    var _el, _confirmButton, _originalText;\r\n\r\n    function init(el) {\r\n        _confirmButton = el.find('.confirm-button').click(onConfirmButtonClicked);\r\n        _originalText = _confirmButton.text();\r\n\r\n        _el = el;\r\n    }\r\n\r\n\r\n    /***\r\n     * Get a parameter from query string\r\n     * http://stackoverflow.com/a/901144\r\n     *\r\n     * @param name\r\n     * @returns {string}\r\n     */\r\n    function getParameterByName(name) {\r\n        name = name.replace(/[\\[]/, \"\\\\\\[\").replace(/[\\]]/, \"\\\\\\]\");\r\n        var regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\r\n        var regex = new RegExp(regexS);\r\n        var results = regex.exec(window.location.search);\r\n        if (results === null)\r\n            return \"\";\r\n        else\r\n            return decodeURIComponent(results[1].replace(/\\+/g, \" \"));\r\n    }\r\n\r\n\r\n    var _isDowngrade = false;\r\n\r\n    function onConfirmButtonClicked(e) {\r\n        var t = $(e.currentTarget);\r\n        if (t.hasClass('disabled')) return;\r\n\r\n        var requestedPlan = t.data('target-plan');\r\n        _isDowngrade = t.data('downgrade');\r\n\r\n        if (!requestedPlan) return;\r\n\r\n        // lock the modal\r\n        modal.lock();\r\n        setError(false);\r\n\r\n        t.addClass('disabled').text('Please wait...');\r\n\r\n        var p = safe.post(CHANGE_PLAN_ENDPOINT, {requested_plan: requestedPlan, upgrade_reason: getParameterByName('ur')});\r\n\r\n        p.done(onPlanChangeConfirmed).fail(onPlanChangeFailed);\r\n    }\r\n\r\n    function onPlanChangeConfirmed() {\r\n        modal.unlock();\r\n        modal.close(true);\r\n        $('html,body').scrollTop(0);\r\n        document.location.reload();\r\n    }\r\n\r\n\r\n    function setError(text) {\r\n        if (text === false) {\r\n            _el.find('.error').hide();\r\n        } else {\r\n            _el.find('.error').show().find('p').text(text);\r\n        }\r\n    }\r\n\r\n\r\n    function onPlanChangeFailed(err) {\r\n        setError(err);\r\n        _confirmButton.removeClass('disabled').text(_originalText);\r\n        modal.unlock();\r\n    }\r\n\r\n    return {\r\n        init: init\r\n    }\r\n});", "/*****\r\n * @fileOverview\r\n * Popover tool\r\n *****/\r\n\r\ndefine('fire/ui/popover', function (require) {\r\n    var overlay = require('fire/ui/overlay');\r\n\r\n    var ACTIVE_CLASS = 'active';\r\n\r\n    var _doc = $(document);\r\n    var _body = $(_doc[0].body);\r\n    var _win = $(window);\r\n\r\n    var _isFixed, _isAbove, _contentEl, _isCenterOnArrow;\r\n\r\n    /****\r\n     *\r\n     * @param targetEl\r\n     * @param popoverEl\r\n     * @param wrapperCls\r\n     * @param {Boolean=} isFixed\r\n     * @param {Boolean|Function=} overlayClose\r\n     * @return {$.Deferred}\r\n     */\r\n    function show(targetEl, popoverEl, wrapperCls, isFixed, overlayClose) {\r\n        if (overlayClose === undefined) overlayClose = true;\r\n\r\n        // close any current popover\r\n        close();\r\n\r\n        var dfd = $.Deferred();\r\n        // create overlay, attach to when user clicked\r\n        var o = overlay.show();\r\n\r\n        if (overlayClose) {\r\n\r\n            // handle a tester function\r\n            if ($.isFunction(overlayClose)) {\r\n                o.done(function () {\r\n                    if (overlayClose()) {\r\n                        close();\r\n                        dfd.resolve();\r\n                    }\r\n                });\r\n            } else {\r\n                o.done(close).done(dfd.resolve);\r\n            }\r\n        }\r\n\r\n        _isFixed = isFixed;\r\n\r\n        _isAbove = targetEl.hasClass('pop-above');\r\n        _isCenterOnArrow = targetEl.hasClass('pop-center-arrow');\r\n\r\n        _target = targetEl;\r\n\r\n        _contentEl = popoverEl;\r\n        // generate element\r\n        _current = generate();\r\n\r\n        _popoverArrow = _current.find('.arrow');\r\n\r\n        if (wrapperCls) _current.addClass(wrapperCls);\r\n\r\n        // add to body\r\n        _body.append(_current);\r\n\r\n        position();\r\n\r\n        _target.addClass(ACTIVE_CLASS);\r\n\r\n        // register position\r\n        _win.on('resize', refresh);\r\n\r\n        var p = dfd.promise();\r\n        p.el = _current;\r\n        return p;\r\n    }\r\n\r\n\r\n    function refresh() {\r\n\r\n        if (_current && _target) {\r\n            _current.css('position', getPos());\r\n            position();\r\n        }\r\n    }\r\n\r\n    function position() {\r\n        var targetOffset = getOffset(_target);\r\n        var targetWidth = _target.outerWidth();\r\n        var popoverWidth = _current.outerWidth();\r\n\r\n        var left;\r\n        if (_isCenterOnArrow) {\r\n            var arrowRightOffset = parseInt(_popoverArrow.css('right'));\r\n            var arrowCenter = _popoverArrow.outerWidth() / 2;\r\n            left = targetOffset.left + (targetWidth / 2) - popoverWidth + arrowRightOffset + arrowCenter;\r\n        } else {\r\n            left = targetOffset.left + (targetWidth / 2) - (popoverWidth / 2);\r\n        }\r\n\r\n        var top = 0;\r\n        if (_isAbove) {\r\n            top = targetOffset.top - _current.outerHeight() - 2;\r\n        } else {\r\n            top = targetOffset.top + _target.outerHeight() - 2;\r\n        }\r\n        _current.css({top:top, left:left});\r\n\r\n        window.setTimeout(fixPlaceholders, 20);\r\n    }\r\n\r\n\r\n    function getOffset(el) {\r\n        var o = el.offset();\r\n        if (_isFixed) {\r\n            var st = _win.scrollTop();\r\n            var sl = _win.scrollLeft();\r\n\r\n            return {\r\n                left:o.left - sl,\r\n                top:o.top - st\r\n            }\r\n        } else {\r\n            return o;\r\n        }\r\n    }\r\n\r\n    function getPos() {\r\n        return _isFixed ? 'fixed' : 'absolute';\r\n    }\r\n\r\n    /*****\r\n     * Generate the popover markup\r\n     *\r\n     * @returns {jQuery}\r\n     * @private\r\n     */\r\n    function generate() {\r\n        var markup = $('<div class=\"popover\"><div class=\"arrow\"></div><div class=\"inner\"><div class=\"content\"></div></div></div>');\r\n\r\n        markup.addClass(_isAbove ? 'popover-above' : 'popover-below');\r\n        // set z-index above the shim\r\n        markup.css({'z-index':6000, 'position':getPos()});\r\n\r\n        _contentEl.show();\r\n\r\n        // append the content el and return\r\n        markup.find('.content').append(_contentEl);\r\n        return markup;\r\n    }\r\n\r\n    var _popoverArrow = null;\r\n\r\n    /****\r\n     * Current popover\r\n     * @type {jQuery}\r\n     * @private\r\n     */\r\n    var _current = null;\r\n\r\n    /****\r\n     * Current popover\r\n     * @type {jQuery}\r\n     * @private\r\n     */\r\n    var _target = null;\r\n\r\n    /****\r\n     * Hides the current popover\r\n     */\r\n    function close() {\r\n        hideMask();\r\n\r\n        if (!_current) return;\r\n        // detach content from the dom before we remove current\r\n        if (_contentEl) {\r\n            // push it to the body and hide it\r\n            _body.append(_contentEl.hide());\r\n        }\r\n\r\n        if (_current) _current.remove();\r\n        if (_target) _target.removeClass(ACTIVE_CLASS);\r\n\r\n        _contentEl = _current = _target = null;\r\n\r\n        overlay.remove();\r\n    }\r\n\r\n    var _mask;\r\n\r\n    function mask(text, cls) {\r\n        if (!_current) return;\r\n        hideMask();\r\n\r\n        var content = _current.find('.content').first();\r\n        var mask = $('<div class=\"popover-mask\"><div class=\"mask-content\">' + text + '</div></div> ');\r\n        if (cls) mask.addClass(cls);\r\n\r\n        mask.css({\r\n            width:content.outerWidth(),\r\n            height:content.outerHeight()\r\n        });\r\n\r\n        content.before(mask);\r\n\r\n        _mask = mask;\r\n    }\r\n\r\n    function hideMask() {\r\n        if (!_mask) return;\r\n        _mask.remove();\r\n        _mask = null;\r\n    }\r\n\r\n    function fixPlaceholders() {\r\n        var pf = $.fn.placeholderPolyfill;\r\n        if (!_current || !pf) return;\r\n\r\n        // apply the placeholder on child elements\r\n        pf(_current, true);\r\n    }\r\n\r\n    return {\r\n        mask:mask,\r\n        hideMask:hideMask,\r\n        close:close,\r\n        refresh:refresh,\r\n        show:show\r\n    }\r\n\r\n});\r\n\r\n// backwards compatability\r\n/****\r\n *\r\n * @deprecated\r\n */\r\nfire.popover = fire.ui.popover;", "define('billing/PlanChange', function(require) {\n\n    /***\n     * PlanChange.js\n     * ==========\n     *\n     * A simple class to hold information about plan change, like upgrade reason, target plan and coupon code\n     *\n     */\n\n\n    /***\n     *\n     * @class PlanChange\n     * @param {string!} plan                The target plan for the plan change.\n     * @param {string=} upgradeReason       (optional) Upgrade reason for the change\n     * @param {string=} coupon              (optional) Coupon code being used\n     * @constructor\n     */\n    function PlanChange(plan, upgradeReason, coupon) {\n        this.plan = plan;\n        this.upgradeReason = upgradeReason;\n        this.coupon = coupon;\n    }\n\n    PlanChange.prototype = {\n        /**\n         * Convert the plan change to the format on the server side\n         */\n        toServer: function() {\n            var r = {\n                'requested_plan': this.plan\n            };\n\n            // Set upgrade reason\n            if (this.upgradeReason) {\n                r.upgrade_reason = this.upgradeReason;\n            }\n\n\n            // Set coupon\n            if (this.coupon) {\n                r.coupon_code = this.coupon;\n            }\n\n            return r;\n        }\n    };\n\n\n    return PlanChange;\n});", "define('fire/ui/pleaseWait', function(require) {\n    /***\n     * pleaseWait.js\n     * =============\n     *\n     *  A helper method to handling disable/enable items when using a promise\n     *\n     *  Usage:\n     *\n     *  pleaseWait.wait(promise, '.confirm-button')\n     *  >>> Disable the elements (add disabled class, add disabled attribute) and re-enable them when the promise is\n     *  >>> rejected or resolved\n     *\n     *  pleaseWait.wait(promise, $el, 'Please wait...')\n     *  >>> Disable the element and set it's text to 'Please wait...') restore everything back when the promise is\n     *  >>> rejected or resolved\n     */\n\n\n    /***\n     *\n     * @param {jQuery.Deferred} promise     The promise we're waiting for\n     * @param {string|jQuery}   selector    The selector we're going to enable/disable\n     * @param {string=}         waitText    (optional) Please wait text, to set for the element\n     *\n     * @return {jQuery.Deferred} the original promise for chaining purposes\n     */\n    function wait(promise, selector, waitText) {\n\n        // If we're already resolved or rejected, there is nothing to do\n        if (promise.state() !== 'pending') {\n            return promise;\n        }\n\n        // Get the selector\n        selector = $(selector);\n        var _currentText;\n\n        // Store current text\n        if (waitText) {\n            _currentText = selector.text();\n        }\n\n\n        // Start by disabling\n        selector.addClass('disabled').attr('disabled', true);\n\n        // Set the wait text\n        if (waitText) {\n            selector.text(waitText);\n        }\n\n        // Restore everything here\n        promise.always(function() {\n            selector.removeClass('disabled').removeAttr('disabled');\n\n            // Restore text\n            if (_currentText) {\n                selector.text(_currentText);\n            }\n        });\n\n        // return the promise\n        return promise;\n    }\n\n    /***\n     *\n     * @param {jQuery|string} selector\n     *\n     * @return {Boolean} true if the selector is disabled false if not\n     */\n    function disabled(selector) {\n        return $(selector).is('.disabled');\n    }\n\n\n    return {\n        wait: wait,\n        disabled: disabled\n    };\n});", "/* globals Backbone, _ */\n\ndefine('billing/ui/ChangePlanView', function(require) {\n\n    var pleaseWait = require('fire/ui/pleaseWait');\n    var safe = require('fire/net/safe');\n\n\n    /***\n     * ChangePlanView.js\n     * =================\n     *\n     * A base view that's being used by Upgrade, Downgrade and Cancel views\n     *\n     * Handles calling to the server and setting the new plan\n     *\n     * Will trigger the 'changeCompleted' event when the change plan action was completed\n     */\n\n\n    /**\n     * @const\n     * @type {string}\n     */\n    var CHANGE_PLAN_ENDPOINT = '/app/billing/change_pro_plan';\n\n\n    /***\n     *\n     * @extends {Backbone.View}\n     * @constructor\n     */\n    var ChangePlanView = Backbone.View.extend({\n\n        initialize: function(options) {\n            // Get the plan change from the options\n            this.planChange = options.planChange;\n\n            // Register events (We do it in order to free the sub views to use the 'events' dicts\n\n            this.delegateEvents({'click button.confirm-button': '_onConfirmButtonClicked'});\n\n            if (!options.skipReportOpen) {\n                this.reportOpen();\n            }\n\n        },\n\n        /***\n         * Handles the confirm button events\n         *\n         * @param {jQuery.Event} e\n         * @protected\n         */\n        _onConfirmButtonClicked: function(e) {\n            // If the button is disabled, return\n            var t = $(e.currentTarget);\n\n            if (pleaseWait.disabled(t)) {\n                return false;\n            }\n\n            // Clear errors\n            this.setError(false);\n\n            // Create a safe post request\n            var p = safe.post(CHANGE_PLAN_ENDPOINT, this.planChange.toServer());\n\n            // Set the button as pending\n            pleaseWait.wait(p, t, 'Please wait...');\n            // Disable the back button\n            pleaseWait.wait(p, this.$('.modal-back-button, .fire-modal-close'));\n\n            // Set completion callbacks\n            p.done($.proxy(this.onChangePlanCompleted, this));\n            p.fail($.proxy(this.onChangePlanFailed, this));\n        },\n\n        /**\n         * Handles completions\n         * @param result\n         */\n        onChangePlanCompleted: function(result) {\n\n            var r = this.reportCompleteChange();\n            var _this = this;\n\n            function trigger() {\n                _this.trigger('changeCompleted', _this);\n            }\n\n            if (r && r.always) {\n                // wait for the report to complete and than close the modal\n\n                r.always(trigger());\n            } else {\n                trigger();\n            }\n        },\n\n\n        /***\n         * Handles an error when changing plans\n         * @param {string} errorText\n         */\n        onChangePlanFailed: function(errorText) {\n            // Show error\n            this.setError(errorText);\n        },\n\n\n        /***\n         * A hook for reporting the completion of the change to mixpanel\n         */\n        reportCompleteChange: function() {\n            // no-op\n        },\n\n        /***\n         * A hook for reporting the opening of the view to mixpanel\n         */\n        reportOpen: function() {\n            //\n        },\n\n        /**\n         * Set the error message. if errorText is false, hide the error box\n         * @param {string|boolean} errorText\n         */\n        setError: function(errorText) {\n            var el = this.$el.find('.error');\n\n            // Show if we have the error text\n            if (errorText) {\n                el.show().find('p').text(errorText);\n            } else {\n                el.hide();\n            }\n        }\n\n    });\n\n\n    return ChangePlanView;\n});\n", "/* globals Backbone */\n\ndefine('billing/ui/DowngradeView', function(require) {\n\n    var ChangePlanView = require('./ChangePlanView');\n    var events = require('billing/events');\n\n    /***\n     * DowngradeView.js\n     * ==========\n     *\n     * DowngradeView\n     */\n\n    /***\n     *\n     * @constructor\n     * @extends {ChangePlanView}\n     */\n    var DowngradeView = ChangePlanView.extend({\n\n        reportOpen: function() {\n            if (this._isCancel()) {\n                events.report(events.Events.opened_cancel_modal, {requested_plan: this.planChange.plan});\n            } else {\n                events.report(events.Events.opened_downgrade_modal, {requested_plan: this.planChange.plan});\n            }\n        },\n\n        reportCompleteChange: function() {\n            if (this._isCancel()) {\n                return events.report(events.Events.completed_cancel, {requested_plan: this.planChange.plan});\n            } else {\n                return events.report(events.Events.completed_downgrade, {requested_plan: this.planChange.plan});\n            }\n        },\n\n        /***\n         * Are we donwgrading to free?\n         * @private\n         */\n        _isCancel: function() {\n            return this.planChange.plan === 'free';\n        }\n    });\n\n\n    return DowngradeView;\n});\n", "/* globals Backbone */\n\ndefine('billing/ui/UpgradeView', function(require) {\n\n    var ChangePlanView = require('./ChangePlanView');\n\n    var events = require('billing/events');\n\n    /***\n     * UpgradeView.js\n     * ==========\n     *\n     * UpgradeView\n     */\n\n    var UpgradeView = ChangePlanView.extend({\n\n\n        reportOpen: function() {\n            events.report(events.Events.opened_upgrade_modal, {requested_plan: this.planChange.plan});\n        },\n\n        reportCompleteChange: function() {\n            return events.report(events.Events.completed_upgrade, {requested_plan: this.planChange.plan});\n        }\n\n    });\n\n\n    return UpgradeView;\n});\n", "/* globals _ */\r\n\r\ndefine('smore/ui/supportModal', function (require) {\r\n\r\n    var safe = require('fire/net/safe');\r\n    var token = require('smore/token');\r\n    var modal = require('fire/ui/modal');\r\n\r\n    var SUPPORT_MODAL_ENDPOINT = '/app/support/modal';\r\n    var FEEDBACK_END_POINT = '/app/support/feedback';\r\n\r\n    var _showFeedback;\r\n\r\n    var keywordToSuggestedFlyerLinksMap = {};\r\n    var keywordsRegex;\r\n    var hrefToSuggestedFlyerElementMap = {};\r\n    var suggestedFlyersElement;\r\n    var suggestedFlyersPanelElement;\r\n    var previouslyMatchingKeywords = [];\r\n    var suggestedFlyersCount = 0;\r\n\r\n    var MAX_NUMBER_OF_SUGGESTED_FLYERS = 6;\r\n\r\n    function show(showFeedback) {\r\n\r\n        // Automatically go to the feedback section\r\n\r\n        var url = SUPPORT_MODAL_ENDPOINT;\r\n\r\n        if (showFeedback === true) {\r\n            url += '?feedback=true';\r\n            _showFeedback = true;\r\n        }\r\n\r\n        modal.showUrl(url, {\r\n            cssClass: 'base-modal free-support-modal',\r\n            width: 760\r\n        }).done(setupModal);\r\n    }\r\n\r\n    function setupModal(el) {\r\n        // Setup sections\r\n        el.find('.section > h2').click(onSectionClicked);\r\n\r\n        setupNewLanguageFeatures();\r\n        setupFeedback(el);\r\n\r\n        if (_showFeedback) {\r\n            el.find('.feedback-section textarea').focus();\r\n        }\r\n    }\r\n\r\n    function setupNewLanguageFeatures() {\r\n        if (!Object.keys) {\r\n            Object.keys = function (o) {\r\n                if (o !== Object(o)) {\r\n                    throw new TypeError('Object.keys called on a non-object');\r\n                }\r\n                var k = [], p;\r\n                for (p in o) {\r\n                    if (Object.prototype.hasOwnProperty.call(o, p)) {\r\n                        k.push(p);\r\n                    }\r\n                }\r\n                return k;\r\n            };\r\n        }\r\n    }\r\n\r\n    function buildKeywordToFlyerMap() {\r\n        suggestedFlyersPanelElement = $('.suggested-flyers-panel');\r\n        suggestedFlyersElement = $('.suggested-flyers');\r\n\r\n        // Iterate over all FAQ items and extract its keywords\r\n        _.each($('.faq-item'), function (faqItem) {\r\n            var keywords = $(faqItem).data('keywords');\r\n            // Normalize keywords string\r\n            keywords = keywords.replace(/'/g, '\"').toLowerCase();\r\n            if (keywords) {\r\n                keywords = JSON.parse(keywords);\r\n\r\n                // Iterate over all keywords of the FAQ item\r\n                _.each(keywords, function (keyword) {\r\n                    // Add keyword to dict\r\n                    if (!(keyword in keywordToSuggestedFlyerLinksMap)) {\r\n                        keywordToSuggestedFlyerLinksMap[keyword] = [];\r\n                    }\r\n\r\n                    keywordToSuggestedFlyerLinksMap[keyword].push(faqItem.href);\r\n\r\n                    if (!hrefToSuggestedFlyerElementMap[faqItem.href]) {\r\n                        // Create a (hidden) suggested-flyer element and add to map\r\n                        hrefToSuggestedFlyerElementMap[faqItem.href] = $('<a/>')\r\n                            .attr('href', faqItem.href)\r\n                            .text(faqItem.text)\r\n                            .addClass('suggested-flyer');\r\n                    }\r\n                });\r\n            }\r\n        });\r\n\r\n        var allFlyerKeywords = _.keys(keywordToSuggestedFlyerLinksMap);\r\n        // Regex pattern that matches all keywords without repetitions\r\n        var regexPattern = '(' + allFlyerKeywords.join(\"|\") + ')(?!.*\\\\1)';\r\n        // ignore-case + global matching\r\n        var regexFlags = 'ig';\r\n        keywordsRegex = new RegExp(regexPattern, regexFlags);\r\n    }\r\n\r\n    /*********************************************************************************\r\n     * Feedback\r\n     *********************************************************************************/\r\n\r\n    function setupFeedback(el) {\r\n        var button = el.find('.submit-feedback');\r\n        var text = el.find('#feedback-text');\r\n        var type = el.find('#feedback-type');\r\n        var confirm = el.find('#confirm-send');\r\n\r\n        buildKeywordToFlyerMap();\r\n\r\n        text.bind(\"input\", onFeedbackTextChanged);\r\n\r\n        function isValid() {\r\n            var hasContent = !!$.trim(text.val());\r\n            var isConfirmed = confirm.is(':checked');\r\n            return hasContent && isConfirmed;\r\n        }\r\n\r\n        // submitting\r\n        button.click(function (e) {\r\n            if (button.hasClass('disabled')) {\r\n                return;\r\n            }\r\n\r\n            var content = $.trim(text.val());\r\n\r\n            sendFeedback(content, type.val());\r\n        });\r\n\r\n\r\n        // toggle the send button\r\n        text.keyup(function (e) {\r\n            button.toggleClass('disabled', !isValid());\r\n        });\r\n\r\n        confirm.click(function (e) {\r\n            button.toggleClass('disabled', !isValid());\r\n        });\r\n\r\n        el.find('.close-feedback').click(function () {\r\n            text.val('');\r\n            modal.close();\r\n        });\r\n    }\r\n\r\n    function showElementWithAnimation(element) {\r\n        element.addClass('visible');\r\n    }\r\n\r\n    function hideElementWithAnimation(element) {\r\n        element.removeClass('visible');\r\n    }\r\n\r\n    function onFeedbackTextChanged(event) {\r\n        var text = $.trim(event.target.value);\r\n\r\n        var newMatchingKeywords = text.match(keywordsRegex);\r\n\r\n        // Show/hide the whole suggested flyers panel if there is/isn't a match\r\n        if (newMatchingKeywords && newMatchingKeywords.length > 0) {\r\n            showElementWithAnimation(suggestedFlyersPanelElement);\r\n\r\n        } else {\r\n            hideElementWithAnimation(suggestedFlyersPanelElement);\r\n        }\r\n\r\n        // Remove suggested flyers for keywords no longer found\r\n        var keywordsNotInUse = _.difference(previouslyMatchingKeywords, newMatchingKeywords);\r\n        _.each(keywordsNotInUse, function (keywordNotInUse) {\r\n            var suggestedFlyerLinksToHide = keywordToSuggestedFlyerLinksMap[keywordNotInUse];\r\n            _.each(suggestedFlyerLinksToHide, function (suggestedFlyerLinkToHide) {\r\n                // Remove old suggested flyer if it's in DOM\r\n                var suggestedFlyerElementToHide = hrefToSuggestedFlyerElementMap[suggestedFlyerLinkToHide];\r\n                if (suggestedFlyerElementToHide.hasClass('visible')) {\r\n                    hideElementWithAnimation(suggestedFlyerElementToHide);\r\n                    suggestedFlyerElementToHide.detach();\r\n                    suggestedFlyersCount--;\r\n                }\r\n            });\r\n        });\r\n\r\n        // Show suggested flyers for new keywords\r\n        var newKeywords = _.difference(newMatchingKeywords, previouslyMatchingKeywords);\r\n        _.each(newKeywords, function (newKeyword) {\r\n            if (suggestedFlyersCount >= MAX_NUMBER_OF_SUGGESTED_FLYERS) {\r\n                return;\r\n            }\r\n\r\n            var suggestedFlyerLinksToShow = keywordToSuggestedFlyerLinksMap[newKeyword];\r\n            _.each(suggestedFlyerLinksToShow, function (suggestedFlyerLinkToShow) {\r\n                if (suggestedFlyersCount >= MAX_NUMBER_OF_SUGGESTED_FLYERS) {\r\n                    return;\r\n                }\r\n\r\n                var suggestedFlyerElementToShow = hrefToSuggestedFlyerElementMap[suggestedFlyerLinkToShow];\r\n\r\n                if (!suggestedFlyerElementToShow.hasClass('visible')) {\r\n                    // Add suggested flyer to DOM\r\n                    suggestedFlyerElementToShow.appendTo(suggestedFlyersElement);\r\n                    showElementWithAnimation(suggestedFlyerElementToShow);\r\n                    suggestedFlyersCount++;\r\n                }\r\n            });\r\n        });\r\n\r\n        // Save the new state\r\n        previouslyMatchingKeywords = newMatchingKeywords;\r\n    }\r\n\r\n    function sendFeedback(content, type) {\r\n        var sending = $('#feedback-sending');\r\n        var sent = $('#feedback-sent');\r\n\r\n\r\n        sending.show().siblings().hide();\r\n\r\n        safe.post(FEEDBACK_END_POINT, {\r\n            content: content,\r\n            location: document.location.href,\r\n            type: type,\r\n            button: 'toolbar'\r\n        }).always(function () {\r\n            sent.show().siblings().hide();\r\n        });\r\n    }\r\n\r\n    /*********************************************************************************\r\n     * Sections\r\n     *********************************************************************************/\r\n\r\n    function onSectionClicked(e) {\r\n        var section = $(e.currentTarget).parent();\r\n        section.addClass('active').siblings().removeClass('active');\r\n\r\n        if (section.hasClass('feedback-section')) {\r\n            setTimeout(function() {\r\n                section.find('textarea').focus();\r\n            }, 100);\r\n        }\r\n    }\r\n\r\n\r\n    /****\r\n     * Initialize the page events\r\n     */\r\n    function init() {\r\n        // show the modal on click\r\n        $('#feedback-button, .open-feedback-box').click(show);\r\n        // setup token\r\n        safe.token(token);\r\n    }\r\n\r\n\r\n    $(init);\r\n\r\n\r\n    return {\r\n        show: show\r\n    };\r\n});", "/* globals Backbone */\n\ndefine('billing/ui/CancelView', function(require) {\n\n    var supportModal = require('smore/ui/supportModal');\n    var FormView = require('fire/ui/forms/formView').FormView;\n    var events = require('billing/events');\n    var pleaseWait = require('fire/ui/pleaseWait');\n    var safe = require('fire/net/safe');\n\n    /***\n     * CancelView.js\n     * ==========\n     *\n     * CancelView\n     *\n     *\n     *\n     *\n     *\n     *\n     *\n     */\n\n    var APPLY_COUPON_ENDPOINT = '/app/billing/apply_coupon';\n    var ONE_MONTH_FREE_ENDPOINT = '/app/billing/get_one_month_free';\n\n    /**\n     *\n     * @constructor\n     * @extends {Backbone.View}\n     */\n    var CancelView = Backbone.View.extend({\n\n        events: {\n            'click .get-support-button': '_onGetSupportButtonClicked',\n            'click .cancel-account-button': '_onCancelAccountButtonClicked',\n            'click .progress-to-next-step': '_onProgressToNextStepClicked',\n            'click .apply-coupon': '_onApplyCouponClicked',\n            'click .get-one-month-free': '_onOneMonthFreeClicked'\n        },\n\n        render: function() {\n            // Setup the form view for the cancel form\n            var el = this.$('.cancel-reason-form');\n            this._formView = new FormView({el: el,\n                validationErrorMessage: el.data('validation-message')});\n\n            this._formView.on('success', $.proxy(this._onChangePlanCompleted, this));\n\n            events.report(events.Events.opened_cancel_modal, {requested_plan: 'free'});\n        },\n\n\n        /***\n         * When the user hits the support button, we want to show the support modal\n         * @private\n         */\n        _onGetSupportButtonClicked: function() {\n            // Close the current modal\n            this.trigger('close');\n            // Show support modal\n            supportModal.show(/* show feedback*/ true);\n\n            // Notify mixpanel\n            events.report(events.Events.took_cancel_offer, {offer: 'support'});\n        },\n\n\n        /***\n         * This handler will move the step to the next one in line\n         *\n         * @param {jQuery.Event} e\n         * @private\n         */\n        _onProgressToNextStepClicked: function(e) {\n\n            var t = $(e.currentTarget);\n\n            if (t.hasClass('disabled')) {\n                return;\n            }\n\n            // Find the parent step\n            var stepEl = t.parents('.step').first();\n\n            // Try to get the the next step\n            var nextStepEl = stepEl.next('.step');\n\n            if (nextStepEl.length) {\n                stepEl.hide();\n                nextStepEl.show();\n            }\n        },\n\n        /***\n         *\n         * @param {jQuery.Event} e\n         * @private\n         */\n        _onApplyCouponClicked: function(e) {\n            // Get the current apply coupon button\n            var applyCouponButton = $(e.currentTarget);\n\n            var couponCode = applyCouponButton.data('coupon');\n\n            // Exit if no coupon code\n            if (!couponCode) {\n                return;\n            }\n\n            var p = safe.post(APPLY_COUPON_ENDPOINT, {coupon_code: couponCode});\n\n            this._waitForOfferCompletion(p, applyCouponButton, 'coupon: ' + couponCode);\n\n        },\n\n        /**\n         *\n         * @param {jQuery.Event} e\n         * @private\n         */\n        _onOneMonthFreeClicked: function(e) {\n            // Get the current apply coupon button\n            var monthFreeButton = $(e.currentTarget);\n\n            var p = safe.post(ONE_MONTH_FREE_ENDPOINT);\n\n            this._waitForOfferCompletion(p, monthFreeButton, 'one_month_free');\n        },\n\n        /***\n         *\n         * @param {jQuery.Deferred} p\n         * @param {jQuery} button\n         * @param {String} offerKey\n         * @private\n         */\n        _waitForOfferCompletion: function(p, button, offerKey) {\n\n\n            // disable the next step button\n            pleaseWait.wait(p, '.progress-to-next-step');\n            pleaseWait.wait(p, button, \"Please wait...\");\n\n            p.error(function(err) {\n                window.alert(err);\n            });\n\n\n            // Close the modal and refresh\n            p.done($.proxy(function() {\n                this._onOfferCompleted(offerKey);\n            }, this));\n        },\n\n        /***\n         * Close the modal and reload the page\n         * @private\n         */\n        _onChangePlanCompleted: function() {\n            // hide body - to make the user feel like we're already reloading\n            $('body').hide();\n\n            var d = events.report(events.Events.completed_cancel, {requested_plan: 'free'});\n\n            // Wait for it to complete\n            d.always($.proxy(function() {\n                this.trigger('changeCompleted');\n            }, this));\n        },\n\n        /***\n         * Report to mixpanel about the offer and reload the modal\n         * @param offerKey\n         * @private\n         */\n        _onOfferCompleted: function(offerKey) {\n            // hide body - to make the user feel like we're already reloading\n            $('body').hide();\n            var d = events.report(events.Events.took_cancel_offer, {offer: offerKey});\n\n            // Wait for it to complete\n            d.always($.proxy(function() {\n                this.trigger('changeCompleted');\n            }, this));\n        }\n\n\n    });\n\n\n    return CancelView;\n});\n", "define('smore/pixel', function (require) {\n    /***\n     * Utils for working with facebook pixel\n     *\n     * Usage:\n     *\n     * pixel('ViewContent', {'cool'})\n     *\n     */\n\n\n    /***\n     *\n     * @param {String!} eventKey\n     * @param {Object?} extra\n     */\n    function pixel(eventKey, extra) {\n        if (!window.fbq) {\n            console.log(\"Facebook pixel not loaded\", eventKey, extra);\n            return;\n        }\n\n        // report to facebook\n        window.fbq('track', eventKey, extra || {});\n    }\n\n\n    return pixel;\n});", "/* globals Backbone */\n\ndefine('billing/ui/SubscribeView', function (require) {\n\n    var paymentForm = require('./paymentForm');\n    var events = require('billing/events');\n    var pixel = require('smore/pixel');\n\n    /***\n     * SubscribeView.js\n     * ==========\n     *\n     * SubscribeView - Handles subscribing to a new account\n     */\n\n    var SUBSCRIBE_TO_PRO_ENDPOINT = '/app/billing/subscribe_to_pro';\n    var COMPLETION_ENDPOINT = '/app/welcome/';\n\n    /***\n     *\n     * @constructor\n     * @extends {Backbone.View}\n     */\n    var SubscribeView = Backbone.View.extend({\n\n        initialize: function (options) {\n            // Get the plan change from the options\n            this.planChange = options.planChange;\n\n            // Handle the signup modal\n            events.report(events.Events.signup_modal_opened, {requested_plan: this.planChange.plan});\n\n            // Report pixel events to facebook\n            pixel('InitiateCheckout');\n        },\n\n\n        render: function () {\n            var completionUrl = COMPLETION_ENDPOINT + this.planChange.plan;\n            paymentForm.init(this.$el,\n                SUBSCRIBE_TO_PRO_ENDPOINT,\n                this.planChange.plan,\n                completionUrl,\n                this.planChange.coupon);\n        }\n\n    });\n\n\n    return SubscribeView;\n});\n", "define('billing/ui/ChangePlanModalView', function(require) {\n    /***\n     * ChangePlanModalView.js\n     * ======================\n     *\n     * This modal allows us to upgrade, downgrade and signup to pro account\n     *\n     * Notes:\n     *  - The client asks for the 'change_plan_modal_content' from the server, with the requested\n     *      \"target plan\" (the plan we wish to upgrade/downgrade/signup to)\n     *\n     *  - The server replies with the right content, and the modal matches it with the\n     *      right views (SignupToProView, UpgradeView, DowngradeView, CancelView)\n     *\n     *\n     */\n\n\n    // Require base modal view\n    var ModalView = require('fire/ui/views/ModalView').ModalView;\n\n    var PlanChange = require('billing/PlanChange');\n\n    // Require sub views\n    var DowngradeView = require('./DowngradeView');\n    var UpgradeView = require('./UpgradeView');\n    var CancelView = require('./CancelView');\n    var SubscribeView = require('./SubscribeView');\n    var report = require('smore/util/report');\n    var events = require('billing/events');\n\n    // Use safe post\n    var safe = require('fire/net/safe');\n\n    /***\n     * The content endpoint\n     *\n     * @const\n     * @type {string}\n     */\n    var MODAL_ENDPOINT = '/app/billing/change_plan_modal_content';\n\n    /***\n     *\n     * @const\n     * @type {Object}\n     */\n    var MODAL_OPTIONS = {\n        cssClass: 'base-modal billing-modal2',\n        width: 600,\n        overlayClose: false\n    };\n\n    /***\n     *\n     *\n     * @param {!string} plan            The requested plan\n     * @param {string=} upgradeReason   (Optional) Upgrade reason to report to the server\n     * @param {string=} coupon          (Optional) coupon code to send to the server\n     * @extends {ModalView}\n     * @constructor\n     */\n    function ChangePlanModalView(plan, upgradeReason, coupon) {\n\n        /**\n         *\n         * @type {PlanChange}\n         */\n        this.planChange = new PlanChange(plan, upgradeReason, coupon);\n\n\n        // Call the ModalView constructor with a generated url\n        ModalView.call(this);\n    }\n\n\n    ChangePlanModalView.prototype = {\n\n        /***\n         * Overrides ModalView's _loadContent to use safe post\n         * @private\n         */\n        _loadContent: function() {\n\n\n            // Send to server\n            return safe.post(this._getEndpointUrl(), this.planChange.toServer());\n        },\n\n\n        _getEndpointUrl: function() {\n            return MODAL_ENDPOINT;\n        },\n\n        /***\n         * Render the content after the modal is loaded from the server\n         *\n         * This method will choose the right view from the sub views and render it\n         */\n        render: function() {\n            // Get the type of the result\n            var contentEl = this.el.find('.modal-content');\n            var type = contentEl.data('type');\n\n            switch (type) {\n                case 'same':\n                    // We don't need to do anything, because it's basically a close button :P\n                    break;\n\n                case 'subscribe':\n                    this._contentView = new SubscribeView({el: contentEl, planChange: this.planChange});\n                    break;\n\n                case 'downgrade':\n                    this._contentView = new DowngradeView({el: contentEl, planChange: this.planChange});\n                    break;\n\n                case 'upgrade':\n                    this._contentView = new UpgradeView({el: contentEl, planChange: this.planChange});\n                    break;\n\n                case 'cancel':\n                    this._contentView = new CancelView({el: contentEl, planChange: this.planChange});\n                    break;\n            }\n\n            // Render the content:\n            if (this._contentView) {\n                this._contentView.render();\n\n                // Register events\n                this._contentView.on('changeCompleted', $.proxy(this._onChangePlanCompleted, this));\n                this._contentView.on('subscribeCompleted', $.proxy(this._onSubscribeCompleted, this));\n                this._contentView.on('close', $.proxy(this._onCloseEvent, this));\n            }\n\n        },\n\n        show: function() {\n            ModalView.prototype.show.call(this, MODAL_OPTIONS);\n        },\n\n        /***\n         * Closes the modal and refresh the page when we change the plan\n         * @private\n         */\n        _onChangePlanCompleted: function() {\n            this._closeAndReload();\n        },\n\n        /***\n         * Close the modal.\n         *\n         * This allows subviews to trigger the close event to close the modal\n         * @private\n         */\n        _onCloseEvent: function() {\n            this.close(true);\n            events.report(events.Events.signup_modal_closed);\n        },\n\n        /***\n         * Closes the modal and refresh the page when we completed our subscription process\n         * @private\n         */\n        _onSubscribeCompleted: function() {\n            this._closeAndReload();\n        },\n\n        /**\n         * Close the modal and refresh the page\n         * @private\n         */\n        _closeAndReload: function() {\n            // Fast close the modal\n            this.close(true);\n\n            // Scroll to the top of the page (why? because we're about to reload the page, and the browser\n            // will scroll the page back to where it was, We want to user to see the top of the page (with the flash :P)\n            $('html,body').scrollTop(0);\n\n            // Reload the page\n            document.location.reload();\n        }\n    };\n\n    // Inherit\n    ChangePlanModalView.inherits(ModalView);\n\n\n    return ChangePlanModalView;\n});\n\n", "/* globals Backbone, _ */\n\ndefine(\"smore/ui/views/overlay\", function (require) {\n\n    /***\n     * OverlayView\n     * =========\n     *\n     * Draws an overlay on on the screen.\n     *\n     * This view is responsible for:\n     * - VIEW RESPONSIBILITIES\n     *\n     * Markup structure\n     * ----------------\n     * this.el -> div.smore-overlay   The root element\n     *\n     *\n     * Available option keys\n     * ----------------------\n     * - `clickCallback`    A function that will be called when someone clicks on the overlay\n     * - `type`             A type for the overlay, can be \"modal\" or \"popover\"\n     *\n     *\n     * Usage\n     * -----\n     *\n     * >>> var o = new OverlayView({clickCallback: myAwesomeFunction});\n     * >>> o.show();\n     * >>> o.hide();\n     *\n     *\n     *\n     *\n     * Events\n     * ------\n     *\n     * @class OverlayView\n     * @extends {Backbone.View}\n     * @constructor\n     */\n    var OverlayView = Backbone.View.extend({\n\n        className: 'smore-overlay',\n\n        events: {\n            'click': '_onOverlayClicked'\n        },\n\n\n        initialize: function (options) {\n            this.options = options || {};\n            this.closeOnClick = this.options.closeOnClick || false;\n            this.allowAccessToolbar = this.options.allowAccessToolbar || false;\n\n            this.type = this.options.type || 'modal';\n\n            this.scrollContainer = $('<div/>').addClass('smore-modal-scroll-wrapper')\n                .attr('id', 'modal-scroll-container');\n\n        },\n\n        /***\n         * Handles clicks on the overlay\n         *\n         * If clickCallback was defined, we will call it\n         *\n         * @param {jQuery.Event} e\n         * @private\n         */\n        _onOverlayClicked: function (e) {\n            var clickedOnOverlay = e.target === this.el || e.target === this.scrollContainer.get(0);\n\n            if (!clickedOnOverlay) {\n                return;\n            }\n\n            var cb = this.options.clickCallback;\n\n            // Invoke if this is a function;\n            if (_.isFunction(cb)) {\n                cb();\n            }\n\n            if (this.closeOnClick) {\n                this.hide();\n            }\n        },\n\n\n        /***\n         * Shows the overlay\n         */\n        show: function () {\n\n            // Render\n            this.render();\n            this.$el.addClass('smore-overlay-' + this.type);\n\n            if (this.allowAccessToolbar) {\n                this.$el.addClass('smore-overlay-bellow-toolbar');\n            }\n\n            if (this.type === 'modal' || this.type === 'modal-fixed') {\n                this.$el.append(this.scrollContainer);\n            }\n\n            // add our el\n            var container = this.getContainer();\n\n            if (this.type !== 'modal-fixed') {\n                this.$el.css('min-height', this.getMinHeight(container[0]));\n            }\n\n\n            container.prepend(this.el);\n\n            // Show and add class active for animation\n            this.$el.show().addClass('active');\n\n        },\n\n\n        hide: function () {\n            this.$el.removeClass('active');\n\n            var el = this.$el;\n\n            if (this.type === 'popover-transparent') {\n                el.remove();\n                this.trigger('close');\n            } else {\n                var self = this;\n                // Wait for transition to over\n                el.transitionEnd(function () {\n                    el.remove();\n                    self.trigger('close');\n                });\n            }\n        },\n\n        getContainer: function () {\n            var result = $('#modal-scroll-container');\n\n            if (result.length && this.type !== 'modal') {\n                return result;\n            }\n\n            return $('body');\n        },\n\n        /***\n         * Calculate the minimum height for the container\n         * @param container\n         */\n        getMinHeight: function (container) {\n            if (container.tagName === 'BODY') {\n                return Math.max(container.scrollHeight, window.innerHeight);\n            }\n\n            return container.scrollHeight;\n        }\n    });\n\n\n    return {\n        OverlayView: OverlayView\n    };\n\n});", "define('fire/ui/raf', function (require) {\n\n    /***\n     * raf.js\n     * ==========\n     *\n     * RequestAnimationFrame utilities and tools\n     *\n     * This module provides some tools for high performance rendering etc\n     *\n     * We also enable queuing of action for each animation frame for better performance\n     *\n     */\n\n\n    var _raf = window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||\n        window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;\n\n\n    // Are we in legacy mode?\n    var _isLegacy = !_raf;\n    var LEGACY_TIMEOUT = 20;\n\n    var _queue = [];\n\n\n    /***\n     * Queue a function to run on the next request animation frame\n     *\n     * You can provide a context for the function\n     *\n     * @param {Function} callback\n     * @param {Object=} context\n     */\n    function queue(callback, context) {\n        // Apply context\n        if (context) {\n            callback = $.proxy(callback, context);\n        }\n\n        // Add to the queue\n        _queue.push(callback);\n\n        if (_isLegacy) {\n            window.setTimeout(executeQueue, LEGACY_TIMEOUT);\n        } else {\n            _raf(executeQueue);\n        }\n    }\n\n    var _runningQueue = false;\n\n    function executeQueue() {\n        if (!_queue.length) {\n            return;\n        }\n\n        // Copy the queue\n        var items = _queue;\n        // clear the queue\n        _queue = [];\n\n        _runningQueue = true;\n\n        // Execute all the callbacks in the queue\n        for (var i = 0; i < items.length; i++) {\n            items[i]();\n        }\n\n        _runningQueue = false;\n    }\n\n    /***\n     * Execute a callback in RAF context, or if we're already in an RAF context, instantly run it.\n     *\n     * @param {Function} callback\n     * @param {Object=} context\n     */\n    function queueOrInline(callback, context) {\n        if (_runningQueue) {\n            // Apply context\n            if (context) {\n                callback = $.proxy(callback, context);\n            }\n\n            // execute\n            callback();\n        } else {\n\n        // Else - queue\n        queue(callback, context);\n        }\n\n    }\n\n\n    /***\n     * Wraps a function that we wish to execute inside a requestAnimationFrame context\n     * @param {Function} func   the function we wish to wrap\n     * @param {Object} context  Optional context for the execution\n     * @returns {Function} a wrapped function that will be executed using the queue\n     */\n    function wrap(func, context) {\n        if (!context) {\n            context = window;\n        }\n\n        var result = function () {\n            var args = arguments;\n\n\n            queue(function () {\n                func.apply(context, args);\n            });\n        };\n\n        return result;\n    }\n\n\n    return {\n        queue: queue,\n        wrap: wrap,\n        queueOrInline: queueOrInline\n    };\n});", "/* globals Backbone, _ */\n\ndefine(\"smore/ui/views/modal\", function (require) {\n\n    var safe = require('fire/net/safe');\n    var overlay = require('./overlay');\n    var raf = require('fire/ui/raf');\n    var history = require('fire/util/history');\n    var mobile = require('fire/util/mobile');\n\n    var _win = $(window);\n    var _body = $(document.body);\n\n    /***\n     * ModalView\n     * =========\n     *\n     * The new version of the modal view. Based on Backbone views, with support for subviews and moving between them.\n     *\n     * This view is responsible for:\n     * - Loading the content of the view from a remote endpoint/promise/template\n     * - Opening the modal and blocking the screen\n     * - Support for subviews, called steps and the ability to go to specific ones (for example, a billing modal with\n     *   a pre-step of explanation, before showing the payment step\n     * - The \"show\" method returns a promise, which can be resolved with a value by passing it to complete, or rejected\n     *   if the \"close\" method was called\n     *\n     *\n     * Markup structure\n     * ----------------\n     * this.el -> div.smore-modal-container           The root element\n     *\n     *\n     * Available option keys\n     * ----------------------\n     * - `templateSelector`          Selector to use for getting the template for the modal.\n     * - `contentEndpoint`           Url that will be used for fetching the content of the modal\n     * - `overlayClose`              Is clicking on the overlay layer closes the modal? (Default to false)\n     * - `useSafePost`               Should the modal request the content using safe post? (Default to false)\n     *\n     * - `loadingTitle`              Text to show when loading the modal\n     * - `hideClose`              Hide all the 'fire-modal-close' buttons\n     *\n     *\n     * Subviews\n     * --------\n     * Sometimes you want to re-use views in your modal. Historically, you would use the `render` method\n     * To initialize your subviews. However, some of the modals we built returns different content based on the user\n     * state, and requires some boiler-plate code to decide which sub-views to initialize.\n     *\n     * The solution is the subviews option key. Similar to the `events` option key, a subclass can define its subviews\n     * and the template can reference them using a special declarative syntax\n     *\n     * Example:\n     *\n     * On our SomeModalView class:\n     *\n     * ```\n     * subviews: {\n     *      'billing-upgrade-confirmation': '_getBillingUpgradeView',\n     *      'another-cool-view': AmazinglyCoolView,\n     * },\n     *\n     * _getBillingUpgradeView: function(el){\n     *    return new UpgradeConfirmationView({el: el})\n     * }\n     * ```\n     *\n     * On our modal template:\n     *\n     * ```\n     * <div data-subview=\"billing-upgrade-confirmation\"></div>\n     * ```\n     * After our modal was loaded, we initiate the subviews.\n     *\n     *\n     * Steps\n     * -----\n     * Some of our modals have multiple screens (offer -> confirmation etc.). We call these screens \"steps\".\n     *\n     * We can easily define steps in our modal template:\n     * ```\n     * <div data-step=\"my-cool-step\"></div>\n     * ```\n     *\n     * When the modal is loaded, the ModalView will scan the dom and build a list of all of the available steps\n     * Your event handlers can then use the `goStep(<step-key>)` method or `nextStep()`/`prevStep()`\n     * to navigate your steps.\n     *\n     * The active step adds the `step-<step-key>' class to the modal container, for easing the css process\n     *\n     * You could also pass the `startStep` param to the `show()` method in order to choose which step to start from as\n     * your modal is loaded\n     *\n     * You can also use the special classes `.go-to-step`, `.go-to-prev-step` and `.go-to-next-step` as a declarative\n     * way to navigate from your templates\n     *\n     * Example:\n     * ```\n     *\n     *  <a class=\"button go-to-step\" data-key=\"confirmation-step\">Get offer now</a>\n     *  <a class=\"go-to-next-step\">Or skip</a>\n     *\n     * ```\n     *\n     *\n     *\n     *\n     *\n     * @class ModalView\n     * @extends {Backbone.View}\n     * @constructor\n     */\n    var ModalView = Backbone.View.extend({\n\n        /***\n         * Sets the default options for the ModalView\n         */\n        defaultOptions: {\n            overlayClose: false,\n            loadingTitle: 'Loading...',\n            hideClose: false,\n            allowAccessToolbar: false,\n            modalType: 'modal' // can be modal / modal-fixed\n        },\n\n\n        /***\n         * Sets the template selector for the content of the modal\n         *\n         * Example:\n         * >>> templateSelector: '#molsh-modal'\n         *\n         * @type {String}\n         */\n        templateSelector: '',\n\n\n        /***\n         * Sets a url for the modal to load from\n         *\n         * Example:\n         * >>> contentEndpoint: '/app/molsh/dolsh'\n         *\n         * @type {String}\n         */\n        contentEndpoint: '',\n\n\n        /***\n         * Should the get content method use safe post for fetching the modal?\n         *\n         *\n         * @type {Boolean}\n         */\n        useSafePost: false,\n\n        /**\n         * Get the params that will be sent to the modal endpoint\n         * Defaults to false for no params\n         *\n         * @returns {Object}\n         */\n        contentParams: function () {\n            return undefined;\n        },\n\n\n        /***\n         * Initialize our modal\n         *\n         * @param {object} options\n         */\n        initialize: function (options) {\n\n            /***\n             * Create a new promise for the modal.\n             *\n             * The promise will be resolved when someone is\n             *\n             * @type {jQuery.Deferred}\n             */\n            this.result = $.Deferred();\n\n\n            this.options = _.extend({}, this.defaultOptions, options || {});\n\n            // Register base event\n            this.events = _.extend({}, {\n                'click .fire-modal-close': '_onCloseClicked',\n                'click .go-to-step': '_onGoStepClicked',\n                'click .go-to-next-step': '_onNextStepClicked',\n                'click .go-to-prev-step': '_onPrevStepClicked',\n                'click .go-back-step': '_onBackStepClicked'\n            }, this.events);\n\n\n            this.overlayClose = this.options.overlayClose || false;\n\n            if (this.options.hideClose) {\n                this.$el.addClass('hide-close');\n            }\n\n            // Register resize handler, we throttle it to once in 50 ms\n            _win.on('resize', _.throttle($.proxy(this.position, this), 50));\n\n            // Empty steps stack\n            this._stepsStack = [];\n        },\n\n\n        /*********************************************************************************\n         * Getting content\n         *********************************************************************************/\n\n        /***\n         * Fetch the content of the modal and return a promise that will be resolved when\n         * The modal content was loaded\n         *\n         * The promise will resolve with the html content for the modal\n         *\n         * @returns {jQuery.Deferred}\n         */\n        getContent: function () {\n            var promise = $.Deferred();\n\n            // Gets the value of templateSelector. If templateSelector is a function, it\n            // will evaluate it and return the result\n\n            var templateSelector = _.result(this, 'templateSelector');\n\n            // If we have template selector defined, use it\n            if (templateSelector) {\n                var content = $(templateSelector).html();\n\n                if (content) {\n                    content = this.renderContent(content);\n                    promise.resolve(content);\n                } else {\n                    promise.reject(\"Template '\" + templateSelector + '\" was not found');\n                }\n\n                return promise;\n            }\n\n            // Else, we have to get it from the server\n            var endpoint = _.result(this, 'contentEndpoint');\n\n            // If we have no endpoint, fail\n            if (!endpoint) {\n                promise.reject(\"No endpoint was defined for \" + this);\n                return promise;\n            }\n\n            // Get the params\n            var params = _.result(this, 'contentParams');\n\n            if (_.result(this, 'useSafePost')) {\n                // If we can use safe post, return the promise from it\n                return safe.post(endpoint, params);\n            }\n\n            // Else, use $.get\n            return $.get(endpoint, params);\n        },\n\n        renderContent: function (templateContent) {\n            return templateContent;\n        },\n\n        isFixedModal: function () {\n            return this.options.modalType === 'modal-fixed';\n        },\n\n\n        /*********************************************************************************\n         * Closing and showing the modal\n         *********************************************************************************/\n\n        /**\n         * Opens the modal, returns a promise that will be resolved when the modal was closed\n         *\n         * The promise will resolved if the modal was closed using \"complete\" or rejected if the modal was\n         * closed using the \"close\" method\n         *\n         * @params {String} (optional) A key for the step to show first\n         * @returns {jQuery.Deferred}\n         */\n        show: function (startStep) {\n\n            this._startStep = startStep || (this.steps || [])[0];\n\n            // Set the container for the modal and add it into the overlay\n            this.$el.addClass('smore-modal-container');\n            if (this._startStep) {\n                this.$el.addClass('step-' + (this._startStep || ''));\n            }\n\n            if (this.options.containerEl) {\n                this._wrapper = $('<div/>').addClass('internal-modal-container').appendTo(this.options.containerEl);\n                this._wrapper.append(this.$el);\n\n            } else {\n                // Show the modal\n                this.overlay = new overlay.OverlayView({\n                    closeOnClick: this.overlayClose,\n                    type: this.options.modalType,\n                    allowAccessToolbar: this.options.allowAccessToolbar\n                });\n\n                this.overlay.scrollContainer.append(this.$el);\n                this.overlay.show();\n\n                var self = this;\n                this.overlay.on('close', function () {\n                   self.trigger('close');\n                });\n            }\n\n\n            // Get the content promise\n            var content = this.getContent();\n\n            // function to execute if we're still waiting after the delay time\n            var pending = function () {\n                if (content.state() === 'pending') {\n                    // Set the html to be loading\n                    this.showLoading();\n                }\n            };\n\n            // Only show the loading screen if the loading hasn't completed in 150ms\n            window.setTimeout($.proxy(pending, this), 150);\n\n\n            // Register callback for loading of the content\n            content.done($.proxy(this._onShowLoadingDone, this));\n            content.fail($.proxy(this._onShowLoadingFailed, this));\n\n\n            return this.result;\n        },\n\n        showLoading: function () {\n            this._setHtml(this.getLoadingContent());\n        },\n\n        /***\n         * Handles the completion of loading the html.\n         *\n         * @param {String} html\n         * @private\n         */\n        _onShowLoadingDone: function (html) {\n            this._setHtml(html, function () {\n                // This method will run after the html was set and the modal was re-positioned\n\n                // Setup history\n                this.setupHistory();\n\n                // Setup steps\n                this.setupSteps();\n\n                // Setup subviews\n                this.setupSubviews();\n\n                // Call the render function\n                this.render();\n\n                this.onShow();\n            });\n        },\n\n        onShow: function () {\n            // override in subclass\n        },\n\n        /***\n         * If for some reason the loading has failed\n         * @param error\n         * @private\n         */\n        _onShowLoadingFailed: function (error) {\n            this._setHtml(this.getErrorContent(error));\n        },\n\n        /***\n         * Sets the modal html\n         * @param {String} html\n         * @param {Function=} onCompleted Callback function to run after the html was rendered on the\n         *                                  modal was positioned (The callback is executed in the context of the\n         *                                  ModalView.\n         *\n         * @private\n         */\n        _setHtml: function (html, onCompleted) {\n            // Run it in request animation frame\n            raf.queue(function () {\n\n                // If mobile add mobile classes to the body\n                if (mobile.isMiniLayout()) {\n                    _body.addClass('smore-mobile-modal');\n                }\n\n                this.$el.html(html);\n                // Reposition the modal, after the html was set\n                this.position();\n\n                if (_.isFunction(onCompleted)) {\n                    onCompleted.call(this);\n                }\n\n            }, this);\n        },\n\n\n        /***\n         * Renders a simple html to show when loading the flyer\n         */\n        getLoadingContent: function () {\n            return '<div class=\"smore-modal-loading\">' +\n                '<div class=\"indicator\">' +\n                '<div class=\"spinner\">' +\n                '<div class=\"rect1\"></div>' +\n                '<div class=\"rect2\"></div>' +\n                '<div class=\"rect3\"></div>' +\n                '<div class=\"rect4\"></div>' +\n                '<div class=\"rect5\"></div>' +\n                '</div></div><h3><span>' +\n                this.options.loadingTitle +\n                '</span></h3></div>';\n        },\n\n        /***\n         *\n         * @param error\n         */\n        getErrorContent: function (error) {\n            return '<div class=\"smore-modal-error\"><h3>Oops! Something bad happened :/</h3>' +\n                '<p>Hope we can still be friends...</p> ' +\n                '<p><a class=\"smore-modal-close fire-modal-close\">Close this</a> or ' +\n                '<a href=\"mailto:hello@smore.com\">Contact support and tell us what happend</a>.</div></div>';\n        },\n\n        /***\n         * Centers the modal vertically\n         */\n        position: function () {\n            // Do nothing if our el is not inside the dom yet\n            if (!this.el.parentNode) {\n                return;\n            }\n\n            var minTop = 70;\n\n            var height = this.$el.height();\n\n            var screenHeight = window.innerHeight || _win.height();\n\n            // Handle internal modal wrapper\n            if (this.options.containerEl) {\n                screenHeight = this.options.containerEl.height();\n            }\n\n            // put at screen center\n            var scrollTop = $(window).scrollTop();\n            // disable scroll for fixed modals\n            if (this.isFixedModal()) {\n                scrollTop = 0;\n            }\n\n            var top = (screenHeight / 2 ) - (height / 2) + scrollTop;\n\n            // Set a minimum top\n            top = Math.max(minTop, top);\n            // Set the top and apply animation\n            this.$el.css('margin-top', top).addClass('active');\n        },\n\n        /***\n         * Closes the modal, resolve its promise with the the given result\n         *\n         * @param {*} result\n         */\n        complete: function (result) {\n\n            this.onComplete(result);\n\n            // Close the modal\n            this._closeModal();\n\n            this.result.resolve(result);\n        },\n\n        /***\n         * A useful placeholder for sub classes.\n         * This can be used for reporting purposes etc.\n         *\n         *\n         * @param {*} result\n         */\n        onComplete: function (result) {\n            // no-op\n        },\n\n        /***\n         * Close the modal, rejecting the `result` promise\n         */\n        close: function (cancelReason) {\n\n            this.onClose(cancelReason);\n\n            // Close the modal\n            this._closeModal();\n\n            this.trigger('close');\n\n            this.result.reject(cancelReason);\n        },\n\n        /***\n         * A useful placeholder for sub classes.\n         * This can be used for reporting purposes etc.\n         *\n         *\n         * @param {*} cancelReason\n         */\n        onClose: function (cancelReason) {\n            // no-op\n        },\n\n        /***\n         * The actual method that hides the modal\n         * @private\n         */\n        _closeModal: function () {\n            // Drop animation\n            this.$el.addClass('drop');\n\n            // Hide the overlay\n            if (this.overlay) {\n                this.overlay.hide();\n            }\n\n            var internalWrapper = this._wrapper;\n\n            var el = this.$el;\n\n            // When everything is completed, remove the element\n            el.transitionEnd(function () {\n                el.remove();\n\n                // remove mobile class from body\n                _body.removeClass('smore-mobile-modal');\n\n                if (internalWrapper) {\n                    internalWrapper.remove();\n                }\n            });\n\n            // remove history helper\n            if (this._historyHelper) {\n                this._historyHelper.remove();\n                this._historyHelper = null;\n            }\n\n\n        },\n\n        /*********************************************************************************\n         * Subviews\n         *********************************************************************************/\n\n        /***\n         * Initialize subviews\n         */\n        setupSubviews: function () {\n\n            // Get the dict for the view keys\n            var subviews = _.result(this, 'subviews');\n\n            // we will use the reference for our internal views\n            var _this = this;\n\n            // Iterate over the subviews in our loaded dom\n            this.$('[data-subview]').each(function () {\n                var el = $(this);\n\n                var key = el.data('subview');\n                var viewCls = subviews[key];\n\n                if (!key || !viewCls) {\n                    console.error(\"Can't find view for key: \", key, \"el:\", el);\n                    return;\n                }\n\n                // initialize the view using the the class we have\n                var view;\n                // If it's a view class create it\n                if (viewCls.__super__) {\n                    // Create the view, pass it the viewCls\n                    view = new viewCls({el: el});\n                } else {\n                    // If it's a string, get it from the class\n                    if (_.isString(viewCls)) {\n\n                        var targetFn = _this[viewCls];\n\n                        if (!targetFn) {\n                            throw \"Cant find the key '\" + viewCls + \"'\";\n                        }\n\n                        // Set the function\n                        viewCls = targetFn;\n                    }\n\n                    // run the function that initialize it, run it in the context of the modal\n                    view = viewCls.call(_this, el);\n\n                }\n\n                // Skip if we don't have a view\n                if (!view) {\n                    return;\n                }\n\n                // set reference\n                view.modal = _this;\n\n                // We render everything inside an RAF for performance reasons\n                raf.queue(view.render, view);\n            });\n\n        },\n\n\n        /*********************************************************************************\n         * Steps\n         *********************************************************************************/\n\n        /***\n         * Setup the steps, if defined\n         */\n        setupSteps: function () {\n\n            // Find all the step elements\n            this._stepEls = this.$('[data-step]');\n\n            // Find all the steps and store them in 'this.steps'\n            this.steps = this._stepEls.map(function () {\n                return $(this).data('step');\n            }).get();\n\n            // If we have steps, show the first step or the startStep\n            if (!this.steps.length) {\n                return;\n            }\n\n            this._startStep = this._startStep || (this.steps || [])[0];\n\n\n            this.goStep(this._startStep);\n\n        },\n\n        _getStepEl: function (stepKey) {\n            return this._stepEls.filter('[data-step=\"' + stepKey + '\"]');\n        },\n\n        /***\n         * Go to a given step key\n         * @param {String} stepKey\n         * @param {Boolean=} skipStack   Will not add the current step to the stack\n         */\n        goStep: function (stepKey, skipStack) {\n            var stepEl = this._getStepEl(stepKey);\n\n            if (!stepEl.length) {\n                console.error(\"Can't find step with key\", stepKey, \"steps:\", this._stepEls);\n                return;\n            }\n\n            // else:\n            // Do everything inside an RAF for performance reasons\n            raf.queueOrInline(function () {\n\n                // Add and remove the step keys\n                if (this._currentSection) {\n                    this.$el.removeClass('step-' + this._currentSection);\n\n                    if (!skipStack) {\n                        // Store the step in the stack\n                        this._stepsStack.push(this._currentSection);\n                    }\n                }\n\n                this.$el.addClass('step-' + stepKey);\n\n                // Hide all other steps\n                this._stepEls.hide();\n                // Show selected step\n                stepEl.show();\n\n                // Call position to re-position our modal\n                this.position();\n\n                // Store the current step\n                this._currentSection = stepKey;\n\n                /**\n                 * Store the current step element\n                 * @type {jQuery}\n                 */\n                this.currentStepEl = stepEl;\n\n                if (!skipStack) {\n                    this._historyHelper.push({step: this._currentSection});\n                }\n\n                // Notify\n                this.onStepActivated(stepKey);\n\n            }, this);\n        },\n\n        goBackStep: function () {\n            if (!this._stepsStack.length) {\n                return;\n            }\n\n            var upcomingStep = this._stepsStack.pop();\n\n            this.goStep(upcomingStep, true);\n        },\n\n        _stepIdx: function (stepKey) {\n            return this.steps.indexOf(stepKey);\n        },\n\n        /***\n         * Go to the next step\n         */\n        nextStep: function () {\n            // // Default - first step\n            var nextStep = this.steps[0];\n\n            if (this._currentSection) {\n                var idx = this._stepIdx(this._currentSection);\n\n\n                nextStep = this.steps[idx + 1];\n\n                if (!nextStep) {\n                    return;\n                }\n            }\n\n            this.goStep(nextStep);\n        },\n\n        /***\n         * Go to previous step\n         */\n        prevStep: function () {\n            // Default - first step\n            var prevStep = this.steps[0];\n\n            if (this._currentSection) {\n                var idx = this._stepIdx(this._currentSection);\n\n\n                prevStep = this.steps[idx - 1];\n\n                if (!prevStep) {\n                    return;\n                }\n            }\n\n            this.goStep(prevStep);\n        },\n\n        /***\n         * A method for implementers of modals, to allow them to handle cases when a step is activated\n         * @param {String} stepKey\n         */\n        onStepActivated: function (stepKey) {\n            // no-op\n        },\n\n        /*********************************************************************************\n         * History\n         *********************************************************************************/\n        setupHistory: function () {\n            this._historyHelper = history.getHelper($.proxy(this._onHistoryPopState, this));\n        },\n\n\n        /*********************************************************************************\n         * Event handlers\n         *********************************************************************************/\n\n        /***\n         * Handle history events\n         * @private\n         */\n        _onHistoryPopState: function (e, state) {\n            if (state.step) {\n                this.goBackStep();\n            }\n        },\n\n        _onCloseClicked: function (e) {\n            e.preventDefault();\n            e.stopImmediatePropagation();\n            this.close('clicked_on_cancel');\n        },\n\n        _onNextStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n            this.nextStep();\n        },\n\n        _onPrevStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n            this.prevStep();\n        },\n\n        _onGoStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n\n            var key = t.data('key');\n            if (key) {\n                this.goStep(key);\n            }\n        },\n\n        _onBackStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n\n            // Go back a step\n            this.goBackStep();\n        }\n    });\n\n\n    return {\n        ModalView: ModalView\n    };\n});", "/* globals _, Backbone */\ndefine('billing/ui/BackToSchoolSaleModal', function (require) {\n\n    var ModalView = require('smore/ui/views/modal').ModalView;\n\n    /***\n     * @extends {ModalView}\n     */\n    var BackToSchoolSaleModal = ModalView.extend({\n\n        className: 'back-to-school-sale-modal modal-container',\n\n        templateSelector: '#back-to-school-sale-modal',\n\n        defaultOptions: {\n            overlayClose: true,\n            modalType: 'modal-fixed'\n        },\n\n        events: {\n            'click .delete-button': '_onDeleteClicked'\n        },\n\n    });\n\n    return BackToSchoolSaleModal;\n});\n", "define('billing/ui/pricing', function (require) {\r\n\r\n    var loginModal = require('smore/ui/login/modal');\r\n    var safe = require('fire/net/safe');\r\n    var token = require('smore/token');\r\n    var popover = require('fire/ui/popover');\r\n    var _modal, _upgradeAfterSignupPlan;\r\n    var events = require('billing/events');\r\n    var ChangePlanModalView = require('./ChangePlanModalView');\r\n    var BackToSchoolSaleModal = require('./BackToSchoolSaleModal');\r\n    var _couponCode = '';\r\n\r\n    var SALE_MODAL_KEY = 'pricing-sale-modal-dont-show';\r\n\r\n    function init() {\r\n\r\n        _modal = new loginModal.LoginModalView({buttonId: 'pricing-page-choose-this-plan', onSuccess: onLoginSuccess});\r\n\r\n        var upgradeButtonSelectors = [\r\n            '.pricing-table .upgrade-button',\r\n            '.pricing-table .downgrade-button',\r\n            '.downgrade-to-free',\r\n            '.education-pricing .upgrade-button',\r\n            '.stylist-pricing .upgrade-button',\r\n            '.change-plan .upgrade-button'\r\n        ];\r\n\r\n        var upgradeButtonsSelectorString = upgradeButtonSelectors.join(', ');\r\n\r\n        $(upgradeButtonsSelectorString).click(onUpgradeClicked);\r\n\r\n        // extract the coupon code from the meta tag\r\n        _couponCode = $('meta[name=\"smore:coupon_code\"]').attr('value');\r\n\r\n        showUpgradeIfSpecified();\r\n\r\n        // make the quick login buttons only reload\r\n        $('.auto-quick-login').attr('data-reload-only', true);\r\n\r\n        $('#contact-us-link').attr('href', 'mailto:hello@smore.com');\r\n\r\n        $('.upgrade-header').mouseenter(onUpgradeHeaderMouseEnter)\r\n            .mouseleave(onUpgradeHeaderMouseLeft);\r\n\r\n        // Setup videos and fancyboxes\r\n        setupFancyBox();\r\n\r\n        autoOpenSaleModal();\r\n        autoOpenUpgradePlan();\r\n    }\r\n\r\n    function localStorage() {\r\n        var mock = {\r\n            getItem: function () {},\r\n            setItem: function () {}\r\n        };\r\n\r\n        return window.localStorage || mock;\r\n    }\r\n\r\n    function markSaleModalShown() {\r\n        localStorage().setItem(SALE_MODAL_KEY, true);\r\n    }\r\n\r\n    function alreadySeenSaleModal() {\r\n        return localStorage().getItem(SALE_MODAL_KEY);\r\n    }\r\n\r\n    function shouldAutoOpenSaleModal() {\r\n        return !!window.__autoOpenSaleModal && !alreadySeenSaleModal();\r\n    }\r\n\r\n    function autoOpenSaleModal() {\r\n\r\n        if (shouldAutoOpenUpgradePlan()) {\r\n            return;\r\n        }\r\n\r\n        if (shouldAutoOpenSaleModal()) {\r\n            showSaleModal();\r\n        }\r\n    }\r\n\r\n    function showSaleModal() {\r\n        var saleModal = new BackToSchoolSaleModal();\r\n        saleModal.show();\r\n\r\n        markSaleModalShown();\r\n    }\r\n\r\n    function shouldAutoOpenUpgradePlan() {\r\n        return !!window.__autoOpenUpgradePlan && !!window.__planForAutoUpgrade && loginModal.isLoggedIn();\r\n    }\r\n\r\n    function autoOpenUpgradePlan() {\r\n        if (shouldAutoOpenUpgradePlan()) {\r\n            showUpgradeModal(window.__planForAutoUpgrade);\r\n        }\r\n    }\r\n\r\n    function onUpgradeHeaderMouseEnter(e) {\r\n        $(e.currentTarget).find('.upgrade-button').addClass('hover');\r\n    }\r\n\r\n    function onUpgradeHeaderMouseLeft(e) {\r\n        $(e.currentTarget).find('.upgrade-button').removeClass('hover');\r\n    }\r\n\r\n\r\n    function onUpgradeClicked(e) {\r\n        var t = $(e.currentTarget);\r\n        e.stopImmediatePropagation();\r\n\r\n\r\n        var requestedPlan = t.data('target');\r\n        if (!requestedPlan) return;\r\n\r\n        if (loginModal.isLoggedIn()) {\r\n            // if we're logged in\r\n            showUpgradeModal(requestedPlan, _couponCode, t.data('force-page'));\r\n        } else {\r\n            _upgradeAfterSignupPlan = requestedPlan;\r\n            // show the quick login\r\n            _modal.show();\r\n        }\r\n    }\r\n\r\n    function onLoginSuccess() {\r\n\r\n        // refresh the page with ref, using 'post' request so the user will not refresh/copy paste the url\r\n        // and have bad behavior.\r\n\r\n        safe.form(document.location, {\r\n            open_upgrade: _upgradeAfterSignupPlan,\r\n            coupon_code: _couponCode\r\n        });\r\n    }\r\n\r\n    function showUpgradeIfSpecified() {\r\n        var t = $('meta[name=\"smore:target_upgrade_plan\"]');\r\n        var targetPlan = t.attr('value');\r\n        var forcePage = t.data('force-page');\r\n\r\n        if (targetPlan) {\r\n            showUpgradeModal(targetPlan, _couponCode, forcePage);\r\n        }\r\n    }\r\n\r\n    /***\r\n     *\r\n     * @param requestedPlan\r\n     * @param {String=} couponCode\r\n     * @param {Boolean=} forcePage\r\n     */\r\n    function showUpgradeModal(requestedPlan, couponCode, forcePage) {\r\n        var upgradeOption = 'new_modal';\r\n\r\n        if (forcePage) {\r\n            upgradeOption = 'different_page';\r\n        }\r\n\r\n        switch (upgradeOption) {\r\n            case 'new_modal':\r\n\r\n                var modal = new ChangePlanModalView(requestedPlan, 'N/A', couponCode);\r\n                modal.show();\r\n                break;\r\n            case 'different_page':\r\n                var loc = '/app/billing/standalone_upgrade_form?requested_plan=' + requestedPlan;\r\n\r\n                // Get the upgrade reason\r\n                var ur = events.reason;\r\n\r\n                if (ur && ur !== 'N/A') {\r\n                    loc += ('&ur=' + ur);\r\n                }\r\n\r\n                // if we have an upgrade reason, use it\r\n                if (couponCode) {\r\n                    loc += '&coupon_code=' + couponCode;\r\n                }\r\n\r\n                document.location = loc;\r\n                break;\r\n        }\r\n    }\r\n\r\n\r\n    function setupFancyBox() {\r\n        var vidEl = $('.play-smore-video');\r\n\r\n        vidEl.fancybox({\r\n            type: 'iframe',\r\n            href: '//www.youtube.com/embed/61nyPzZPZYA?autoplay=1',\r\n            orig: vidEl,\r\n            width: 690,\r\n            height: 390\r\n        });\r\n\r\n        // Show fancybox\r\n        $('.fancybox').fancybox();\r\n    }\r\n\r\n\r\n    $(init);\r\n});", "define('billing/ui/educationPricing', function (require) {\n\n    function resetCarouselButtons() {\n        $('.carousel-button').removeClass('active');\n    }\n\n    function hideTestimonials() {\n        $('.testimonial').addClass('hidden');\n    }\n\n    function setup() {\n        $('.carousel-control .carousel-button').click(function (e) {\n            // Set only current carousel as active\n            resetCarouselButtons();\n            var carouselElement = $(e.currentTarget);\n            carouselElement.addClass('active');\n\n            // Show only current testimonial\n            hideTestimonials();\n            var testimonialId = carouselElement.data('testimonial-id');\n            $('#' + testimonialId).removeClass('hidden');\n        });\n    }\n\n    $(setup);\n});", "define('billing/ui/billingDataModal', function(require) {\r\n\r\n    var modal = require('fire/ui/modal');\r\n    var safe = require('fire/net/safe');\r\n    var token = require('smore/token');\r\n\r\n\r\n    var paymentFrom = require('billing/ui/paymentForm');\r\n\r\n    // set the token\r\n    safe.token(token);\r\n\r\n    var MODAL_ENDPOINT = '/app/billing/update_billing_data_modal';\r\n    var CHANGE_BILLING_DATA_ENDPOINT = '/app/billing/update_billing_data';\r\n\r\n\r\n    var MODAL_OPTIONS = {\r\n        cssClass: 'base-modal billing-modal',\r\n        width: 530,\r\n        overlayClose: false,\r\n        close: onClose\r\n    };\r\n\r\n\r\n    function show() {\r\n        var p = safe.post(MODAL_ENDPOINT);\r\n\r\n        modal.showDeferred(p, MODAL_OPTIONS).done(setupModal);\r\n    }\r\n\r\n    function setupModal(el) {\r\n        var form = el.find('.change-card-details-modal');\r\n        paymentFrom.init(form, CHANGE_BILLING_DATA_ENDPOINT);\r\n    }\r\n\r\n    function onClose(e) {\r\n    }\r\n\r\n\r\n    function setup() {\r\n        $('.change-billing-data').click(show)\r\n    }\r\n\r\n\r\n    $(setup);\r\n});", "define('smore/ui/flash', function (require) {\r\n\r\n    var FLASH_SELECTOR = '.flash-animation-container';\r\n    var FLASH_TIMEOUT = 5000;\r\n\r\n    function hideFlash() {\r\n        setTimeout(function () {\r\n            $(FLASH_SELECTOR).addClass('hidden');\r\n        }, FLASH_TIMEOUT);\r\n    }\r\n\r\n    $(hideFlash);\r\n});", "define('billing/ui/sandalonePage', function (require) {\r\n    var events = require('billing/events');\r\n    var paymentForm = require('billing/ui/paymentForm');\r\n\r\n    var SUBSCRIBE_TO_PRO_ENDPOINT = '/app/billing/subscribe_to_pro';\r\n    var COMPLETION_ENDPOINT = '/app/billing/verify';\r\n\r\n    var _el = $('#upgrade-form-standalone-container');\r\n\r\n    function init() {\r\n        var form = _el.find('.payment-form-modal2');\r\n        var requestedPlanKey = form.data('plan-key');\r\n        var subscribeToProEndpoint = form.data('subscribe-endpoint') || SUBSCRIBE_TO_PRO_ENDPOINT;\r\n        var completionEndpoint = form.data('completion-redirect') || COMPLETION_ENDPOINT;\r\n        var completionUrl = completionEndpoint + '?requested_plan=' + requestedPlanKey;\r\n\r\n        paymentForm.init(\r\n            _el,\r\n            subscribeToProEndpoint,\r\n            requestedPlanKey,\r\n            completionUrl,\r\n            form.data('coupon-code'),\r\n            form.data('addon-plan-key')\r\n        );\r\n    }\r\n\r\n\r\n    // only init if we have a the element\r\n    if (_el.length) {\r\n        $(init);\r\n    }\r\n\r\n});", "/*\r\n * FancyBox - jQuery Plugin\r\n * Simple and fancy lightbox alternative\r\n *\r\n * Examples and documentation at: http://fancybox.net\r\n *\r\n * Copyright (c) 2008 - 2010 Janis Skarnelis\r\n * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.\r\n *\r\n * Version: 1.3.4 (11/11/2010)\r\n * Requires: jQuery v1.3+\r\n *\r\n * Dual licensed under the MIT and GPL licenses:\r\n *   http://www.opensource.org/licenses/mit-license.php\r\n *   http://www.gnu.org/licenses/gpl.html\r\n */\r\n\r\n;\r\n(function ($) {\r\n    var MIN_WIDTH = 350;\r\n    var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right,\r\n\r\n        selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [],\r\n\r\n        ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\\.]\\.(swf)\\s*$/i,\r\n\r\n        loadingTimer, loadingFrame = 1,\r\n\r\n        titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),\r\n\r\n        isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,\r\n\r\n    /*\r\n     * Private methods\r\n     */\r\n\r\n        _abort = function () {\r\n            loading.hide();\r\n\r\n            imgPreloader.onerror = imgPreloader.onload = null;\r\n\r\n            if (ajaxLoader) {\r\n                ajaxLoader.abort();\r\n            }\r\n\r\n            tmp.empty();\r\n        },\r\n\r\n        _error = function () {\r\n            if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) {\r\n                loading.hide();\r\n                busy = false;\r\n                return;\r\n            }\r\n\r\n            selectedOpts.titleShow = false;\r\n\r\n            selectedOpts.width = 'auto';\r\n            selectedOpts.height = 'auto';\r\n\r\n            tmp.html('<p id=\"fancybox-error\">The requested content cannot be loaded.<br />Please try again later.</p>');\r\n\r\n            _process_inline();\r\n        },\r\n\r\n        _start = function () {\r\n            var obj = selectedArray[ selectedIndex ],\r\n                href,\r\n                type,\r\n                title,\r\n                str,\r\n                emb,\r\n                ret;\r\n\r\n            _abort();\r\n\r\n            selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox')));\r\n\r\n            ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts);\r\n\r\n            if (ret === false) {\r\n                busy = false;\r\n                return;\r\n            } else if (typeof ret == 'object') {\r\n                selectedOpts = $.extend(selectedOpts, ret);\r\n            }\r\n\r\n            title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || '';\r\n\r\n            if (obj.nodeName && !selectedOpts.orig) {\r\n                selectedOpts.orig = $(obj).children(\"img:first\").length ? $(obj).children(\"img:first\") : $(obj);\r\n            }\r\n\r\n            if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) {\r\n                title = selectedOpts.orig.attr('alt');\r\n            }\r\n\r\n            href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null;\r\n\r\n            if ((/^(?:javascript)/i).test(href) || href == '#') {\r\n                href = null;\r\n            }\r\n\r\n            if (selectedOpts.type) {\r\n                type = selectedOpts.type;\r\n\r\n                if (!href) {\r\n                    href = selectedOpts.content;\r\n                }\r\n\r\n            } else if (selectedOpts.content) {\r\n                type = 'html';\r\n\r\n            } else if (href) {\r\n                if (href.match(imgRegExp)) {\r\n                    type = 'image';\r\n\r\n                } else if (href.match(swfRegExp)) {\r\n                    type = 'swf';\r\n\r\n                } else if ($(obj).hasClass(\"iframe\")) {\r\n                    type = 'iframe';\r\n\r\n                } else if (href.indexOf(\"#\") === 0) {\r\n                    type = 'inline';\r\n\r\n                } else {\r\n                    type = 'ajax';\r\n                }\r\n            }\r\n\r\n            if (!type) {\r\n                _error();\r\n                return;\r\n            }\r\n\r\n            if (type == 'inline') {\r\n                obj = href.substr(href.indexOf(\"#\"));\r\n                type = $(obj).length > 0 ? 'inline' : 'ajax';\r\n            }\r\n\r\n            selectedOpts.type = type;\r\n            selectedOpts.href = href;\r\n            selectedOpts.title = title;\r\n\r\n            if (selectedOpts.autoDimensions) {\r\n                if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') {\r\n                    selectedOpts.width = 'auto';\r\n                    selectedOpts.height = 'auto';\r\n                } else {\r\n                    selectedOpts.autoDimensions = false;\r\n                }\r\n            }\r\n\r\n            if (selectedOpts.modal) {\r\n                selectedOpts.overlayShow = true;\r\n                selectedOpts.hideOnOverlayClick = false;\r\n                selectedOpts.hideOnContentClick = false;\r\n                selectedOpts.enableEscapeButton = false;\r\n                selectedOpts.showCloseButton = false;\r\n            }\r\n\r\n            selectedOpts.padding = parseInt(selectedOpts.padding, 10);\r\n            selectedOpts.margin = parseInt(selectedOpts.margin, 10);\r\n\r\n            tmp.css('padding', (selectedOpts.padding + selectedOpts.margin));\r\n\r\n            $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function () {\r\n                $(this).replaceWith(content.children());\r\n            });\r\n\r\n            switch (type) {\r\n                case 'html' :\r\n                    tmp.html(selectedOpts.content);\r\n                    _process_inline();\r\n                    break;\r\n\r\n                case 'inline' :\r\n                    if ($(obj).parent().is('#fancybox-content') === true) {\r\n                        busy = false;\r\n                        return;\r\n                    }\r\n\r\n                    $('<div class=\"fancybox-inline-tmp\" />')\r\n                        .hide()\r\n                        .insertBefore($(obj))\r\n                        .bind('fancybox-cleanup', function () {\r\n                            $(this).replaceWith(content.children());\r\n                        }).bind('fancybox-cancel', function () {\r\n                            $(this).replaceWith(tmp.children());\r\n                        });\r\n\r\n                    $(obj).appendTo(tmp);\r\n\r\n                    _process_inline();\r\n                    break;\r\n\r\n                case 'image':\r\n                    busy = false;\r\n\r\n                    $.fancybox.showActivity();\r\n\r\n                    imgPreloader = new Image();\r\n\r\n                    imgPreloader.onerror = function () {\r\n                        _error();\r\n                    };\r\n\r\n                    imgPreloader.onload = function () {\r\n                        busy = true;\r\n\r\n                        imgPreloader.onerror = imgPreloader.onload = null;\r\n\r\n                        _process_image();\r\n                    };\r\n\r\n                    imgPreloader.src = href;\r\n                    break;\r\n\r\n                case 'swf':\r\n                    selectedOpts.scrolling = 'no';\r\n\r\n                    str = '<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"' + selectedOpts.width + '\" height=\"' + selectedOpts.height + '\"><param name=\"movie\" value=\"' + href + '\"></param>';\r\n                    emb = '';\r\n\r\n                    $.each(selectedOpts.swf, function (name, val) {\r\n                        str += '<param name=\"' + name + '\" value=\"' + val + '\"></param>';\r\n                        emb += ' ' + name + '=\"' + val + '\"';\r\n                    });\r\n\r\n                    str += '<embed src=\"' + href + '\" type=\"application/x-shockwave-flash\" width=\"' + selectedOpts.width + '\" height=\"' + selectedOpts.height + '\"' + emb + '></embed></object>';\r\n\r\n                    tmp.html(str);\r\n\r\n                    _process_inline();\r\n                    break;\r\n\r\n                case 'ajax':\r\n                    busy = false;\r\n\r\n                    $.fancybox.showActivity();\r\n\r\n                    selectedOpts.ajax.win = selectedOpts.ajax.success;\r\n\r\n                    ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, {\r\n                        url: href,\r\n                        data: selectedOpts.ajax.data || {},\r\n                        error: function (XMLHttpRequest, textStatus, errorThrown) {\r\n                            if (XMLHttpRequest.status > 0) {\r\n                                _error();\r\n                            }\r\n                        },\r\n                        success: function (data, textStatus, XMLHttpRequest) {\r\n                            var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader;\r\n                            if (o.status == 200) {\r\n                                if (typeof selectedOpts.ajax.win == 'function') {\r\n                                    ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest);\r\n\r\n                                    if (ret === false) {\r\n                                        loading.hide();\r\n                                        return;\r\n                                    } else if (typeof ret == 'string' || typeof ret == 'object') {\r\n                                        data = ret;\r\n                                    }\r\n                                }\r\n\r\n                                tmp.html(data);\r\n                                _process_inline();\r\n                            }\r\n                        }\r\n                    }));\r\n\r\n                    break;\r\n\r\n                case 'iframe':\r\n                    _show();\r\n                    break;\r\n            }\r\n        },\r\n\r\n        _process_inline = function () {\r\n            var\r\n                w = selectedOpts.width,\r\n                h = selectedOpts.height;\r\n\r\n            if (w.toString().indexOf('%') > -1) {\r\n                w = parseInt(($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px';\r\n\r\n            } else {\r\n                w = w == 'auto' ? 'auto' : w + 'px';\r\n            }\r\n\r\n            if (h.toString().indexOf('%') > -1) {\r\n                h = parseInt(($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px';\r\n\r\n            } else {\r\n                h = h == 'auto' ? 'auto' : h + 'px';\r\n            }\r\n\r\n            tmp.wrapInner('<div style=\"width:' + w + ';height:' + h + ';overflow: ' + (selectedOpts.scrolling == 'auto' ? 'auto' : (selectedOpts.scrolling == 'yes' ? 'scroll' : 'hidden')) + ';position:relative;\"></div>');\r\n\r\n            selectedOpts.width = tmp.width();\r\n            selectedOpts.height = tmp.height();\r\n\r\n            _show();\r\n        },\r\n\r\n        _process_image = function () {\r\n            selectedOpts.width = Math.max(imgPreloader.width, MIN_WIDTH);\r\n            selectedOpts.height = imgPreloader.height;\r\n\r\n            $(\"<img />\").attr({\r\n                'id': 'fancybox-img',\r\n                'src': imgPreloader.src,\r\n                'alt': selectedOpts.title\r\n            }).appendTo(tmp);\r\n\r\n            _show();\r\n        },\r\n\r\n        _show = function () {\r\n            var pos, equal;\r\n\r\n            loading.hide();\r\n\r\n            if (wrap.is(\":visible\") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) {\r\n                $.event.trigger('fancybox-cancel');\r\n\r\n                busy = false;\r\n                return;\r\n            }\r\n\r\n            busy = true;\r\n\r\n            $(content.add(overlay)).unbind();\r\n\r\n            $(window).unbind(\"resize.fb scroll.fb\");\r\n            $(document).unbind('keydown.fb');\r\n\r\n            if (wrap.is(\":visible\") && currentOpts.titlePosition !== 'outside') {\r\n                wrap.css('height', wrap.height());\r\n            }\r\n\r\n            currentArray = selectedArray;\r\n            currentIndex = selectedIndex;\r\n            currentOpts = selectedOpts;\r\n\r\n            if (currentOpts.overlayShow) {\r\n                overlay.css({\r\n                    'background-color': currentOpts.overlayColor,\r\n                    'opacity': currentOpts.overlayOpacity,\r\n                    'cursor': currentOpts.hideOnOverlayClick ? 'pointer' : 'auto',\r\n                    'height': $(document).height()\r\n                });\r\n\r\n                if (!overlay.is(':visible')) {\r\n                    if (isIE6) {\r\n                        $('select:not(#fancybox-tmp select)').filter(function () {\r\n                            return this.style.visibility !== 'hidden';\r\n                        }).css({'visibility': 'hidden'}).one('fancybox-cleanup', function () {\r\n                            this.style.visibility = 'inherit';\r\n                        });\r\n                    }\r\n\r\n                    overlay.show();\r\n                }\r\n            } else {\r\n                overlay.hide();\r\n            }\r\n\r\n            final_pos = _get_zoom_to();\r\n\r\n            _process_title();\r\n\r\n            if (wrap.is(\":visible\")) {\r\n                $(close.add(nav_left).add(nav_right)).hide();\r\n\r\n                pos = wrap.position(),\r\n\r\n                    start_pos = {\r\n                        top: pos.top,\r\n                        left: pos.left,\r\n                        width: wrap.width(),\r\n                        height: wrap.height()\r\n                    };\r\n\r\n                equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height);\r\n\r\n                content.fadeTo(currentOpts.changeFade, 0.3, function () {\r\n                    var finish_resizing = function () {\r\n                        content.html(tmp.contents()).fadeTo(currentOpts.changeFade, 1, _finish);\r\n                    };\r\n\r\n                    $.event.trigger('fancybox-change');\r\n\r\n                    content\r\n                        .empty()\r\n                        .removeAttr('filter')\r\n                        .css({\r\n                            'border-width': currentOpts.padding,\r\n                            'width': final_pos.width - currentOpts.padding * 2,\r\n                            'height': selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2\r\n                        });\r\n\r\n                    if (equal) {\r\n                        finish_resizing();\r\n\r\n                    } else {\r\n                        fx.prop = 0;\r\n\r\n                        $(fx).animate({prop: 1}, {\r\n                            duration: currentOpts.changeSpeed,\r\n                            easing: currentOpts.easingChange,\r\n                            step: _draw,\r\n                            complete: finish_resizing\r\n                        });\r\n                    }\r\n                });\r\n\r\n                return;\r\n            }\r\n\r\n            wrap.removeAttr(\"style\");\r\n\r\n            content.css('border-width', currentOpts.padding);\r\n\r\n            if (currentOpts.transitionIn == 'elastic') {\r\n                start_pos = _get_zoom_from();\r\n\r\n                content.html(tmp.contents());\r\n\r\n                wrap.show();\r\n\r\n                if (currentOpts.opacity) {\r\n                    final_pos.opacity = 0;\r\n                }\r\n\r\n                fx.prop = 0;\r\n\r\n                $(fx).animate({prop: 1}, {\r\n                    duration: currentOpts.speedIn,\r\n                    easing: currentOpts.easingIn,\r\n                    step: _draw,\r\n                    complete: _finish\r\n                });\r\n\r\n                return;\r\n            }\r\n\r\n            if (currentOpts.titlePosition == 'inside' && titleHeight > 0) {\r\n                title.show();\r\n            }\r\n\r\n            content\r\n                .css({\r\n                    'width': final_pos.width - currentOpts.padding * 2,\r\n                    'height': selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2\r\n                })\r\n                .html(tmp.contents());\r\n\r\n            wrap\r\n                .css(final_pos)\r\n                .fadeIn(currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish);\r\n        },\r\n\r\n        _format_title = function (title) {\r\n            if (title && title.length) {\r\n                if (currentOpts.titlePosition == 'float') {\r\n                    return '<table id=\"fancybox-title-float-wrap\" cellpadding=\"0\" cellspacing=\"0\"><tr><td id=\"fancybox-title-float-left\"></td><td id=\"fancybox-title-float-main\">' + title + '</td><td id=\"fancybox-title-float-right\"></td></tr></table>';\r\n                }\r\n\r\n                return '<div id=\"fancybox-title-' + currentOpts.titlePosition + '\">' + title + '</div>';\r\n            }\r\n\r\n            return false;\r\n        },\r\n\r\n        _process_title = function () {\r\n            titleStr = currentOpts.title || '';\r\n            titleHeight = 0;\r\n\r\n            title\r\n                .empty()\r\n                .removeAttr('style')\r\n                .removeClass();\r\n\r\n            if (currentOpts.titleShow === false) {\r\n                title.hide();\r\n                return;\r\n            }\r\n\r\n            titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr);\r\n\r\n            if (!titleStr || titleStr === '') {\r\n                title.hide();\r\n                return;\r\n            }\r\n\r\n            title\r\n                .addClass('fancybox-title-' + currentOpts.titlePosition)\r\n                .html(titleStr)\r\n                .appendTo('body')\r\n                .show();\r\n\r\n            switch (currentOpts.titlePosition) {\r\n                case 'inside':\r\n                    title\r\n                        .css({\r\n                            'width': final_pos.width - (currentOpts.padding * 2),\r\n                            'marginLeft': currentOpts.padding,\r\n                            'marginRight': currentOpts.padding\r\n                        });\r\n\r\n                    titleHeight = title.outerHeight(true);\r\n\r\n                    title.appendTo(outer);\r\n\r\n                    final_pos.height += titleHeight;\r\n                    break;\r\n\r\n                case 'over':\r\n                    title\r\n                        .css({\r\n                            'marginLeft': currentOpts.padding,\r\n                            'width': final_pos.width - (currentOpts.padding * 2),\r\n                            'bottom': currentOpts.padding\r\n                        })\r\n                        .appendTo(outer);\r\n                    break;\r\n\r\n                case 'float':\r\n                    title\r\n                        .css('left', parseInt((title.width() - final_pos.width - 40) / 2, 10) * -1)\r\n                        .appendTo(wrap);\r\n                    break;\r\n\r\n                default:\r\n                    title\r\n                        .css({\r\n                            'width': final_pos.width - (currentOpts.padding * 2),\r\n                            'paddingLeft': currentOpts.padding,\r\n                            'paddingRight': currentOpts.padding\r\n                        })\r\n                        .appendTo(wrap);\r\n                    break;\r\n            }\r\n\r\n            title.hide();\r\n        },\r\n\r\n        _set_navigation = function () {\r\n            if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) {\r\n                $(document).bind('keydown.fb', function (e) {\r\n                    if (e.keyCode == 27 && currentOpts.enableEscapeButton) {\r\n                        e.preventDefault();\r\n                        $.fancybox.close();\r\n\r\n                    } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') {\r\n                        e.preventDefault();\r\n                        $.fancybox[ e.keyCode == 37 ? 'prev' : 'next']();\r\n                    }\r\n                });\r\n            }\r\n\r\n            if (!currentOpts.showNavArrows) {\r\n                nav_left.hide();\r\n                nav_right.hide();\r\n                return;\r\n            }\r\n\r\n            if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) {\r\n                nav_left.show();\r\n            }\r\n\r\n            if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length - 1)) {\r\n                nav_right.show();\r\n            }\r\n        },\r\n\r\n        _finish = function () {\r\n            if (!$.support.opacity) {\r\n                content.get(0).style.removeAttribute('filter');\r\n                wrap.get(0).style.removeAttribute('filter');\r\n            }\r\n\r\n            if (selectedOpts.autoDimensions) {\r\n                content.css('height', 'auto');\r\n            }\r\n\r\n            wrap.css('height', 'auto');\r\n\r\n            if (titleStr && titleStr.length) {\r\n                title.show();\r\n            }\r\n\r\n            if (currentOpts.showCloseButton) {\r\n                close.show();\r\n            }\r\n\r\n            _set_navigation();\r\n\r\n            if (currentOpts.hideOnContentClick) {\r\n                content.bind('click', $.fancybox.close);\r\n            }\r\n\r\n            if (currentOpts.hideOnOverlayClick) {\r\n                overlay.bind('click', $.fancybox.close);\r\n            }\r\n\r\n            $(window).bind(\"resize.fb\", $.fancybox.resize);\r\n\r\n            if (currentOpts.centerOnScroll) {\r\n                $(window).bind(\"scroll.fb\", $.fancybox.center);\r\n            }\r\n\r\n            if (currentOpts.type == 'iframe') {\r\n                $('<iframe id=\"fancybox-frame\" name=\"fancybox-frame' + new Date().getTime() + '\" frameborder=\"0\" hspace=\"0\" ' + ($.browser.msie ? 'allowtransparency=\"true\"\"' : '') + ' scrolling=\"' + selectedOpts.scrolling + '\" src=\"' + currentOpts.href + '\"></iframe>').appendTo(content);\r\n            }\r\n\r\n            wrap.show();\r\n\r\n            busy = false;\r\n\r\n            $.fancybox.center();\r\n\r\n            currentOpts.onComplete(currentArray, currentIndex, currentOpts);\r\n\r\n            _preload_images();\r\n        },\r\n\r\n        _preload_images = function () {\r\n            var href,\r\n                objNext;\r\n\r\n            if ((currentArray.length - 1) > currentIndex) {\r\n                href = currentArray[ currentIndex + 1 ].href;\r\n\r\n                if (typeof href !== 'undefined' && href.match(imgRegExp)) {\r\n                    objNext = new Image();\r\n                    objNext.src = href;\r\n                }\r\n            }\r\n\r\n            if (currentIndex > 0) {\r\n                href = currentArray[ currentIndex - 1 ].href;\r\n\r\n                if (typeof href !== 'undefined' && href.match(imgRegExp)) {\r\n                    objNext = new Image();\r\n                    objNext.src = href;\r\n                }\r\n            }\r\n        },\r\n\r\n        _draw = function (pos) {\r\n            var dim = {\r\n                width: parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10),\r\n                height: parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10),\r\n\r\n                top: parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10),\r\n                left: parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10)\r\n            };\r\n\r\n            if (typeof final_pos.opacity !== 'undefined') {\r\n                dim.opacity = pos < 0.5 ? 0.5 : pos;\r\n            }\r\n\r\n            wrap.css(dim);\r\n\r\n            content.css({\r\n                'width': dim.width - currentOpts.padding * 2,\r\n                'height': dim.height - (titleHeight * pos) - currentOpts.padding * 2\r\n            });\r\n        },\r\n\r\n        _get_viewport = function () {\r\n            return [\r\n                    $(window).width() - (currentOpts.margin * 2),\r\n                    $(window).height() - (currentOpts.margin * 2),\r\n                    $(document).scrollLeft() + currentOpts.margin,\r\n                    $(document).scrollTop() + currentOpts.margin\r\n            ];\r\n        },\r\n\r\n        _get_zoom_to = function () {\r\n            var view = _get_viewport(),\r\n                to = {},\r\n                resize = currentOpts.autoScale,\r\n                double_padding = currentOpts.padding * 2,\r\n                ratio;\r\n\r\n            if (currentOpts.width.toString().indexOf('%') > -1) {\r\n                to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10);\r\n            } else {\r\n                to.width = currentOpts.width + double_padding;\r\n            }\r\n\r\n            if (currentOpts.height.toString().indexOf('%') > -1) {\r\n                to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10);\r\n            } else {\r\n                to.height = currentOpts.height + double_padding;\r\n            }\r\n\r\n            if (resize && (to.width > view[0] || to.height > view[1])) {\r\n                if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') {\r\n                    ratio = (currentOpts.width ) / (currentOpts.height );\r\n\r\n                    if ((to.width ) > view[0]) {\r\n                        to.width = view[0];\r\n                        to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10);\r\n                    }\r\n\r\n                    if ((to.height) > view[1]) {\r\n                        to.height = view[1];\r\n                        to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10);\r\n                    }\r\n\r\n                } else {\r\n                    to.width = Math.min(to.width, view[0]);\r\n                    to.height = Math.min(to.height, view[1]);\r\n                }\r\n            }\r\n\r\n            to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10);\r\n            to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10);\r\n\r\n            return to;\r\n        },\r\n\r\n        _get_obj_pos = function (obj) {\r\n            var pos = obj.offset();\r\n\r\n            pos.top += parseInt(obj.css('paddingTop'), 10) || 0;\r\n            pos.left += parseInt(obj.css('paddingLeft'), 10) || 0;\r\n\r\n            pos.top += parseInt(obj.css('border-top-width'), 10) || 0;\r\n            pos.left += parseInt(obj.css('border-left-width'), 10) || 0;\r\n\r\n            pos.width = obj.width();\r\n            pos.height = obj.height();\r\n\r\n            return pos;\r\n        },\r\n\r\n        _get_zoom_from = function () {\r\n            var orig = selectedOpts.orig ? $(selectedOpts.orig) : false,\r\n                from = {},\r\n                pos,\r\n                view;\r\n\r\n            if (orig && orig.length) {\r\n                pos = _get_obj_pos(orig);\r\n\r\n                from = {\r\n                    width: pos.width + (currentOpts.padding * 2),\r\n                    height: pos.height + (currentOpts.padding * 2),\r\n                    top: pos.top - currentOpts.padding - 20,\r\n                    left: pos.left - currentOpts.padding - 20\r\n                };\r\n\r\n            } else {\r\n                view = _get_viewport();\r\n\r\n                from = {\r\n                    width: currentOpts.padding * 2,\r\n                    height: currentOpts.padding * 2,\r\n                    top: parseInt(view[3] + view[1] * 0.5, 10),\r\n                    left: parseInt(view[2] + view[0] * 0.5, 10)\r\n                };\r\n            }\r\n\r\n            return from;\r\n        },\r\n\r\n        _animate_loading = function () {\r\n            if (!loading.is(':visible')) {\r\n                clearInterval(loadingTimer);\r\n                return;\r\n            }\r\n\r\n            $('div', loading).css('top', (loadingFrame * -40) + 'px');\r\n\r\n            loadingFrame = (loadingFrame + 1) % 12;\r\n        };\r\n\r\n    /*\r\n     * Public methods\r\n     */\r\n\r\n    $.fn.fancybox = function (options) {\r\n        if (!$(this).length) {\r\n            return this;\r\n        }\r\n\r\n        $(this)\r\n            .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {})))\r\n            .unbind('click.fb')\r\n            .bind('click.fb', function (e) {\r\n                e.preventDefault();\r\n\r\n                if (busy) {\r\n                    return;\r\n                }\r\n\r\n                busy = true;\r\n\r\n                $(this).blur();\r\n\r\n                selectedArray = [];\r\n                selectedIndex = 0;\r\n\r\n                var rel = $(this).attr('rel') || '';\r\n\r\n                if (!rel || rel == '' || rel === 'nofollow') {\r\n                    selectedArray.push(this);\r\n\r\n                } else {\r\n                    selectedArray = $(\"a[rel=\" + rel + \"], area[rel=\" + rel + \"]\");\r\n                    selectedIndex = selectedArray.index(this);\r\n                }\r\n\r\n                _start();\r\n\r\n                return;\r\n            });\r\n\r\n        return this;\r\n    };\r\n\r\n    $.fancybox = function (obj) {\r\n        var opts;\r\n\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        busy = true;\r\n        opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {};\r\n\r\n        selectedArray = [];\r\n        selectedIndex = parseInt(opts.index, 10) || 0;\r\n\r\n        if ($.isArray(obj)) {\r\n            for (var i = 0, j = obj.length; i < j; i++) {\r\n                if (typeof obj[i] == 'object') {\r\n                    $(obj[i]).data('fancybox', $.extend({}, opts, obj[i]));\r\n                } else {\r\n                    obj[i] = $({}).data('fancybox', $.extend({content: obj[i]}, opts));\r\n                }\r\n            }\r\n\r\n            selectedArray = jQuery.merge(selectedArray, obj);\r\n\r\n        } else {\r\n            if (typeof obj == 'object') {\r\n                $(obj).data('fancybox', $.extend({}, opts, obj));\r\n            } else {\r\n                obj = $({}).data('fancybox', $.extend({content: obj}, opts));\r\n            }\r\n\r\n            selectedArray.push(obj);\r\n        }\r\n\r\n        if (selectedIndex > selectedArray.length || selectedIndex < 0) {\r\n            selectedIndex = 0;\r\n        }\r\n\r\n        _start();\r\n    };\r\n\r\n    $.fancybox.showActivity = function () {\r\n        clearInterval(loadingTimer);\r\n\r\n        loading.show();\r\n        loadingTimer = setInterval(_animate_loading, 66);\r\n    };\r\n\r\n    $.fancybox.hideActivity = function () {\r\n        loading.hide();\r\n    };\r\n\r\n    $.fancybox.next = function () {\r\n        return $.fancybox.pos(currentIndex + 1);\r\n    };\r\n\r\n    $.fancybox.prev = function () {\r\n        return $.fancybox.pos(currentIndex - 1);\r\n    };\r\n\r\n    $.fancybox.pos = function (pos) {\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        pos = parseInt(pos);\r\n\r\n        selectedArray = currentArray;\r\n\r\n        if (pos > -1 && pos < currentArray.length) {\r\n            selectedIndex = pos;\r\n            _start();\r\n\r\n        } else if (currentOpts.cyclic && currentArray.length > 1) {\r\n            selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1;\r\n            _start();\r\n        }\r\n\r\n        return;\r\n    };\r\n\r\n    $.fancybox.cancel = function () {\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        busy = true;\r\n\r\n        $.event.trigger('fancybox-cancel');\r\n\r\n        _abort();\r\n\r\n        selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts);\r\n\r\n        busy = false;\r\n    };\r\n\r\n    // Note: within an iframe use - parent.$.fancybox.close();\r\n    $.fancybox.close = function () {\r\n        if (busy || wrap.is(':hidden')) {\r\n            return;\r\n        }\r\n\r\n        busy = true;\r\n\r\n        if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) {\r\n            busy = false;\r\n            return;\r\n        }\r\n\r\n        _abort();\r\n\r\n        $(close.add(nav_left).add(nav_right)).hide();\r\n\r\n        $(content.add(overlay)).unbind();\r\n\r\n        $(window).unbind(\"resize.fb scroll.fb\");\r\n        $(document).unbind('keydown.fb');\r\n\r\n        content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank');\r\n\r\n        if (currentOpts.titlePosition !== 'inside') {\r\n            title.empty();\r\n        }\r\n\r\n        wrap.stop();\r\n\r\n        function _cleanup() {\r\n            overlay.fadeOut('fast');\r\n\r\n            title.empty().hide();\r\n            wrap.hide();\r\n\r\n            $.event.trigger('fancybox-cleanup');\r\n\r\n            content.empty();\r\n\r\n            currentOpts.onClosed(currentArray, currentIndex, currentOpts);\r\n\r\n            currentArray = selectedOpts = [];\r\n            currentIndex = selectedIndex = 0;\r\n            currentOpts = selectedOpts = {};\r\n\r\n            busy = false;\r\n        }\r\n\r\n        if (currentOpts.transitionOut == 'elastic') {\r\n            start_pos = _get_zoom_from();\r\n\r\n            var pos = wrap.position();\r\n\r\n            final_pos = {\r\n                top: pos.top,\r\n                left: pos.left,\r\n                width: wrap.width(),\r\n                height: wrap.height()\r\n            };\r\n\r\n            if (currentOpts.opacity) {\r\n                final_pos.opacity = 1;\r\n            }\r\n\r\n            title.empty().hide();\r\n\r\n            fx.prop = 1;\r\n\r\n            $(fx).animate({ prop: 0 }, {\r\n                duration: currentOpts.speedOut,\r\n                easing: currentOpts.easingOut,\r\n                step: _draw,\r\n                complete: _cleanup\r\n            });\r\n\r\n        } else {\r\n            wrap.fadeOut(currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup);\r\n        }\r\n    };\r\n\r\n    $.fancybox.resize = function () {\r\n        if (overlay.is(':visible')) {\r\n            overlay.css('height', $(document).height());\r\n        }\r\n\r\n        $.fancybox.center(true);\r\n    };\r\n\r\n    $.fancybox.center = function () {\r\n        var view, align;\r\n\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        align = arguments[0] === true ? 1 : 0;\r\n        view = _get_viewport();\r\n\r\n        if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) {\r\n            return;\r\n        }\r\n\r\n        wrap\r\n            .stop()\r\n            .animate({\r\n                'top': parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)),\r\n                'left': parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding))\r\n            }, typeof arguments[0] == 'number' ? arguments[0] : 200);\r\n    };\r\n\r\n    $.fancybox.init = function () {\r\n        if ($(\"#fancybox-wrap\").length) {\r\n            return;\r\n        }\r\n\r\n        $('body').append(\r\n            tmp = $('<div id=\"fancybox-tmp\"></div>'),\r\n            loading = $('<div id=\"fancybox-loading\"><div></div></div>'),\r\n            overlay = $('<div id=\"fancybox-overlay\"></div>'),\r\n            wrap = $('<div id=\"fancybox-wrap\"></div>')\r\n        );\r\n\r\n        outer = $('<div id=\"fancybox-outer\"></div>')\r\n            .append('<div class=\"fancybox-bg\" id=\"fancybox-bg-n\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-ne\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-e\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-se\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-s\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-sw\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-w\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-nw\"></div>')\r\n            .appendTo(wrap);\r\n\r\n        outer.append(\r\n            content = $('<div id=\"fancybox-content\"></div>'),\r\n            close = $('<a id=\"fancybox-close\"></a>'),\r\n            title = $('<div id=\"fancybox-title\"></div>'),\r\n\r\n            nav_left = $('<a href=\"javascript:;\" id=\"fancybox-left\"><span class=\"fancy-ico\" id=\"fancybox-left-ico\"></span></a>'),\r\n            nav_right = $('<a href=\"javascript:;\" id=\"fancybox-right\"><span class=\"fancy-ico\" id=\"fancybox-right-ico\"></span></a>')\r\n        );\r\n\r\n        close.click($.fancybox.close);\r\n        loading.click($.fancybox.cancel);\r\n\r\n        nav_left.click(function (e) {\r\n            e.preventDefault();\r\n            $.fancybox.prev();\r\n        });\r\n\r\n        nav_right.click(function (e) {\r\n            e.preventDefault();\r\n            $.fancybox.next();\r\n        });\r\n\r\n        if ($.fn.mousewheel) {\r\n            wrap.bind('mousewheel.fb', function (e, delta) {\r\n                if (busy) {\r\n                    e.preventDefault();\r\n\r\n                } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) {\r\n                    e.preventDefault();\r\n                    $.fancybox[ delta > 0 ? 'prev' : 'next']();\r\n                }\r\n            });\r\n        }\r\n\r\n        if (!$.support.opacity) {\r\n            wrap.addClass('fancybox-ie');\r\n        }\r\n\r\n        if (isIE6) {\r\n            loading.addClass('fancybox-ie6');\r\n            wrap.addClass('fancybox-ie6');\r\n\r\n            $('<iframe id=\"fancybox-hide-sel-frame\" src=\"' + (/^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank' ) + '\" scrolling=\"no\" border=\"0\" frameborder=\"0\" tabindex=\"-1\"></iframe>').prependTo(outer);\r\n        }\r\n    };\r\n\r\n    $.fn.fancybox.defaults = {\r\n        padding: 10,\r\n        margin: 40,\r\n        opacity: false,\r\n        modal: false,\r\n        cyclic: false,\r\n        scrolling: 'auto',\t// 'auto', 'yes' or 'no'\r\n\r\n        width: 560,\r\n        height: 340,\r\n\r\n        autoScale: true,\r\n        autoDimensions: true,\r\n        centerOnScroll: false,\r\n\r\n        ajax: {},\r\n        swf: { wmode: 'transparent' },\r\n\r\n        hideOnOverlayClick: true,\r\n        hideOnContentClick: false,\r\n\r\n        overlayShow: true,\r\n        overlayOpacity: 0.7,\r\n        overlayColor: '#777',\r\n\r\n        titleShow: true,\r\n        titlePosition: 'float', // 'float', 'outside', 'inside' or 'over'\r\n        titleFormat: null,\r\n        titleFromAlt: false,\r\n\r\n        transitionIn: 'fade', // 'elastic', 'fade' or 'none'\r\n        transitionOut: 'fade', // 'elastic', 'fade' or 'none'\r\n\r\n        speedIn: 300,\r\n        speedOut: 300,\r\n\r\n        changeSpeed: 300,\r\n        changeFade: 'fast',\r\n\r\n        easingIn: 'swing',\r\n        easingOut: 'swing',\r\n\r\n        showCloseButton: true,\r\n        showNavArrows: true,\r\n        enableEscapeButton: true,\r\n        enableKeyboardNav: true,\r\n\r\n        onStart: function () {\r\n        },\r\n        onCancel: function () {\r\n        },\r\n        onComplete: function () {\r\n        },\r\n        onCleanup: function () {\r\n        },\r\n        onClosed: function () {\r\n        },\r\n        onError: function () {\r\n        }\r\n    };\r\n\r\n    $(document).ready(function () {\r\n        $.fancybox.init();\r\n    });\r\n\r\n})(jQuery);"], "sources": ["js/_consts.js", "js/fire/util/json.js", "js/fire/ui/overlay.js", "js/fire/util/mobile.js", "js/fire/ui/modal.js", "js/fire/util/eventEmitter.js", "js/fire/ui/view.js", "js/fire/util/history.js", "js/fire/ui/views/ModalView.js", "js/fire/util/array.js", "js/fire/net/safe.js", "js/fire/ui/forms/validators.js", "js/fire/ui/forms/fieldView.js", "js/fire/ui/forms/fields/textFieldView.js", "js/fire/ui/forms/fields/checkboxFieldView.js", "js/fire/ui/forms/fields/radioFieldView.js", "js/fire/ui/forms/fields/hiddenFieldView.js", "js/fire/ui/forms/fields.js", "js/fire/ui/forms/formView.js", "js/smore/ui/login/signupFormView.js", "js/smore/ui/login/loginFormView.js", "js/fire/util/strings.js", "js/fire/net/popup.js", "js/smore/ui/login/facebookConnectView.js", "js/smore/util/report.js", "js/smore/ui/login/modal.js", "js/billing/stripePaymentProvider.js", "js/billing/events.js", "js/lib/underscore.js", "js/lib/backbone.js", "js/billing/provider.js", "js/smore/token.js", "js/billing/ui/paymentForm.js", "js/billing/ui/changePlan.js", "js/fire/ui/popover.js", "js/billing/PlanChange.js", "js/fire/ui/pleaseWait.js", "js/billing/ui/ChangePlanView.js", "js/billing/ui/DowngradeView.js", "js/billing/ui/UpgradeView.js", "js/smore/ui/supportModal.js", "js/billing/ui/CancelView.js", "js/smore/pixel.js", "js/billing/ui/SubscribeView.js", "js/billing/ui/ChangePlanModalView.js", "js/smore/ui/views/overlay.js", "js/fire/ui/raf.js", "js/smore/ui/views/modal.js", "js/billing/ui/BackToSchoolSaleModal.js", "js/billing/ui/pricing.js", "js/billing/ui/educationPricing.js", "js/billing/ui/billingDataModal.js", "js/smore/ui/flash.js", "js/billing/ui/standalonePage.js", "js/lib/fancybox.js"], "version": 3, "names": ["DEVMODE", "STATIC_URI_PREFIX", "define", "require", "encode", "data", "JSON", "stringify", "decode", "parse", "path", "obj", "key", "fallback", "part", "parts", "split", "cur", "length", "shift", "setPath", "value", "show", "zIndex", "extraClass", "closeOnClick", "remove", "Z_INDEX", "dfd", "$", "Deferred", "el", "addClass", "SHIM_CLS", "_current", "css", "position", "z-index", "top", "left", "overflow", "_win", "on", "_body", "prepend", "click", "e", "resolve", "promise", "fade", "off", "animate", "opacity", "FADE_DURATION", "when", "done", "hide", "width", "scrollWidth", "height", "scrollHeight", "_doc", "document", "body", "window", "isLandscape", "isMiniLayout", "isMobile", "isPhone", "isPortrait", "isRetina", "isTablet", "mq", "q", "m", "matchMedia", "msMatchMedia", "matches", "showUrl", "url", "options", "showDeferred", "get", "deferred", "state", "r", "getLoading", "_contentWrap", "html", "fail", "getError", "MODAL_CLASS", "reject", "o", "extend", "DEFAULTS", "loadingTitle", "loadingSubtitle", "content", "_options", "close", "_isPhone", "showPhone", "containerEl", "setup", "skipOverlay", "oc", "OVERLAY_CLASS", "overlayClass", "overlay", "overlayClose", "resolveBeforeAnimation", "containerHeight", "containerWidth", "scrollTop", "scrollLeft", "screenWidth", "innerWidth", "screenHeight", "innerHeight", "setTimeout", "fixPlaceholders", "modalClass", "c", "dom", "cssClass", "wrap", "parent", "append", "delegate", "onCloseClicked", "type", "margin-top", "ANIMATION_DURATION", "removeClass", "fast", "closePhone", "unlock", "detach", "showBodyItems", "_prePhoneScrollTop", "hideBodyItems", "MOBILE_MODAL_CLASS", "_hiddenBodyItems", "children", "pf", "fn", "placeholderPolyfill", "lock", "_locked", "preventDefault", "stopImmediatePropagation", "t", "currentTarget", "hasClass", "mobile", "isTouch", "module", "fire", "modal", "reposition", "Emitter", "this", "__ev", "_guid", "getGuid", "prototype", "name", "callback", "__findCallbackIdx", "guid", "push", "one", "handler", "self", "apply", "arguments", "idx", "splice", "trigger", "i", "len", "ref", "Array", "slice", "call", "child", "ctor", "constructor", "hasProp", "__super__", "hasOwnProperty", "View", "em", "superClass", "defaultOptions", "_modifiers", "generate", "autoRender", "render", "attrs", "attr", "events", "_extractEvents", "beforeRemove", "removed", "find", "selector", "j", "results", "undelegate", "cls", "h", "selEl", "templateSelector", "_", "result", "eventDict", "extractEvent", "k", "v", "_this", "handlerName", "join", "proxy", "addModifier", "modifier", "allowDomUpdate", "u", "hasModifier", "removeModifier", "modifiers", "HISTORY_ID", "HISTORY_KEY", "StateHelper", "getKey", "hub", "onHistoryPopState", "originalEvent", "id", "current", "history", "pushState", "title", "location", "href", "error", "pop", "getHelper", "bind", "me", "ModalView", "view", "url1", "onModalCompleted", "enableHistory", "historyHelper", "init", "preload", "getContent", "PRELOAD_CACHE", "modalOptions", "onClose", "always", "setupModalEvents", "closed", "_loadedContent", "_loadContent", "preloadUrl", "normalize", "items", "isArray", "clone", "objectKeys", "range", "start", "end", "format", "replace", "FORMAT_REGXP", "_proto", "POLYFILLS", "input", "indexOf", "removeBy", "lambda", "where", "insert", "item", "insertBefore", "origItem", "insertAfter", "contains", "minus", "secondArray", "last", "filter", "arr", "first", "setPush", "random", "Math", "round", "unique", "sum", "func", "flatten", "forEach", "toObject", "array", "val", "propertyIsEnumerable", "elt", "from", "Number", "ceil", "floor", "some", "scope", "res", "every", "map", "any", "all", "each", "jQuery", "keys", "post", "uri", "params", "successFunc", "opts", "_token", "token", "success", "p", "ajax", "then", "handleRequest", "handleFailedRequest", "complete", "abort", "setRequestHeader", "getAllResponseHeaders", "getResponseHeader", "jqXhr", "statusText", "GENERIC_ERROR_MESSAGE", "textStatus", "status", "message", "iframeEl", "fromForm", "getIframe", "registerCallback", "_iframe_id", "form", "smore", "_iframeId", "HIDDEN_CSS", "targetFrame", "appendTo", "method", "target", "action", "enctype", "submit", "callbackForm", "baseForm", "callbackParam", "cbName", "base", "visibility", "iframe", "RequiredValidator", "VALIDATORS", "Validator", "fromField", "field1", "field", "validate", "required", "DEFAULT_REQUIRED_MESSAGE", "isEmpty", "isFieldMatch", "fieldView", "validatorClass", "FieldView", "validators", "vw", "setupInputEvents", "setupValidators", "inputEl", "onInputFocus", "onInputBlur", "onChanged", "setValid", "validateField", "setInvalid", "trim", "errorSpan", "text", "enable", "disable", "focus", "fromEl", "selectors", "is", "subclass", "console", "register", "FIELD_VIEW_SELECTOR", "TextFieldView", "fv", "onInput", "onClipboardTextChanged", "removeAttr", "CheckboxFieldView", "RadioFieldView", "radios", "HiddenFieldView", "l", "ErrorCollection", "FormView", "safe", "ERROR_BOX_SELECTOR", "SUBMIT_BUTTON_SELECTOR", "pleaseWaitText", "fieldSelector", "deliveryMethod", "validationErrorMessage", "deliveryDelay", "setupFields", "setupSubmitButton", "errorBox", "results1", "fields", "submitButton", "submitText", "submitButtonText", "onSubmitButtonClicked", "stopPropagation", "validateForm", "deliverForm", "reset", "cleanup", "hideErrors", "values", "onDeliveryCompleted", "onDeliveryFailed", "errors", "processServerErrors", "showErrors", "error_collection", "add", "f", "extraParams", "errorCollecion", "description", "setError", "fieldName", "ref1", "clear", "SignupFormView", "errorMessage", "errorData", "errorCollection", "firstProblem", "problem", "problems", "code", "LoginFormView", "string", "varArgs", "s", "reg", "RegExp", "String", "popup", "handleResult", "NO_DATA_CODE", "_callbackId", "popUrl", "setupUrl", "popRef", "openPopup", "POPUP_CLOSED", "tryAbort", "cb", "closeCb", "frameName", "open", "popupSettings", "interval", "setInterval", "clearInterval", "str", "FacebookConnectView", "POPUP_SIZE", "connectUrl", "textSpan", "onConnectClicked", "generateUrl", "onPopupComplete", "onPopupFailed", "query", "connectParams", "buttonId", "signupSegment", "param", "connectType", "is_new", "MIXPANEL_TIMEOUT", "_uniqueEvents", "getAbTestValues", "track", "props", "analytics", "log", "els", "getAttribute", "ab", "CONTENT_ENDPOINT", "DEFAULT_AFTER_SUCCESS_URL", "LoginModalView", "MODAL_OPTIONS", "autoLogin", "fbv", "isLoggedIn", "lfv", "mv", "report", "sfv", "Date", "EVENTS", "login_modal_open", "click .switch-state", "segment", "signupParams", "signup_button", "_signupSegment", "loginForm", "onSuccess", "signupForm", "signupfbConnect", "fbc", "msg", "onSignupFbFailed", "loginfbConnect", "onLoginFbFailed", "setState", "setupDisableState", "fbConnect", "onSwitchStateClicked", "ga", "reloadOnly", "reload", "redirect_url", "handleFbError", "cookie", "match", "setKey", "Stripe", "setPublishableKey", "provide", "StripePaymentProvider", "stripePublishableKey", "getProviderName", "checkCCData", "ccData", "valid", "reason", "cardType", "number", "validateCardNumber", "validateCVC", "cvc", "validateExpiry", "exp_month", "exp_year", "convertCCDataToSafePaymentData", "successCallback", "failureCallback", "checkResult", "createToken", "response", "paymentData", "stripe_token", "getParameterByName", "regexS", "regex", "exec", "search", "decodeURIComponent", "eventName", "extraProps", "once", "_upgradeReason", "upgrade_reason", "PREFIX", "Events", "opened_pricing_page", "opened_education_pricing_page", "opened_education_bulk_page", "opened_standalone_upgrade_page", "clicked_choose_this_plan", "signup_modal_opened", "signup_modal_closed", "entered_name_in_signup_form", "entered_cc_in_signup_flow", "clicked_completed_purchase", "validation_error_before_complete_purchase", "server_error_in_signing_up", "signup_complete", "focused_on_cc_field", "focused_on_name_field", "focused_on_cvc_field", "opened_downgrade_modal", "opened_upgrade_modal", "completed_upgrade", "completed_downgrade", "opened_cancel_modal", "completed_cancel", "took_cancel_offer", "opened_credits_modal", "opened_credits_modal_plan_upgrade", "upgraded_to_plan_from_credits_modal", "opened_flyer_packs_intro", "opened_flyer_pack_option", "opened_share_for_credits", "completed_share_for_credits", "completed_flyer_pack_purchase", "opened_switch_to_yearly_plan_page", "root", "previousUnderscore", "breaker", "ArrayProto", "ObjProto", "Object", "FuncProto", "Function", "concat", "toString", "nativeForEach", "nativeMap", "nativeReduce", "reduce", "nativeReduceRight", "reduceRight", "nativeFilter", "nativeEvery", "nativeSome", "nativeIndexOf", "nativeLastIndexOf", "lastIndexOf", "nativeIsArray", "nativeKeys", "nativeBind", "_wrapped", "exports", "_underscore", "VERSION", "iterator", "context", "collect", "index", "list", "reduceError", "foldl", "inject", "memo", "initial", "TypeError", "foldr", "detect", "select", "identity", "include", "invoke", "args", "isFunc", "isFunction", "pluck", "findWhere", "max", "Infinity", "computed", "min", "shuffle", "rand", "shuffled", "sample", "n", "guard", "lookupIterator", "sortBy", "criteria", "sort", "right", "a", "b", "group", "behavior", "groupBy", "has", "indexBy", "countBy", "sortedIndex", "low", "high", "mid", "toArray", "size", "head", "take", "rest", "tail", "drop", "compact", "shallow", "output", "isArguments", "without", "difference", "uniq", "isSorted", "seen", "union", "intersection", "other", "zip", "object", "hasIndex", "stop", "step", "bound", "partial", "bindAll", "funcs", "Error", "memoize", "hasher", "delay", "wait", "defer", "throttle", "timeout", "previous", "later", "leading", "now", "remaining", "clearTimeout", "trailing", "debounce", "immediate", "timestamp", "callNow", "ran", "wrapper", "compose", "after", "times", "pairs", "invert", "functions", "methods", "names", "source", "prop", "pick", "copy", "omit", "defaults", "isObject", "tap", "interceptor", "eq", "aStack", "bStack", "className", "global", "multiline", "ignoreCase", "aCtor", "bCtor", "isEqual", "isString", "isElement", "nodeType", "isFinite", "isNaN", "parseFloat", "isNumber", "isBoolean", "isNull", "isUndefined", "noConflict", "accum", "entityMap", "escape", "&", "<", ">", "\"", "'", "unescape", "entityRegexes", "property", "mixin", "idCounter", "uniqueId", "prefix", "templateSettings", "evaluate", "interpolate", "noMatch", "escapes", "\\", "\r", "\n", "\t", "\u2028", "\u2029", "escaper", "template", "settings", "matcher", "offset", "variable", "chain", "_chain", "factory", "amd", "Backbone", "Zepto", "ender", "previousBackbone", "emulateHTTP", "emulateJSON", "eventsApi", "_events", "ctx", "_callback", "retain", "ev", "allEvents", "triggerEvents", "stopListening", "listeningTo", "_listeningTo", "_listenId", "eventSplitter", "test", "a1", "a2", "a3", "listenMethods", "listenTo", "listenToOnce", "implementation", "unbind", "Model", "attributes", "cid", "collection", "set", "changed", "initialize", "validationError", "idAttribute", "toJSON", "sync", "unset", "changes", "silent", "changing", "prev", "_validate", "_changing", "_previousAttributes", "_pending", "hasChanged", "changedAttributes", "diff", "old", "previousAttributes", "fetch", "model", "resp", "wrapError", "save", "xhr", "serverAttrs", "isNew", "patch", "destroy", "urlError", "encodeURIComponent", "isValid", "modelMethods", "unshift", "Collection", "models", "comparator", "_reset", "setOptions", "merge", "addOptions", "singular", "_byId", "_removeReference", "existing", "at", "targetModel", "sortable", "sortAttr", "toAdd", "toRemove", "modelMap", "order", "_prepareModel", "_addReference", "orderedModels", "previousModels", "create", "_onModelEvent", "event", "attributeMethods", "viewOptions", "_ensureElement", "delegateEvents", "delegateEventSplitter", "tagName", "$el", "setElement", "element", "undelegateEvents", "methodMap", "dataType", "contentType", "_method", "beforeSend", "processData", "noXhrPatch", "ActiveXObject", "XMLHttpRequest", "dispatchEvent", "update", "delete", "read", "Router", "routes", "_bindRoutes", "optionalParam", "namedParam", "splatParam", "escapeRegExp", "route", "isRegExp", "_routeToRegExp", "router", "fragment", "_extractParameters", "execute", "navigate", "optional", "History", "handlers", "routeStripper", "rootStripper", "isExplorer", "trailingSlash", "pathStripper", "started", "atRoot", "pathname", "getHash", "getFragment", "forcePushState", "_hasPushState", "_wantsHashChange", "decodeURI", "hashChange", "_wantsPushState", "docMode", "documentMode", "oldIE", "navigator", "userAgent", "toLowerCase", "frame", "contentWindow", "checkUrl", "_checkUrlInterval", "loc", "hash", "replaceState", "loadUrl", "assign", "_updateHash", "protoProps", "staticProps", "Surrogate", "stripe", "provider", "PROVIDER_KEY", "card", "_setupCompleted", "cardNumber", "script", "createElement", "setAttribute", "appendChild", "endPoint", "targetPlan", "completionUrl", "couponCode", "classroomAddonKey", "_el", "_endPoint", "_targetPlan", "_completionUrl", "_couponCode", "_classroomAddonKey", "_name", "_cvc", "_number", "_expMonth", "_expYear", "_agreementCheckboxes", "_classroomConfirm", "_purchaseTextWithAddon", "_purchaseTextNoAddon", "onClassroomConfirmChanged", "onPaymentCardNumberChanged", "maskNonNumericChars", "onPaymentCardNumberBlur", "onNameBlur", "reportFieldFocus", "onSubmitFormClicked", "isChecked", "isClassroomConfirmChecked", "toggleClass", "requested_plan", "fieldVal", "getCCData", "setCard", "updateErrors", "validateInfo", "INPUT_ERROR_CLASS", "err", "validateAgreements", "submitForm", "getAgreementInfo", "checkbox", "isAgreed", "agreementInfo", "agreementValue", "_originalText", "onProviderDataFail", "onProviderDataSuccess", "revertForm", "errMsg", "billingData", "d", "billing_data", "json", "coupon_code", "agreementData", "getAgreementData", "agreement_data", "plan_addon_key", "onPaymentComplete", "agreementFieldName", "mixpanelParams", "requested_plan_addon", "CARDS_CLASSES", "_confirmButton", "onConfirmButtonClicked", "requestedPlan", "_isDowngrade", "CHANGE_PLAN_ENDPOINT", "onPlanChangeConfirmed", "onPlanChangeFailed", "targetEl", "popoverEl", "wrapperCls", "isFixed", "undefined", "_isFixed", "_isAbove", "_isCenterOnArrow", "_target", "_contentEl", "_popoverArrow", "ACTIVE_CLASS", "refresh", "getPos", "targetOffset", "getOffset", "targetWidth", "outerWidth", "popoverWidth", "arrowRightOffset", "parseInt", "arrowCenter", "outerHeight", "st", "sl", "markup", "hideMask", "mask", "before", "_mask", "popover", "ui", "PlanChange", "plan", "upgradeReason", "coupon", "toServer", "waitText", "_currentText", "disabled", "pleaseWait", "ChangePlanView", "planChange", "click button.confirm-button", "skipReportOpen", "reportOpen", "_onConfirmButtonClicked", "onChangePlanCompleted", "onChangePlanFailed", "reportCompleteChange", "errorText", "DowngradeView", "_isCancel", "UpgradeView", "showFeedback", "SUPPORT_MODAL_ENDPOINT", "_showFeedback", "setupModal", "onSectionClicked", "setupNewLanguageFeatures", "setupFeedback", "buildKeywordToFlyerMap", "suggestedFlyersPanelElement", "suggestedFlyersElement", "faqItem", "keywords", "keyword", "keywordToSuggestedFlyerLinksMap", "hrefToSuggestedFlyerElementMap", "allFlyerKeywords", "regexPattern", "regexFlags", "keywordsRegex", "hasContent", "isConfirmed", "confirm", "button", "onFeedbackTextChanged", "sendFeedback", "keyup", "showElementWithAnimation", "hideElementWithAnimation", "newMatchingKeywords", "keywordsNotInUse", "previouslyMatchingKeywords", "keywordNotInUse", "suggestedFlyerLinksToHide", "suggestedFlyerLinkToHide", "suggestedFlyerElementToHide", "suggestedFlyersCount", "newKeywords", "newKeyword", "MAX_NUMBER_OF_SUGGESTED_FLYERS", "suggestedFlyerLinksToShow", "suggestedFlyerLinkToShow", "suggestedFlyerElementToShow", "sending", "sent", "siblings", "FEEDBACK_END_POINT", "section", "supportModal", "APPLY_COUPON_ENDPOINT", "ONE_MONTH_FREE_ENDPOINT", "CancelView", "click .get-support-button", "click .cancel-account-button", "click .progress-to-next-step", "click .apply-coupon", "click .get-one-month-free", "_formView", "_onChangePlanCompleted", "_onGetSupportButtonClicked", "offer", "_onProgressToNextStepClicked", "stepEl", "parents", "nextStepEl", "next", "_onApplyCouponClicked", "applyCouponButton", "_waitForOfferCompletion", "_onOneMonthFreeClicked", "monthFreeButton", "offerKey", "alert", "_onOfferCompleted", "pixel", "eventKey", "extra", "fbq", "paymentForm", "SUBSCRIBE_TO_PRO_ENDPOINT", "COMPLETION_ENDPOINT", "SubscribeView", "ChangePlanModalView", "MODAL_ENDPOINT", "_getEndpointUrl", "contentEl", "_contentView", "_onSubscribeCompleted", "_onCloseEvent", "_closeAndReload", "inherits", "OverlayView", "allowAccessToolbar", "scrollContainer", "_onOverlayClicked", "clickedOnOverlay", "clickCallback", "container", "getContainer", "getMinHeight", "transitionEnd", "queue", "_queue", "_isLegacy", "executeQueue", "LEGACY_TIMEOUT", "_raf", "_runningQueue", "queueOrInline", "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "msRequestAnimationFrame", "raf", "hideClose", "modalType", "contentEndpoint", "useSafePost", "contentParams", "click .fire-modal-close", "click .go-to-step", "click .go-to-next-step", "click .go-to-prev-step", "click .go-back-step", "_stepsStack", "renderContent", "endpoint", "templateContent", "isFixedModal", "startStep", "_startStep", "steps", "_wrapper", "pending", "showLoading", "_onShowLoadingDone", "_onShowLoadingFailed", "_setHtml", "getLoadingContent", "setupHistory", "setupSteps", "setupSubviews", "onShow", "getErrorContent", "onCompleted", "parentNode", "minTop", "onComplete", "_closeModal", "cancelReason", "internalWrapper", "_historyHelper", "subviews", "viewCls", "targetFn", "_stepEls", "goStep", "_getStepEl", "stepKey", "skipStack", "_currentSection", "currentStepEl", "onStepActivated", "goBackStep", "upcomingStep", "_stepIdx", "nextStep", "prevStep", "_onHistoryPopState", "_onCloseClicked", "_onNextStepClicked", "_onPrevStepClicked", "_onGoStepClicked", "_onBackStepClicked", "BackToSchoolSaleModal", "click .delete-button", "_modal", "loginModal", "onLoginSuccess", "upgradeButtonSelectors", "upgradeButtonsSelectorString", "onUpgradeClicked", "showUpgradeIfSpecified", "mouseenter", "onUpgradeHeaderMouseEnter", "mouseleave", "onUpgradeHeaderMouseLeft", "setupFancyBox", "autoOpenSaleModal", "autoOpenUpgradePlan", "localStorage", "mock", "getItem", "setItem", "markSaleModalShown", "SALE_MODAL_KEY", "alreadySeenSaleModal", "shouldAutoOpenSaleModal", "__autoOpenSaleModal", "shouldAutoOpenUpgradePlan", "showSaleModal", "saleModal", "__autoOpenUpgradePlan", "__planForAutoUpgrade", "showUpgradeModal", "_upgradeAfterSignupPlan", "open_upgrade", "forcePage", "upgradeOption", "ur", "vidEl", "fancybox", "orig", "resetCarouselButtons", "hideTestimonials", "carouselElement", "testimonialId", "paymentFrom", "CHANGE_BILLING_DATA_ENDPOINT", "hideFlash", "FLASH_SELECTOR", "FLASH_TIMEOUT", "requestedPlanKey", "subscribeToProEndpoint", "completionEndpoint", "tmp", "loading", "outer", "nav_left", "nav_right", "loadingTimer", "start_pos", "final_pos", "MIN_WIDTH", "selectedIndex", "selectedOpts", "selectedArray", "currentIndex", "currentOpts", "currentArray", "ajaxLoader", "imgPreloader", "Image", "imgRegExp", "swfRegExp", "loadingFrame", "titleHeight", "titleStr", "busy", "fx", "isIE6", "browser", "msie", "version", "_abort", "onerror", "onload", "empty", "_error", "onError", "titleShow", "_process_inline", "_start", "emb", "ret", "onStart", "nodeName", "titleFromAlt", "substr", "autoDimensions", "overlayShow", "hideOnOverlayClick", "hideOnContentClick", "enableEscapeButton", "showCloseButton", "padding", "margin", "replaceWith", "showActivity", "_process_image", "src", "scrolling", "swf", "win", "errorThrown", "_show", "w", "wrapInner", "alt", "pos", "equal", "onCleanup", "titlePosition", "background-color", "overlayColor", "overlayOpacity", "cursor", "style", "_get_zoom_to", "_process_title", "fadeTo", "changeFade", "finish_resizing", "contents", "_finish", "border-width", "duration", "changeSpeed", "easing", "easingChange", "_draw", "transitionIn", "_get_zoom_from", "speedIn", "easingIn", "fadeIn", "_format_title", "titleFormat", "marginLeft", "marginRight", "bottom", "paddingLeft", "paddingRight", "_set_navigation", "enableKeyboardNav", "keyCode", "showNavArrows", "cyclic", "support", "removeAttribute", "resize", "centerOnScroll", "center", "getTime", "_preload_images", "objNext", "dim", "_get_viewport", "ratio", "to", "autoScale", "double_padding", "_get_obj_pos", "_animate_loading", "metadata", "blur", "rel", "hideActivity", "cancel", "onCancel", "_cleanup", "fadeOut", "onClosed", "transitionOut", "speedOut", "easingOut", "align", "mousewheel", "delta", "clientHeight", "prependTo", "wmode", "ready"], "file": "/js/billing.47592dd9.js"}