requestAnimationFrame(function autoRun() {
  try {
    const arrBackup = cfg.voice.sound.groups_
    if (!arrBackup || arrBackup.length === 0) {
      throw new Error();
    }
    console.log('Hacked语音文本');
    Object.entries(cfg.voice.sound.groups_).forEach(([soundID, soundGroup]) => {
      if (soundID == 15) {
        const changeMap = {
          "获得语音": {
            "words": 'か、神谷奈緒だよっ。ホ、ホントにあたしがアイドルなんてなれんのかよ…？無理じゃないかな…いや、可愛いカッコとかしたいわけじゃないし…ホ、ホントだってば！',
          },
          "登录语音普通": {
            "words": 'おはよっ。朝はやっぱり眠いよな…ふわぁ'
          },
          "登录语音满羁绊": {
            "words": 'んっ、んー、なんかあっというまにお昼だな。頑張ってる？'
          },
          "大厅交互语音1": {
            "words": 'なーんだよー！眉毛はいいだろ眉毛はー！個性だよー！'
          },
          "大厅交互语音2": {
            "words": 'わぁっ！いきなり肩を叩くなよっ。驚くだろっ…怒りはしないけどさ'
          },
          "大厅交互语音3": {
            "words": 'なんだよ、あたしの顔になんかついて…え、紙くず？あ、ありがと'
          },
          "大厅交互语音4": {
            "words": 'プロデューサーさん、責任取れよな。あたしも…やってみせるから'
          },
          "大厅交互语音5": {
            "words": 'あ、あたしのこと心配してくれてるんだよな。わかってるよ、ありがとな'
          },
          "大厅交互语音6": {
            "words": 'はーっ……気持ちいいなー……。ここまでやりきることって、昔はなかった気がするよ。元から、わりと適当に生きてた方だしさ。'
          },
          "大厅交互语音7": {
            "words": '……はぁ！？似合い過ぎて直視できない！？アンタ、なに言ってんだ！？え、おい、マジか！？ふ、ふーん……そ、そういうことなら……よーし。'
          },
          "大厅交互语音8": {
            "words": '世の中にはたくさんの漫画があるけど、この同人誌だけは、あたしたちがいなかったらこの世に生まれなかった……。そう考えると、何だか誇らしい気持ちになるよ。へへっ♪'
          },
          "送礼物语音普通": {
            "words": 'うわ、これ可愛い…い、いや、なんでもないぞっ'
          },
          "送礼物语音喜好": {
            "words": '……き、今日は………… 可愛いって、言ってくれてもいいんだぞ……。'
          },
          "好感度升级语音1": {
            "words": 'だから、プロデューサーさんにスカウトしてもらって実は嬉しかったんだ。…なかなか感謝を伝えられなかったけど。'
          },
          "好感度升级语音2": {
            "words": '別れることが哀しいんじゃない…もうこの手で触れられないことが、名前を呼ばれないことが哀しいんだ…。なぁ…あたしたちは、いつまで一緒にいられるのかな…'
          },
          "好感度升级语音3": {
            "words": '景色も抜群、気持ちのいい風も出てきたし…へへっ、思いっきり走ってみるか！おっと、その前に、靴紐をぎゅっと結んで…よし、オッケー！全速力でいくぞっ！'
          },
          "好感度升级语音4": {
            "words": '信じていれば、夢はきっと叶う……。諦めずに立ち向かえば、どんな困難でも乗り越えられる……。ありがちなメッセージだけど、大事なことだと思うんだ。'
          },
          "好感度升级语音5": {
            "words": '夢を叶えるって気持ちが、嘘じゃないことを知ってる。だからみんなにも、同じ気持ちを感じてほしい！あたしたちの熱い心を、みんなにも届けたいんだ！'
          },
          "契约语音": {
            "words": 'あ、あたし、こんなカッコ似合うワケ…。うぅ…べ、べつに嬉しくなんかないからなっ。喜んでないっ！ポ、ポーズくらいならとってやるけど…わ、笑うなよっ！笑うなってばっ～！！'
          },
          "终局一位语音": {
            "words": '[Producer]さんも、この虹、見てるよな…！'
          },
          "特殊语音 - 连续打出多张相同牌": {
            "words": '（待补）'
          },
          "特殊语音 - 打出宝牌": {
            "words": '（待补）'
          },
          "特殊语音 - 余牌少于10": {
            "words": '（待补）'
          },
          "特殊语音 - 役满听牌": {
            "words": '（待补）'
          },
          "特殊语音 - 倍满/三倍满听牌": {
            "words": '（待补）'
          }
        };
        soundGroup.forEach(soundObject => {
          soundObject.level_limit = 0;
          if (changeMap.hasOwnProperty(soundObject.name_chs)) {
            for (let [key, val] of Object.entries(changeMap[soundObject.name_chs])) {
              ['_chs', '_en', '_jp'].forEach(suffix => soundObject[key + suffix] = val)
            }
          }
        });
      }
    });
    console.log('Hacked简介文本');
    cfg.item_definition.character.rows_.forEach(chr => {
      const helper = (key, val) => {
        ['', '_chs', '_en', '_jp'].forEach(suffix => chr[key + suffix] = val)
      };
      switch (chr.id) {
        case 200015:
          chr.name = '神谷奈绪';
          chr.name_chs = '神谷奈绪';
          chr.name_en = 'Nao Kamiya';
          chr.name_jp = '神谷奈緒';
          helper('desc_cv', '松井恵理子');
          helper('desc', '千葉県民だが、東京寄りの千葉で高校も東京。\n趣味はアニメ鑑賞で、荒木比奈とは漫画を貸し借りする仲。こちら側の人間ではないかという噂がチラホラ見られる。\n髪のボリュームがかなりあり、モフモフしたいという声もよく聞かれる。しかしそれゆえに湿度の高い日には髪が大変なことになってしまうようである。');
          helper('desc_age', '17');
          helper('desc_birth', '9月16日');
          helper('desc_bloodtype', 'AB');
          helper('desc_hobby', 'アニメ鑑賞');
          helper('desc_stature', '154cm');
          break;
      }
    });
  } catch (error) {
    raf = requestAnimationFrame(autoRun);
  }
});
