Jmx0OyFET0NUWVBFIGh0bWwmZ3Q7CiZsdDtodG1sIGxhbmc9JnF1b3Q7dmkmcXVvdDsmZ3Q7CiZsdDtoZWFkJmd0OwombHQ7bWV0YSBjaGFyc2V0PSZxdW90O3V0Zi04JnF1b3Q7Jmd0OwombHQ7bWV0YSBuYW1lPSZxdW90O3ZpZXdwb3J0JnF1b3Q7IGNvbnRlbnQ9JnF1b3Q7d2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSZxdW90OyZndDsKJmx0O3RpdGxlJmd0O1ZJ4buGVCBIJkFncmF2ZTtOSCBUUiZJZ3JhdmU7TkgmbHQ7L3RpdGxlJmd0OwombHQ7c3R5bGUmZ3Q7CiogeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CmJvZHkgeyBtYXJnaW46IDA7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZDogIzA3MTAwZDsgY29sb3I6ICNlZWU7IH0KLnRvcCB7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMwNzFiMTQsICMxNjNkMmIpOyBwYWRkaW5nOiAyMHB4OyBib3JkZXItYm90dG9tOiAycHggc29saWQgI2Q3YWQzNTsgfQoud3JhcCB7IHdpZHRoOiBtaW4oMTQwMHB4LCA5NCUpOyBtYXJnaW46IGF1dG87IH0KLnRvcCBoMSB7IG1hcmdpbjogMDsgY29sb3I6ICNmNGNhNDU7IH0KLnRvcCBwIHsgbWFyZ2luOiA3cHggMCAwOyBjb2xvcjogI2RkZDsgfQoucGFuZWwgeyBiYWNrZ3JvdW5kOiAjMGUxNzE0OyBib3JkZXI6IDFweCBzb2xpZCAjOGU2YTIxOyBib3JkZXItcmFkaXVzOiAxMnB4OyBtYXJnaW46IDE4cHggMDsgcGFkZGluZzogMThweDsgYm94LXNoYWRvdzogMCA4cHggMjRweCAjMDAwODsgfQpoMiB7IGNvbG9yOiAjZjJjNDNkOyBtYXJnaW4tdG9wOiAwOyB9Ci5oaWRkZW4geyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KaW5wdXQsIGJ1dHRvbiwgc2VsZWN0IHsgZm9udDogaW5oZXJpdDsgcGFkZGluZzogMTFweDsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCAjOGU2YTIxOyB9CmlucHV0LCBzZWxlY3QgeyBiYWNrZ3JvdW5kOiAjMDUwOTA4OyBjb2xvcjogI2ZmZjsgfQpidXR0b24geyBiYWNrZ3JvdW5kOiAjZDlhZDMyOyBjb2xvcjogIzE2MTIwYTsgZm9udC13ZWlnaHQ6IDcwMDsgY3Vyc29yOiBwb2ludGVyOyBtYXJnaW46IDNweDsgfQpidXR0b246aG92ZXIgeyBmaWx0ZXI6IGJyaWdodG5lc3MoMS4wOCk7IH0KYnV0dG9uLmRhbmdlciB7IGJhY2tncm91bmQ6ICNiNTJiMmI7IGNvbG9yOiAjZmZmOyB9CmJ1dHRvbi5zZWNvbmRhcnkgeyBiYWNrZ3JvdW5kOiAjMjU0YzNhOyBjb2xvcjogI2ZmZjsgfQoubG9naW5ib3ggeyBtYXgtd2lkdGg6IDUyMHB4OyBtYXJnaW46IDcwcHggYXV0bzsgfQouZmllbGQgeyBtYXJnaW46IDEwcHggMDsgfQouZmllbGQgbGFiZWwgeyBkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNXB4OyBjb2xvcjogI2U4ZDI3ZTsgfQouZmllbGQgaW5wdXQgeyB3aWR0aDogMTAwJTsgfQouYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmbGV4LXdyYXA6IHdyYXA7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLm1zZyB7IG1hcmdpbi10b3A6IDEwcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjZmZkMzRmOyB9Ci5vayB7IGNvbG9yOiAjNWVlMjhhOyB9Ci5lcnIgeyBjb2xvcjogI2ZmNzM3MzsgfQoudGFicyB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA1cHg7IG1hcmdpbi1ib3R0b206IDEycHg7IH0KLnRhYmxlIHsgb3ZlcmZsb3c6IGF1dG87IH0KdGFibGUgeyB3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWluLXdpZHRoOiA4NTBweDsgfQp0aCwgdGQgeyBwYWRkaW5nOiAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzI5MzUyZjsgdGV4dC1hbGlnbjogbGVmdDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgfQp0aCB7IGJhY2tncm91bmQ6ICMxNzI1MWY7IGNvbG9yOiAjZjFjYzU3OyB9Ci5zdGF0dXMtYWN0aXZlIHsgY29sb3I6ICM2M2U2OGY7IGZvbnQtd2VpZ2h0OiA3MDA7IH0KLnN0YXR1cy1vZmYgeyBjb2xvcjogI2ZmNzQ3NDsgZm9udC13ZWlnaHQ6IDcwMDsgfQouc21hbGwgeyBmb250LXNpemU6IDEzcHg7IGNvbG9yOiAjYWFhOyB9Ci5tb2RhbCB7IHBvc2l0aW9uOiBmaXhlZDsgaW5zZXQ6IDA7IGJhY2tncm91bmQ6ICMwMDBiOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgcGFkZGluZzogMjBweDsgfQoubW9kYWxib3ggeyB3aWR0aDogbWluKDUyMHB4LCAxMDAlKTsgYmFja2dyb3VuZDogIzEwMTkxNjsgYm9yZGVyOiAxcHggc29saWQgI2QzYWEzMjsgYm9yZGVyLXJhZGl1czogMTJweDsgcGFkZGluZzogMjBweDsgfQouZGFuZ2VyVGV4dCB7IGNvbG9yOiAjZmY3Nzc3OyB9Ci5ncmlkIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEwcHg7IH0KCi8qID09PSBHSUFPIERJ4buGTiBQQU5FTCBWSeG7hlQgSCZBZ3JhdmU7TkggVFImSWdyYXZlO05IID09PSAqLwouaGVyby1wYW5lbCB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMGExYTEyLCAjMWEzYTI4KTsKICAgIGJvcmRlcjogMnB4IHNvbGlkICNkNGFhMzI7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgcGFkZGluZzogMzBweDsKICAgIG1hcmdpbjogMjBweCAwOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgYm94LXNoYWRvdzogMCAwIDMwcHggcmdiYSgyMTIsIDE3MCwgNTAsIDAuMjUpOwp9Ci5oZXJvLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogNDhweDsKICAgIGNvbG9yOiAjZmZkNzAwOwogICAgdGV4dC1zaGFkb3c6IDNweCAzcHggNnB4ICMwMDA7CiAgICBtYXJnaW46IDAgMCAxMHB4Owp9Ci5oZXJvLXN1YnRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGNvbG9yOiAjZmZmOGRjOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgbWFyZ2luLWJvdHRvbTogMjVweDsKfQoubG9naW4tZ21haWwtYm94IHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2ZmZDcwMCwgI2ZmYjMwMCk7CiAgICBjb2xvcjogIzAwMDsKICAgIGZvbnQtc2l6ZTogMjRweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgcGFkZGluZzogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBib3JkZXI6IDNweCBzb2xpZCAjYjg4NjBiOwogICAgYm94LXNoYWRvdzogMCAwIDE1cHggI2ZmZDcwMDsKICAgIG1hcmdpbjogMjBweCBhdXRvOwogICAgbWF4LXdpZHRoOiA3MDBweDsKfQouZmVhdHVyZS1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDI4MHB4LCAxZnIpKTsKICAgIGdhcDogMTVweDsKICAgIG1hcmdpbi10b3A6IDIwcHg7Cn0KLmZlYXR1cmUtY2FyZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDIwLCAzNSwgMjgsIDAuOCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjOGU2YTIxOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDE4cHg7Cn0KLmZlYXR1cmUtY2FyZCBoMyB7CiAgICBjb2xvcjogI2ZmZDcwMDsKICAgIG1hcmdpbjogMCAwIDEycHg7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzNhNGEzZjsKICAgIHBhZGRpbmctYm90dG9tOiA4cHg7Cn0KLmZlYXR1cmUtaXRlbSB7CiAgICBjb2xvcjogI2RkZDsKICAgIHBhZGRpbmc6IDVweCAwIDVweCAyMnB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZm9udC1zaXplOiAxNHB4Owp9Ci5mZWF0dXJlLWl0ZW06OmJlZm9yZSB7CiAgICBjb250ZW50OiAmcXVvdDvinJMmcXVvdDs7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgY29sb3I6ICMzMmNkMzI7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQouYnRuLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdhcDogMTBweDsKICAgIG1hcmdpbi10b3A6IDEwcHg7Cn0KLmJpZy1idG4gewogICAgcGFkZGluZzogMTVweCAxMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2ZmZDcwMCwgI2ZmYjMwMCk7CiAgICBjb2xvcjogIzAwMDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAycHggc29saWQgI2I4ODYwYjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IDAuMnM7Cn0KLmJpZy1idG46aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjEpOwp9Ci5jdWx0dXJlLWJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1LCA0MCwgMzIsIDAuNyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjOGU2YTIxOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDE1cHg7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9Ci5jdWx0dXJlLWl0ZW0gewogICAgY29sb3I6ICNmZmQ3MDA7CiAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQouZm9vdGVyLWluZm8gewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luLXRvcDogMjVweDsKICAgIHBhZGRpbmc6IDE1cHg7CiAgICBjb2xvcjogI2ZmZDcwMDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMmEzYTMwOwp9Ci5lbWFpbC1obCB7CiAgICBjb2xvcjogI2ZmOGMwMDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpAbWVkaWEgKG1heC13aWR0aDogNzAwcHgpIHsKICAgIC5ncmlkIHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IH0KICAgIC5sb2dpbmJveCB7IG1hcmdpbjogMjVweCBhdXRvOyB9CiAgICAuaGVyby10aXRsZSB7IGZvbnQtc2l6ZTogMzJweDsgfQogICAgLmJ0bi1ncmlkIHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IH0KfQombHQ7L3N0eWxlJmd0OwombHQ7L2hlYWQmZ3Q7CiZsdDtib2R5Jmd0OwombHQ7aGVhZGVyIGNsYXNzPSZxdW90O3RvcCZxdW90OyZndDsKICAmbHQ7ZGl2IGNsYXNzPSZxdW90O3dyYXAmcXVvdDsmZ3Q7CiAgICAmbHQ7aDEmZ3Q7Vknhu4ZUIEgmQWdyYXZlO05IIFRSJklncmF2ZTtOSCZsdDsvaDEmZ3Q7CiAgICAmbHQ7cCZndDtM4buiSSAmSWFjdXRlO0NIIENITyBUJk9jaXJjO0kgLSBHSSZBZ3JhdmU7VSBDJk9hY3V0ZTsgTCZBZ3JhdmU7IEPhu6ZBIELhuqBOJmx0Oy9wJmd0OwogICZsdDsvZGl2Jmd0OwombHQ7L2hlYWRlciZndDsKJmx0O21haW4gY2xhc3M9JnF1b3Q7d3JhcCZxdW90OyZndDsKCiAgJmx0OyEtLSA9PT0gR0lBTyBESeG7hk4gQ0gmSWFjdXRlO05IIFZJ4buGVCBIJkFncmF2ZTtOSCBUUiZJZ3JhdmU7TkggPT09IC0tJmd0OwogICZsdDtzZWN0aW9uIGNsYXNzPSZxdW90O2hlcm8tcGFuZWwmcXVvdDsKICAgICZsdDtoMiBjbGFzcz0mcXVvdDtoZXJvLXRpdGxlJnF1b3Q7Jmd0O1ZJ4buGVCBIJkFncmF2ZTtOSCBUUiZJZ3JhdmU7TkgmbHQ7L2gyJmd0OwogICAgJmx0O3AgY2xhc3M9JnF1b3Q7aGVyby1zdWJ0aXRsZSZxdW90OyZndDtL4bq/dCBu4buRaSBt4buNaSBtaeG7gW4gJm1kYXNoOyBUcuG7jW4gduG6uW4gZ2kmYWFjdXRlOyB0cuG7iyBWaeG7h3QmbHQ7L3AmZ3Q7CiAgICAKICZsdDtidXR0b24gY2xhc3M9JnF1b3Q7YmlnLWJ0biZxdW90OyBvbmNsaWNrPSZxdW90O2xvY2F0aW9uLmhyZWY9J2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi92Mi9hdXRoP2NsaWVudF9pZD1ZT1VSX0NMSUVOVF9JRCZhbXA7cmVkaXJlY3RfdXJpPVlPVVJfUkVESVJFQ1RfVVJJJmFtcDtyZXNwb25zZV90eXBlPWNvZGUmYW1wO3Njb3BlPXByb2ZpbGUgZW1haWwnJnF1b3Q7Jmd0O8SQxIJORyBLJllhY3V0ZTsvxJDEgk5HIE5I4bqsUCBHTUFJTCZsdDsvYnV0dG9uJmd0OwombHQ7ZGl2IGNsYXNzPSZxdW90O2ZlYXR1cmUtZ3JpZCZxdW90OyZndDsKICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmZWF0dXJlLWNhcmQmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O2gzJmd0O+KchSBVWSBUJklhY3V0ZTtOICZtZGFzaDsgQU4gVE8mQWdyYXZlO04gJm1kYXNoOyBUSeG7gE4gTOG7okkmbHQ7L2gzJmd0OwogICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7ZmVhdHVyZS1pdGVtJnF1b3Q7Jmd0O1QmYWdyYXZlO2kgeOG6vyBraW5oIG5naGnhu4dtIC0gUGjhu6VjIHbhu6UgdOG6rW4gdCZhY2lyYzttJmx0Oy9kaXYmZ3Q7CiAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmZWF0dXJlLWl0ZW0mcXVvdDsmZ3Q7R2kmYWFjdXRlOyBj4bqjIG1pbmggYuG6oWNoIC0gS2gmb2NpcmM7bmcgcGgmYWFjdXRlO3Qgc2luaCZsdDsvZGl2Jmd0OwogICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7ZmVhdHVyZS1pdGVtJnF1b3Q7Jmd0O0jhu5cgdHLhu6MgMjQvNyAtIE3hu41pIGwmdWFjdXRlO2MgbeG7jWkgbsahaSZsdDsvZGl2Jmd0OwogICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7ZmVhdHVyZS1pdGVtJnF1b3Q7Jmd0O0LhuqNvIG3huq10IHRoJm9jaXJjO25nIHRpbiAtIFR1eeG7h3QgxJHhu5FpIHRpbiBj4bqteSZsdDsvZGl2Jmd0OwogICAgICAmbHQ7L2RpdiZndDsKCiAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7ZmVhdHVyZS1jYXJkJnF1b3Q7Jmd0OwogICAgICAgICZsdDtoMyZndDvwn5qXIEgmQWdyYXZlO05IIFRSJklncmF2ZTtOSCBBTiBUTyZBZ3JhdmU7TiAmbWRhc2g7IFbhuqBOIMSQ4bq2TSBCJklncmF2ZTtOSCBBTiZsdDsvaDMmZ3Q7CiAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmZWF0dXJlLWl0ZW0mcXVvdDsmZ3Q7VCZhZ3JhdmU7aSB44bq/IGNodXkmZWNpcmM7biBuZ2hp4buHcCZsdDsvZGl2Jmd0OwogICAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7ZmVhdHVyZS1pdGVtJnF1b3Q7Jmd0O1hlIGNo4bqldCBsxrDhu6NuZyBjYW8mbHQ7L2RpdiZndDsKICAgICAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2ZlYXR1cmUtaXRlbSZxdW90OyZndDtHaSZhYWN1dGU7IG1pbmggYuG6oWNoJmx0Oy9kaXYmZ3Q7CiAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmZWF0dXJlLWl0ZW0mcXVvdDsmZ3Q7SOG7lyB0cuG7oyAyNC83Jmx0Oy9kaXYmZ3Q7CiAgICAgICZsdDsvZGl2Jmd0OwoKICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmZWF0dXJlLWNhcmQmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtidG4tZ3JpZCZxdW90OyZndDsKICAgICAgICAgICZsdDtidXR0b24gY2xhc3M9JnF1b3Q7YmlnLWJ0biZxdW90OyZndDvEkOG6tlQgWEUgR0gmRWFjdXRlO1AgQ0hVWeG6vk4mbHQ7L2J1dHRvbiZndDsKICAgICAgICAgICZsdDtidXR0b24gY2xhc3M9JnF1b3Q7YmlnLWJ0biZxdW90OyZndDtNVUEgU+G6rk0gU+G6ok4gUEjhuqhNJmx0Oy9idXR0b24mZ3Q7CiAgICAgICAgICAmbHQ7YnV0dG9uIGNsYXNzPSZxdW90O2JpZy1idG4mcXVvdDsmZ3Q7QuG6ok5HIEdJJkFhY3V0ZTsgWEUgR0gmRWFjdXRlO1AmbHQ7L2J1dHRvbiZndDsKICAgICAgICAgICZsdDtidXR0b24gY2xhc3M9JnF1b3Q7YmlnLWJ0biZxdW90OyZndDvEkOG6tlQgUEgmT2dyYXZlO05HJmx0Oy9idXR0b24mZ3Q7CiAgICAgICAgJmx0Oy9kaXYmZ3Q7CiAgICAgICZsdDsvZGl2Jmd0OwogICAgJmx0Oy9kaXYmZ3Q7CgogICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtjdWx0dXJlLWJhciZxdW90OyBzdHlsZT0mcXVvdDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IHBhZGRpbmc6IDE1cHggMjBweDsgbWFyZ2luLXRvcDoxNXB4OyZxdW90OyZndDsKICAgICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtjdWx0dXJlLWl0ZW0mcXVvdDsmZ3Q78J+alyDEkOG6tlQgWEUgTkhBTkggQ0gmT2FjdXRlO05HJmx0O2JyJmd0OyZsdDtzbWFsbCZndDtDaOG7iSB2JmFncmF2ZTtpIHRoYW8gdCZhYWN1dGU7YyZsdDsvc21hbGwmZ3Q7Jmx0Oy9kaXYmZ3Q7CiAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7Y3VsdHVyZS1pdGVtJnF1b3Q7Jmd0O/CfkrAgR0kmQWFjdXRlOyBU4buQVCBN4buWSSBORyZBZ3JhdmU7WSZsdDticiZndDsmbHQ7c21hbGwmZ3Q7VGnhur90IGtp4buHbSBjaGkgcGgmaWFjdXRlOyZsdDsvc21hbGwmZ3Q7Jmx0Oy9kaXYmZ3Q7CiAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7Y3VsdHVyZS1pdGVtJnF1b3Q7Jmd0O/Cfk4sgVCZBZ3JhdmU7SSBY4bq+IENIVVkmRWNpcmM7TiBOR0hJ4buGUCZsdDticiZndDsmbHQ7c21hbGwmZ3Q7S2luaCBuZ2hp4buHbSAmYW1wOyB0aCZhY2lyYztuIHRoaeG7h24mbHQ7L3NtYWxsJmd0OyZsdDsvZGl2Jmd0OwogICAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2N1bHR1cmUtaXRlbSZxdW90OyZndDvwn5uO77iPIEjhu5YgVFLhu6IgMjQvNyZsdDticiZndDsmbHQ7c21hbGwmZ3Q7THUmb2NpcmM7biBz4bq1biBzJmFncmF2ZTtuZyZsdDsvc21hbGwmZ3Q7Jmx0Oy9kaXYmZ3Q7CiAgICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7Y3VsdHVyZS1pdGVtJnF1b3Q7Jmd0O/CfkrsgQyZPY2lyYztORyBOR0jhu4YgSEnhu4ZOIMSQ4bqgSSZsdDticiZndDsmbHQ7c21hbGwmZ3Q7S+G6v3QgbuG7kWkgdGgmb2NpcmM7bmcgbWluaCZsdDsvc21hbGwmZ3Q7Jmx0Oy9kaXYmZ3Q7CiAgICAmbHQ7L2RpdiZndDsKCiAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2Zvb3Rlci1pbmZvJnF1b3Q7Jmd0OwogICAgICAmbHQ7cCZndDtH4butaSBnJm9hY3V0ZTtwICZ5YWN1dGU7IHYmYWdyYXZlOyBjaGlhIHPhursgduG7gTogJmx0O3NwYW4gY2xhc3M9JnF1b3Q7ZW1haWwtaGwmcXVvdDsmZ3Q7dmlldGhhbmh0cmluaDNtaWVuQGdtYWlsLmNvbSZsdDsvc3BhbiZndDsgJmFtcDtuYnNwO3wmYW1wO25ic3A7ICZsdDtidXR0b24gY2xhc3M9JnF1b3Q7YmlnLWJ0biZxdW90OyZndDtI4buiUCDEkOG7kk5HIMSQ4buQSSBUJkFhY3V0ZTtDJmx0Oy9idXR0b24mZ3Q7Jmx0O2J1dHRvbiBjbGFzcz0mcXVvdDtiaWctYnRuJnF1b3Q7Jmd0O8SQxIJORyBLJllhY3V0ZTsgVCZBZ3JhdmU7SSBY4bq+Jmx0Oy9idXR0b24mZ3Q7Jmx0O2J1dHRvbiBjbGFzcz0mcXVvdDtiaWctYnRuJnF1b3Q7Jmd0O8SQ4buQSSBUJkFhY3V0ZTtDIFRIxq/GoE5HIE3huqBJJmx0Oy9idXR0b24mZ3Q7Jmx0Oy9wJmd0OwogICAgICAmbHQ7cCBzdHlsZT0mcXVvdDttYXJnaW4tdG9wOjEwcHg7IGZvbnQtc2l6ZToxM3B4OyBjb2xvcjojZGFhNTIwOyZxdW90OyZndDsmY29weTsgMjAyNiBWSeG7hlQgSCZBZ3JhdmU7TkggVFImSWdyYXZlO05IICZtZGFzaDsgS+G6vlQgTuG7kEkgTeG7jEkgTUnhu4BOICZtZGFzaDsgVFLhu4xOIFZFTiBHSSZBYWN1dGU7IFRS4buKIFZJ4buGVCAmbWRhc2g7IEzhu6JJICZJYWN1dGU7Q0ggQ0hPIFQmT2NpcmM7SSBMJkFncmF2ZTtNIEdJJkFncmF2ZTtVIENITyBC4bqgTiB8IFBoaSZlY2lyYztuIGLhuqNuIFYzLjAmbHQ7L3AmZ3Q7CiAgICAmbHQ7L2RpdiZndDsKICAmbHQ7L3NlY3Rpb24mZ3Q7CgogICZsdDshLS0gPT09IEtI4buQSSDEkMSCTkcgTkjhuqxQIFFV4bqiTiBUUuG7iiA9PT0gLS0mZ3Q7CiAgJmx0O3NlY3Rpb24gaWQ9JnF1b3Q7bG9naW4mcXVvdDsgY2xhc3M9JnF1b3Q7cGFuZWwgbG9naW5ib3gmcXVvdDsmZ3Q7CiAgICAmbHQ7aDImZ3Q78J+UkCDEkMSCTkcgTkjhuqxQIFFV4bqiTiBUUuG7iiBI4buGIFRI4buQTkcmbHQ7L2gyJmd0OwogICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmaWVsZCZxdW90OyZndDsKICAgICAgJmx0O2xhYmVsIGZvcj0mcXVvdDthZG1pbkVtYWlsJnF1b3Q7Jmd0O0VtYWlsIEFkbWluJmx0Oy9sYWJlbCZndDsKICAgICAgJmx0O2lucHV0IGlkPSZxdW90O2FkbWluRW1haWwmcXVvdDsgdHlwZT0mcXVvdDtlbWFpbCZxdW90OyBhdXRvY29tcGxldGU9JnF1b3Q7dXNlcm5hbWUmcXVvdDsKICAgICAgICAgICAgIHZhbHVlPSZxdW90O3ZpZXRoYW5odHJpbmgzbWllbkBnbWFpbC5jb20mcXVvdDsmZ3Q7CiAgICAmbHQ7L2RpdiZndDsKICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7ZmllbGQmcXVvdDsmZ3Q7CiAgICAgICZsdDtsYWJlbCBmb3I9JnF1b3Q7YWRtaW5QYXNzd29yZCZxdW90OyZndDtN4bqtdCBraOG6qXUgQWRtaW4mbHQ7L2xhYmVsJmd0OwogICAgICAmbHQ7aW5wdXQgaWQ9JnF1b3Q7YWRtaW5QYXNzd29yZCZxdW90OyB0eXBlPSZxdW90O3Bhc3N3b3JkJnF1b3Q7IGF1dG9jb21wbGV0ZT0mcXVvdDtjdXJyZW50LXBhc3N3b3JkJnF1b3Q7Jmd0OwogICAgJmx0Oy9kaXYmZ3Q7CiAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2FjdGlvbnMmcXVvdDsmZ3Q7CiAgICAgICZsdDtidXR0b24gdHlwZT0mcXVvdDtidXR0b24mcXVvdDsgb25jbGljaz0mcXVvdDtsb2dpbigpJnF1b3Q7Jmd0O8SQxIJORyBOSOG6rFAgUVXhuqJOIFRS4buKJmx0Oy9idXR0b24mZ3Q7CiAgICAgICZsdDtidXR0b24gdHlwZT0mcXVvdDtidXR0b24mcXVvdDsgY2xhc3M9JnF1b3Q7c2Vjb25kYXJ5JnF1b3Q7IG9uY2xpY2s9JnF1b3Q7c2hvd0ZvcmdvdCgpJnF1b3Q7Jmd0O1FVJkVjaXJjO04gTeG6rFQgS0jhuqhVJmx0Oy9idXR0b24mZ3Q7CiAgICAmbHQ7L2RpdiZndDsKICAgICZsdDtkaXYgaWQ9JnF1b3Q7bG9naW5Nc2cmcXVvdDsgY2xhc3M9JnF1b3Q7bXNnJnF1b3Q7Jmd0OyZsdDsvZGl2Jmd0OwogICZsdDsvc2VjdGlvbiZndDsKCiAgJmx0OyEtLSA9PT0gS0jhu5BJIFFV4bqiTiBMJllhY3V0ZTsgU0FVIMSQxIJORyBOSOG6rFAgPT09IC0tJmd0OwogICZsdDtzZWN0aW9uIGlkPSZxdW90O2FwcCZxdW90OyBjbGFzcz0mcXVvdDtoaWRkZW4mcXVvdDsmZ3Q7CiAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O3BhbmVsJnF1b3Q7Jmd0OwogICAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2FjdGlvbnMmcXVvdDsmZ3Q7CiAgICAgICAgJmx0O3N0cm9uZyBpZD0mcXVvdDthZG1pbkluZm8mcXVvdDsmZ3Q7Jmx0Oy9zdHJvbmcmZ3Q7CiAgICAgICAgJmx0O2J1dHRvbiB0eXBlPSZxdW90O2J1dHRvbiZxdW90OyBvbmNsaWNrPSZxdW90O2xvYWRVc2VycygpJnF1b3Q7Jmd0O/CfkaUgVCZBZ3JhdmU7SSBLSE/huqJOJmx0Oy9idXR0b24mZ3Q7CiAgICAgICAgJmx0O2J1dHRvbiB0eXBlPSZxdW90O2J1dHRvbiZxdW90OyBvbmNsaWNrPSZxdW90O2xvYWRWZWhpY2xlUGFydG5lcnMoKSZxdW90OyZndDvwn5qXIMSQ4buQSSBUJkFhY3V0ZTtDIFhFJmx0Oy9idXR0b24mZ3Q7CiAgICAgICAgJmx0O2J1dHRvbiB0eXBlPSZxdW90O2J1dHRvbiZxdW90OyBvbmNsaWNrPSZxdW90O2xvYWRDb21tZXJjaWFsUGFydG5lcnMoKSZxdW90OyZndDvwn4+qIMSQ4buQSSBUJkFhY3V0ZTtDIFRIxq/GoE5HIE3huqBJJmx0Oy9idXR0b24mZ3Q7CiAgICAgICAgJmx0O2J1dHRvbiB0eXBlPSZxdW90O2J1dHRvbiZxdW90OyBjbGFzcz0mcXVvdDtkYW5nZXImcXVvdDsgb25jbGljaz0mcXVvdDtsb2dvdXQoKSZxdW90OyZndDvEkMSCTkcgWFXhuqRUJmx0Oy9idXR0b24mZ3Q7CiAgICAgICZsdDsvZGl2Jmd0OwogICAgJmx0Oy9kaXYmZ3Q7CiAgICAmbHQ7ZGl2IGlkPSZxdW90O2NvbnRlbnQmcXVvdDsgY2xhc3M9JnF1b3Q7cGFuZWwmcXVvdDsmZ3Q7CiAgICAgICZsdDtoMiZndDvwn5GlIFFV4bqiTiBMJllhY3V0ZTsgVCZBZ3JhdmU7SSBLSE/huqJOJmx0Oy9oMiZndDsKICAgICZsdDsvZGl2Jmd0OwogICZsdDsvc2VjdGlvbiZndDsKCiZsdDsvbWFpbiZndDsKCiZsdDshLS0gPT09IEtI4buQSSBRVSZFY2lyYztOIE3huqxUIEtI4bqoVSA9PT0gLS0mZ3Q7CiZsdDtkaXYgaWQ9JnF1b3Q7Zm9yZ290TW9kYWwmcXVvdDsgY2xhc3M9JnF1b3Q7bW9kYWwgaGlkZGVuJnF1b3Q7Jmd0OwogICZsdDtkaXYgY2xhc3M9JnF1b3Q7bW9kYWxib3gmcXVvdDsmZ3Q7CiAgICAmbHQ7aDImZ3Q7UVUmRWNpcmM7TiBN4bqsVCBLSOG6qFUgQURNSU4mbHQ7L2gyJmd0OwogICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmaWVsZCZxdW90OyZndDsKICAgICAgJmx0O2xhYmVsIGZvcj0mcXVvdDtmb3Jnb3RFbWFpbCZxdW90OyZndDtFbWFpbCBBZG1pbiZsdDsvbGFiZWwmZ3Q7CiAgICAgICZsdDtpbnB1dCBpZD0mcXVvdDtmb3Jnb3RFbWFpbCZxdW90OyB0eXBlPSZxdW90O2VtYWlsJnF1b3Q7Jmd0OwogICAgJmx0Oy9kaXYmZ3Q7CiAgICAmbHQ7ZGl2IGNsYXNzPSZxdW90O2ZpZWxkJnF1b3Q7Jmd0OwogICAgICAmbHQ7bGFiZWwgZm9yPSZxdW90O3JlY292ZXJ5Q29kZSZxdW90OyZndDtNJmF0aWxkZTsga2gmb2NpcmM7aSBwaOG7pWMmbHQ7L2xhYmVsJmd0OwogICAgICAmbHQ7aW5wdXQgaWQ9JnF1b3Q7cmVjb3ZlcnlDb2RlJnF1b3Q7IHR5cGU9JnF1b3Q7dGV4dCZxdW90OyZndDsKICAgICZsdDsvZGl2Jmd0OwogICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtmaWVsZCZxdW90OyZndDsKICAgICAgJmx0O2xhYmVsIGZvcj0mcXVvdDtuZXdBZG1pblBhc3N3b3JkJnF1b3Q7Jmd0O03huq10IGto4bqpdSBt4bubaSZsdDsvbGFiZWwmZ3Q7CiAgICAgICZsdDtpbnB1dCBpZD0mcXVvdDtuZXdBZG1pblBhc3N3b3JkJnF1b3Q7IHR5cGU9JnF1b3Q7cGFzc3dvcmQmcXVvdDsmZ3Q7CiAgICAmbHQ7L2RpdiZndDsKICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7YWN0aW9ucyZxdW90OyZndDsKICAgICAgJmx0O2J1dHRvbiB0eXBlPSZxdW90O2J1dHRvbiZxdW90OyBvbmNsaWNrPSZxdW90O2ZvcmdvdFBhc3N3b3JkKCkmcXVvdDsmZ3Q7xJDhurZUIEzhuqBJIE3huqxUIEtI4bqoVSZsdDsvYnV0dG9uJmd0OwogICAgICAmbHQ7YnV0dG9uIHR5cGU9JnF1b3Q7YnV0dG9uJnF1b3Q7IGNsYXNzPSZxdW90O3NlY29uZGFyeSZxdW90OyBvbmNsaWNrPSZxdW90O2hpZGVGb3Jnb3QoKSZxdW90OyZndDvEkCZPYWN1dGU7TkcmbHQ7L2J1dHRvbiZndDsKICAgICZsdDsvZGl2Jmd0OwogICAgJmx0O2RpdiBpZD0mcXVvdDtmb3Jnb3RNc2cmcXVvdDsgY2xhc3M9JnF1b3Q7bXNnJnF1b3Q7Jmd0OyZsdDsvZGl2Jmd0OwogICZsdDsvZGl2Jmd0OwombHQ7L2RpdiZndDsKCiZsdDtzY3JpcHQgdHlwZT0mcXVvdDttb2R1bGUmcXVvdDsmZ3Q7CmltcG9ydCB7IGluaXRpYWxpemVBcHAgfSBmcm9tICZxdW90O2h0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYy5jb20vZmlyZWJhc2Vqcy8xMi4xNy4xL2ZpcmViYXNlLWFwcC5qcyZxdW90OzsKaW1wb3J0IHsKICBnZXRBdXRoLAogIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkLAogIHNlbmRQYXNzd29yZFJlc2V0RW1haWwsCiAgc2lnbk91dCwKICBvbkF1dGhTdGF0ZUNoYW5nZWQKfSBmcm9tICZxdW90O2h0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYy5jb20vZmlyZWJhc2Vqcy8xMi4xNy4xL2ZpcmViYXNlLWF1dGguanMmcXVvdDs7Cgpjb25zdCBmaXJlYmFzZUNvbmZpZyA9IHsKICBhcGlLZXk6ICZxdW90O0FJemFTeUJDeW9GcHN2enh2UnJQSWJMTWNoTkhGb0RKT3FoM1NnJnF1b3Q7LAogIGF1dGhEb21haW46ICZxdW90O3ZpZXQtaGFuaC10cmluaC5maXJlYmFzZWFwcC5jb20mcXVvdDssCiAgcHJvamVjdElkOiAmcXVvdDt2aWV0LWhhbmgtdHJpbmgmcXVvdDssCiAgc3RvcmFnZUJ1Y2tldDogJnF1b3Q7dmlldC1oYW5oLXRyaW5oLmZpcmViYXNlc3RvcmFnZS5hcHAmcXVvdDssCiAgbWVzc2FnaW5nU2VuZGVySWQ6ICZxdW90OzUwODc4MTgyMTExNyZxdW90OywKICBhcHBJZDogJnF1b3Q7MTo1MDg3ODE4MjExMTc6d2ViOmJjN2QwM2FkZDhjM2U0OWZmMWNiZDQmcXVvdDssCiAgbWVhc3VyZW1lbnRJZDogJnF1b3Q7Ry1WSlRTMFNYNExTJnF1b3Q7Cn07Cgpjb25zdCBhcHBGaXJlYmFzZSA9IGluaXRpYWxpemVBcHAoZmlyZWJhc2VDb25maWcpOwpjb25zdCBhdXRoID0gZ2V0QXV0aChhcHBGaXJlYmFzZSk7CmNvbnN0IEFETUlOX0VNQUlMID0gJnF1b3Q7dmlldGhhbmh0cmluaEBnbWFpbC5jb20mcXVvdDs7CmNvbnN0ICQgPSBpZCA9Jmd0OyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CmNvbnN0IGVzYyA9IHMgPSZndDsgU3RyaW5nKHMgPz8gJycpLnJlcGxhY2UoL1smYW1wOyZsdDsmZ3Q7JnF1b3Q7J10vZywgYyA9Jmd0OyAoeycmYW1wOyc6JyZhbXA7YW1wOycsJyZsdDsnOicmYW1wO2x0OycsJyZndDsnOicmYW1wO2d0OycsJyZxdW90Oyc6JyZhbXA7cXVvdDsnLCZxdW90OycmcXVvdDs6JyZhbXA7IzM5Oyd9W2NdKSk7CgpmdW5jdGlvbiBzZXRNc2coaWQsIHRleHQsIG9rPWZhbHNlKXsKICBjb25zdCBlbD0kKGlkKTsgaWYoIWVsKSByZXR1cm47CiAgZWwudGV4dENvbnRlbnQ9dGV4dDsgZWwuY2xhc3NOYW1lPSdtc2cgJysob2s/J29rJzonZXJyJyk7Cn0KCmZ1bmN0aW9uIHNob3dBcHAodXNlcil7CiAgJCgnbG9naW4nKS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTsKICAkKCdhcHAnKS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKICAkKCdhZG1pbkluZm8nKS50ZXh0Q29udGVudD1gxJBhbmcgxJHEg25nIG5o4bqtcDogJHt1c2VyLmVtYWlsfSAmbWRhc2g7IEZpcmViYXNlIEF1dGhlbnRpY2F0aW9uYDsKICByZW5kZXJBZG1pbkhvbWUoKTsKfQoKZnVuY3Rpb24gcmVuZGVyQWRtaW5Ib21lKCl7CiAgJCgnY29udGVudCcpLmlubmVySFRNTD1gCiAgICAmbHQ7aDImZ3Q78J+RpSBRVeG6ok4gVFLhu4ogSOG7hiBUSOG7kE5HIFZJ4buGVCBIJkFncmF2ZTtOSCBUUiZJZ3JhdmU7TkgmbHQ7L2gyJmd0OwogICAgJmx0O3AgY2xhc3M9JnF1b3Q7c21hbGwmcXVvdDsmZ3Q74pyFIMSQxINuZyBuaOG6rXAgQWRtaW4gxJEmYXRpbGRlOyDEkcaw4bujYyB4JmFhY3V0ZTtjIHRo4buxYyBi4bqxbmcgRmlyZWJhc2UgQXV0aGVudGljYXRpb24uJmx0Oy9wJmd0OwogICAgJmx0O2RpdiBjbGFzcz0mcXVvdDtwYW5lbCZxdW90OyBzdHlsZT0mcXVvdDttYXJnaW46MTJweCAwIDA7cGFkZGluZzoxNHB4O2JhY2tncm91bmQ6cmdiYSgyMCwzNSwyOCwwLjUpOyZxdW90OyZndDsKICAgICAgJmx0O2ImZ3Q78J+alyDEkOG7kEkgVCZBYWN1dGU7QyBYRSAvIENI4bumIFhFJmx0Oy9iJmd0OyZsdDticiZndDsKICAgICAgUXXhuqNuIGwmeWFjdXRlOyBo4buTIHPGoSB0JmFncmF2ZTtpIHjhur8sIHRy4bqhbmcgdGgmYWFjdXRlO2kgaG/huqF0IMSR4buZbmcgdiZhZ3JhdmU7IEFVVE8gTUFUQ0guCiAgICAmbHQ7L2RpdiZndDsKICAgICZsdDtkaXYgY2xhc3M9JnF1b3Q7cGFuZWwmcXVvdDsgc3R5bGU9JnF1b3Q7bWFyZ2luOjEycHggMCAwO3BhZGRpbmc6MTRweDtiYWNrZ3JvdW5kOnJnYmEoMjAsMzUsMjgsMC41KTsmcXVvdDsmZ3Q7CiAgICAgICZsdDtiJmd0O/Cfj6ogxJDhu5BJIFQmQWFjdXRlO0MgVEjGr8agTkcgTeG6oEkmbHQ7L2ImZ3Q7Jmx0O2JyJmd0OwogICAgICBRdeG6o24gbCZ5YWN1dGU7IGjhu5Mgc8ahIMSR4buRaSB0JmFhY3V0ZTtjIHRoxrDGoW5nIG3huqFpIHYmYWdyYXZlOyB0cuG6oW5nIHRoJmFhY3V0ZTtpIHBoJmVjaXJjOyBkdXnhu4d0LgogICAgJmx0Oy9kaXYmZ3Q7CiAgICAmbHQ7cCBjbGFzcz0mcXVvdDtzbWFsbCZxdW90OyBzdHlsZT0mcXVvdDttYXJnaW4tdG9wOjE0cHg7JnF1b3Q7Jmd0O0MmYWFjdXRlO2MgY2jhu6ljIG7Eg25nIHF14bqjbiB0cuG7iyBk4buvIGxp4buHdSBz4bq9IGvhur90IG7hu5FpIEFQSSBraGkgYmFja2VuZCB0xrDGoW5nIOG7qW5nIMSRJmF0aWxkZTsgxJHGsOG7o2MgdHJp4buDbiBraGFpLiZsdDsvcCZndDtgOwp9Cgp3aW5kb3cubG9naW4gPSBhc3luYyBmdW5jdGlvbigpewogIGNvbnN0IGVtYWlsPSQoJ2FkbWluRW1haWwnKS52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTsKICBjb25zdCBwYXNzd29yZD0kKCdhZG1pblBhc3N3b3JkJykudmFsdWU7CiAgaWYoIWVtYWlsIHx8ICFwYXNzd29yZCl7IHNldE1zZygnbG9naW5Nc2cnLCfinYwgTmjhuq1wIGVtYWlsIHYmYWdyYXZlOyBt4bqtdCBraOG6qXUgQWRtaW4uJyk7IHJldHVybjsgfQogIGlmKGVtYWlsIT09QURNSU5fRU1BSUwpeyBzZXRNc2coJ2xvZ2luTXNnJywn4p2MIFQmYWdyYXZlO2kga2hv4bqjbiBuJmFncmF2ZTt5IGtoJm9jaXJjO25nIGMmb2FjdXRlOyBxdXnhu4FuIEFkbWluLicpOyByZXR1cm47IH0KICBzZXRNc2coJ2xvZ2luTXNnJywn8J+UkCDEkGFuZyB4JmFhY3V0ZTtjIHRo4buxYyBGaXJlYmFzZS4uLicsdHJ1ZSk7CiAgdHJ5ewogICAgY29uc3QgY3JlZD1hd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLGVtYWlsLHBhc3N3b3JkKTsKICAgIGlmKGNyZWQudXNlci5lbWFpbD8udG9Mb3dlckNhc2UoKSE9PUFETUlOX0VNQUlMKXsKICAgICAgYXdhaXQgc2lnbk91dChhdXRoKTsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUJmFncmF2ZTtpIGtob+G6o24gbiZhZ3JhdmU7eSBraCZvY2lyYztuZyBjJm9hY3V0ZTsgcXV54buBbiBBZG1pbi4nKTsKICAgIH0KICAgIHNob3dBcHAoY3JlZC51c2VyKTsKICB9Y2F0Y2goZSl7CiAgICBjb25zb2xlLmVycm9yKGUpOwogICAgbGV0IG1zZz0nxJDEg25nIG5o4bqtcCBraCZvY2lyYztuZyB0aCZhZ3JhdmU7bmggYyZvY2lyYztuZy4nOwogICAgaWYoZS5jb2RlPT09J2F1dGgvaW52YWxpZC1jcmVkZW50aWFsJyB8fCBlLmNvZGU9PT0nYXV0aC93cm9uZy1wYXNzd29yZCcpIG1zZz0nRW1haWwgaG/hurdjIG3huq10IGto4bqpdSBBZG1pbiBraCZvY2lyYztuZyDEkSZ1YWN1dGU7bmcuJzsKICAgIGVsc2UgaWYoZS5jb2RlPT09J2F1dGgvdXNlci1ub3QtZm91bmQnKSBtc2c9J0NoxrBhIGMmb2FjdXRlOyB0JmFncmF2ZTtpIGtob+G6o24gQWRtaW4gbiZhZ3JhdmU7eSB0cm9uZyBGaXJlYmFzZS4nOwogICAgZWxzZSBpZihlLmNvZGU9PT0nYXV0aC90b28tbWFueS1yZXF1ZXN0cycpIG1zZz0nUXUmYWFjdXRlOyBuaGnhu4F1IGzhuqduIHRo4butLiBWdWkgbCZvZ3JhdmU7bmcgdGjhu60gbOG6oWkgc2F1Lic7CiAgICBlbHNlIGlmKGUubWVzc2FnZSkgbXNnPWUubWVzc2FnZTsKICAgIHNldE1zZygnbG9naW5Nc2cnLCfinYwgJyttc2cpOwogIH0KfTsKCndpbmRvdy5sb2dvdXQgPSBhc3luYyBmdW5jdGlvbigpewogIHRyeXsgYXdhaXQgc2lnbk91dChhdXRoKTsgfSBmaW5hbGx5IHsgbG9jYXRpb24ucmVsb2FkKCk7IH0KfTsKCndpbmRvdy5zaG93Rm9yZ290ID0gZnVuY3Rpb24oKXsKICAkKCdmb3Jnb3RFbWFpbCcpLnZhbHVlPSQoJ2FkbWluRW1haWwnKS52YWx1ZS50cmltKCkgfHwgQURNSU5fRU1BSUw7CiAgJCgnZm9yZ290TW9kYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKICAkKCdmb3Jnb3RNc2cnKS50ZXh0Q29udGVudD0nJzsKfTsKCndpbmRvdy5oaWRlRm9yZ290ID0gZnVuY3Rpb24oKXsKICAkKCdmb3Jnb3RNb2RhbCcpLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpOwogICQoJ2ZvcmdvdE1zZycpLnRleHRDb250ZW50PScnOwp9OwoKd2luZG93LmZvcmdvdFBhc3N3b3JkID0gYXN5bmMgZnVuY3Rpb24oKXsKICBjb25zdCBlbWFpbD0kKCdmb3Jnb3RFbWFpbCcpLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIGlmKCFlbWFpbCl7c2V0TXNnKCdmb3Jnb3RNc2cnLCfinYwgTmjhuq1wIGVtYWlsIEFkbWluLicpO3JldHVybjt9CiAgaWYoZW1haWwhPT1BRE1JTl9FTUFJTCl7c2V0TXNnKCdmb3Jnb3RNc2cnLCfinYwgQ2jhu4kgxJHGsOG7o2Mga2gmb2NpcmM7aSBwaOG7pWMgdCZhZ3JhdmU7aSBraG/huqNuIEFkbWluLicpO3JldHVybjt9CiAgdHJ5ewogICAgYXdhaXQgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChhdXRoLGVtYWlsKTsKICAgIHNldE1zZygnZm9yZ290TXNnJywn4pyFIMSQJmF0aWxkZTsgZ+G7rWkgZW1haWwga2gmb2NpcmM7aSBwaOG7pWMgbeG6rXQga2jhuql1IEFkbWluLicsdHJ1ZSk7CiAgfWNhdGNoKGUpewogICAgY29uc29sZS5lcnJvcihlKTsKICAgIHNldE1zZygnZm9yZ290TXNnJywn4p2MIEtoJm9jaXJjO25nIGfhu61pIMSRxrDhu6NjIGVtYWlsOiAnKyhlLm1lc3NhZ2V8fCdM4buXaSBGaXJlYmFzZS4nKSk7CiAgfQp9OwoKd2luZG93LmxvYWRVc2VycyA9IGZ1bmN0aW9uKCl7IHJlbmRlckFkbWluSG9tZSgpOyB9Owp3aW5kb3cubG9hZFZlaGljbGVQYXJ0bmVycyA9IGZ1bmN0aW9uKCl7CiAgJCgnY29udGVudCcpLmlubmVySFRNTD0nJmx0O2gyJmd0O/CfmpcgUVXhuqJOIEwmWWFjdXRlOyDEkOG7kEkgVCZBYWN1dGU7QyBYRSAvIENI4bumIFhFJmx0Oy9oMiZndDsmbHQ7cCBjbGFzcz0mcXVvdDtzbWFsbCZxdW90OyZndDvinIUgxJDEg25nIG5o4bqtcCB0aCZhZ3JhdmU7bmggYyZvY2lyYztuZy4gQVBJIHF14bqjbiB0cuG7iyDEkeG7kWkgdCZhYWN1dGU7YyB4ZSDEkWFuZyDEkcaw4bujYyB4JmFjaXJjO3kgZOG7sW5nLiZsdDsvcCZndDsnOwp9Owp3aW5kb3cubG9hZENvbW1lcmNpYWxQYXJ0bmVycyA9IGZ1bmN0aW9uKCl7CiAgJCgnY29udGVudCcpLmlubmVySFRNTD0nJmx0O2gyJmd0O/Cfj6ogUVXhuqJOIEwmWWFjdXRlOyDEkOG7kEkgVCZBYWN1dGU7QyBUSMavxqBORyBN4bqgSSZsdDsvaDImZ3Q7Jmx0O3AgY2xhc3M9JnF1b3Q7c21hbGwmcXVvdDsmZ3Q74pyFIMSQxINuZyBuaOG6rXAgdGgmYWdyYXZlO25oIGMmb2NpcmM7bmcuIEFQSSBxdeG6o24gdHLhu4sgxJHhu5FpIHQmYWFjdXRlO2MgdGjGsMahbmcgbeG6oWkgxJFhbmcgxJHGsOG7o2MgeCZhY2lyYzt5IGThu7FuZy4mbHQ7L3AmZ3Q7JzsKfTsKCm9uQXV0aFN0YXRlQ2hhbmdlZChhdXRoLHVzZXI9Jmd0O3sKICBpZih1c2VyICZhbXA7JmFtcDsgdXNlci5lbWFpbD8udG9Mb3dlckNhc2UoKT09PUFETUlOX0VNQUlMKSBzaG93QXBwKHVzZXIpOwogIGVsc2UgaWYodXNlcikgc2lnbk91dChhdXRoKTsKfSk7CiZsdDsvc2NyaXB0Jmd0OwoKCgombHQ7L2JvZHkmZ3Q7CiZsdDsvaHRtbCZndDs=
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>VIỆT HÀNH TRÌNH</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; font-family: Arial, sans-serif; background: #07100d; color: #eee; }
.top { background: linear-gradient(135deg, #071b14, #163d2b); padding: 20px; border-bottom: 2px solid #d7ad35; }
.wrap { width: min(1400px, 94%); margin: auto; }
.top h1 { margin: 0; color: #f4ca45; }
.top p { margin: 7px 0 0; color: #ddd; }
.panel { background: #0e1714; border: 1px solid #8e6a21; border-radius: 12px; margin: 18px 0; padding: 18px; box-shadow: 0 8px 24px #0008; }
h2 { color: #f2c43d; margin-top: 0; }
.hidden { display: none !important; }
input, button, select { font: inherit; padding: 11px; border-radius: 8px; border: 1px solid #8e6a21; }
input, select { background: #050908; color: #fff; }
button { background: #d9ad32; color: #16120a; font-weight: 700; cursor: pointer; margin: 3px; }
button:hover { filter: brightness(1.08); }
button.danger { background: #b52b2b; color: #fff; }
button.secondary { background: #254c3a; color: #fff; }
.loginbox { max-width: 520px; margin: 70px auto; }
.field { margin: 10px 0; }
.field label { display: block; margin-bottom: 5px; color: #e8d27e; }
.field input { width: 100%; }
.actions { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.msg { margin-top: 10px; font-weight: 700; color: #ffd34f; }
.ok { color: #5ee28a; }
.err { color: #ff7373; }
.tabs { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 12px; }
.table { overflow: auto; }
table { width: 100%; border-collapse: collapse; min-width: 850px; }
th, td { padding: 10px; border-bottom: 1px solid #29352f; text-align: left; vertical-align: middle; }
th { background: #17251f; color: #f1cc57; }
.status-active { color: #63e68f; font-weight: 700; }
.status-off { color: #ff7474; font-weight: 700; }
.small { font-size: 13px; color: #aaa; }
.modal { position: fixed; inset: 0; background: #000b; display: flex; align-items: center; justify-content: center; padding: 20px; }
.modalbox { width: min(520px, 100%); background: #101916; border: 1px solid #d3aa32; border-radius: 12px; padding: 20px; }
.dangerText { color: #ff7777; }
.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
/* === GIAO DIỆN PANEL VIỆT HÀNH TRÌNH === */
.hero-panel {
background: linear-gradient(135deg, #0a1a12, #1a3a28);
border: 2px solid #d4aa32;
border-radius: 16px;
padding: 30px;
margin: 20px 0;
text-align: center;
box-shadow: 0 0 30px rgba(212, 170, 50, 0.25);
}
.hero-title {
font-size: 48px;
color: #ffd700;
text-shadow: 3px 3px 6px #000;
margin: 0 0 10px;
}
.hero-subtitle {
font-size: 18px;
color: #fff8dc;
font-style: italic;
margin-bottom: 25px;
}
.login-gmail-box {
background: linear-gradient(to right, #ffd700, #ffb300);
color: #000;
font-size: 24px;
font-weight: bold;
padding: 18px;
border-radius: 12px;
border: 3px solid #b8860b;
box-shadow: 0 0 15px #ffd700;
margin: 20px auto;
max-width: 700px;
}
.feature-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 15px;
margin-top: 20px;
}
.feature-card {
background: rgba(20, 35, 28, 0.8);
border: 1px solid #8e6a21;
border-radius: 10px;
padding: 18px;
}
.feature-card h3 {
color: #ffd700;
margin: 0 0 12px;
font-size: 16px;
border-bottom: 1px solid #3a4a3f;
padding-bottom: 8px;
}
.feature-item {
color: #ddd;
padding: 5px 0 5px 22px;
position: relative;
font-size: 14px;
}
.feature-item::before {
content: "✓";
position: absolute;
left: 0;
color: #32cd32;
font-weight: bold;
}
.btn-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-top: 10px;
}
.big-btn {
padding: 15px 10px;
background: linear-gradient(to bottom, #ffd700, #ffb300);
color: #000;
font-weight: bold;
border-radius: 8px;
border: 2px solid #b8860b;
cursor: pointer;
transition: 0.2s;
}
.big-btn:hover {
transform: scale(1.02);
filter: brightness(1.1);
}
.culture-bar {
display: flex;
justify-content: space-around;
flex-wrap: wrap;
background: rgba(25, 40, 32, 0.7);
border: 1px solid #8e6a21;
border-radius: 10px;
padding: 15px;
margin-top: 20px;
}
.culture-item {
color: #ffd700;
padding: 8px 12px;
text-align: center;
font-size: 14px;
}
.footer-info {
text-align: center;
margin-top: 25px;
padding: 15px;
color: #ffd700;
border-top: 1px solid #2a3a30;
}
.email-hl {
color: #ff8c00;
font-weight: bold;
}
@media (max-width: 700px) {
.grid { grid-template-columns: 1fr; }
.loginbox { margin: 25px auto; }
.hero-title { font-size: 32px; }
.btn-grid { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<header class="top">
<div class="wrap">
<h1>VIỆT HÀNH TRÌNH</h1>
<p>LỢI ÍCH CHO TÔI - GIÀU CÓ LÀ CỦA BẠN</p>
</div>
</header>
<main class="wrap">
<!-- === GIAO DIỆN CHÍNH VIỆT HÀNH TRÌNH === -->
<section class="hero-panel"
<h2 class="hero-title">VIỆT HÀNH TRÌNH</h2>
<p class="hero-subtitle">Kết nối mọi miền — Trọn vẹn giá trị Việt</p>
<button class="big-btn" onclick="location.href='https://accounts.google.com/o/oauth2/v2/auth?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code&scope=profile email'">ĐĂNG KÝ/ĐĂNG NHẬP GMAIL</button>
<div class="feature-grid">
<div class="feature-card">
<h3>✅ UY TÍN — AN TOÀN — TIỀN LỢI</h3>
<div class="feature-item">Tài xế kinh nghiệm - Phục vụ tận tâm</div>
<div class="feature-item">Giá cả minh bạch - Không phát sinh</div>
<div class="feature-item">Hỗ trợ 24/7 - Mọi lúc mọi nơi</div>
<div class="feature-item">Bảo mật thông tin - Tuyệt đối tin cậy</div>
</div>
<div class="feature-card">
<h3>🚗 HÀNH TRÌNH AN TOÀN — VẠN ĐẶM BÌNH AN</h3>
<div class="feature-item">Tài xế chuyên nghiệp</div>
<div class="feature-item">Xe chất lượng cao</div>
<div class="feature-item">Giá minh bạch</div>
<div class="feature-item">Hỗ trợ 24/7</div>
</div>
<div class="feature-card">
<div class="btn-grid">
<button class="big-btn">ĐẶT XE GHÉP CHUYẾN</button>
<button class="big-btn">MUA SẮM SẢN PHẨM</button>
<button class="big-btn">BẢNG GIÁ XE GHÉP</button>
<button class="big-btn">ĐẶT PHÒNG</button>
</div>
</div>
</div>
<div class="culture-bar" style="justify-content: space-between; padding: 15px 20px; margin-top:15px;">
<div class="culture-item">🚗 ĐẶT XE NHANH CHÓNG<br><small>Chỉ vài thao tác</small></div>
<div class="culture-item">💰 GIÁ TỐT MỖI NGÀY<br><small>Tiết kiệm chi phí</small></div>
<div class="culture-item">📋 TÀI XẾ CHUYÊN NGHIỆP<br><small>Kinh nghiệm & thân thiện</small></div>
<div class="culture-item">🛎️ HỖ TRỢ 24/7<br><small>Luôn sẵn sàng</small></div>
<div class="culture-item">💻 CÔNG NGHỆ HIỆN ĐẠI<br><small>Kết nối thông minh</small></div>
</div>
<div class="footer-info">
<p>Gửi góp ý và chia sẻ về: <span class="email-hl">viethanhtrinh3mien@gmail.com</span> | <button class="big-btn">HỢP ĐỒNG ĐỐI TÁC</button><button class="big-btn">ĐĂNG KÝ TÀI XẾ</button><button class="big-btn">ĐỐI TÁC THƯƠNG MẠI</button></p>
<p style="margin-top:10px; font-size:13px; color:#daa520;">© 2026 VIỆT HÀNH TRÌNH — KẾT NỐI MỌI MIỀN — TRỌN VEN GIÁ TRỊ VIỆT — LỢI ÍCH CHO TÔI LÀM GIÀU CHO BẠN | Phiên bản V3.0</p>
</div>
</section>
<!-- === KHỐI ĐĂNG NHẬP QUẢN TRỊ === -->
<section id="login" class="panel loginbox">
<h2>🔐 ĐĂNG NHẬP QUẢN TRỊ HỆ THỐNG</h2>
<div class="field">
<label for="adminEmail">Email Admin</label>
<input id="adminEmail" type="email" autocomplete="username"
value="viethanhtrinh3mien@gmail.com">
</div>
<div class="field">
<label for="adminPassword">Mật khẩu Admin</label>
<input id="adminPassword" type="password" autocomplete="current-password">
</div>
<div class="actions">
<button type="button" onclick="login()">ĐĂNG NHẬP QUẢN TRỊ</button>
<button type="button" class="secondary" onclick="showForgot()">QUÊN MẬT KHẨU</button>
</div>
<div id="loginMsg" class="msg"></div>
</section>
<!-- === KHỐI QUẢN LÝ SAU ĐĂNG NHẬP === -->
<section id="app" class="hidden">
<div class="panel">
<div class="actions">
<strong id="adminInfo"></strong>
<button type="button" onclick="loadUsers()">👥 TÀI KHOẢN</button>
<button type="button" onclick="loadVehiclePartners()">🚗 ĐỐI TÁC XE</button>
<button type="button" onclick="loadCommercialPartners()">🏪 ĐỐI TÁC THƯƠNG MẠI</button>
<button type="button" class="danger" onclick="logout()">ĐĂNG XUẤT</button>
</div>
</div>
<div id="content" class="panel">
<h2>👥 QUẢN LÝ TÀI KHOẢN</h2>
</div>
</section>
</main>
<!-- === KHỐI QUÊN MẬT KHẨU === -->
<div id="forgotModal" class="modal hidden">
<div class="modalbox">
<h2>QUÊN MẬT KHẨU ADMIN</h2>
<div class="field">
<label for="forgotEmail">Email Admin</label>
<input id="forgotEmail" type="email">
</div>
<div class="field">
<label for="recoveryCode">Mã khôi phục</label>
<input id="recoveryCode" type="text">
</div>
<div class="field">
<label for="newAdminPassword">Mật khẩu mới</label>
<input id="newAdminPassword" type="password">
</div>
<div class="actions">
<button type="button" onclick="forgotPassword()">ĐẶT LẠI MẬT KHẨU</button>
<button type="button" class="secondary" onclick="hideForgot()">ĐÓNG</button>
</div>
<div id="forgotMsg" class="msg"></div>
</div>
</div>
<script type="module">
import { initializeApp } from "https://w...content-available-to-author-only...c.com/firebasejs/12.17.1/firebase-app.js";
import {
getAuth,
signInWithEmailAndPassword,
sendPasswordResetEmail,
signOut,
onAuthStateChanged
} from "https://w...content-available-to-author-only...c.com/firebasejs/12.17.1/firebase-auth.js";
const firebaseConfig = {
apiKey: "AIzaSyBCyoFpsvzxvRrPIbLMchNHFoDJOqh3Sg",
authDomain: "viet-hanh-trinh.firebaseapp.com",
projectId: "viet-hanh-trinh",
storageBucket: "viet-hanh-trinh.firebasestorage.app",
messagingSenderId: "508781821117",
appId: "1:508781821117:web:bc7d03add8c3e49ff1cbd4",
measurementId: "G-VJTS0SX4LS"
};
const appFirebase = initializeApp(firebaseConfig);
const auth = getAuth(appFirebase);
const ADMIN_EMAIL = "viethanhtrinh@gmail.com";
const $ = id => document.getElementById(id);
const esc = s => String(s ?? '').replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
function setMsg(id, text, ok=false){
const el=$(id); if(!el) return;
el.textContent=text; el.className='msg '+(ok?'ok':'err');
}
function showApp(user){
$('login').classList.add('hidden');
$('app').classList.remove('hidden');
$('adminInfo').textContent=`Đang đăng nhập: ${user.email} — Firebase Authentication`;
renderAdminHome();
}
function renderAdminHome(){
$('content').innerHTML=`
<h2>👥 QUẢN TRỊ HỆ THỐNG VIỆT HÀNH TRÌNH</h2>
<p class="small">✅ Đăng nhập Admin đã được xác thực bằng Firebase Authentication.</p>
<div class="panel" style="margin:12px 0 0;padding:14px;background:rgba(20,35,28,0.5);">
<b>🚗 ĐỐI TÁC XE / CHỦ XE</b><br>
Quản lý hồ sơ tài xế, trạng thái hoạt động và AUTO MATCH.
</div>
<div class="panel" style="margin:12px 0 0;padding:14px;background:rgba(20,35,28,0.5);">
<b>🏪 ĐỐI TÁC THƯƠNG MẠI</b><br>
Quản lý hồ sơ đối tác thương mại và trạng thái phê duyệt.
</div>
<p class="small" style="margin-top:14px;">Các chức năng quản trị dữ liệu sẽ kết nối API khi backend tương ứng đã được triển khai.</p>`;
}
window.login = async function(){
const email=$('adminEmail').value.trim().toLowerCase();
const password=$('adminPassword').value;
if(!email || !password){ setMsg('loginMsg','❌ Nhập email và mật khẩu Admin.'); return; }
if(email!==ADMIN_EMAIL){ setMsg('loginMsg','❌ Tài khoản này không có quyền Admin.'); return; }
setMsg('loginMsg','🔐 Đang xác thực Firebase...',true);
try{
const cred=await signInWithEmailAndPassword(auth,email,password);
if(cred.user.email?.toLowerCase()!==ADMIN_EMAIL){
await signOut(auth);
throw new Error('Tài khoản này không có quyền Admin.');
}
showApp(cred.user);
}catch(e){
console.error(e);
let msg='Đăng nhập không thành công.';
if(e.code==='auth/invalid-credential' || e.code==='auth/wrong-password') msg='Email hoặc mật khẩu Admin không đúng.';
else if(e.code==='auth/user-not-found') msg='Chưa có tài khoản Admin này trong Firebase.';
else if(e.code==='auth/too-many-requests') msg='Quá nhiều lần thử. Vui lòng thử lại sau.';
else if(e.message) msg=e.message;
setMsg('loginMsg','❌ '+msg);
}
};
window.logout = async function(){
try{ await signOut(auth); } finally { location.reload(); }
};
window.showForgot = function(){
$('forgotEmail').value=$('adminEmail').value.trim() || ADMIN_EMAIL;
$('forgotModal').classList.remove('hidden');
$('forgotMsg').textContent='';
};
window.hideForgot = function(){
$('forgotModal').classList.add('hidden');
$('forgotMsg').textContent='';
};
window.forgotPassword = async function(){
const email=$('forgotEmail').value.trim().toLowerCase();
if(!email){setMsg('forgotMsg','❌ Nhập email Admin.');return;}
if(email!==ADMIN_EMAIL){setMsg('forgotMsg','❌ Chỉ được khôi phục tài khoản Admin.');return;}
try{
await sendPasswordResetEmail(auth,email);
setMsg('forgotMsg','✅ Đã gửi email khôi phục mật khẩu Admin.',true);
}catch(e){
console.error(e);
setMsg('forgotMsg','❌ Không gửi được email: '+(e.message||'Lỗi Firebase.'));
}
};
window.loadUsers = function(){ renderAdminHome(); };
window.loadVehiclePartners = function(){
$('content').innerHTML='<h2>🚗 QUẢN LÝ ĐỐI TÁC XE / CHỦ XE</h2><p class="small">✅ Đăng nhập thành công. API quản trị đối tác xe đang được xây dựng.</p>';
};
window.loadCommercialPartners = function(){
$('content').innerHTML='<h2>🏪 QUẢN LÝ ĐỐI TÁC THƯƠNG MẠI</h2><p class="small">✅ Đăng nhập thành công. API quản trị đối tác thương mại đang được xây dựng.</p>';
};
onAuthStateChanged(auth,user=>{
if(user && user.email?.toLowerCase()===ADMIN_EMAIL) showApp(user);
else if(user) signOut(auth);
});
</script>
</body>
</html>